date and time created 88/12/14 15:29:52 by sklower
authorKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Thu, 15 Dec 1988 07:29:52 +0000 (23:29 -0800)
committerKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Thu, 15 Dec 1988 07:29:52 +0000 (23:29 -0800)
SCCS-vsn: sys/netiso/te.c 7.1

usr/src/sys/netiso/te.c [new file with mode: 0644]

diff --git a/usr/src/sys/netiso/te.c b/usr/src/sys/netiso/te.c
new file mode 100644 (file)
index 0000000..62bef7a
--- /dev/null
@@ -0,0 +1,232 @@
+
+/*
+ * $Header: te.c,v 1.1 88/06/29 15:00:09 hagens Exp $ 
+ * $Source: /usr/argo/sys/netiso/RCS/te.c,v $ 
+ *
+ *     EON rfc 
+ *  Layer between IP and CLNL
+ *
+ * TODO:
+ * Put together a current rfc986 address format and get the right offset
+ * for the nsel
+ */
+#define RFC986_NSEL_OFFSET 5
+
+#ifndef lint
+static char *rcsid = "$Header: te.c,v 1.1 88/06/29 15:00:09 hagens Exp $";
+#endif lint
+
+#include "eon.h"
+#if NEON>0
+
+#include <stdio.h>
+
+#include "param.h"
+#include "systm.h"
+#include "types.h"
+#include "mbuf.h"
+#include "buf.h"
+#include "protosw.h"
+#include "socket.h"
+#include "ioctl.h"
+#include "errno.h"
+#include "types.h"
+
+#include "../machine/io.h"
+#include "../machineio/ioccvar.h"
+
+#include "../net/if.h"
+#include "../net/netisr.h"
+#include "../net/route.h"
+
+#include "../netinet/in.h"
+#include "../netinet/in_systm.h"
+#include "../netinet/ip.h"
+#include "../netinet/ip_var.h"
+#include "../netinet/if_ether.h"
+
+#include "../netiso/iso.h"
+#include "../netiso/argo_debug.h"
+#include "../netiso/iso_errno.h"
+#include "../netiso/eonvar.h"
+
+#define EOK 0
+
+#undef insque
+#define        insque(p,q)     _insque((queue_t)q,(queue_t)p)
+#define        remque(q)       _remque((queue_t)q)
+
+
+struct eon_centry {
+       struct qhdr eonc_q_LINK;
+#define eonc_nextLINK eonc_q_LINK.link
+#define eonc_prevLINK eonc_q_LINK.flink
+
+       struct qhdr eonc_q_IS;
+#define eonc_nextIS eonc_q_IS.link
+#define eonc_prevIS eonc_q_IS.flink
+
+       struct qhdr eonc_q_ES;
+#define eonc_nextES eonc_q_ES.link
+#define eonc_prevES eonc_q_ES.flink
+
+       struct in_addr  eonc_addr;
+       u_short         eonc_status;
+};
+
+/* kinda like mtod() but for eon_centries */
+#define qtocentry(q, off)  ((struct eon_centry *)  (((caddr_t)(q)) - off))
+#define centrytoq(c, off)  ((struct qhdr *)  (((caddr_t)(c)) + off))
+
+struct qhdr                    eon_LINK_hdr = {
+       (struct qhdr *)0,
+       (struct qhdr *)0,
+};
+static struct qhdr             eon_IS_hdr = {
+       (struct qhdr *)0,
+       (struct qhdr *)0,
+};
+static struct qhdr             eon_ES_hdr = {
+       (struct qhdr *)0,
+       (struct qhdr *)0,
+};
+static struct qhdr             eon_FREE_hdr = {
+       (struct qhdr *)0,
+       (struct qhdr *)0,
+};
+
+eon_dumpcache(which)
+       int                                             which;
+{
+       register int                            off;
+       register struct eon_centry      *ent;
+       struct  qhdr                            *hdr;
+
+       switch (which) {
+               case E_FREE:
+                       printf("FREE LIST\n");
+                       off = _offsetof( struct eon_centry, eonc_q_LINK);
+                       hdr = &eon_FREE_hdr;
+                       ent = qtocentry( hdr->link, 
+                               _offsetof( struct eon_centry, eonc_q_LINK));
+                       break;
+               case E_ES:
+                       printf("ES LIST\n");
+                       off = _offsetof( struct eon_centry, eonc_q_ES);
+                       hdr = &eon_ES_hdr;
+                       ent = qtocentry( hdr->link, 
+                               _offsetof( struct eon_centry, eonc_q_ES));
+                       break;
+               case E_IS:
+                       printf("IS LIST\n");
+                       off = _offsetof( struct eon_centry, eonc_q_IS);
+                       hdr = &eon_IS_hdr;
+                       ent = qtocentry( hdr->link, 
+                               _offsetof( struct eon_centry, eonc_q_IS));
+                       break;
+               case E_LINK:
+                       printf("LINK LIST\n");
+                       off = _offsetof( struct eon_centry, eonc_q_LINK);
+                       hdr = &eon_LINK_hdr;
+                       ent = qtocentry( hdr->link, 
+                               _offsetof( struct eon_centry, eonc_q_LINK));
+                       break;
+       }
+       if(hdr == centrytoq(ent, off)->link )
+               printf("EMPTY\n");
+       else while(1) {
+               printf("0x%x: %d.%d.%d.%d, %s %s\n", ent,
+                       (ent->eonc_addr.s_addr>>24)&0xff,
+                       (ent->eonc_addr.s_addr>>16)&0xff,
+                       (ent->eonc_addr.s_addr>>8)&0xff,
+                       (ent->eonc_addr.s_addr)&0xff,
+                       ((ent->eonc_status & EON_ESLINK_UP)?"ES^":
+                               (ent->eonc_status & EON_ESLINK_DOWN)?"es*": "   "),
+                       ((ent->eonc_status & EON_ISLINK_UP)?"IS^":
+                               (ent->eonc_status & EON_ISLINK_DOWN)?"is*": "   ")
+                       );
+               dump_buf(ent, sizeof(struct eon_centry) );
+
+               {       /* ent = ent.next: */
+                       register struct qhdr    *q;
+
+                       q = centrytoq(ent, off)->link;
+                       if( q == hdr)
+                               break;
+                       if( q == (struct qhdr *)0) /* panic */ {
+                               printf("eon0: BAD Q HDR or CENTRY! q 0x%x ent 0x%x off 0x%x\n",
+                                       q, ent, off);
+                               break;
+                       }
+                       ent = qtocentry( q,  off );
+               }
+       }
+}
+
+initq(q) 
+       struct qhdr *q;
+{
+       q->rlink = q->link = q;
+}
+main()
+{
+       static struct eon_centry        eoncache[EON_CACHESIZE];
+       register int                            i;
+       register struct eon_centry      *ent;
+
+       initq( &eon_FREE_hdr );
+       initq( &eon_LINK_hdr );
+       initq( &eon_ES_hdr );
+       initq( &eon_IS_hdr );
+
+       bzero( eoncache, EON_CACHESIZE*sizeof(struct eon_centry));
+       ent = eoncache;
+
+       for(i=0; i< EON_CACHESIZE; i++,ent++) {
+               insque(&eon_FREE_hdr, 
+                       centrytoq(ent, _offsetof( struct eon_centry, eonc_q_LINK)));
+       }
+
+       eon_dumpcache(E_FREE);
+       eon_dumpcache(E_ES);
+}
+#endif NEON>0
+
+#define MAX_COLUMNS 8
+dump_buf(buf, len)
+char   *buf;
+int            len;
+{
+       int             i,j;
+
+       printf("Dump buf 0x%x len 0x%x\n", buf, len);
+       for (i = 0; i < len; i += MAX_COLUMNS) {
+               printf("+%d:\t", i);
+               for (j = 0; j < MAX_COLUMNS; j++) {
+                       if (i + j < len) {
+                               printf("%x/%d\t", buf[i+j], buf[i+j]);
+                       } else {
+                               printf("        ");
+                       }
+               }
+
+               for (j = 0; j < MAX_COLUMNS; j++) {
+                       if (i + j < len) {
+                               if (((buf[i+j]) > 31) && ((buf[i+j]) < 128))
+                                       printf("%c", buf[i+j]);
+                               else
+                                       printf(".");
+                       }
+               }
+               printf("\n");
+       }
+}
+
+_insque(new, header)
+       register struct qhdr *new, *header;
+{
+       (*new).link = (*header).link;
+       (*new).rlink = header;
+       (*(*header).link).rlink = new;
+       (*header).link = new;
+}