/* * find first ip addr suitable for proto and * that isn't the friggin loopback address. * deprecate link-local and multicast addresses. */ static int myipvnaddr(uint8_t *ip, struct proto *proto, char *net) { int ipisv4, wantv4; struct ipifc *nifc; struct iplifc *lifc; uint8_t mynet[IPaddrlen], linklocal[IPaddrlen]; static struct ipifc *ifc; ipmove(linklocal, IPnoaddr); wantv4 = proto->version == 4; ifc = readipifc(net, ifc, -1); for(nifc = ifc; nifc; nifc = nifc->next) for(lifc = nifc->lifc; lifc; lifc = lifc->next){ maskip(lifc->ip, loopbackmask, mynet); if(ipcmp(mynet, loopbacknet) == 0) continue; if(ISIPV6MCAST(lifc->ip) || ISIPV6LINKLOCAL(lifc->ip)) { ipmove(linklocal, lifc->ip); continue; } ipisv4 = isv4(lifc->ip) != 0; if(ipcmp(lifc->ip, IPnoaddr) != 0 && wantv4 == ipisv4){ ipmove(ip, lifc->ip); return 0; } } /* no global unicast addrs found, fall back to link-local, if any */ ipmove(ip, linklocal); return ipcmp(ip, IPnoaddr) == 0? -1: 0; }
void pipifc(void) { Ipifc *ip, *nip; Iplifc *lifc; char buf[100]; int l, i; fmtinstall('I', eipfmt); fmtinstall('M', eipfmt); ip = readipifc(netroot, nil, -1); l = 7; for(nip = ip; nip; nip = nip->next){ for(lifc = nip->lifc; lifc; lifc = lifc->next){ i = snprint(buf, sizeof buf, "%I", lifc->ip); if(i > l) l = i; i = snprint(buf, sizeof buf, "%I", lifc->net); if(i > l) l = i; } } for(nip = ip; nip; nip = nip->next){ for(lifc = nip->lifc; lifc; lifc = lifc->next) Bprint(&out, "%-12s %5d %-*I %5M %-*I %8lud %8lud %8lud %8lud\n", nip->dev, nip->mtu, l, lifc->ip, lifc->mask, l, lifc->net, nip->pktin, nip->pktout, nip->errin, nip->errout); } Bflush(&out); }
// find first ip addr that isn't the friggin loopback address // unless there are no others int myipaddr(uchar *ip, char *net) { Ipifc *nifc; Iplifc *lifc; static Ipifc *ifc; uchar mynet[IPaddrlen]; ifc = readipifc(net, ifc, -1); for(nifc = ifc; nifc; nifc = nifc->next) for(lifc = nifc->lifc; lifc; lifc = lifc->next){ /* unspecified */ if(ipcmp(lifc->ip, IPnoaddr) == 0) continue; /* ipv6 loopback */ if(ipcmp(lifc->ip, loopback6) == 0) continue; /* ipv4 loopback */ maskip(lifc->ip, loopbackmask, mynet); if(ipcmp(mynet, loopbacknet) == 0) continue; ipmove(ip, lifc->ip); return 0; } ipmove(ip, IPnoaddr); return -1; }
static uchar* getipv4addr(void) { Ipifc *nifc; Iplifc *lifc; static Ipifc *ifc; ifc = readipifc("/net", ifc, -1); for(nifc = ifc; nifc; nifc = nifc->next) for(lifc = nifc->lifc; lifc; lifc = lifc->next) if(ipcmp(lifc->ip, IPnoaddr) != 0 && ipcmp(lifc->ip, v4prefix) != 0) return lifc->ip; return nil; }
void main(void) { Ipifc *ifc, *list; Iplifc *lifc; int i; fmtinstall('I', eipfmt); fmtinstall('M', eipfmt); list = readipifc("/net", nil, -1); for(ifc = list; ifc; ifc = ifc->next){ print("ipifc %s %d\n", ifc->dev, ifc->mtu); for(lifc = ifc->lifc; lifc; lifc = lifc->next) print("\t%I %M %I\n", lifc->ip, lifc->mask, lifc->net); } }
void readifcs(void) { Ipifc *ifc; Iplifc *lifc; Ifc *ip; Bnet *bn; Route route; int i; ifcs = readipifc(netdir, ifcs, -1); i = 0; for(ifc = ifcs; ifc != nil; ifc = ifc->next){ for(lifc = ifc->lifc; lifc != nil && i < Nifc; lifc = lifc->next){ // ignore any interfaces that aren't v4 if(memcmp(lifc->ip, v4prefix, IPaddrlen-IPv4addrlen) != 0) continue; ip = &ialloc.ifc[i++]; v6tov4(ip->addr, lifc->ip); v6tov4mask(ip->mask, lifc->mask); v6tov4(ip->net, lifc->net); ip->cmask = v4defmask(ip->net); v4maskip(ip->net, ip->cmask, ip->cnet); ip->bcast = 0; /* add as a route */ memmove(route.mask, ip->mask, Pasize); memmove(route.dest, ip->net, Pasize); memset(route.gate, 0, Pasize); route.metric = 0; considerroute(&route); /* mark as broadcast */ if(bnets == 0) ip->bcast = 1; else for(bn = bnets; bn; bn = bn->next) if(memcmp(bn->addr, ip->net, Pasize) == 0){ ip->bcast = 1; break; } } } ialloc.nifc = i; }
int myetheraddr(uchar *to, char *dev) { Ipifc *ifclist, *ifc; ifclist = readipifc(nil, nil, -1); for(ifc=ifclist; ifc; ifc=ifc->next){ if(dev && strcmp(ifc->dev, dev) != 0) continue; if(memcmp(zea, ifc->ether, 6) == 0) continue; memmove(to, ifc->ether, 6); freeipifc(ifclist); return 0; } freeipifc(ifclist); werrstr("no ethernet devices"); return -1; }