xref: /original-bsd/sys/tests/netiso/te.c (revision a8414ee1)
1 
2 /*
3  * $Header: te.c,v 1.1 88/06/29 15:00:09 hagens Exp $
4  * $Source: /usr/argo/sys/netiso/RCS/te.c,v $
5  *
6  *	EON rfc
7  *  Layer between IP and CLNL
8  *
9  * TODO:
10  * Put together a current rfc986 address format and get the right offset
11  * for the nsel
12  */
13 #define RFC986_NSEL_OFFSET 5
14 
15 #ifndef lint
16 static char *rcsid = "$Header: te.c,v 1.1 88/06/29 15:00:09 hagens Exp $";
17 #endif lint
18 
19 #include "eon.h"
20 #if NEON>0
21 
22 #include <stdio.h>
23 
24 #include "param.h"
25 #include "systm.h"
26 #include "types.h"
27 #include "mbuf.h"
28 #include "buf.h"
29 #include "protosw.h"
30 #include "socket.h"
31 #include "ioctl.h"
32 #include "errno.h"
33 #include "types.h"
34 
35 #include "machine/io.h"
36 #include "../machineio/ioccvar.h"
37 
38 #include "../net/if.h"
39 #include "../net/netisr.h"
40 #include "../net/route.h"
41 
42 #include "../netinet/in.h"
43 #include "../netinet/in_systm.h"
44 #include "../netinet/ip.h"
45 #include "../netinet/ip_var.h"
46 #include "../netinet/if_ether.h"
47 
48 #include "../netiso/iso.h"
49 #include "../netiso/argo_debug.h"
50 #include "../netiso/iso_errno.h"
51 #include "../netiso/eonvar.h"
52 
53 #define EOK 0
54 
55 #undef insque
56 #define	insque(p,q)	_insque((queue_t)q,(queue_t)p)
57 #define	remque(q)	_remque((queue_t)q)
58 
59 
60 struct eon_centry {
61 	struct qhdr eonc_q_LINK;
62 #define eonc_nextLINK eonc_q_LINK.link
63 #define eonc_prevLINK eonc_q_LINK.flink
64 
65 	struct qhdr eonc_q_IS;
66 #define eonc_nextIS eonc_q_IS.link
67 #define eonc_prevIS eonc_q_IS.flink
68 
69 	struct qhdr eonc_q_ES;
70 #define eonc_nextES eonc_q_ES.link
71 #define eonc_prevES eonc_q_ES.flink
72 
73 	struct in_addr	eonc_addr;
74 	u_short		eonc_status;
75 };
76 
77 /* kinda like mtod() but for eon_centries */
78 #define qtocentry(q, off)  ((struct eon_centry *)  (((caddr_t)(q)) - off))
79 #define centrytoq(c, off)  ((struct qhdr *)  (((caddr_t)(c)) + off))
80 
81 struct qhdr 			eon_LINK_hdr = {
82 	(struct qhdr *)0,
83 	(struct qhdr *)0,
84 };
85 static struct qhdr 		eon_IS_hdr = {
86 	(struct qhdr *)0,
87 	(struct qhdr *)0,
88 };
89 static struct qhdr 		eon_ES_hdr = {
90 	(struct qhdr *)0,
91 	(struct qhdr *)0,
92 };
93 static struct qhdr 		eon_FREE_hdr = {
94 	(struct qhdr *)0,
95 	(struct qhdr *)0,
96 };
97 
98 eon_dumpcache(which)
99 	int 						which;
100 {
101 	register int 				off;
102 	register struct eon_centry 	*ent;
103 	struct	qhdr				*hdr;
104 
105 	switch (which) {
106 		case E_FREE:
107 			printf("FREE LIST\n");
108 			off = _offsetof( struct eon_centry, eonc_q_LINK);
109 			hdr = &eon_FREE_hdr;
110 			ent = qtocentry( hdr->link,
111 				_offsetof( struct eon_centry, eonc_q_LINK));
112 			break;
113 		case E_ES:
114 			printf("ES LIST\n");
115 			off = _offsetof( struct eon_centry, eonc_q_ES);
116 			hdr = &eon_ES_hdr;
117 			ent = qtocentry( hdr->link,
118 				_offsetof( struct eon_centry, eonc_q_ES));
119 			break;
120 		case E_IS:
121 			printf("IS LIST\n");
122 			off = _offsetof( struct eon_centry, eonc_q_IS);
123 			hdr = &eon_IS_hdr;
124 			ent = qtocentry( hdr->link,
125 				_offsetof( struct eon_centry, eonc_q_IS));
126 			break;
127 		case E_LINK:
128 			printf("LINK LIST\n");
129 			off = _offsetof( struct eon_centry, eonc_q_LINK);
130 			hdr = &eon_LINK_hdr;
131 			ent = qtocentry( hdr->link,
132 				_offsetof( struct eon_centry, eonc_q_LINK));
133 			break;
134 	}
135 	if(hdr == centrytoq(ent, off)->link )
136 		printf("EMPTY\n");
137 	else while(1) {
138 		printf("0x%x: %d.%d.%d.%d, %s %s\n", ent,
139 			(ent->eonc_addr.s_addr>>24)&0xff,
140 			(ent->eonc_addr.s_addr>>16)&0xff,
141 			(ent->eonc_addr.s_addr>>8)&0xff,
142 			(ent->eonc_addr.s_addr)&0xff,
143 			((ent->eonc_status & EON_ESLINK_UP)?"ES^":
144 				(ent->eonc_status & EON_ESLINK_DOWN)?"es*": "   "),
145 			((ent->eonc_status & EON_ISLINK_UP)?"IS^":
146 				(ent->eonc_status & EON_ISLINK_DOWN)?"is*": "   ")
147 			);
148 		dump_buf(ent, sizeof(struct eon_centry) );
149 
150 		{ 	/* ent = ent.next: */
151 			register struct qhdr 	*q;
152 
153 			q = centrytoq(ent, off)->link;
154 			if( q == hdr)
155 				break;
156 			if( q == (struct qhdr *)0) /* panic */ {
157 				printf("eon0: BAD Q HDR or CENTRY! q 0x%x ent 0x%x off 0x%x\n",
158 					q, ent, off);
159 				break;
160 			}
161 			ent = qtocentry( q,  off );
162 		}
163 	}
164 }
165 
166 initq(q)
167 	struct qhdr *q;
168 {
169 	q->rlink = q->link = q;
170 }
171 main()
172 {
173 	static struct eon_centry	eoncache[EON_CACHESIZE];
174 	register int 				i;
175 	register struct eon_centry 	*ent;
176 
177 	initq( &eon_FREE_hdr );
178 	initq( &eon_LINK_hdr );
179 	initq( &eon_ES_hdr );
180 	initq( &eon_IS_hdr );
181 
182 	bzero( eoncache, EON_CACHESIZE*sizeof(struct eon_centry));
183 	ent = eoncache;
184 
185 	for(i=0; i< EON_CACHESIZE; i++,ent++) {
186 		insque(&eon_FREE_hdr,
187 			centrytoq(ent, _offsetof( struct eon_centry, eonc_q_LINK)));
188 	}
189 
190 	eon_dumpcache(E_FREE);
191 	eon_dumpcache(E_ES);
192 }
193 #endif NEON>0
194 
195 #define MAX_COLUMNS 8
196 dump_buf(buf, len)
197 char	*buf;
198 int		len;
199 {
200 	int		i,j;
201 
202 	printf("Dump buf 0x%x len 0x%x\n", buf, len);
203 	for (i = 0; i < len; i += MAX_COLUMNS) {
204 		printf("+%d:\t", i);
205 		for (j = 0; j < MAX_COLUMNS; j++) {
206 			if (i + j < len) {
207 				printf("%x/%d\t", buf[i+j], buf[i+j]);
208 			} else {
209 				printf("	");
210 			}
211 		}
212 
213 		for (j = 0; j < MAX_COLUMNS; j++) {
214 			if (i + j < len) {
215 				if (((buf[i+j]) > 31) && ((buf[i+j]) < 128))
216 					printf("%c", buf[i+j]);
217 				else
218 					printf(".");
219 			}
220 		}
221 		printf("\n");
222 	}
223 }
224 
225 _insque(new, header)
226 	register struct qhdr *new, *header;
227 {
228 	(*new).link = (*header).link;
229 	(*new).rlink = header;
230 	(*(*header).link).rlink = new;
231 	(*header).link = new;
232 }
233