/sys/src/9/ip/icmp6.c % cat >/sys/lib/dist/changes/1176939006.0.txt << EOF Code cleanup • Whitespace / style • Comments • Where possible, condense conditionals EOF [geoff] --rw-rw-r-- M 44 presotto sys 17893 Apr 18 19:10 sys/src/9/ip/icmp6.c /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:284,293 - /n/sources/plan9/sys/src/9/ip/icmp6.c:284,293 static void goticmpkt6(Proto *icmp, Block *bp, int muxkey) { - ushort recid; - uchar *addr; - Conv **c, *s; - IPICMP *p = (IPICMP *)bp->rp; + ushort recid; + uchar *addr; + Conv **c, *s; + IPICMP *p = (IPICMP *)bp->rp; if(muxkey == 0) { recid = nhgets(p->icmpid); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:609,620 - /n/sources/plan9/sys/src/9/ip/icmp6.c:609,620 goto err; } - if(p->type == NbrSolicit) - if(ipcmp(np->src, v6Unspecified) == 0) - if(!issmcast(np->dst) || optexsts(np)) { - ipriv->stats[AddrmxpErrs6]++; - goto err; - } + if (p->type == NbrSolicit && + ipcmp(np->src, v6Unspecified) == 0) + if(!issmcast(np->dst) || optexsts(np)) { + ipriv->stats[AddrmxpErrs6]++; + goto err; + } if(p->type == NbrAdvert) if(isv6mcast(np->dst) && /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:670,678 - /n/sources/plan9/sys/src/9/ip/icmp6.c:670,676 goto err; } } - return 1; - err: ipriv->stats[InErrors6]++; return 0; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:692,698 - /n/sources/plan9/sys/src/9/ip/icmp6.c:690,696 for(lifc = ifc->lifc; lifc; lifc = lifc->next) if(ipcmp(lifc->local, target) == 0) { - t = (lifc->tentative) ? t_unitent : t_unirany; + t = (lifc->tentative)? t_unitent: t_unirany; runlock(ifc); return t; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:761,767 - /n/sources/plan9/sys/src/9/ip/icmp6.c:759,765 } p = (IPICMP *)bp->rp; pr = Fsrcvpcolx(icmp->f, p->proto); - if(pr != nil && pr->advise != nil) { + if(pr && pr->advise) { (*pr->advise)(pr, bp, m2); return; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/icmp6.c:837,843 - /n/sources/plan9/sys/src/9/ip/icmp6.c:835,840 break; } return; - raise: freeblist(bp); } [geoff] --rw-rw-r-- M 44 glenda sys 33863 Apr 18 19:12 sys/src/9/ip/ipifc.c /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:13,27 - /n/sources/plan9/sys/src/9/ip/ipifc.c:13,24 enum { Maxmedia = 32, Nself = Maxmedia*5, - NHASH = (1<<6), + NHASH = 1<<6, NCACHE = 256, QMAX = 64*1024-1, }; - Medium *media[Maxmedia] = - { - 0 - }; + Medium *media[Maxmedia] = { 0 }; /* * cache of local addresses (addresses we answer to) /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:144,158 - /n/sources/plan9/sys/src/9/ip/ipifc.c:141,155 ifc->maxtu = ifc->m->maxtu; if(ifc->m->unbindonclose == 0) ifc->conv->inuse++; - ifc->rp.mflag = 0; // default not managed + ifc->rp.mflag = 0; /* default not managed */ ifc->rp.oflag = 0; - ifc->rp.maxraint = 600000; // millisecs + ifc->rp.maxraint = 600000; /* millisecs */ ifc->rp.minraint = 200000; - ifc->rp.linkmtu = 0; // no mtu sent + ifc->rp.linkmtu = 0; /* no mtu sent */ ifc->rp.reachtime = 0; ifc->rp.rxmitra = 0; ifc->rp.ttl = MAXTTL; - ifc->rp.routerlt = 3*(ifc->rp.maxraint); + ifc->rp.routerlt = 3 * ifc->rp.maxraint; /* any ancillary structures (like routes) no longer pertain */ ifc->ifcid++; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:189,195 - /n/sources/plan9/sys/src/9/ip/ipifc.c:186,192 ifc->ifcid++; /* disassociate device */ - if(ifc->m != nil && ifc->m->unbind) + if(ifc->m && ifc->m->unbind) (*ifc->m->unbind)(ifc); memset(ifc->dev, 0, sizeof(ifc->dev)); ifc->arg = nil; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:213,219 - /n/sources/plan9/sys/src/9/ip/ipifc.c:210,218 return nil; } - char sfixedformat[] = "device %s maxtu %d sendra %d recvra %d mflag %d oflag %d maxraint %d minraint %d linkmtu %d reachtime %d rxmitra %d ttl %d routerlt %d pktin %lud pktout %lud errin %lud errout %lud\n"; + char sfixedformat[] = "device %s maxtu %d sendra %d recvra %d mflag %d oflag" + " %d maxraint %d minraint %d linkmtu %d reachtime %d rxmitra %d ttl %d routerlt" + " %d pktin %lud pktout %lud errin %lud errout %lud\n"; char slineformat[] = " %-40I %-10M %-40I %-12lud %-12lud\n"; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:225,231 - /n/sources/plan9/sys/src/9/ip/ipifc.c:224,229 int m; ifc = (Ipifc*)c->ptcl; - m = snprint(state, n, sfixedformat, ifc->dev, ifc->maxtu, ifc->sendra6, ifc->recvra6, ifc->rp.mflag, ifc->rp.oflag, ifc->rp.maxraint, /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:235,243 - /n/sources/plan9/sys/src/9/ip/ipifc.c:233,240 rlock(ifc); for(lifc = ifc->lifc; lifc && n > m; lifc = lifc->next) - m += snprint(state+m, n - m, slineformat, - lifc->local, lifc->mask, lifc->remote, - lifc->validlt, lifc->preflt); + m += snprint(state+m, n - m, slineformat, lifc->local, + lifc->mask, lifc->remote, lifc->validlt, lifc->preflt); if(ifc->lifc == nil) m += snprint(state+m, n - m, "\n"); runlock(ifc); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:253,259 - /n/sources/plan9/sys/src/9/ip/ipifc.c:250,255 int m; ifc = (Ipifc*)c->ptcl; - m = 0; rlock(ifc); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:337,343 - /n/sources/plan9/sys/src/9/ip/ipifc.c:333,339 ifc = (Ipifc*)c->ptcl; m = ifc->m; - if(m != nil && m->unbindonclose) + if(m && m->unbindonclose) ipifcunbind(ifc); } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:349,358 - /n/sources/plan9/sys/src/9/ip/ipifc.c:345,352 { int mtu; - if(argc < 2) + if(argc < 2 || ifc->m == nil) return Ebadarg; - if(ifc->m == nil) - return Ebadarg; mtu = strtoul(argv[1], 0, 0); if(mtu < ifc->m->mintu || mtu > ifc->m->maxtu) return Ebadarg; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:366,377 - /n/sources/plan9/sys/src/9/ip/ipifc.c:360,370 char* ipifcadd(Ipifc *ifc, char **argv, int argc, int tentative, Iplifc *lifcp) { + int i, type, mtu, sendnbrdisc = 0; uchar ip[IPaddrlen], mask[IPaddrlen], rem[IPaddrlen]; uchar bcast[IPaddrlen], net[IPaddrlen]; Iplifc *lifc, **l; - int i, type, mtu; Fs *f; - int sendnbrdisc = 0; if(ifc->m == nil) return "ipifc not yet bound to device"; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:412,418 - /n/sources/plan9/sys/src/9/ip/ipifc.c:405,410 break; default: return Ebadarg; - break; } if(isv4(ip)) tentative = 0; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:419,425 - /n/sources/plan9/sys/src/9/ip/ipifc.c:411,417 wlock(ifc); /* ignore if this is already a local address for this ifc */ - for(lifc = ifc->lifc; lifc; lifc = lifc->next) { + for(lifc = ifc->lifc; lifc; lifc = lifc->next) if(ipcmp(lifc->local, ip) == 0) { if(lifc->tentative != tentative) lifc->tentative = tentative; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:432,438 - /n/sources/plan9/sys/src/9/ip/ipifc.c:424,429 } goto out; } - } /* add the address to the list of logical ifc's for this ifc */ lifc = smalloc(sizeof(Iplifc)); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:447,459 - /n/sources/plan9/sys/src/9/ip/ipifc.c:438,449 lifc->validlt = lifcp->validlt; lifc->preflt = lifcp->preflt; lifc->origint = lifcp->origint; - } - else { // default values + } else { /* default values */ lifc->onlink = 1; lifc->autoflag = 1; - lifc->validlt = 0xffffffff; - lifc->preflt = 0xffffffff; - lifc->origint = NOW / 10^3; + lifc->validlt = ~0L; + lifc->preflt = ~0L; + lifc->origint = NOW / 1000; } lifc->next = nil; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:462,468 - /n/sources/plan9/sys/src/9/ip/ipifc.c:452,458 *l = lifc; /* check for point-to-point interface */ - if(ipcmp(ip, v6loopback)) /* skip v6 loopback, it's a special address */ + if(ipcmp(ip, v6loopback)) /* skip v6 loopback, it's a special address */ if(ipcmp(mask, IPallbits) == 0) type |= Rptpt; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:503,516 - /n/sources/plan9/sys/src/9/ip/ipifc.c:493,506 addselfcache(f, ifc, lifc, bcast, Rbcast); addselfcache(f, ifc, lifc, IPv4bcast, Rbcast); - } - else { + } else { if(ipcmp(ip, v6loopback) == 0) { /* add node-local mcast address */ addselfcache(f, ifc, lifc, v6allnodesN, Rmulti); /* add route for all node multicast */ - v6addroute(f, tifc, v6allnodesN, v6allnodesNmask, v6allnodesN, Rmulti); + v6addroute(f, tifc, v6allnodesN, v6allnodesNmask, + v6allnodesN, Rmulti); } /* add all nodes multicast address */ /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:517,523 - /n/sources/plan9/sys/src/9/ip/ipifc.c:507,514 addselfcache(f, ifc, lifc, v6allnodesL, Rmulti); /* add route for all nodes multicast */ - v6addroute(f, tifc, v6allnodesL, v6allnodesLmask, v6allnodesL, Rmulti); + v6addroute(f, tifc, v6allnodesL, v6allnodesLmask, v6allnodesL, + Rmulti); /* add solicited-node multicast address */ ipv62smcast(bcast, ip); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:579,585 - /n/sources/plan9/sys/src/9/ip/ipifc.c:570,575 free(lifc); return nil; - } /* /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:589,599 - /n/sources/plan9/sys/src/9/ip/ipifc.c:579,587 char* ipifcrem(Ipifc *ifc, char **argv, int argc) { - uchar ip[IPaddrlen]; - uchar mask[IPaddrlen]; - uchar rem[IPaddrlen]; - Iplifc *lifc; char *rv; + uchar ip[IPaddrlen], mask[IPaddrlen], rem[IPaddrlen]; + Iplifc *lifc; if(argc < 3) return Ebadarg; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:612,623 - /n/sources/plan9/sys/src/9/ip/ipifc.c:600,610 * for pt to pt we actually specify the remote address as the * addresss to remove. */ - for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next) { + for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next) if (memcmp(ip, lifc->local, IPaddrlen) == 0 && memcmp(mask, lifc->mask, IPaddrlen) == 0 && memcmp(rem, lifc->remote, IPaddrlen) == 0) break; - } rv = ipifcremlifc(ifc, lifc); wunlock(ifc); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:636,651 - /n/sources/plan9/sys/src/9/ip/ipifc.c:623,635 Ipifc *ifc; e = &f->ipifc->conv[f->ipifc->nc]; - for(cp = f->ipifc->conv; cp < e; cp++){ + for(cp = f->ipifc->conv; cp < e; cp++) if(*cp != nil) { ifc = (Ipifc*)(*cp)->ptcl; m = ifc->m; - if(m == nil) - continue; - if(m->addroute != nil) + if(m && m->addroute) m->addroute(ifc, vers, addr, mask, gate, type); } - } } void /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:656,671 - /n/sources/plan9/sys/src/9/ip/ipifc.c:640,652 Ipifc *ifc; e = &f->ipifc->conv[f->ipifc->nc]; - for(cp = f->ipifc->conv; cp < e; cp++){ + for(cp = f->ipifc->conv; cp < e; cp++) if(*cp != nil) { ifc = (Ipifc*)(*cp)->ptcl; m = ifc->m; - if(m == nil) - continue; - if(m->remroute != nil) + if(m && m->remroute) m->remroute(ifc, vers, addr, mask); } - } } /* /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:702,708 - /n/sources/plan9/sys/src/9/ip/ipifc.c:683,688 return err; Fsconnected(c, nil); - return nil; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:718,744 - /n/sources/plan9/sys/src/9/ip/ipifc.c:698,724 return Ebadarg; while (argsleft > 1) { - if(strcmp(argv[i],"recvra")==0) + if(strcmp(argv[i], "recvra") == 0) ifc->recvra6 = (atoi(argv[i+1]) != 0); - else if(strcmp(argv[i],"sendra")==0) + else if(strcmp(argv[i], "sendra") == 0) ifc->sendra6 = (atoi(argv[i+1]) != 0); - else if(strcmp(argv[i],"mflag")==0) + else if(strcmp(argv[i], "mflag") == 0) ifc->rp.mflag = (atoi(argv[i+1]) != 0); - else if(strcmp(argv[i],"oflag")==0) + else if(strcmp(argv[i], "oflag") == 0) ifc->rp.oflag = (atoi(argv[i+1]) != 0); - else if(strcmp(argv[i],"maxraint")==0) + else if(strcmp(argv[i], "maxraint") == 0) ifc->rp.maxraint = atoi(argv[i+1]); - else if(strcmp(argv[i],"minraint")==0) + else if(strcmp(argv[i], "minraint") == 0) ifc->rp.minraint = atoi(argv[i+1]); - else if(strcmp(argv[i],"linkmtu")==0) + else if(strcmp(argv[i], "linkmtu") == 0) ifc->rp.linkmtu = atoi(argv[i+1]); - else if(strcmp(argv[i],"reachtime")==0) + else if(strcmp(argv[i], "reachtime") == 0) ifc->rp.reachtime = atoi(argv[i+1]); - else if(strcmp(argv[i],"rxmitra")==0) + else if(strcmp(argv[i], "rxmitra") == 0) ifc->rp.rxmitra = atoi(argv[i+1]); - else if(strcmp(argv[i],"ttl")==0) + else if(strcmp(argv[i], "ttl") == 0) ifc->rp.ttl = atoi(argv[i+1]); - else if(strcmp(argv[i],"routerlt")==0) + else if(strcmp(argv[i], "routerlt") == 0) ifc->rp.routerlt = atoi(argv[i+1]); else return Ebadarg; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:747,759 - /n/sources/plan9/sys/src/9/ip/ipifc.c:727,738 i += 2; } - // consistency check + /* consistency check */ if(ifc->rp.maxraint < ifc->rp.minraint) { ifc->rp.maxraint = vmax; ifc->rp.minraint = vmin; return Ebadarg; } - return nil; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:760,771 - /n/sources/plan9/sys/src/9/ip/ipifc.c:739,745 char* ipifcsendra6(Ipifc *ifc, char **argv, int argc) { - int i; - - i = 0; - if(argc > 1) - i = atoi(argv[1]); - ifc->sendra6 = (i!=0); + ifc->sendra6 = ((argc > 1? atoi(argv[1]): 0) != 0); return nil; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:772,783 - /n/sources/plan9/sys/src/9/ip/ipifc.c:746,752 char* ipifcrecvra6(Ipifc *ifc, char **argv, int argc) { - int i; - - i = 0; - if(argc > 1) - i = atoi(argv[1]); - ifc->recvra6 = (i!=0); + ifc->recvra6 = ((argc > 1? atoi(argv[1]): 0) != 0); return nil; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:789,795 - /n/sources/plan9/sys/src/9/ip/ipifc.c:758,763 ipifcctl(Conv* c, char**argv, int argc) { Ipifc *ifc; - int i; ifc = (Ipifc*)c->ptcl; if(strcmp(argv[0], "add") == 0) /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:809,823 - /n/sources/plan9/sys/src/9/ip/ipifc.c:777,786 else if(strcmp(argv[0], "reassemble") == 0){ ifc->reassemble = 1; return nil; - } - else if(strcmp(argv[0], "iprouting") == 0){ - i = 1; - if(argc > 1) - i = atoi(argv[1]); - iprouting(c->p->f, i); + } else if(strcmp(argv[0], "iprouting") == 0){ + iprouting(c->p->f, (argc > 1? atoi(argv[1]): 1)); return nil; - } - else if(strcmp(argv[0], "addpref6") == 0) + } else if(strcmp(argv[0], "addpref6") == 0) return ipifcaddpref6(ifc, argv, argc); else if(strcmp(argv[0], "setpar6") == 0) return ipifcsetpar6(ifc, argv, argc); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:857,863 - /n/sources/plan9/sys/src/9/ip/ipifc.c:820,826 ipifc->nc = Maxmedia; ipifc->ptclsize = sizeof(Ipifc); - f->ipifc = ipifc; /* hack for ipifcremroute, findipifc, ... */ + f->ipifc = ipifc; /* hack for ipifcremroute, findipifc, ... */ f->self = smalloc(sizeof(Ipselftab)); /* hack for ipforme */ Fsproto(f, ipifc); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:913,927 - /n/sources/plan9/sys/src/9/ip/ipifc.c:876,890 /* add to routing table */ if(isv4(a)) - v4addroute(f, tifc, a+IPv4off, IPallbits+IPv4off, a+IPv4off, type); + v4addroute(f, tifc, a+IPv4off, IPallbits+IPv4off, + a+IPv4off, type); else v6addroute(f, tifc, a, IPallbits, a, type); if((type & Rmulti) && ifc->m->addmulti != nil) (*ifc->m->addmulti)(ifc, a, lifc->local); - } else { + } else lp->ref++; - } qunlock(f->self); } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:950,956 - /n/sources/plan9/sys/src/9/ip/ipifc.c:913,919 } l = &np->next; } - p->expire = now + 5000; /* give other threads 5 secs to get out */ + p->expire = now + 5000; /* give other threads 5 secs to get out */ p->next = nil; *l = p; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:969,975 - /n/sources/plan9/sys/src/9/ip/ipifc.c:932,938 } l = &np->next; } - p->expire = now + 5000; /* give other threads 5 secs to get out */ + p->expire = now + 5000; /* give other threads 5 secs to get out */ p->next = nil; *l = p; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1018,1024 - /n/sources/plan9/sys/src/9/ip/ipifc.c:981,987 */ l_self = &p->link; for(link = *l_self; link; link = *l_self){ - if(link == *(l_lifc)) + if(link == *l_lifc) break; l_self = &link->selflink; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1075,1081 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1038,1044 m = 0; off = offset; qlock(f->self); - for(i = 0; i < NHASH && m < n; i++){ + for(i = 0; i < NHASH && m < n; i++) for(p = f->self->hash[i]; p != nil && m < n; p = p->next){ nifc = 0; for(link = p->link; link; link = link->selflink) /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1087,1093 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1050,1055 m = 0; } } - } qunlock(f->self); return m; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1098,1108 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1060,1068 Ipself *p; p = f->self->hash[hashipa(addr)]; - for(; p; p = p->next){ - if(ipcmp(addr, p->a) == 0) { + for(; p; p = p->next) + if(ipcmp(addr, p->a) == 0) return p->link->lifc->tentative; - } - } return 0; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1119,1133 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1079,1091 Ipself *p; p = f->self->hash[hashipa(addr)]; - for(; p; p = p->next){ + for(; p; p = p->next) if(ipcmp(addr, p->a) == 0) return p->type; - } /* hack to say accept anything */ if(f->self->acceptall) return Runi; - return 0; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1141,1150 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1099,1108 Ipifc *ifc, *x; Iplifc *lifc; Conv **cp, **e; - uchar gnet[IPaddrlen]; - uchar xmask[IPaddrlen]; + uchar gnet[IPaddrlen], xmask[IPaddrlen]; - x = nil; memset(xmask, 0, IPaddrlen); + x = nil; + memset(xmask, 0, IPaddrlen); /* find most specific match */ e = &f->ipifc->conv[f->ipifc->nc]; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1151,1167 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1109,1122 for(cp = f->ipifc->conv; cp < e; cp++){ if(*cp == 0) continue; - ifc = (Ipifc*)(*cp)->ptcl; - for(lifc = ifc->lifc; lifc; lifc = lifc->next){ maskip(remote, lifc->mask, gnet); - if(ipcmp(gnet, lifc->net) == 0){ + if(ipcmp(gnet, lifc->net) == 0) if(x == nil || ipcmp(lifc->mask, xmask) > 0){ x = ifc; ipmove(xmask, lifc->mask); } - } } } if(x != nil) /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1168,1174 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1123,1129 return x; /* for now for broadcast and multicast, just use first interface */ - if(type & (Rbcast|Rmulti)){ + if(type & (Rbcast|Rmulti)) for(cp = f->ipifc->conv; cp < e; cp++){ if(*cp == 0) continue; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1176,1188 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1131,1141 if(ifc->lifc != nil) return ifc; } - } - return nil; } enum { - unknownv6, + unknownv6, /* UGH */ multicastv6, unspecifiedv6, linklocalv6, /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1204,1218 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1157,1172 return unknownv6; } - #define v6addrcurr(lifc) (( (lifc)->origint + (lifc)->preflt >= (NOW/10^3) ) || ( (lifc)->preflt == 0xffffffff )) + #define v6addrcurr(lifc) ((lifc)->origint + (lifc)->preflt >= NOW/1000 || \ + (lifc)->preflt == ~0L) static void findprimaryipv6(Fs *f, uchar *local) { + int atype, atypel; Conv **cp, **e; Ipifc *ifc; Iplifc *lifc; - int atype, atypel; ipmove(local, v6Unspecified); atype = unspecifiedv6; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1227,1234 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1181,1187 ifc = (Ipifc*)(*cp)->ptcl; for(lifc = ifc->lifc; lifc; lifc = lifc->next){ atypel = v6addrtype(lifc->local); - if(atypel > atype) - if(v6addrcurr(lifc)) { + if(atypel > atype && v6addrcurr(lifc)) { ipmove(local, lifc->local); atype = atypel; if(atype == globalv6) /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1268,1286 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1221,1237 void findlocalip(Fs *f, uchar *local, uchar *remote) { + int version, atype = unspecifiedv6, atypel = unknownv6; + uchar gate[IPaddrlen], gnet[IPaddrlen]; Ipifc *ifc; Iplifc *lifc; Route *r; - uchar gate[IPaddrlen]; - uchar gnet[IPaddrlen]; - int version; - int atype = unspecifiedv6, atypel = unknownv6; USED(atype); USED(atypel); qlock(f->ipifc); r = v6lookup(f, remote, nil); - version = (memcmp(remote, v4prefix, IPv4off) == 0) ? V4 : V6; + version = (memcmp(remote, v4prefix, IPv4off) == 0)? V4: V6; if(r != nil){ ifc = r->ifc; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1306,1314 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1257,1264 for(lifc = ifc->lifc; lifc; lifc = lifc->next){ atypel = v6addrtype(lifc->local); maskip(gate, lifc->mask, gnet); - if(ipcmp(gnet, lifc->net) == 0) - if(atypel > atype) - if(v6addrcurr(lifc)) { + if (ipcmp(gnet, lifc->net) == 0 && + atypel > atype && v6addrcurr(lifc)) { ipmove(local, lifc->local); atype = atypel; if(atype == globalv6) /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1346,1357 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1296,1306 { Iplifc *lifc; - for(lifc = ifc->lifc; lifc; lifc = lifc->next){ + for(lifc = ifc->lifc; lifc; lifc = lifc->next) if(isv4(lifc->local)){ memmove(addr, lifc->local+IPv4off, IPv4addrlen); return 1; } - } return 0; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1363,1374 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1312,1322 { Iplifc *lifc; - for(lifc = ifc->lifc; lifc; lifc = lifc->next){ + for(lifc = ifc->lifc; lifc; lifc = lifc->next) if(!isv4(lifc->local) && !(lifc->tentative)){ ipmove(addr, lifc->local); return 1; } - } return 0; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1377,1388 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1325,1335 { Iplifc *lifc; - for(lifc = ifc->lifc; lifc; lifc = lifc->next){ + for(lifc = ifc->lifc; lifc; lifc = lifc->next) if(!isv4(lifc->local)){ ipmove(addr, lifc->local); return SRC_UNI; } - } return SRC_UNSPEC; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1413,1422 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1360,1367 /* see if this is a direct connected pt to pt address */ r = v6lookup(f, ip, nil); - if(r == nil) + if(r == nil || (r->type & (Rifc|Rproxy)) != (Rifc|Rproxy)) return 0; - if((r->type & (Rifc|Rproxy)) != (Rifc|Rproxy)) - return 0; /* see if this is on the right interface */ for(lifc = ifc->lifc; lifc; lifc = lifc->next){ /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1424,1430 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1369,1374 if(ipcmp(net, lifc->remote) == 0) return 1; } - return 0; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1437,1460 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1381,1402 if(isv4(ip)){ if(ip[IPv4off] >= 0xe0 && ip[IPv4off] < 0xf0) return V4; - } else { + } else if(ip[0] == 0xff) return V6; - } return 0; } int ipisbm(uchar *ip) { - if(isv4(ip)){ + if(isv4(ip)) if(ip[IPv4off] >= 0xe0 && ip[IPv4off] < 0xf0) return V4; - if(ipcmp(ip, IPv4bcast) == 0) + else if(ipcmp(ip, IPv4bcast) == 0) return V4; - } else { + else if(ip[0] == 0xff) return V6; - } return 0; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1474,1481 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1416,1422 f = c->p->f; for(l = &c->multi; *l; l = &(*l)->next) - if(ipcmp(ma, (*l)->ma) == 0) - if(ipcmp(ia, (*l)->ia) == 0) + if(ipcmp(ma, (*l)->ma) == 0 && ipcmp(ia, (*l)->ia) == 0) return; /* it's already there */ multi = *l = smalloc(sizeof(*multi)); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1516,1523 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1457,1463 f = c->p->f; for(l = &c->multi; *l; l = &(*l)->next) - if(ipcmp(ma, (*l)->ma) == 0) - if(ipcmp(ia, (*l)->ia) == 0) + if(ipcmp(ma, (*l)->ma) == 0 && ipcmp(ia, (*l)->ia) == 0) break; multi = *l; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1575,1588 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1515,1524 /* register the address on any network that will proxy for us */ e = &f->ipifc->conv[f->ipifc->nc]; - if(!isv4(ip)) { // V6 + if(!isv4(ip)) /* V6 */ for(cp = f->ipifc->conv; cp < e; cp++){ - if(*cp == nil) + if(*cp == nil || (nifc = (Ipifc*)(*cp)->ptcl) == ifc) continue; - nifc = (Ipifc*)(*cp)->ptcl; - if(nifc == ifc) - continue; - rlock(nifc); m = nifc->m; if(m == nil || m->addmulti == nil) { /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1591,1616 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1527,1547 } for(lifc = nifc->lifc; lifc; lifc = lifc->next){ maskip(ip, lifc->mask, net); - if(ipcmp(net, lifc->remote) == 0) { /* add solicited-node multicast address */ + if(ipcmp(net, lifc->remote) == 0) { + /* add solicited-node multicast addr */ ipv62smcast(net, ip); addselfcache(f, nifc, lifc, net, Rmulti); arpenter(f, V6, ip, nifc->mac, 6, 0); - //(*m->addmulti)(nifc, net, ip); + // (*m->addmulti)(nifc, net, ip); break; } } runlock(nifc); } - return; - } - else { // V4 + else /* V4 */ for(cp = f->ipifc->conv; cp < e; cp++){ - if(*cp == nil) + if(*cp == nil || (nifc = (Ipifc*)(*cp)->ptcl) == ifc) continue; - nifc = (Ipifc*)(*cp)->ptcl; - if(nifc == ifc) - continue; - rlock(nifc); m = nifc->m; if(m == nil || m->areg == nil){ /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1626,1636 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1557,1566 } runlock(nifc); } - } } - // added for new v6 mesg types + /* added for new v6 mesg types */ static void adddefroute6(Fs *f, uchar *gate, int force) { /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1637,1653 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1567,1584 Route *r; r = v6lookup(f, v6Unspecified, nil); - if(r!=nil) - if(!(force) && (strcmp(r->tag,"ra")!=0)) // route entries generated - return; // by all other means take - // precedence over router annc + /* + * route entries generated by all other means take precedence + * over router announcements. + */ + if (r && !force && strcmp(r->tag, "ra") != 0) + return; v6delroute(f, v6Unspecified, v6Unspecified, 1); v6addroute(f, "ra", v6Unspecified, v6Unspecified, gate, 0); } - enum - { + enum { Ngates = 3, }; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1654,1669 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1585,1597 char* ipifcaddpref6(Ipifc *ifc, char**argv, int argc) { - uchar onlink = 1; - uchar autoflag = 1; - long validlt = 0xffffffff; - long preflt = 0xffffffff; - long origint = NOW / 10^3; - uchar prefix[IPaddrlen]; - int plen = 64; - Iplifc *lifc; - char addr[40], preflen[6]; - char *params[3]; + int plen = 64; + long origint = NOW / 1000, preflt = ~0L, validlt = ~0L; + char addr[40], preflen[6]; + char *params[3]; + uchar autoflag = 1, onlink = 1; + uchar prefix[IPaddrlen]; + Iplifc *lifc; switch(argc) { case 7: /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1680,1685 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1608,1614 /* fall through */ case 3: plen = atoi(argv[2]); + /* fall through */ case 2: break; default: /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1686,1696 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1615,1622 return Ebadarg; } - if((parseip(prefix, argv[1])!=6) || - (validlt < preflt) || - (plen < 0) || (plen > 64) || - (islinklocal(prefix)) - ) + if (parseip(prefix, argv[1]) != 6 || validlt < preflt || plen < 0 || + plen > 64 || islinklocal(prefix)) return Ebadarg; lifc = smalloc(sizeof(Iplifc)); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1700,1706 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1626,1632 lifc->preflt = preflt; lifc->origint = origint; - if(ifc->m->pref2addr!=nil) + if(ifc->m->pref2addr) ifc->m->pref2addr(prefix, ifc->mac); else return Ebadarg; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipifc.c:1713,1716 - /n/sources/plan9/sys/src/9/ip/ipifc.c:1639,1641 return ipifcadd(ifc, params, 3, 0, lifc); } - [geoff] --rw-rw-r-- M 44 presotto sys 14297 Apr 18 19:13 sys/src/9/ip/ipv6.c /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:16,26 - /n/sources/plan9/sys/src/9/ip/ipv6.c:16,26 IP_DF = 0x4000, /* Don't fragment */ IP_MF = 0x2000, /* More fragments */ IP6FHDR = 8, /* sizeof(Fraghdr6) */ - IP_MAX = (32*1024), /* Maximum Internet packet size */ + IP_MAX = 32*1024, /* Maximum Internet packet size */ }; - #define IPV6CLASS(hdr) ((hdr->vcf[0]&0x0F)<<2 | (hdr->vcf[1]&0xF0)>>2) - #define BLKIPVER(xp) (((Ip6hdr*)((xp)->rp))->vcf[0]&0xF0) + #define IPV6CLASS(hdr) (((hdr)->vcf[0]&0x0F)<<2 | ((hdr)->vcf[1]&0xF0)>>2) + #define BLKIPVER(xp) (((Ip6hdr*)((xp)->rp))->vcf[0] & 0xF0) /* * This sleazy macro is stolen shamelessly from ip.c, see comment there. */ /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:32,42 - /n/sources/plan9/sys/src/9/ip/ipv6.c:32,42 typedef struct Ipfrag Ipfrag; Block* ip6reassemble(IP*, int, Block*, Ip6hdr*); - void ipfragfree6(IP*, Fragment6*); Fragment6* ipfragallo6(IP*); - static Block* procxtns(IP *ip, Block *bp, int doreasm); - int unfraglen(Block *bp, uchar *nexthdr, int setfh); + void ipfragfree6(IP*, Fragment6*); Block* procopts(Block *bp); + static Block* procxtns(IP *ip, Block *bp, int doreasm); + int unfraglen(Block *bp, uchar *nexthdr, int setfh); /* MIB II counters */ enum /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:134,149 - /n/sources/plan9/sys/src/9/ip/ipv6.c:134,148 int ipoput6(Fs *f, Block *bp, int gating, int ttl, int tos, Conv *c) { - int tentative; - Ipifc *ifc; + int medialen, len, chunk, uflen, flen, seglen, lid, offset, fragoff; + int morefrags, blklen, rv = 0, tentative; uchar *gate, nexthdr; - Ip6hdr *eh; - int medialen, len, chunk, uflen, flen, seglen, lid, offset, fragoff, morefrags, blklen; - Route *r, *sr; - Fraghdr6 fraghdr; Block *xp, *nb; + Fraghdr6 fraghdr; IP *ip; - int rv = 0; + Ip6hdr *eh; + Ipifc *ifc; + Route *r, *sr; ip = f->ip; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:154,160 - /n/sources/plan9/sys/src/9/ip/ipv6.c:153,159 /* Number of uchars in data and ip header to write */ len = blocklen(bp); - + tentative = iptentative(f, eh->src); if(tentative){ netlog(f, Logip, "reject tx of packet with tentative src address\n"); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:191,204 - /n/sources/plan9/sys/src/9/ip/ipv6.c:190,201 ifc = r->ifc; if(r->type & (Rifc|Runi)) gate = eh->dst; - else - if(r->type & (Rbcast|Rmulti)) { + else if(r->type & (Rbcast|Rmulti)) { gate = eh->dst; sr = v6lookup(f, eh->src, nil); - if(sr != nil && (sr->type & Runi)) + if(sr && (sr->type & Runi)) ifc = sr->ifc; - } - else + } else gate = r->v6.gate; if(!gating) /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:205,217 - /n/sources/plan9/sys/src/9/ip/ipv6.c:202,213 eh->vcf[0] = IP_VER6; eh->ttl = ttl; if(!gating) { - eh->vcf[0] |= (tos >> 4); - eh->vcf[1] = (tos << 4); + eh->vcf[0] |= tos >> 4; + eh->vcf[1] = tos << 4; } - if(!canrlock(ifc)) { + if(!canrlock(ifc)) goto free; - } if(waserror()){ runlock(ifc); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:218,226 - /n/sources/plan9/sys/src/9/ip/ipv6.c:214,221 nexterror(); } - if(ifc->m == nil) { + if(ifc->m == nil) goto raise; - } /* If we dont need to fragment just send it */ medialen = ifc->maxtu - ifc->m->hsize; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:232,251 - /n/sources/plan9/sys/src/9/ip/ipv6.c:227,244 return 0; } - if(gating) - if(ifc->reassemble <= 0) { - - /* v6 intermediate nodes are not supposed to fragment pkts; - we fragment if ifc->reassemble is turned on; an exception - needed for nat. + if(gating && ifc->reassemble <= 0) { + /* + * v6 intermediate nodes are not supposed to fragment pkts; + * we fragment if ifc->reassemble is turned on; an exception + * needed for nat. */ - ip->stats[OutDiscards]++; icmppkttoobig6(f, ifc, bp); netlog(f, Logip, "%I: gated pkts not fragmented\n", eh->dst); goto raise; } - + /* start v6 fragmentation */ uflen = unfraglen(bp, &nexthdr, 1); if(uflen > medialen) { /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:271,283 - /n/sources/plan9/sys/src/9/ip/ipv6.c:264,276 xp = bp; offset = uflen; - while (xp != nil && offset && offset >= BLEN(xp)) { + while (xp && offset && offset >= BLEN(xp)) { offset -= BLEN(xp); xp = xp->next; } xp->rp += offset; - fragoff = 0; + fragoff = 0; morefrags = 1; for(; fragoff < flen; fragoff += seglen) { /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:292,298 - /n/sources/plan9/sys/src/9/ip/ipv6.c:285,291 memmove(nb->wp, eh, uflen); nb->wp += uflen; - hnputs(fraghdr.offsetRM, fragoff); // last 3 bits must be 0 + hnputs(fraghdr.offsetRM, fragoff); /* last 3 bits must be 0 */ fraghdr.offsetRM[1] |= morefrags; memmove(nb->wp, &fraghdr, IP6FHDR); nb->wp += IP6FHDR; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:316,322 - /n/sources/plan9/sys/src/9/ip/ipv6.c:309,315 xp->rp += blklen; chunk -= blklen; if(xp->rp == xp->wp) - xp = xp->next; + xp = xp->next; } ifc->m->bwrite(ifc, nb, V6, gate); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:328,334 - /n/sources/plan9/sys/src/9/ip/ipv6.c:321,327 runlock(ifc); poperror(); free: - freeblist(bp); + freeblist(bp); return rv; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:335,349 - /n/sources/plan9/sys/src/9/ip/ipv6.c:328,339 void ipiput6(Fs *f, Ipifc *ifc, Block *bp) { - int hl; - int hop, tos; + int hl, hop, tos, notforme, tentative; uchar proto; - Ip6hdr *h; - Proto *p; - int notforme; - int tentative; uchar v6dst[IPaddrlen]; IP *ip; + Ip6hdr *h; + Proto *p; Route *r, *sr; ip = f->ip; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:365,377 - /n/sources/plan9/sys/src/9/ip/ipv6.c:355,367 return; } - h = (Ip6hdr *)(bp->rp); + h = (Ip6hdr *)bp->rp; - memmove(&v6dst[0], &(h->dst)[0], IPaddrlen); + memmove(&v6dst[0], &h->dst[0], IPaddrlen); notforme = ipforme(f, v6dst) == 0; tentative = iptentative(f, v6dst); - - if(tentative && (h->proto != ICMPv6)) { + + if(tentative && h->proto != ICMPv6) { print("tentative addr, drop\n"); freeblist(bp); return; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:393,399 - /n/sources/plan9/sys/src/9/ip/ipv6.c:383,389 } /* don't forward to source's network */ sr = v6lookup(f, h->src, nil); - r = v6lookup(f, h->dst, nil); + r = v6lookup(f, h->dst, nil); if(r == nil || sr == r){ ip->stats[OutDiscards]++; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:412,423 - /n/sources/plan9/sys/src/9/ip/ipv6.c:402,412 /* process headers & reassemble if the interface expects it */ bp = procxtns(ip, bp, r->ifc->reassemble); - if(bp == nil) return; ip->stats[ForwDatagrams]++; - h = (Ip6hdr *) (bp->rp); + h = (Ip6hdr *)bp->rp; tos = IPV6CLASS(h); hop = h->ttl; ipoput6(f, bp, 1, hop-1, tos, nil); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:426,432 - /n/sources/plan9/sys/src/9/ip/ipv6.c:415,420 /* reassemble & process headers if needed */ bp = procxtns(ip, bp, 1); - if(bp == nil) return; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:433,439 - /n/sources/plan9/sys/src/9/ip/ipv6.c:421,427 h = (Ip6hdr *) (bp->rp); proto = h->proto; p = Fsrcvpcol(f, proto); - if(p != nil && p->rcv != nil) { + if(p && p->rcv) { ip->stats[InDelivers]++; (*p->rcv)(p, ifc, bp); return; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:470,476 - /n/sources/plan9/sys/src/9/ip/ipv6.c:458,463 frag->next = ip->fragfree6; ip->fragfree6 = frag; - } /* /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:497,529 - /n/sources/plan9/sys/src/9/ip/ipv6.c:484,515 } static Block* - procxtns(IP *ip, Block *bp, int doreasm) { - + procxtns(IP *ip, Block *bp, int doreasm) + { int offset; uchar proto; Ip6hdr *h; - h = (Ip6hdr *) (bp->rp); + h = (Ip6hdr *)bp->rp; offset = unfraglen(bp, &proto, 0); - if((proto == FH) && (doreasm != 0)) { + if(proto == FH && doreasm != 0) { bp = ip6reassemble(ip, offset, bp, h); - if(bp == nil) - return nil; + if(bp == nil) + return nil; offset = unfraglen(bp, &proto, 0); } - if(proto == DOH || offset > IP6HDR) + if(proto == DOH || offset > IP6HDR) bp = procopts(bp); - return bp; } - - /* returns length of "Unfragmentable part", i.e., sum of lengths of ipv6 hdr, - * hop-by-hop & routing headers if present; *nexthdr is set to nexthdr value - * of the last header in the "Unfragmentable part"; if setfh != 0, nexthdr - * field of the last header in the "Unfragmentable part" is set to FH. + /* + * returns length of "Unfragmentable part", i.e., sum of lengths of ipv6 hdr, + * hop-by-hop & routing headers if present; *nexthdr is set to nexthdr value + * of the last header in the "Unfragmentable part"; if setfh != 0, nexthdr + * field of the last header in the "Unfragmentable part" is set to FH. */ int unfraglen(Block *bp, uchar *nexthdr, int setfh) /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:532,543 - /n/sources/plan9/sys/src/9/ip/ipv6.c:518,529 int ufl, hs; p = bp->rp; - q = p+6; /* proto, = p+sizeof(Ip6hdr.vcf)+sizeof(Ip6hdr.ploadlen) */ + q = p+6; /* proto, = p+sizeof(Ip6hdr.vcf)+sizeof(Ip6hdr.ploadlen) */ *nexthdr = *q; ufl = IP6HDR; p += ufl; - for(;;) { + for(;;) if(*nexthdr == HBH || *nexthdr == RH) { *nexthdr = *p; hs = ((int)*(p+1) + 1) * 8; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:544,560 - /n/sources/plan9/sys/src/9/ip/ipv6.c:530,542 ufl += hs; q = p; p += hs; - } - else + } else break; - } if(*nexthdr == FH) *q = *p; - if(setfh) *q = FH; - return ufl; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:567,582 - /n/sources/plan9/sys/src/9/ip/ipv6.c:549,562 Block* ip6reassemble(IP* ip, int uflen, Block* bp, Ip6hdr* ih) { - - int fend, offset; + int fend, offset, ovlap, len, fragsize, pktposn; uint id; - Fragment6 *f, *fnext; - Fraghdr6 *fraghdr; uchar src[IPaddrlen], dst[IPaddrlen]; Block *bl, **l, *last, *prev; - int ovlap, len, fragsize, pktposn; + Fraghdr6 *fraghdr; + Fragment6 *f, *fnext; - fraghdr = (Fraghdr6 *) (bp->rp + uflen); + fraghdr = (Fraghdr6 *)(bp->rp + uflen); memmove(src, ih->src, IPaddrlen); memmove(dst, ih->dst, IPaddrlen); id = nhgetl(fraghdr->id); /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:587,596 - /n/sources/plan9/sys/src/9/ip/ipv6.c:567,575 */ if(bp->next){ bp = pullupblock(bp, blocklen(bp)); - ih = (Ip6hdr *)(bp->rp); + ih = (Ip6hdr *)bp->rp; } - qlock(&ip->fraglock6); /* /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:606,619 - /n/sources/plan9/sys/src/9/ip/ipv6.c:585,597 } } - /* * if this isn't a fragmented packet, accept it * and get rid of any fragments that might go * with it. */ - if(nhgets(fraghdr->offsetRM)==0) { // first frag is also the last - if(f != nil) { + if(nhgets(fraghdr->offsetRM) == 0) { /* 1st frag is also last */ + if(f) { ipfragfree6(ip, f); ip->stats[ReasmFails]++; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:678,689 - /n/sources/plan9/sys/src/9/ip/ipv6.c:656,665 fend = BKFG(bp)->foff + BKFG(bp)->flen; /* Take completely covered segments out */ - while(*l) { ovlap = fend - BKFG(*l)->foff; - - if(ovlap <= 0) - break; + if(ovlap <= 0) + break; if(ovlap < BKFG(*l)->flen) { BKFG(*l)->flen -= ovlap; BKFG(*l)->foff += ovlap; /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:704,726 - /n/sources/plan9/sys/src/9/ip/ipv6.c:680,697 * with the trailing bit of fraghdr->offsetRM[1] set, we're done. */ pktposn = 0; - for(bl = f->blist; bl; bl = bl->next) { - if(BKFG(bl)->foff != pktposn) - break; - - fraghdr = (Fraghdr6 *) (bl->rp + uflen); + for(bl = f->blist; bl && BKFG(bl)->foff == pktposn; bl = bl->next) { + fraghdr = (Fraghdr6 *)(bl->rp + uflen); if((fraghdr->offsetRM[1] & 1) == 0) { - bl = f->blist; /* get rid of frag header in first fragment */ - memmove(bl->rp + IP6FHDR, bl->rp, uflen); bl->rp += IP6FHDR; - len = nhgets(((Ip6hdr*)(bl->rp))->ploadlen) - IP6FHDR; + len = nhgets(((Ip6hdr*)bl->rp)->ploadlen) - IP6FHDR; bl->wp = bl->rp + len + IP6HDR; - - /* Pullup all the fragment headers and + /* + * Pullup all the fragment headers and * return a complete packet */ for(bl = bl->next; bl; bl = bl->next) { /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:733,743 - /n/sources/plan9/sys/src/9/ip/ipv6.c:704,714 bl = f->blist; f->blist = nil; ipfragfree6(ip, f); - ih = (Ip6hdr*)(bl->rp); + ih = (Ip6hdr*)bl->rp; hnputs(ih->ploadlen, len); qunlock(&ip->fraglock6); ip->stats[ReasmOKs]++; - return bl; + return bl; } pktposn += BKFG(bl)->flen; } /n/sourcesdump/2007/0418/plan9/sys/src/9/ip/ipv6.c:744,747 - /n/sources/plan9/sys/src/9/ip/ipv6.c:715,717 qunlock(&ip->fraglock6); return nil; } -