| plan 9 kernel history: overview | file list | diff list |
1998/0307/ip/ipifc.c (diff list | history)
| 1998/0306/sys/src/9/ip/ipifc.c:23,28 – 1998/0307/sys/src/9/ip/ipifc.c:23,29 (short | long | prev | next) | ||
| 1998/0306 | Medium *media[] = { ðermedium, | |
| 1998/0307 | &pktmedium, | |
| 1998/0306 | &nullmedium, 0 }; | |
| 1998/0306/sys/src/9/ip/ipifc.c:151,166 – 1998/0307/sys/src/9/ip/ipifc.c:152,169 | ||
| 1998/0306 | } wlock(ifc); | |
| 1998/0307 | /* dissociate routes */ ifc->ifcid++; | |
| 1998/0306 | ||
| 1998/0307 | /* disassociate device */ (*ifc->m->unbind)(ifc); memset(ifc->dev, 0, sizeof(ifc->dev)); ifc->arg = nil; | |
| 1998/0306 | /* hangup queues to stop queuing of packets */ qhangup(ifc->conv->rq, "unbind"); qhangup(ifc->conv->wq, "unbind"); | |
| 1998/0306/sys/src/9/ip/ipifc.c:172,185 – 1998/0307/sys/src/9/ip/ipifc.c:175,181 | ||
| 1998/0306 | ipifcrem(ifc, av, 3, 0); } | |
| 1998/0307 | ifc->m = nil; | |
| 1998/0306 | wunlock(ifc); poperror(); return nil; | |
| 1998/0306/sys/src/9/ip/ipifc.c:223,229 – 1998/0307/sys/src/9/ip/ipifc.c:219,225 | ||
| 1998/0306 | for(lifc = ifc->lifc; lifc; lifc = lifc->next){ m += snprint(state+m, n - m, "%-20.20I ->", lifc->local); for(link = lifc->link; link; link = link->lifclink) | |
| 1998/0307 | m += snprint(state+m, n - m, " %-20.20I", link->self->a); | |
| 1998/0306 | m += snprint(state+m, n - m, "\n"); } runlock(ifc); | |
| 1998/0306/sys/src/9/ip/ipifc.c:272,277 – 1998/0307/sys/src/9/ip/ipifc.c:268,275 | ||
| 1998/0306 | c->wq = qopen(QMAX, 0, 0, 0); ifc = (Ipifc*)c->ptcl; ifc->conv = c; | |
| 1998/0307 | ifc->unbinding = 0; ifc->m = nil; | |
| 1998/0306 | } /* | |
| 1998/0306/sys/src/9/ip/ipifc.c:281,290 – 1998/0307/sys/src/9/ip/ipifc.c:279,291 | ||
| 1998/0306 | static void ipifcclose(Conv *c) { | |
| 1998/0307 | Ipifc *ifc; Medium *m; ifc = (Ipifc*)c->ptcl; m = ifc->m; if(m != nil && m->unbindonclose) ipifcunbind(ifc); | |
| 1998/0306 | unlock(c); } | |
| 1998/0306/sys/src/9/ip/ipifc.c:423,429 – 1998/0307/sys/src/9/ip/ipifc.c:424,430 | ||
| 1998/0306 | /* disassociate any addresses */ while(lifc->link) | |
| 1998/0307 | remselfcache(ifc, lifc, lifc->link->self->a); | |
| 1998/0306 | /* remove the route for this logical interface */ if(isv4(ip)) | |
| 1998/0306/sys/src/9/ip/ipifc.c:456,461 – 1998/0307/sys/src/9/ip/ipifc.c:457,464 | ||
| 1998/0306 | if(*cp != nil) { ifc = (Ipifc*)(*cp)->ptcl; m = ifc->m; | |
| 1998/0307 | if(m == nil) continue; | |
| 1998/0306 | if(m->addroute != nil) m->addroute(ifc, vers, addr, mask, gate, type); } | |
| 1998/0306/sys/src/9/ip/ipifc.c:473,478 – 1998/0307/sys/src/9/ip/ipifc.c:476,483 | ||
| 1998/0306 | if(*cp != nil) { ifc = (Ipifc*)(*cp)->ptcl; m = ifc->m; | |
| 1998/0307 | if(m == nil) continue; | |
| 1998/0306 | if(m->remroute != nil) m->remroute(ifc, vers, addr, mask); } | |
| 1998/0306/sys/src/9/ip/ipifc.c:603,609 – 1998/0307/sys/src/9/ip/ipifc.c:608,614 | ||
| 1998/0306 | } /* look for a link for this lifc */ | |
| 1998/0307 | for(lp = p->link; lp; lp = lp->selflink) | |
| 1998/0306 | if(lp->lifc == lifc) break; | |
| 1998/0306/sys/src/9/ip/ipifc.c:612,619 – 1998/0307/sys/src/9/ip/ipifc.c:617,624 | ||
| 1998/0306 | lp = smalloc(sizeof(*lp)); lp->ref = 1; lp->lifc = lifc; | |
| 1998/0307 | lp->self = p; lp->selflink = p->link; | |
| 1998/0306 | p->link = lp; lp->lifclink = lifc->link; lifc->link = lp; | |
| 1998/0306/sys/src/9/ip/ipifc.c:690,696 – 1998/0307/sys/src/9/ip/ipifc.c:695,701 | ||
| 1998/0306 | remselfcache(Ipifc *ifc, Iplifc *lifc, uchar *a) { Ipself *p, **l; | |
| 1998/0307 | Iplink *link, **l_self, **l_lifc; | |
| 1998/0306 | qlock(&selftab); | |
| 1998/0306/sys/src/9/ip/ipifc.c:709,722 – 1998/0307/sys/src/9/ip/ipifc.c:714,727 | ||
| 1998/0306 | * walk down links from an ifc looking for one * that matches the selftab entry */ | |
| 1998/0307 | l_lifc = &lifc->link; for(link = *l_lifc; link; link = *l_lifc){ if(link->self == p) | |
| 1998/0306 | break; | |
| 1998/0307 | l_lifc = &link->lifclink; | |
| 1998/0306 | } | |
| 1998/0307 | if(link == nil) | |
| 1998/0306 | goto out; /* | |
| 1998/0306/sys/src/9/ip/ipifc.c:723,739 – 1998/0307/sys/src/9/ip/ipifc.c:728,744 | ||
| 1998/0306 | * walk down the links from the selftab looking for * the one we just found */ | |
| 1998/0307 | l_self = &p->link; for(link = *l_self; link; link = *l_self){ if(link == *(l_lifc)) | |
| 1998/0306 | break; | |
| 1998/0307 | l_self = &link->selflink; | |
| 1998/0306 | } | |
| 1998/0307 | if(link == nil) | |
| 1998/0306 | panic("remselfcache"); | |
| 1998/0307 | if(--(link->ref) != 0) | |
| 1998/0306 | goto out; if((p->type & Rmulti) && ifc->m->remmulti != nil) | |
| 1998/0306/sys/src/9/ip/ipifc.c:740,748 – 1998/0307/sys/src/9/ip/ipifc.c:745,753 | ||
| 1998/0306 | (*ifc->m->remmulti)(ifc, a, lifc->local); /* ref == 0, remove from both chains and free the link */ | |
| 1998/0307 | *l_lifc = link->lifclink; *l_self = link->selflink; iplinkfree(link); | |
| 1998/0306 | /* remove from routing table */ if(isv4(a)) | |
| 1998/0306/sys/src/9/ip/ipifc.c:1001,1059 – 1998/0307/sys/src/9/ip/ipifc.c:1006,1011 | ||
| 1998/0306 | return V6; } return 0; | |