2 87a52e04 2005-12-26 devnull * this currently only works for ethernet bootp's -- presotto
4 87a52e04 2005-12-26 devnull #include <u.h>
5 87a52e04 2005-12-26 devnull #include <libc.h>
6 87a52e04 2005-12-26 devnull #include <ip.h>
7 87a52e04 2005-12-26 devnull #include <bio.h>
8 87a52e04 2005-12-26 devnull #include <ndb.h>
9 87a52e04 2005-12-26 devnull #include "dat.h"
11 87a52e04 2005-12-26 devnull static void check72(Info *iip);
14 87a52e04 2005-12-26 devnull char *ndbfile;
17 87a52e04 2005-12-26 devnull findlifc(uchar *ip)
19 87a52e04 2005-12-26 devnull uchar x[IPaddrlen];
20 87a52e04 2005-12-26 devnull Ipifc *ifc;
21 87a52e04 2005-12-26 devnull Iplifc *lifc;
23 87a52e04 2005-12-26 devnull for(ifc = ipifcs; ifc; ifc = ifc->next){
24 87a52e04 2005-12-26 devnull for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next){
25 87a52e04 2005-12-26 devnull if(lifc->net[0] == 0)
26 87a52e04 2005-12-26 devnull continue;
27 87a52e04 2005-12-26 devnull maskip(ip, lifc->mask, x);
28 87a52e04 2005-12-26 devnull if(memcmp(x, lifc->net, IPaddrlen) == 0)
29 87a52e04 2005-12-26 devnull return lifc;
32 87a52e04 2005-12-26 devnull return nil;
36 87a52e04 2005-12-26 devnull forme(uchar *ip)
38 87a52e04 2005-12-26 devnull Ipifc *ifc;
39 87a52e04 2005-12-26 devnull Iplifc *lifc;
41 87a52e04 2005-12-26 devnull extern uchar xmyipaddr[IPaddrlen];
43 87a52e04 2005-12-26 devnull if(memcmp(ip, xmyipaddr, IPaddrlen) == 0)
44 87a52e04 2005-12-26 devnull return 1;
46 87a52e04 2005-12-26 devnull for(ifc = ipifcs; ifc; ifc = ifc->next){
47 87a52e04 2005-12-26 devnull for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next)
48 87a52e04 2005-12-26 devnull if(memcmp(ip, lifc->ip, IPaddrlen) == 0)
49 87a52e04 2005-12-26 devnull return 1;
51 87a52e04 2005-12-26 devnull return 0;
54 87a52e04 2005-12-26 devnull uchar noetheraddr[6];
56 87a52e04 2005-12-26 devnull static void
57 87a52e04 2005-12-26 devnull setipaddr(uchar *addr, char *ip)
59 87a52e04 2005-12-26 devnull if(ipcmp(addr, IPnoaddr) == 0)
60 87a52e04 2005-12-26 devnull parseip(addr, ip);
63 87a52e04 2005-12-26 devnull static void
64 87a52e04 2005-12-26 devnull setipmask(uchar *mask, char *ip)
66 87a52e04 2005-12-26 devnull if(ipcmp(mask, IPnoaddr) == 0)
67 87a52e04 2005-12-26 devnull parseipmask(mask, ip);
71 87a52e04 2005-12-26 devnull * do an ipinfo with defaults
74 87a52e04 2005-12-26 devnull lookupip(uchar *ipaddr, Info *iip, int gate)
76 87a52e04 2005-12-26 devnull char ip[32];
77 87a52e04 2005-12-26 devnull Ndbtuple *t, *nt;
78 87a52e04 2005-12-26 devnull char *attrs[32], **p;
80 87a52e04 2005-12-26 devnull if(db == 0)
81 87a52e04 2005-12-26 devnull db = ndbopen(ndbfile);
82 87a52e04 2005-12-26 devnull if(db == 0){
83 87a52e04 2005-12-26 devnull fprint(2, "can't open db\n");
84 87a52e04 2005-12-26 devnull return -1;
87 87a52e04 2005-12-26 devnull p = attrs;
88 87a52e04 2005-12-26 devnull *p++ = "ip";
89 87a52e04 2005-12-26 devnull *p++ = "ipmask";
90 87a52e04 2005-12-26 devnull *p++ = "@ipgw";
91 87a52e04 2005-12-26 devnull if(!gate){
92 87a52e04 2005-12-26 devnull *p++ = "bootf";
93 87a52e04 2005-12-26 devnull *p++ = "bootf2";
94 87a52e04 2005-12-26 devnull *p++ = "@tftp";
95 87a52e04 2005-12-26 devnull *p++ = "@tftp2";
96 87a52e04 2005-12-26 devnull *p++ = "rootpath";
97 87a52e04 2005-12-26 devnull *p++ = "dhcp";
98 87a52e04 2005-12-26 devnull *p++ = "vendorclass";
99 87a52e04 2005-12-26 devnull *p++ = "ether";
100 87a52e04 2005-12-26 devnull *p++ = "dom";
101 87a52e04 2005-12-26 devnull *p++ = "@fs";
102 87a52e04 2005-12-26 devnull *p++ = "@auth";
106 87a52e04 2005-12-26 devnull memset(iip, 0, sizeof(*iip));
107 87a52e04 2005-12-26 devnull snprint(ip, sizeof(ip), "%I", ipaddr);
108 87a52e04 2005-12-26 devnull t = ndbipinfo(db, "ip", ip, attrs, p - attrs);
109 87a52e04 2005-12-26 devnull if(t == nil)
110 87a52e04 2005-12-26 devnull return -1;
112 87a52e04 2005-12-26 devnull for(nt = t; nt != nil; nt = nt->entry){
113 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "ip") == 0)
114 87a52e04 2005-12-26 devnull setipaddr(iip->ipaddr, nt->val);
116 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "ipmask") == 0)
117 87a52e04 2005-12-26 devnull setipmask(iip->ipmask, nt->val);
119 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "fs") == 0)
120 87a52e04 2005-12-26 devnull setipaddr(iip->fsip, nt->val);
122 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "auth") == 0)
123 87a52e04 2005-12-26 devnull setipaddr(iip->auip, nt->val);
125 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "tftp") == 0)
126 87a52e04 2005-12-26 devnull setipaddr(iip->tftp, nt->val);
128 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "tftp2") == 0)
129 87a52e04 2005-12-26 devnull setipaddr(iip->tftp2, nt->val);
131 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "ipgw") == 0)
132 87a52e04 2005-12-26 devnull setipaddr(iip->gwip, nt->val);
134 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "ether") == 0){
135 87a52e04 2005-12-26 devnull if(memcmp(iip->etheraddr, noetheraddr, 6) == 0)
136 87a52e04 2005-12-26 devnull parseether(iip->etheraddr, nt->val);
137 87a52e04 2005-12-26 devnull iip->indb = 1;
140 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "dhcp") == 0){
141 87a52e04 2005-12-26 devnull if(iip->dhcpgroup[0] == 0)
142 87a52e04 2005-12-26 devnull strcpy(iip->dhcpgroup, nt->val);
145 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "bootf") == 0){
146 87a52e04 2005-12-26 devnull if(iip->bootf[0] == 0)
147 87a52e04 2005-12-26 devnull strcpy(iip->bootf, nt->val);
150 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "bootf2") == 0){
151 87a52e04 2005-12-26 devnull if(iip->bootf2[0] == 0)
152 87a52e04 2005-12-26 devnull strcpy(iip->bootf2, nt->val);
155 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "vendor") == 0){
156 87a52e04 2005-12-26 devnull if(iip->vendor[0] == 0)
157 87a52e04 2005-12-26 devnull strcpy(iip->vendor, nt->val);
160 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "dom") == 0){
161 87a52e04 2005-12-26 devnull if(iip->domain[0] == 0)
162 87a52e04 2005-12-26 devnull strcpy(iip->domain, nt->val);
165 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "rootpath") == 0){
166 87a52e04 2005-12-26 devnull if(iip->rootpath[0] == 0)
167 87a52e04 2005-12-26 devnull strcpy(iip->rootpath, nt->val);
170 87a52e04 2005-12-26 devnull ndbfree(t);
171 87a52e04 2005-12-26 devnull maskip(iip->ipaddr, iip->ipmask, iip->ipnet);
172 87a52e04 2005-12-26 devnull return 0;
175 87a52e04 2005-12-26 devnull static uchar zeroes[6];
178 87a52e04 2005-12-26 devnull * lookup info about a client in the database. Find an address on the
179 87a52e04 2005-12-26 devnull * same net as riip.
182 87a52e04 2005-12-26 devnull lookup(Bootp *bp, Info *iip, Info *riip)
184 87a52e04 2005-12-26 devnull Ndbtuple *t, *nt;
186 87a52e04 2005-12-26 devnull char *hwattr;
187 87a52e04 2005-12-26 devnull char *hwval, hwbuf[33];
188 87a52e04 2005-12-26 devnull uchar ciaddr[IPaddrlen];
190 87a52e04 2005-12-26 devnull if(db == 0)
191 87a52e04 2005-12-26 devnull db = ndbopen(ndbfile);
192 87a52e04 2005-12-26 devnull if(db == 0){
193 87a52e04 2005-12-26 devnull fprint(2, "can't open db\n");
194 87a52e04 2005-12-26 devnull return -1;
197 87a52e04 2005-12-26 devnull memset(iip, 0, sizeof(*iip));
199 87a52e04 2005-12-26 devnull /* client knows its address? */
200 87a52e04 2005-12-26 devnull v4tov6(ciaddr, bp->ciaddr);
201 87a52e04 2005-12-26 devnull if(validip(ciaddr)){
202 87a52e04 2005-12-26 devnull if(lookupip(ciaddr, iip, 0) < 0)
203 87a52e04 2005-12-26 devnull return -1; /* don't know anything about it */
205 87a52e04 2005-12-26 devnull check72(iip);
207 87a52e04 2005-12-26 devnull if(!samenet(riip->ipaddr, iip)){
208 87a52e04 2005-12-26 devnull warning(0, "%I not on %I", ciaddr, riip->ipnet);
209 87a52e04 2005-12-26 devnull return -1;
213 87a52e04 2005-12-26 devnull * see if this is a masquerade, i.e., if the ether
214 87a52e04 2005-12-26 devnull * address doesn't match what we expected it to be.
216 87a52e04 2005-12-26 devnull if(memcmp(iip->etheraddr, zeroes, 6) != 0)
217 87a52e04 2005-12-26 devnull if(memcmp(bp->chaddr, iip->etheraddr, 6) != 0)
218 87a52e04 2005-12-26 devnull warning(0, "ciaddr %I rcvd from %E instead of %E",
219 87a52e04 2005-12-26 devnull ciaddr, bp->chaddr, iip->etheraddr);
221 87a52e04 2005-12-26 devnull return 0;
224 87a52e04 2005-12-26 devnull if(bp->hlen > Maxhwlen)
225 87a52e04 2005-12-26 devnull return -1;
226 87a52e04 2005-12-26 devnull switch(bp->htype){
228 87a52e04 2005-12-26 devnull hwattr = "ether";
229 87a52e04 2005-12-26 devnull hwval = hwbuf;
230 87a52e04 2005-12-26 devnull snprint(hwbuf, sizeof(hwbuf), "%E", bp->chaddr);
232 87a52e04 2005-12-26 devnull default:
233 87a52e04 2005-12-26 devnull syslog(0, blog, "not ethernet %E, htype %d, hlen %d",
234 87a52e04 2005-12-26 devnull bp->chaddr, bp->htype, bp->hlen);
235 87a52e04 2005-12-26 devnull return -1;
239 87a52e04 2005-12-26 devnull * use hardware address to find an ip address on
240 87a52e04 2005-12-26 devnull * same net as riip
242 87a52e04 2005-12-26 devnull t = ndbsearch(db, &s, hwattr, hwval);
243 87a52e04 2005-12-26 devnull while(t){
244 87a52e04 2005-12-26 devnull for(nt = t; nt; nt = nt->entry){
245 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "ip") != 0)
246 87a52e04 2005-12-26 devnull continue;
247 87a52e04 2005-12-26 devnull parseip(ciaddr, nt->val);
248 87a52e04 2005-12-26 devnull if(lookupip(ciaddr, iip, 0) < 0)
249 87a52e04 2005-12-26 devnull continue;
250 87a52e04 2005-12-26 devnull if(samenet(riip->ipaddr, iip)){
251 87a52e04 2005-12-26 devnull ndbfree(t);
252 87a52e04 2005-12-26 devnull return 0;
255 87a52e04 2005-12-26 devnull ndbfree(t);
256 87a52e04 2005-12-26 devnull t = ndbsnext(&s, hwattr, hwval);
258 87a52e04 2005-12-26 devnull return -1;
262 87a52e04 2005-12-26 devnull * interface to ndbipinfo
264 87a52e04 2005-12-26 devnull Ndbtuple*
265 87a52e04 2005-12-26 devnull lookupinfo(uchar *ipaddr, char **attr, int n)
267 87a52e04 2005-12-26 devnull char ip[32];
269 87a52e04 2005-12-26 devnull sprint(ip, "%I", ipaddr);
270 87a52e04 2005-12-26 devnull return ndbipinfo(db, "ip", ip, attr, n);
274 87a52e04 2005-12-26 devnull * return the ip addresses for a type of server for system ip
277 87a52e04 2005-12-26 devnull lookupserver(char *attr, uchar **ipaddrs, Ndbtuple *t)
279 87a52e04 2005-12-26 devnull Ndbtuple *nt;
280 87a52e04 2005-12-26 devnull int rv = 0;
282 87a52e04 2005-12-26 devnull for(nt = t; rv < 2 && nt != nil; nt = nt->entry)
283 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, attr) == 0){
284 87a52e04 2005-12-26 devnull parseip(ipaddrs[rv], nt->val);
287 87a52e04 2005-12-26 devnull return rv;
291 87a52e04 2005-12-26 devnull * just lookup the name
294 87a52e04 2005-12-26 devnull lookupname(char *val, Ndbtuple *t)
296 87a52e04 2005-12-26 devnull Ndbtuple *nt;
298 87a52e04 2005-12-26 devnull for(nt = t; nt != nil; nt = nt->entry)
299 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "dom") == 0){
300 87a52e04 2005-12-26 devnull strcpy(val, nt->val);
305 87a52e04 2005-12-26 devnull uchar slash120[IPaddrlen] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
306 87a52e04 2005-12-26 devnull 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0 };
307 87a52e04 2005-12-26 devnull uchar net72[IPaddrlen] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
308 87a52e04 2005-12-26 devnull 0x0, 0x0, 0xff, 0xff, 135, 104, 72, 0 };
310 87a52e04 2005-12-26 devnull static void
311 87a52e04 2005-12-26 devnull check72(Info *iip)
313 87a52e04 2005-12-26 devnull uchar net[IPaddrlen];
315 87a52e04 2005-12-26 devnull maskip(iip->ipaddr, slash120, net);
316 87a52e04 2005-12-26 devnull if(ipcmp(net, net72) == 0)
317 87a52e04 2005-12-26 devnull syslog(0, blog, "check72 %I %M gw %I", iip->ipaddr, iip->ipmask, iip->gwip);