diff options
Diffstat (limited to 'sys/src/cmd/ip/dhcpd/ndb.c')
| -rw-r--r-- | sys/src/cmd/ip/dhcpd/ndb.c | 66 |
1 files changed, 36 insertions, 30 deletions
diff --git a/sys/src/cmd/ip/dhcpd/ndb.c b/sys/src/cmd/ip/dhcpd/ndb.c index bfc629896..fcd6c0d13 100644 --- a/sys/src/cmd/ip/dhcpd/ndb.c +++ b/sys/src/cmd/ip/dhcpd/ndb.c @@ -33,39 +33,49 @@ opendb(void) return db; } -Iplifc* -findlifc(uchar *ip) +Ipifc* +findifc(uchar *ip) { - uchar x[IPaddrlen]; Ipifc *ifc; Iplifc *lifc; for(ifc = ipifcs; ifc != nil; ifc = ifc->next){ - for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next){ - if(lifc->net[0] == 0) - continue; - maskip(ip, lifc->mask, x); - if(ipcmp(x, lifc->net) == 0) - return lifc; - } + for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next) + if(ipcmp(ip, lifc->ip) == 0) + return ifc; } return nil; } -int -forme(uchar *ip) +Iplifc* +findlifc(uchar *ip, Ipifc *ifc) { - Ipifc *ifc; + uchar x[IPaddrlen]; Iplifc *lifc; - for(ifc = ipifcs; ifc != nil; ifc = ifc->next){ - for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next) - if(ipcmp(ip, lifc->ip) == 0) - return 1; + if(ifc == nil) + return nil; + + for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next){ + maskip(ip, lifc->mask, x); + if(ipcmp(x, lifc->net) == 0) + return lifc; } - return 0; + return nil; +} + +void +localip(uchar *laddr, uchar *raddr, Ipifc *ifc) +{ + Iplifc *lifc; + + if((lifc = findlifc(raddr, ifc)) != nil) + ipmove(laddr, lifc->ip); + else if(ipcmp(laddr, IPv4bcast) == 0) + ipmove(laddr, IPnoaddr); } + uchar noetheraddr[6]; static void @@ -190,8 +200,6 @@ lookupip(uchar *ipaddr, Info *iip, int gate) return 0; } -static uchar zeroes[6]; - /* * lookup info about a client in the database. Find an address on the * same net as riip. @@ -215,21 +223,21 @@ lookup(Bootp *bp, Info *iip, Info *riip) /* client knows its address? */ v4tov6(ciaddr, bp->ciaddr); if(validip(ciaddr)){ + if(!samenet(ciaddr, riip)){ + warning(0, "%I not on %I", ciaddr, riip->ipnet); + return -1; + } if(lookupip(ciaddr, iip, 0) < 0) { if (debug) warning(0, "don't know %I", ciaddr); return -1; /* don't know anything about it */ } - if(!samenet(riip->ipaddr, iip)){ - warning(0, "%I not on %I", ciaddr, riip->ipnet); - return -1; - } /* * see if this is a masquerade, i.e., if the ether * address doesn't match what we expected it to be. */ - if(memcmp(iip->etheraddr, zeroes, 6) != 0) + if(memcmp(iip->etheraddr, zeros, 6) != 0) if(memcmp(bp->chaddr, iip->etheraddr, 6) != 0) warning(0, "ciaddr %I rcvd from %E instead of %E", ciaddr, bp->chaddr, iip->etheraddr); @@ -262,14 +270,12 @@ lookup(Bootp *bp, Info *iip, Info *riip) continue; if(parseip(ciaddr, nt->val) == -1) continue; - if(!validip(ciaddr)) + if(!validip(ciaddr) || !samenet(ciaddr, riip)) continue; if(lookupip(ciaddr, iip, 0) < 0) continue; - if(samenet(riip->ipaddr, iip)){ - ndbfree(t); - return 0; - } + ndbfree(t); + return 0; } ndbfree(t); t = ndbsnext(&s, hwattr, hwval); |
