static void ipifcregisterproxy(Fs *f, Ipifc *ifc, uint8_t *ip) { Conv **cp, **e; Ipifc *nifc; Iplifc *lifc; Medium *m; uint8_t net[IPaddrlen]; /* register the address on any network that will proxy for us */ e = &f->ipifc->conv[f->ipifc->nc]; if(!isv4(ip)) { /* V6 */ for(cp = f->ipifc->conv; cp < e; cp++){ if(*cp == nil || (nifc = (Ipifc*)(*cp)->ptcl) == ifc) continue; rlock(nifc); m = nifc->medium; if(m == nil || m->addmulti == nil) { runlock(nifc); continue; } for(lifc = nifc->lifc; lifc; lifc = lifc->next){ maskip(ip, lifc->mask, net); 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); break; } } runlock(nifc); } } else { /* V4 */ for(cp = f->ipifc->conv; cp < e; cp++){ if(*cp == nil || (nifc = (Ipifc*)(*cp)->ptcl) == ifc) continue; rlock(nifc); m = nifc->medium; if(m == nil || m->areg == nil){ runlock(nifc); continue; } for(lifc = nifc->lifc; lifc; lifc = lifc->next){ maskip(ip, lifc->mask, net); if(ipcmp(net, lifc->remote) == 0){ (*m->areg)(nifc, ip); break; } } runlock(nifc); } } }
static void ipifcregisterproxy(struct Fs *f, struct Ipifc *ifc, uint8_t * ip) { struct conv **cp, **e; struct Ipifc *nifc; struct Iplifc *lifc; struct medium *m; uint8_t net[IPaddrlen]; /* register the address on any network that will proxy for us */ e = &f->ipifc->conv[f->ipifc->nc]; if (!isv4(ip)) { // V6 for (cp = f->ipifc->conv; cp < e; cp++) { if (*cp == NULL) continue; nifc = (struct Ipifc *)(*cp)->ptcl; if (nifc == ifc) continue; rlock(&nifc->rwlock); m = nifc->m; if (m == NULL || m->addmulti == NULL) { runlock(&nifc->rwlock); continue; } for (lifc = nifc->lifc; lifc; lifc = lifc->next) { maskip(ip, lifc->mask, net); if (ipcmp(net, lifc->remote) == 0) { /* add solicited-node multicast address */ ipv62smcast(net, ip); addselfcache(f, nifc, lifc, net, Rmulti); arpenter(f, V6, ip, nifc->mac, 6, 0); //(*m->addmulti)(nifc, net, ip); break; } } runlock(&nifc->rwlock); } return; } else { // V4 for (cp = f->ipifc->conv; cp < e; cp++) { if (*cp == NULL) continue; nifc = (struct Ipifc *)(*cp)->ptcl; if (nifc == ifc) continue; rlock(&nifc->rwlock); m = nifc->m; if (m == NULL || m->areg == NULL) { runlock(&nifc->rwlock); continue; } for (lifc = nifc->lifc; lifc; lifc = lifc->next) { maskip(ip, lifc->mask, net); if (ipcmp(net, lifc->remote) == 0) { (*m->areg) (nifc, ip); break; } } runlock(&nifc->rwlock); } } }