## diffname port/stip.c 1991/0424 ## diff -e /dev/null /n/bootesdump/1991/0424/sys/src/9/port/stip.c 0a /* * ethernet specific multiplexor for ip * * this line discipline gets pushed onto an ethernet channel * to demultiplex/multiplex ip conversations. */ #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "errno.h" #include "arp.h" #include "ipdat.h" #define DPRINT if(pip)print int pip = 0; int ipcksum = 1; extern Ipifc *ipifc; int Id = 1; Fragq *flisthead; Fragq *fragfree; QLock fraglock; Queue *Etherq; Ipaddr Myip; Ipaddr Mymask; /* Predeclaration */ static void ipetherclose(Queue*); static void ipetheriput(Queue*, Block*); static void ipetheropen(Queue*, Stream*); static void ipetheroput(Queue*, Block*); /* * the ethernet multiplexor stream module definition */ Qinfo ipinfo = { ipetheriput, ipetheroput, ipetheropen, ipetherclose, "internet" }; void initfrag(int size) { Fragq *fq, *eq; fragfree = (Fragq*)ialloc(sizeof(Fragq) * size, 0); eq = &fragfree[size]; for(fq = fragfree; fq < eq; fq++) fq->next = fq+1; fragfree[size-1].next = 0; } /* * set up an ether interface */ static void ipetheropen(Queue *q, Stream *s) { /* First open is by ipconfig and sets up channel * to ethernet */ if(!Etherq) Etherq = WR(q); DPRINT("ipetheropen EQ %lux dev=%d id=%d RD %lux WR %lux\n", Etherq, s->dev, s->id, RD(q), WR(q)); } /* * newipifc - Attach to or Create a new protocol interface */ Ipifc * newipifc(uchar ptcl, void (*recvfun)(Ipconv *, Block *bp), Ipconv *con, int max, int min, int hdrsize, char *name) { Ipifc *ifc, *free; free = 0; for(ifc = ipifc; ifc < &ipifc[conf.ipif]; ifc++) { qlock(ifc); if(ifc->protocol == ptcl) { ifc->ref++; qunlock(ifc); return(ifc); } if(!free && ifc->ref == 0) { ifc->ref = 1; free = ifc; } else qunlock(ifc); } if(!free) error(Enoifc); free->iprcv = recvfun; /* If media supports large transfer units limit maxmtu * to max ip size */ if(max > IP_MAX) max = IP_MAX; free->maxmtu = max; free->minmtu = min; free->hsize = hdrsize; free->connections = con; free->protocol = ptcl; strncpy(free->name, name, NAMELEN); qunlock(free); return(free); } static void ipetherclose(Queue *q) { if(q == Etherq) { print("stip: Clearing ether channel\n"); Etherq = 0; } DPRINT("ipetherclose RD %lux WR %lux\n", RD(q), WR(q)); } void closeipifc(Ipifc *ifc) { /* If this is the last reference to the protocol multiplexor * cancel upcalls from this stream */ qlock(ifc); if(--ifc->ref == 0) { ifc->protocol = 0; ifc->name[0] = 0; } qunlock(ifc); } static void ipetheroput(Queue *q, Block *bp) { Etherhdr *eh, *feh; int lid, len, seglen, chunk, dlen, blklen, offset; Ipifc *ifp; ushort fragoff; Block *xp, *nb; uchar *ptr; if(bp->type != M_DATA){ /* Allow one setting of the ip address */ if(!Myip && streamparse("setip", bp)) { ptr = bp->rptr; Myip = ipparse((char *)ptr); Mymask = classmask[Myip>>30]; while(*ptr != ' ' && *ptr) ptr++; if(*ptr) Mymask = ipparse((char *)ptr); freeb(bp); } else PUTNEXT(Etherq, bp); return; } ifp = (Ipifc *)(q->ptr); /* Number of bytes in ip and media header to write */ len = blen(bp); /* Fill out the ip header */ eh = (Etherhdr *)(bp->rptr); eh->vihl = IP_VER|IP_HLEN; eh->tos = 0; eh->ttl = 255; /* If we dont need to fragment just send it */ if(len <= ifp->maxmtu) { hnputs(eh->length, len-ETHER_HDR); eh->frag[0] = 0; eh->frag[1] = 0; eh->cksum[0] = 0; eh->cksum[1] = 0; hnputs(eh->cksum, ip_csum(&eh->vihl)); /* Finally put in the ethernet level information */ hnputs(eh->type, ET_IP); if(!arp_lookup(eh->dst, eh->d)) { freeb(bp); return; } PUTNEXT(Etherq, bp); return; } if(eh->frag[0] & (IP_DF>>8)) goto drop; seglen = (ifp->minmtu - (ETHER_HDR+ETHER_IPHDR)) & ~7; if(seglen < 8) goto drop; /* Make prototype output header */ hnputs(eh->type, ET_IP); if(!arp_lookup(eh->dst, eh->d)) { freeb(bp); return; } dlen = len - (ETHER_HDR+ETHER_IPHDR); xp = bp; lid = Id++; offset = ETHER_HDR+ETHER_IPHDR; while(xp && offset && offset >= BLEN(xp)) { offset -= BLEN(xp); xp = xp->next; } xp->rptr += offset; for(fragoff = 0; fragoff < dlen; fragoff += seglen) { nb = allocb(ETHER_HDR+ETHER_IPHDR+seglen); feh = (Etherhdr *)(nb->rptr); memmove(nb->wptr, eh, ETHER_HDR+ETHER_IPHDR); nb->wptr += ETHER_HDR+ETHER_IPHDR; if((fragoff + seglen) >= dlen) { seglen = dlen - fragoff; hnputs(feh->frag, fragoff>>3); } else { hnputs(feh->frag, (fragoff>>3)|IP_MF); } hnputs(feh->length, seglen + ETHER_IPHDR); hnputs(feh->id, lid); /* Copy up the data area */ chunk = seglen; while(chunk) { if(!xp) { freeb(nb); goto drop; } blklen = MIN(BLEN(xp), chunk); memmove(nb->wptr, xp->rptr, blklen); nb->wptr += blklen; xp->rptr += blklen; chunk -= blklen; if(xp->rptr == xp->wptr) xp = xp->next; } feh->cksum[0] = 0; feh->cksum[1] = 0; hnputs(feh->cksum, ip_csum(&feh->vihl)); nb->flags |= S_DELIM; PUTNEXT(Etherq, nb); } drop: freeb(bp); } /* * Input a packet and use the ip protocol to select the correct * device to pass it to. * */ static void ipetheriput(Queue *q, Block *bp) { Ipifc *ep, *ifp; Etherhdr *h; ushort frag; if(bp->type != M_DATA){ PUTNEXT(q, bp); return; } h = (Etherhdr *)(bp->rptr); /* Ensure we have enough data to process */ if(BLEN(bp) < (ETHER_HDR+ETHER_IPHDR)) { bp = pullup(bp, ETHER_HDR+ETHER_IPHDR); if(!bp) return; } if(ipcksum && ip_csum(&h->vihl)) { print("ip: checksum error (from %d.%d.%d.%d ?)\n", h->src[0], h->src[1], h->src[2], h->src[3]); goto drop; } /* Check header length and version */ if(h->vihl != (IP_VER|IP_HLEN)) goto drop; frag = nhgets(h->frag); if(frag) { h->tos = frag & IP_MF ? 1 : 0; bp = ip_reassemble(frag, bp, h); if(!bp) return; } /* * Look for an ip interface attached to this protocol */ ep = &ipifc[conf.ipif]; for(ifp = ipifc; ifp < ep; ifp++) { if(ifp->protocol == h->proto) { (*ifp->iprcv)(ifp->connections, bp); return; } } drop: freeb(bp); } Block * ip_reassemble(int offset, Block *bp, Etherhdr *ip) { Fragq *f; Ipaddr src, dst; ushort id; Block *bl, **l, *last, *prev; int ovlap, len, fragsize; src = nhgetl(ip->src); dst = nhgetl(ip->dst); id = nhgets(ip->id); for(f = flisthead; f; f = f->next) { if(f->src == src && f->dst == dst && f->id == id) break; } if(!ip->tos && (offset & ~(IP_MF|IP_DF)) == 0) { if(f) { qlock(f); ipfragfree(f); } return(bp); } BLKFRAG(bp)->foff = offset<<3; BLKFRAG(bp)->flen = nhgets(ip->length) - ETHER_IPHDR; /* Ip data length */ bp->flags &= ~S_DELIM; /* First fragment allocates a reassembly queue */ if(f == 0) { f = ipfragallo(); if(f == 0) { freeb(bp); return 0; } qlock(f); f->id = id; f->src = src; f->dst = dst; f->blist = bp; /* Check lance has handed us a contiguous buffer */ if(bp->next) panic("ip: reass ?"); qunlock(f); return 0; } qlock(f); prev = 0; l = &f->blist; for(bl = f->blist; bl && BLKFRAG(bp)->foff > BLKFRAG(bl)->foff; bl = bl->next) { prev = bl; l = &bl->next; } /* Check overlap of a previous fragment - trim away as necessary */ if(prev) { ovlap = BLKFRAG(prev)->foff + BLKFRAG(prev)->flen - BLKFRAG(bp)->foff; if(ovlap > 0) { if(ovlap > BLKFRAG(bp)->flen) { freeb(bp); qunlock(f); return 0; } BLKFRAG(bp)->flen -= ovlap; } } /* Link onto assembly queue */ bp->next = *l; *l = bp; /* Check to see if suceeding segments overlap */ if(bp->next) { l = &bp->next; end = BLKFRAG(bp)->foff + BLKFRAG(bp)->flen; /* Take completely covered segements out */ while(*l && (ovlap = (end - BLKFRAG(*l)->foff)) > 0) { if(ovlap < BLKFRAG(*l)->flen) { BLKFRAG(*l)->flen -= ovlap; (*l)->rptr += ovlap; break; } last = *l; freeb(*l); *l = last; } } /* Now look for a completed queue */ for(bl = f->blist; bl; bl = bl->next) { if((BLKIP(bl)->frag[0]&(IP_MF>>8)) == 0) goto complete; if(bl->next == 0 || BLKFRAG(bl)->foff+BLKFRAG(bl)->flen != BLKFRAG(bl->next)->foff) break; } qunlock(f); return 0; complete: bl = f->blist; last = bl; len = nhgets(BLKIP(bl)->length); bl->wptr = bl->rptr + len + ETHER_HDR; /* Pullup all the fragment headers and return a complete packet */ for(bl = bl->next; bl; bl = bl->next) { fragsize = BLKFRAG(bl)->flen; len += fragsize; bl->rptr += (ETHER_HDR+ETHER_IPHDR); bl->wptr = bl->rptr + fragsize; last = bl; } last->flags |= S_DELIM; bl = f->blist; f->blist = 0; ipfragfree(f); ip = BLKIP(bl); hnputs(ip->length, len); return(bl); } /* * ipfragfree - Free a list of fragments, fragment list must be locked */ void ipfragfree(Fragq *frag) { Block *f, *next; Fragq *fl, **l; for(f = frag->blist; f; f = next) { next = f->next; freeb(f); } frag->src = 0; frag->id = 0; qunlock(frag); qlock(&fraglock); l = &flisthead; for(fl = *l; fl; fl = fl->next) { if(fl == frag) { *l = frag->next; break; } l = &fl->next; } frag->next = fragfree; fragfree = frag; qunlock(&fraglock); } /* * ipfragallo - allocate a reassembly queue */ Fragq * ipfragallo(void) { Fragq *f; qlock(&fraglock); if(!fragfree) { qunlock(&fraglock); print("ipfragallo: no queue\n"); return 0; } f = fragfree; fragfree = f->next; f->next = flisthead; flisthead = f; qunlock(&fraglock); return f; } /* * ip_csum - Compute internet header checksums */ ushort ip_csum(uchar *addr) { int len; ulong sum = 0; len = (addr[0]&0xf)<<2; while(len > 0) { sum += addr[0]<<8 | addr[1] ; len -= 2; addr += 2; } sum = (sum & 0xffff) + (sum >> 16); sum = (sum & 0xffff) + (sum >> 16); return (sum^0xffff); } /* * ipparse - Parse an ip address out of a string */ Ipaddr classmask[4] = { 0xff000000, 0xff000000, 0xffff0000, 0xffffff00 }; Ipaddr ipparse(char *ipa) { Ipaddr address = 0; int shift; Ipaddr net; shift = 24; while(shift >= 0 && ipa != (char *)1) { address |= atoi(ipa) << shift; shift -= 8; ipa = strchr(ipa, '.')+1; } net = address & classmask[address>>30]; shift += 8; return net | ((address & ~classmask[address>>30])>>shift); } /* * XXX debugging code ! */ void ppkt(Block *bp) { uchar *x; int len, cnt = 0; Block *xp; uchar ch; if(bp) print("ppkt: %lux len %d\n", bp, blen(bp)); else print("ppkt: Null packet pointer\n"); xp = bp; while(bp) { len = BLEN(bp); x = bp->rptr; while(len--) { if(cnt%64 == 0) print("\n%.04d: ", cnt); print("%.02x ", *x++); cnt++; } bp = bp->next; } bp = xp; cnt = 0; while(bp) { len = BLEN(bp); x = bp->rptr; while(len--) { if(cnt%64 == 0) print("\n%.04d: ", cnt); ch = *x++; print("%c ", ch < ' ' || ch >= 0x7f ? '.' : ch); cnt++; } bp = bp->next; } print("\n"); } . ## diffname port/stip.c 1991/0430 ## diff -e /n/bootesdump/1991/0424/sys/src/9/port/stip.c /n/bootesdump/1991/0430/sys/src/9/port/stip.c 130,135d 74a s->opens++; /* Hold this queue in place */ } . 73c if(!Etherq) { . ## diffname port/stip.c 1991/0504 ## diff -e /n/bootesdump/1991/0430/sys/src/9/port/stip.c /n/bootesdump/1991/0504/sys/src/9/port/stip.c 75a s->inuse++; . ## diffname port/stip.c 1991/0906 ## diff -e /n/bootesdump/1991/0504/sys/src/9/port/stip.c /n/bootesdump/1991/0906/sys/src/9/port/stip.c 582,627d 304a /* Look to see if its for me before we waste time checksuming it */ if(memcmp(h->dst, Netmyip, sizeof(Netmyip)) != 0) goto drop; . 163a Netmyip[0] = (Myip>>24)&0xff; Netmyip[1] = (Myip>>16)&0xff; Netmyip[2] = (Myip>>8)&0xff; Netmyip[3] = Myip&0xff; . 30a uchar Netmyip[4]; /* In Network byte order */ . ## diffname port/stip.c 1991/1023 ## diff -e /n/bootesdump/1991/0906/sys/src/9/port/stip.c /n/bootesdump/1991/1023/sys/src/9/port/stip.c 558d ## diffname port/stip.c 1991/1027 ## diff -e /n/bootesdump/1991/1023/sys/src/9/port/stip.c /n/bootesdump/1991/1027/sys/src/9/port/stip.c 276c arpsendpkt(feh->dst, feh->d, Etherq, nb); . 274d 221,224d 203,208c arpsendpkt(eh->dst, eh->d, Etherq, bp); . ## diffname port/stip.c 1991/1029 ## diff -e /n/bootesdump/1991/1027/sys/src/9/port/stip.c /n/bootesdump/1991/1029/sys/src/9/port/stip.c 268d 266c PUTNEXT(Etherq, nb); . 203c PUTNEXT(Etherq, bp); . 201c /* Finally put in the type and pass down to the arp layer */ . ## diffname port/stip.c 1991/1106 ## diff -e /n/bootesdump/1991/1029/sys/src/9/port/stip.c /n/bootesdump/1991/1106/sys/src/9/port/stip.c 330d 325c for(ifp = ipifc; ifp < ep; ifp++) . ## diffname port/stip.c 1991/1115 ## diff -e /n/bootesdump/1991/1106/sys/src/9/port/stip.c /n/bootesdump/1991/1115/sys/src/9/port/stip.c 133a USED(q); . ## diffname port/stip.c 1991/1120 ## diff -e /n/bootesdump/1991/1115/sys/src/9/port/stip.c /n/bootesdump/1991/1120/sys/src/9/port/stip.c 134c Ipconv *ipc; ipc = (Ipconv *)(q->ptr); if(ipc) ipc->ref = 0; . 77a } else { ipc = &ipconv[s->dev][s->id]; RD(q)->ptr = (void *)ipc; WR(q)->ptr = (void *)ipc; ipc->ref = 1; . 70a Ipconv *ipc; . ## diffname port/stip.c 1991/1125 ## diff -e /n/bootesdump/1991/1120/sys/src/9/port/stip.c /n/bootesdump/1991/1125/sys/src/9/port/stip.c 312c if(memcmp(h->dst, Netmyip, sizeof(Netmyip)) != 0 && memcmp(h->dst, bcast, sizeof(bcast)) != 0) . 31a uchar bcast[4] = { 0xff, 0xff, 0xff, 0xff }; . ## diffname port/stip.c 1991/1126 ## diff -e /n/bootesdump/1991/1125/sys/src/9/port/stip.c /n/bootesdump/1991/1126/sys/src/9/port/stip.c 348a int ipforme(uchar *addr) { Ipaddr haddr; if(memcmp(addr, Netmyip, sizeof(Netmyip)) == 0) return 1; haddr = nhgetl(addr); /* My subnet broadcast */ if((haddr&Mymask) == (Myip&Mymask)) return 1; /* My network broadcast */ if((haddr&Mynetmask) == (Myip&Mynetmask)) return 1; /* Real ip broadcast */ if(haddr == 0) return 1; /* Old style 255.255.255.255 address */ if(haddr == ~0) return 1; return 0; } . 316a . 313,314c if(ipforme(h->dst) == 0) . 186a /* * Temporary Until we understand real subnets */ Mynetmask = Mymask; . 146a } . 145c if(ipc){ netdisown(ipc->net, ipc->index); . 30a Ipaddr Mynetmask; . ## diffname port/stip.c 1991/1216 ## diff -e /n/bootesdump/1991/1126/sys/src/9/port/stip.c /n/bootesdump/1991/1216/sys/src/9/port/stip.c 569a f->age = TK2MS(MACHP(0)->ticks)/1000 + 600; . 214a hnputs(eh->id, Id++); . ## diffname port/stip.c 1991/1219 ## diff -e /n/bootesdump/1991/1216/sys/src/9/port/stip.c /n/bootesdump/1991/1219/sys/src/9/port/stip.c 231c seglen = (ifp->maxmtu - (ETHER_HDR+ETHER_IPHDR)) & ~7; . ## diffname port/stip.c 1992/0101 ## diff -e /n/bootesdump/1991/1219/sys/src/9/port/stip.c /n/bootesdump/1992/0101/sys/src/9/port/stip.c 575d 571c f->age = TK2MS(MACHP(0)->ticks) + 30000; . 562,565c while(fragfree == 0) { for(f = flisthead; f; f = f->next) if(canqlock(f)) { qunlock(&fraglock); ipfragfree(f); break; } qlock(&fraglock); . 549,550d 531a frag->blist = 0; . 525,528c freeb(frag->blist); . 522d 488c . 482,484c pktposn += BLKFRAG(bl)->flen; . 479a if(BLKFRAG(bl)->foff != pktposn) break; . 478c pktposn = 0; . 418,421d 404c if(f != 0) { . 401a qunlock(&fraglock); . 399c if(f->src == src) if(f->dst == dst) if(f->id == id) . 397a qlock(&fraglock); . 392c int ovlap, len, fragsize, pktposn; . ## diffname port/stip.c 1992/0102 ## diff -e /n/bootesdump/1992/0101/sys/src/9/port/stip.c /n/bootesdump/1992/0102/sys/src/9/port/stip.c 525c if(frag->blist) freeb(frag->blist); . ## diffname port/stip.c 1992/0107 ## diff -e /n/bootesdump/1992/0102/sys/src/9/port/stip.c /n/bootesdump/1992/0107/sys/src/9/port/stip.c 566d 562,563c ipfragfree(f, 0); . 547c if(lockq) qunlock(&fraglock); . 533c if(lockq) qlock(&fraglock); . 521c ipfragfree(Fragq *frag, int lockq) . 508c ipfragfree(f, 1); . 428,430d 410c ipfragfree(f, 1); . 393a /* Check lance has handed us a contiguous buffer */ if(bp->next) panic("ip: reass ?"); . 316c if(bp == 0) . ## diffname port/stip.c 1992/0111 ## diff -e /n/bootesdump/1992/0107/sys/src/9/port/stip.c /n/bootesdump/1992/0111/sys/src/9/port/stip.c 13c #include "../port/error.h" . ## diffname port/stip.c 1992/0211 ## diff -e /n/bootesdump/1992/0111/sys/src/9/port/stip.c /n/bootesdump/1992/0211/sys/src/9/port/stip.c 190,192d 178c if(streamparse("setip", bp)) { if(strncmp(eve, u->p->user, sizeof(eve)) != 0) error(Eperm); . ## diffname port/stip.c 1992/0213 ## diff -e /n/bootesdump/1992/0211/sys/src/9/port/stip.c /n/bootesdump/1992/0213/sys/src/9/port/stip.c 383a . 374,381d 370,371c /* if we haven't set an address yet, accept anything we get */ if(Myip[Myself] == 0) . 366,368c /* try my address plus all the forms of ip broadcast */ for(p = Myip; p < &Myip[7]; p++) if(haddr == *p); return 1; . 361,363d 359a Ipaddr *p; . 355a void ipsetaddrs(void) { Myip[1] = ~0; /* local broadcast */ Myip[2] = 0; /* local broadcast - old */ Myip[Mysubnet] = Myip[Myself] | ~Mynetmask; /* subnet broadcast */ Myip[Mysubnet+1] = Myip[Myself] & Mynetmask; /* subnet broadcast - old */ Myip[Mynet] = Myip[Myself] | ~Mymask; /* net broadcast */ Myip[Mynet+1] = Myip[Myself] & Mymask; /* net broadcast - old */ } . 193a ipsetaddrs(); . 191,192c Mynetmask = ipparse((char *)ptr); else Mynetmask = Mymask; . 182,187c Myip[Myself] = ipparse((char *)ptr); Netmyip[0] = (Myip[Myself]>>24)&0xff; Netmyip[1] = (Myip[Myself]>>16)&0xff; Netmyip[2] = (Myip[Myself]>>8)&0xff; Netmyip[3] = Myip[Myself]&0xff; Mymask = classmask[Myip[Myself]>>30]; . 81a ipsetaddrs(); . 39a static void ipsetaddrs(void); . 33a Ipaddr Me[7]; /* possible addresses for me */ . 29c Ipaddr Myip[4]; . ## diffname port/stip.c 1992/0214 ## diff -e /n/bootesdump/1992/0213/sys/src/9/port/stip.c /n/bootesdump/1992/0214/sys/src/9/port/stip.c 364c Myip[Mybcast] = ~0; /* local broadcast */ . 41d 34d 29c Ipaddr Myip[7]; . ## diffname port/stip.c 1992/0304 ## diff -e /n/bootesdump/1992/0214/sys/src/9/port/stip.c /n/bootesdump/1992/0304/sys/src/9/port/stip.c 478c last = (*l)->next; . ## diffname port/stip.c 1992/0307 ## diff -e /n/bootesdump/1992/0304/sys/src/9/port/stip.c /n/bootesdump/1992/0307/sys/src/9/port/stip.c 473a fragstat.succall++; . 472c while(*l){ ovlap = end - BLKFRAG(*l)->foff; if(ovlap <= 0) break; fragstat.succ++; . 454c fragstat.prev++; if(ovlap >= BLKFRAG(bp)->flen) { fragstat.prevall++; . 389a typedef struct Fragstat Fragstat; struct Fragstat { ulong prev; ulong prevall; ulong succ; ulong succall; }; Fragstat fragstat; . ## diffname port/stip.c 1992/0319 ## diff -e /n/bootesdump/1992/0307/sys/src/9/port/stip.c /n/bootesdump/1992/0319/sys/src/9/port/stip.c 494c } . 479c /* Check to see if succeeding segments overlap */ . 407a int end; . ## diffname port/stip.c 1992/0321 ## diff -e /n/bootesdump/1992/0319/sys/src/9/port/stip.c /n/bootesdump/1992/0321/sys/src/9/port/stip.c 8c #include "../port/lib.h" . ## diffname port/stip.c 1992/0326 ## diff -e /n/bootesdump/1992/0321/sys/src/9/port/stip.c /n/bootesdump/1992/0326/sys/src/9/port/stip.c 501a /* * look for a complete packet. if we get to a fragment * without IP_MF set, we're done. */ . 496a (*l)->next = 0; . 492a BLKFRAG(*l)->foff += ovlap; . 472c BLKFRAG(prev)->flen -= ovlap; . 453a /* * find the new fragment's position in the queue */ . 426a /* * if this isn't a fragmented packet, accept it * and get rid of any fragments that might go * with it. */ . 417a /* * find a reassembly queue for this fragment */ . ## diffname port/stip.c 1992/0622 ## diff -e /n/bootesdump/1992/0326/sys/src/9/port/stip.c /n/bootesdump/1992/0622/sys/src/9/port/stip.c 58c fragfree = (Fragq*)xalloc(sizeof(Fragq) * size); . ## diffname port/stip.c 1992/0623 ## diff -e /n/bootesdump/1992/0622/sys/src/9/port/stip.c /n/bootesdump/1992/0623/sys/src/9/port/stip.c 148c netdisown(ipc); . ## diffname port/stip.c 1992/0626 ## diff -e /n/bootesdump/1992/0623/sys/src/9/port/stip.c /n/bootesdump/1992/0626/sys/src/9/port/stip.c 354c } . 348,351c for(ifp = ipifc; ; ifp++){ ifc = *ifp; if(ifc == 0) break; if(ifc->protocol == h->proto) { (*ifc->iprcv)(ifc, bp); . 304c Ipifc *ifc, **ifp; . 153,166d 137,138c qunlock(ifc); . 134,135c ifc->protocol = ptcl; ifc->inited = 1; . 129,132c ifc->maxmtu = max; ifc->minmtu = min; ifc->hsize = hdrsize; . 120,124d 102,118c qlock(ifc); ifc->iprcv = recvfun; . 97,100c void initipifc(Ipifc *ifc, uchar ptcl, void (*recvfun)(Ipifc*, Block *bp), int max, int min, int hdrsize, char *name) . 95c * initipifc - set parameters of an ip protocol interface . 84c ipc = ipcreateconv(ipifc[s->dev], s->id); . 20d ## diffname port/stip.c 1992/0711 ## diff -e /n/bootesdump/1992/0626/sys/src/9/port/stip.c /n/bootesdump/1992/0711/sys/src/9/port/stip.c 98c int min, int hdrsize) . ## diffname port/stip.c 1992/0724 ## diff -e /n/bootesdump/1992/0711/sys/src/9/port/stip.c /n/bootesdump/1992/0724/sys/src/9/port/stip.c 469a /* move up ether+ip hdrs */ memmove((*l)->rptr + ovlap, (*l)->rptr, ETHER_HDR+ETHER_IPHDR); . ## diffname port/stip.c 1992/0913 ## diff -e /n/bootesdump/1992/0724/sys/src/9/port/stip.c /n/bootesdump/1992/0913/sys/src/9/port/stip.c 405c return bp; . 392d 387,390c for(f = flisthead; f; f = f->next) if(f->src == src && f->dst == dst && f->id == id) . 375c /* Check ethrnet has handed us a contiguous buffer */ . ## diffname port/stip.c 1993/0123 ## diff -e /n/bootesdump/1992/0913/sys/src/9/port/stip.c /n/bootesdump/1993/0123/sys/src/9/port/stip.c 459c ovlap = fend - BLKFRAG(*l)->foff; . 456c fend = BLKFRAG(bp)->foff + BLKFRAG(bp)->flen; . 373c int fend; . ## diffname port/stip.c 1993/0501 ## diff -e /n/bootesdump/1993/0123/sys/src/9/port/stip.c /n/fornaxdump/1993/0501/sys/src/brazil/port/stip.c 459c ovlap = end - BLKFRAG(*l)->foff; . 456c end = BLKFRAG(bp)->foff + BLKFRAG(bp)->flen; . 373c int end; . 142c if(strncmp(eve, up->user, sizeof(eve)) != 0) . ## diffname port/stip.c 1993/0804 # deleted ## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/stip.c /n/fornaxdump/1993/0804/sys/src/brazil/port/stip.c 1,635d