|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.