## diffname port/stnoether.c 1990/1210 ## diff -e /dev/null /n/bootesdump/1990/1210/sys/src/9/port/stnoether.c 0a /* * ethernet specific multiplexor for nonet * * this line discipline gets pushed onto an ethernet channel * to demultiplex/multiplex nonet conversations. */ #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "errno.h" static void etherparse(uchar*, char*); static void noetherclose(Queue*); static void noetheriput(Queue*, Block*); static void noetheropen(Queue*, Stream*); static void noetheroput(Queue*, Block*); /* * ethernet header of a packet */ typedef struct Etherhdr Etherhdr; struct Etherhdr { uchar d[6]; uchar s[6]; uchar type[2]; uchar circuit[3]; /* circuit number */ uchar flag; uchar mid; /* message id */ uchar ack; /* piggy back ack */ uchar remain[2]; /* count of remaing bytes of data */ uchar sum[2]; /* checksum (0 means none) */ }; #define EHDRSIZE 24 #define EMAXBODY (1514-HDRSIZE) /* maximum ethernet packet body */ #define ETHER_TYPE 0x900 /* most significant byte last */ /* * the ethernet multiplexor stream module definition */ Qinfo noetherinfo = { noetheriput, noetheroput, noetheropen, noetherclose, "noether" }; /* * perform the ether specific part of nonetconnect. just stick * the address into the prototype header. */ void noetherconnect(Noconv *cp, char *ea) { Etherhdr *eh; eh = (Etherhdr *)cp->media->rptr; etherparse(eh->d, ea); eh->type[0] = ETHER_TYPE>>8; eh->type[1] = ETHER_TYPE; } /* * set up an ether interface */ static void noetheropen(Queue *q, Stream *s) { nonetnewifc(q, s, 1514, 60, 14, noetherconnect); } /* * tear down an ether interface */ static void noetherclose(Queue *q) { Noifc *ifc; ifc = (Noifc *)(q->ptr); nonetfreeifc(ifc); } /* * configure the system */ static void noetheroput(Queue *q, Block *bp) { Noifc *ifc; ifc = (Noifc *)(q->ptr); if(bp->type != M_DATA){ if(streamparse("config", bp)){ if(*bp->rptr == 0) strcpy(ifc->name, "nonet"); else strncpy(ifc->name, (char *)bp->rptr, sizeof(ifc->name)); } else PUTNEXT(q, bp); return; } PUTNEXT(q, bp); } /* * Input a packet and use the ether address to select the correct * nonet device to pass it to. * * Simplifying assumption: one put == one packet && the complete header * is in the first block. If this isn't true, demultiplexing will not work. */ static void noetheriput(Queue *q, Block *bp) { Noifc *ifc; int circuit; Noconv *cp, *ep; Etherhdr *h; Etherhdr *ph; ulong s; Block *nbp; int next; Nocall *clp; if(bp->type != M_DATA){ PUTNEXT(q, bp); return; } ifc = (Noifc *)(q->ptr); h = (Etherhdr *)(bp->rptr); circuit = (h->circuit[2]<<16) | (h->circuit[1]<<8) | h->circuit[0]; s = (h->sum[1]<<8) | h->sum[0]; if(s && s!=nonetcksum(bp, 14)){ print("checksum error %ux %ux\n", s, (h->sum[1]<<8) | h->sum[0]); freeb(bp); return; } /* * look for an existing circuit. */ ep = &ifc->conv[conf.nnoconv]; for(cp = &ifc->conv[0]; cp < ep; cp++){ if(circuit==cp->rcvcircuit && canqlock(cp)){ ph = (Etherhdr *)(cp->media->rptr); if(circuit == cp->rcvcircuit && memcmp(ph->d, h->s, sizeof(h->s)) == 0){ cp->hdr->flag &= ~NO_NEWCALL; bp->rptr += ifc->hsize; nonetrcvmsg(cp, bp); qunlock(cp); return; } qunlock(cp); } } /* * if not a new call, then its misaddressed */ if((h->flag & NO_NEWCALL) == 0) { freeb(bp); return; } /* * Queue call in a circular queue and wakeup a listener. */ lock(&ifc->lock); next = (ifc->wptr + 1) % Nnocalls; if(next == ifc->rptr){ /* no room in the queue */ unlock(&ifc->lock); freeb(bp); return; } clp = &ifc->call[ifc->rptr]; sprint(clp->raddr, "%.2ux%.2ux%.2ux%.2ux%.2ux%.2ux", h->s[0], h->s[1], h->s[2], h->s[3], h->s[4], h->s[5]); clp->circuit = circuit^1; bp->rptr += ifc->hsize; clp->msg = bp; ifc->wptr = next; unlock(&ifc->lock); wakeup(&ifc->listenr); } /* * parse an ethernet address (assumed to be 12 ascii hex digits) */ static void etherparse(uchar *to, char *from) { int tdig; int fdig; int i; if(strlen(from) != 12) error(Ebadnet); for(i = 0; i < 6; i++){ fdig = *from++; tdig = fdig > 'a' ? (fdig - 'a' + 10) : (fdig > 'A' ? (fdig - 'A' + 10) : (fdig - '0')); fdig = *from++; tdig <<= 4; tdig |= fdig > 'a' ? (fdig - 'a' + 10) : (fdig > 'A' ? (fdig - 'A' + 10) : (fdig - '0')); *to++ = tdig; } } . ## diffname port/stnoether.c 1990/1214 ## diff -e /n/bootesdump/1990/1210/sys/src/9/port/stnoether.c /n/bootesdump/1990/1214/sys/src/9/port/stnoether.c 65c eh->type[1] = ETHER_TYPE & 0xff; . ## diffname port/stnoether.c 1990/1229 ## diff -e /n/bootesdump/1990/1214/sys/src/9/port/stnoether.c /n/bootesdump/1990/1229/sys/src/9/port/stnoether.c 175a DPRINT("call in\n"); . 168a DPRINT("misaddressed nonet packet %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", circuit, h->s[0], h->s[1], h->s[2], h->s[3], h->s[4], h->s[5]); . 150a DPRINT("checking %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", cp->rcvcircuit, ph->d[0], ph->d[1], ph->d[2], ph->d[3], ph->d[4], ph->d[5]); . 14a #define DPRINT if(pnonet)print extern int pnonet; . ## diffname port/stnoether.c 1990/1231 ## diff -e /n/bootesdump/1990/1229/sys/src/9/port/stnoether.c /n/bootesdump/1990/1231/sys/src/9/port/stnoether.c 154d ## diffname port/stnoether.c 1991/0112 ## diff -e /n/bootesdump/1990/1231/sys/src/9/port/stnoether.c /n/bootesdump/1991/0112/sys/src/9/port/stnoether.c 189c clp = &ifc->call[ifc->wptr]; . ## diffname port/stnoether.c 1991/0119 ## diff -e /n/bootesdump/1991/0112/sys/src/9/port/stnoether.c /n/bootesdump/1991/0119/sys/src/9/port/stnoether.c 171,173c if((h->flag & NO_NEWCALL) == 0){ noetherbad(ifc, bp); . 158d 114a * respond to a misaddressed message with a close */ void noetherbad(Noifc *ifc, Block *bp) { Etherhdr *eh, *neh; int circuit; Block *nbp; /* * crack the packet header */ eh = (Etherhdr *)bp->rptr; print("bad c %d m %d f %d\n", eh->circuit[0], eh->mid, eh->flag); if(eh->flag & NO_RESET) goto out; /* * craft an error reply */ print("sending reset\n"); nbp = allocb(60); nbp->flags |= S_DELIM; nbp->wptr = nbp->rptr + 60; memset(bp->rptr, 0, 60); neh = (Etherhdr *)nbp->rptr; memcpy(neh, eh, sizeof(Etherhdr)); neh->circuit[0] ^= 1; neh->remain[0] = neh->remain[1] = 0; neh->flag = NO_HANGUP | NO_RESET; neh->ack = eh->mid; neh->mid = eh->ack; memcpy(neh->s, eh->d, sizeof(neh->s)); memcpy(neh->d, eh->s, sizeof(neh->d)); nonetcksum(nbp, 14); PUTNEXT(ifc->wq, nbp); out: freeb(bp); } /* . ## diffname port/stnoether.c 1991/0206 ## diff -e /n/bootesdump/1991/0119/sys/src/9/port/stnoether.c /n/bootesdump/1991/0206/sys/src/9/port/stnoether.c 195c if(circuit==cp->rcvcircuit){ qlock(cp); . 128c print("bad %.2ux%.2ux%.2ux%.2ux%.2ux%.2ux c %d m %d f %d\n", eh->s[0], eh->s[1], eh->s[2], eh->s[3], eh->s[4], eh->s[5], eh->circuit[0], eh->mid, eh->flag); . ## diffname port/stnoether.c 1991/0209 ## diff -e /n/bootesdump/1991/0206/sys/src/9/port/stnoether.c /n/bootesdump/1991/0209/sys/src/9/port/stnoether.c 131a goto out; /* * only one reset per message */ r = (eh->remain[1]<<8) | eh->remain[0]; if(r<0) . 122a int r; . ## diffname port/stnoether.c 1991/0318 ## diff -e /n/bootesdump/1991/0209/sys/src/9/port/stnoether.c /n/bootesdump/1991/0318/sys/src/9/port/stnoether.c 157,158c memmove(neh->s, eh->d, sizeof(neh->s)); memmove(neh->d, eh->s, sizeof(neh->d)); . 151c memmove(neh, eh, sizeof(Etherhdr)); . 110a . 77c nonetnewifc(q, s, 1514, ETHERMINMTU, 14, noetherconnect); . ## diffname port/stnoether.c 1991/0319 ## diff -e /n/bootesdump/1991/0318/sys/src/9/port/stnoether.c /n/bootesdump/1991/0319/sys/src/9/port/stnoether.c 196c /* print("checksum error %ux %ux\n", s, (h->sum[1]<<8) | h->sum[0]); /**/ . ## diffname port/stnoether.c 1991/0320 ## diff -e /n/bootesdump/1991/0319/sys/src/9/port/stnoether.c /n/bootesdump/1991/0320/sys/src/9/port/stnoether.c 196c print("checksum error %ux %ux\n", s, (h->sum[1]<<8) | h->sum[0]); /**/ . ## diffname port/stnoether.c 1991/0328 ## diff -e /n/bootesdump/1991/0320/sys/src/9/port/stnoether.c /n/bootesdump/1991/0328/sys/src/9/port/stnoether.c 224c noetherbad(ifc, bp, circuit); . 135a ep = &ifc->conv[conf.nnoconv]; for(cp = &ifc->conv[0]; cp < ep; cp++){ qlock(cp); if(cp->media){ neh = (Etherhdr *)(cp->media->rptr); print("%lux %.2ux%.2ux%.2ux%.2ux%.2ux%.2ux %s c %d\n", neh, neh->s[0], neh->s[1], neh->s[2], neh->s[3], neh->s[4], neh->s[5], cp->raddr, cp->rcvcircuit); } qunlock(cp); } . 132c eh->s[5], circuit, eh->mid, eh->flag); . 124a Noconv *cp, *ep; . 122d 119c noetherbad(Noifc *ifc, Block *bp, int circuit) . 13a #include "../port/nonet.h" . ## diffname port/stnoether.c 1991/0330 ## diff -e /n/bootesdump/1991/0328/sys/src/9/port/stnoether.c /n/bootesdump/1991/0330/sys/src/9/port/stnoether.c 272a #ifdef MAGNUM /* Dot means ip address */ if(strchr(from, '.')) { ip = ipparse(from); if(ip == 0) error(Ebadnet); hnputl(nip, ip); if(arp_lookup(nip, to)) return; } #endif . 269a ulong ip; uchar nip[4]; . ## diffname port/stnoether.c 1991/0401 ## diff -e /n/bootesdump/1991/0330/sys/src/9/port/stnoether.c /n/bootesdump/1991/0401/sys/src/9/port/stnoether.c 209c /* print("checksum error %ux %ux\n", s, (h->sum[1]<<8) | h->sum[0]); /**/ . ## diffname port/stnoether.c 1991/0407 ## diff -e /n/bootesdump/1991/0401/sys/src/9/port/stnoether.c /n/bootesdump/1991/0407/sys/src/9/port/stnoether.c 255c eh->s[0], eh->s[1], eh->s[2], eh->s[3], eh->s[4], eh->s[5]); . 236c if((nh->flag & NO_NEWCALL) == 0){ . 223c && memcmp(peh->d, eh->s, sizeof(eh->s)) == 0){ . 221c peh = (Etherpkt*)cp->media->rptr; . 204,209c ifc = (Noifc*)q->ptr; eh = (Etherpkt*)bp->rptr; nh = (Nohdr*)eh->data; circuit = (nh->circuit[2]<<16) | (nh->circuit[1]<<8) | nh->circuit[0]; s = (nh->sum[1]<<8) | nh->sum[0]; if(s && s!=nonetcksum(bp, ETHERHDRSIZE)){ /* print("checksum error %ux %ux\n", s, (nh->sum[1]<<8) | nh->sum[0]); /**/ . 192,193c Etherpkt *eh, *peh; Nohdr *nh; . 164,170c neh = (Etherpkt *)nbp->rptr; nnh = (Nohdr*)neh->data; memmove(neh, eh, EHDRSIZE); nnh->circuit[0] ^= 1; nnh->remain[0] = nnh->remain[1] = 0; nnh->flag = NO_HANGUP | NO_RESET; nnh->ack = nh->mid; nnh->mid = nh->ack; . 152c r = (nh->remain[1]<<8) | nh->remain[0]; . 137,148d 133,134c eh->s[5], circuit, nh->mid, nh->flag); if(nh->flag & NO_RESET) . 130c eh = (Etherpkt*)bp->rptr; nh = (Nohdr*)eh->data; . 122c Etherpkt *eh, *neh; Nohdr *nh, *nnh; . 101c ifc = (Noifc*)q->ptr; . 89c ifc = (Noifc*)q->ptr; . 78c nonetnewifc(q, s, ETHERMAXTU, ETHERMINTU, ETHERHDRSIZE, noetherconnect); . 66c eh = (Etherpkt*)cp->media->rptr; . 64c Etherpkt *eh; . 28,42c #define EHDRSIZE (ETHERHDRSIZE + NO_HDRSIZE) #define EMAXBODY (ETHERMAXTU - EHDRSIZE) /* maximum ethernet packet body */ . ## diffname port/stnoether.c 1991/0410 ## diff -e /n/bootesdump/1991/0407/sys/src/9/port/stnoether.c /n/bootesdump/1991/0410/sys/src/9/port/stnoether.c 151c nonetcksum(nbp, ETHERHDRSIZE); . ## diffname port/stnoether.c 1991/0413 ## diff -e /n/bootesdump/1991/0410/sys/src/9/port/stnoether.c /n/bootesdump/1991/0413/sys/src/9/port/stnoether.c 64a streamenter(s); . ## diffname port/stnoether.c 1991/0417 ## diff -e /n/bootesdump/1991/0413/sys/src/9/port/stnoether.c /n/bootesdump/1991/0417/sys/src/9/port/stnoether.c 137c /* print("sending reset\n"); /**/ . 123c eh->s[5], circuit, nh->mid, nh->flag); /**/ . 121c /* print("bad %.2ux%.2ux%.2ux%.2ux%.2ux%.2ux c %d m %d f %d\n", . ## diffname port/stnoether.c 1991/0510 ## diff -e /n/bootesdump/1991/0417/sys/src/9/port/stnoether.c /n/bootesdump/1991/0510/sys/src/9/port/stnoether.c 189c print("checksum error %ux %ux\n", s, (nh->sum[1]<<8) | nh->sum[0]); /**/ . ## diffname port/stnoether.c 1991/0511 ## diff -e /n/bootesdump/1991/0510/sys/src/9/port/stnoether.c /n/bootesdump/1991/0511/sys/src/9/port/stnoether.c 189c /* print("checksum error %ux %ux\n", s, (nh->sum[1]<<8) | nh->sum[0]); /**/ . ## diffname port/stnoether.c 1991/0608 ## diff -e /n/bootesdump/1991/0511/sys/src/9/port/stnoether.c /n/bootesdump/1991/0608/sys/src/9/port/stnoether.c 278,279c tdig |= fdig >= 'a' ? ((fdig - 'a') + 10) : (fdig >= 'A' ? ((fdig - 'A') + 10) : (fdig - '0')); . 273,276c fdig = (*from++)&0x7f; tdig = fdig >= 'a' ? ((fdig - 'a') + 10) : (fdig >= 'A' ? ((fdig - 'A') + 10) : (fdig - '0')); fdig = (*from++)&0x7f; . ## diffname port/stnoether.c 1991/1107 ## diff -e /n/bootesdump/1991/0608/sys/src/9/port/stnoether.c /n/bootesdump/1991/1107/sys/src/9/port/stnoether.c 199,203c nbp = cp->media; if(nbp == 0) continue; peh = (Etherpkt*)nbp->rptr; if(circuit==cp->rcvcircuit && memcmp(peh->d, eh->s, sizeof(eh->s))==0){ if(!canqlock(cp)){ freeb(bp); return; } peh = (Etherpkt*)nbp->rptr; if(circuit==cp->rcvcircuit && memcmp(peh->d, eh->s, sizeof(eh->s))==0){ . ## diffname port/stnoether.c 1991/1121 ## diff -e /n/bootesdump/1991/1107/sys/src/9/port/stnoether.c /n/bootesdump/1991/1121/sys/src/9/port/stnoether.c 248a DPRINT("call from %s wptr %d\n", clp->raddr, ifc->wptr); . 231d 223c if((nh->flag & NO_NEWCALL) == 0 || nh->mid != 1){ . ## diffname port/stnoether.c 1991/1214 ## diff -e /n/bootesdump/1991/1121/sys/src/9/port/stnoether.c /n/bootesdump/1991/1214/sys/src/9/port/stnoether.c 189c print("checksum error %ux %ux\n", s, (nh->sum[1]<<8) | nh->sum[0]); /**/ . ## diffname port/stnoether.c 1992/0111 ## diff -e /n/bootesdump/1991/1214/sys/src/9/port/stnoether.c /n/bootesdump/1992/0111/sys/src/9/port/stnoether.c 13c #include "../port/error.h" . ## diffname port/stnoether.c 1992/0114 ## diff -e /n/bootesdump/1992/0111/sys/src/9/port/stnoether.c /n/bootesdump/1992/0114/sys/src/9/port/stnoether.c 277c error(Enetaddr); . 268c error(Enetaddr); . ## diffname port/stnoether.c 1992/0303 # deleted ## diff -e /n/bootesdump/1992/0114/sys/src/9/port/stnoether.c /n/bootesdump/1992/0303/sys/src/9/port/stnoether.c 1,289d