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