Blame


1 87a52e04 2005-12-26 devnull /*
2 87a52e04 2005-12-26 devnull * this currently only works for ethernet bootp's -- presotto
3 87a52e04 2005-12-26 devnull */
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"
10 87a52e04 2005-12-26 devnull
11 87a52e04 2005-12-26 devnull static void check72(Info *iip);
12 87a52e04 2005-12-26 devnull
13 87a52e04 2005-12-26 devnull Ndb *db;
14 87a52e04 2005-12-26 devnull char *ndbfile;
15 87a52e04 2005-12-26 devnull
16 87a52e04 2005-12-26 devnull Iplifc*
17 87a52e04 2005-12-26 devnull findlifc(uchar *ip)
18 87a52e04 2005-12-26 devnull {
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;
22 87a52e04 2005-12-26 devnull
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;
30 87a52e04 2005-12-26 devnull }
31 87a52e04 2005-12-26 devnull }
32 87a52e04 2005-12-26 devnull return nil;
33 87a52e04 2005-12-26 devnull }
34 87a52e04 2005-12-26 devnull
35 87a52e04 2005-12-26 devnull int
36 87a52e04 2005-12-26 devnull forme(uchar *ip)
37 87a52e04 2005-12-26 devnull {
38 87a52e04 2005-12-26 devnull Ipifc *ifc;
39 87a52e04 2005-12-26 devnull Iplifc *lifc;
40 87a52e04 2005-12-26 devnull
41 87a52e04 2005-12-26 devnull extern uchar xmyipaddr[IPaddrlen];
42 87a52e04 2005-12-26 devnull
43 87a52e04 2005-12-26 devnull if(memcmp(ip, xmyipaddr, IPaddrlen) == 0)
44 87a52e04 2005-12-26 devnull return 1;
45 87a52e04 2005-12-26 devnull
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;
50 87a52e04 2005-12-26 devnull }
51 87a52e04 2005-12-26 devnull return 0;
52 87a52e04 2005-12-26 devnull }
53 87a52e04 2005-12-26 devnull
54 87a52e04 2005-12-26 devnull uchar noetheraddr[6];
55 87a52e04 2005-12-26 devnull
56 87a52e04 2005-12-26 devnull static void
57 87a52e04 2005-12-26 devnull setipaddr(uchar *addr, char *ip)
58 87a52e04 2005-12-26 devnull {
59 87a52e04 2005-12-26 devnull if(ipcmp(addr, IPnoaddr) == 0)
60 87a52e04 2005-12-26 devnull parseip(addr, ip);
61 87a52e04 2005-12-26 devnull }
62 87a52e04 2005-12-26 devnull
63 87a52e04 2005-12-26 devnull static void
64 87a52e04 2005-12-26 devnull setipmask(uchar *mask, char *ip)
65 87a52e04 2005-12-26 devnull {
66 87a52e04 2005-12-26 devnull if(ipcmp(mask, IPnoaddr) == 0)
67 87a52e04 2005-12-26 devnull parseipmask(mask, ip);
68 87a52e04 2005-12-26 devnull }
69 87a52e04 2005-12-26 devnull
70 87a52e04 2005-12-26 devnull /*
71 87a52e04 2005-12-26 devnull * do an ipinfo with defaults
72 87a52e04 2005-12-26 devnull */
73 87a52e04 2005-12-26 devnull int
74 87a52e04 2005-12-26 devnull lookupip(uchar *ipaddr, Info *iip, int gate)
75 87a52e04 2005-12-26 devnull {
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;
79 87a52e04 2005-12-26 devnull
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;
85 87a52e04 2005-12-26 devnull }
86 87a52e04 2005-12-26 devnull
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";
103 87a52e04 2005-12-26 devnull }
104 87a52e04 2005-12-26 devnull *p = 0;
105 87a52e04 2005-12-26 devnull
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;
111 fa325e9b 2020-01-10 cross
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);
115 87a52e04 2005-12-26 devnull else
116 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "ipmask") == 0)
117 87a52e04 2005-12-26 devnull setipmask(iip->ipmask, nt->val);
118 87a52e04 2005-12-26 devnull else
119 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "fs") == 0)
120 87a52e04 2005-12-26 devnull setipaddr(iip->fsip, nt->val);
121 87a52e04 2005-12-26 devnull else
122 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "auth") == 0)
123 87a52e04 2005-12-26 devnull setipaddr(iip->auip, nt->val);
124 87a52e04 2005-12-26 devnull else
125 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "tftp") == 0)
126 87a52e04 2005-12-26 devnull setipaddr(iip->tftp, nt->val);
127 87a52e04 2005-12-26 devnull else
128 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "tftp2") == 0)
129 87a52e04 2005-12-26 devnull setipaddr(iip->tftp2, nt->val);
130 87a52e04 2005-12-26 devnull else
131 87a52e04 2005-12-26 devnull if(strcmp(nt->attr, "ipgw") == 0)
132 87a52e04 2005-12-26 devnull setipaddr(iip->gwip, nt->val);
133 87a52e04 2005-12-26 devnull else
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;
138 87a52e04 2005-12-26 devnull }
139 87a52e04 2005-12-26 devnull else
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);
143 87a52e04 2005-12-26 devnull }
144 87a52e04 2005-12-26 devnull else
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);
148 87a52e04 2005-12-26 devnull }
149 87a52e04 2005-12-26 devnull else
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);
153 87a52e04 2005-12-26 devnull }
154 87a52e04 2005-12-26 devnull else
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);
158 87a52e04 2005-12-26 devnull }
159 87a52e04 2005-12-26 devnull else
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);
163 87a52e04 2005-12-26 devnull }
164 87a52e04 2005-12-26 devnull else
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);
168 87a52e04 2005-12-26 devnull }
169 87a52e04 2005-12-26 devnull }
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;
173 87a52e04 2005-12-26 devnull }
174 87a52e04 2005-12-26 devnull
175 87a52e04 2005-12-26 devnull static uchar zeroes[6];
176 87a52e04 2005-12-26 devnull
177 87a52e04 2005-12-26 devnull /*
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.
180 87a52e04 2005-12-26 devnull */
181 87a52e04 2005-12-26 devnull int
182 87a52e04 2005-12-26 devnull lookup(Bootp *bp, Info *iip, Info *riip)
183 87a52e04 2005-12-26 devnull {
184 87a52e04 2005-12-26 devnull Ndbtuple *t, *nt;
185 87a52e04 2005-12-26 devnull Ndbs s;
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];
189 87a52e04 2005-12-26 devnull
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;
195 87a52e04 2005-12-26 devnull }
196 87a52e04 2005-12-26 devnull
197 87a52e04 2005-12-26 devnull memset(iip, 0, sizeof(*iip));
198 87a52e04 2005-12-26 devnull
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 */
204 87a52e04 2005-12-26 devnull
205 87a52e04 2005-12-26 devnull check72(iip);
206 87a52e04 2005-12-26 devnull
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;
210 87a52e04 2005-12-26 devnull }
211 87a52e04 2005-12-26 devnull
212 87a52e04 2005-12-26 devnull /*
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.
215 87a52e04 2005-12-26 devnull */
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);
220 87a52e04 2005-12-26 devnull
221 87a52e04 2005-12-26 devnull return 0;
222 87a52e04 2005-12-26 devnull }
223 87a52e04 2005-12-26 devnull
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){
227 87a52e04 2005-12-26 devnull case 1:
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);
231 87a52e04 2005-12-26 devnull break;
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;
236 87a52e04 2005-12-26 devnull }
237 87a52e04 2005-12-26 devnull
238 87a52e04 2005-12-26 devnull /*
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
241 87a52e04 2005-12-26 devnull */
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;
253 87a52e04 2005-12-26 devnull }
254 87a52e04 2005-12-26 devnull }
255 87a52e04 2005-12-26 devnull ndbfree(t);
256 87a52e04 2005-12-26 devnull t = ndbsnext(&s, hwattr, hwval);
257 87a52e04 2005-12-26 devnull }
258 87a52e04 2005-12-26 devnull return -1;
259 87a52e04 2005-12-26 devnull }
260 87a52e04 2005-12-26 devnull
261 87a52e04 2005-12-26 devnull /*
262 87a52e04 2005-12-26 devnull * interface to ndbipinfo
263 87a52e04 2005-12-26 devnull */
264 87a52e04 2005-12-26 devnull Ndbtuple*
265 87a52e04 2005-12-26 devnull lookupinfo(uchar *ipaddr, char **attr, int n)
266 87a52e04 2005-12-26 devnull {
267 87a52e04 2005-12-26 devnull char ip[32];
268 87a52e04 2005-12-26 devnull
269 87a52e04 2005-12-26 devnull sprint(ip, "%I", ipaddr);
270 87a52e04 2005-12-26 devnull return ndbipinfo(db, "ip", ip, attr, n);
271 87a52e04 2005-12-26 devnull }
272 87a52e04 2005-12-26 devnull
273 87a52e04 2005-12-26 devnull /*
274 87a52e04 2005-12-26 devnull * return the ip addresses for a type of server for system ip
275 87a52e04 2005-12-26 devnull */
276 87a52e04 2005-12-26 devnull int
277 87a52e04 2005-12-26 devnull lookupserver(char *attr, uchar **ipaddrs, Ndbtuple *t)
278 87a52e04 2005-12-26 devnull {
279 87a52e04 2005-12-26 devnull Ndbtuple *nt;
280 87a52e04 2005-12-26 devnull int rv = 0;
281 87a52e04 2005-12-26 devnull
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);
285 87a52e04 2005-12-26 devnull rv++;
286 87a52e04 2005-12-26 devnull }
287 87a52e04 2005-12-26 devnull return rv;
288 87a52e04 2005-12-26 devnull }
289 87a52e04 2005-12-26 devnull
290 87a52e04 2005-12-26 devnull /*
291 87a52e04 2005-12-26 devnull * just lookup the name
292 87a52e04 2005-12-26 devnull */
293 87a52e04 2005-12-26 devnull void
294 87a52e04 2005-12-26 devnull lookupname(char *val, Ndbtuple *t)
295 87a52e04 2005-12-26 devnull {
296 87a52e04 2005-12-26 devnull Ndbtuple *nt;
297 87a52e04 2005-12-26 devnull
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);
301 87a52e04 2005-12-26 devnull break;
302 87a52e04 2005-12-26 devnull }
303 87a52e04 2005-12-26 devnull }
304 87a52e04 2005-12-26 devnull
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 };
309 87a52e04 2005-12-26 devnull
310 87a52e04 2005-12-26 devnull static void
311 87a52e04 2005-12-26 devnull check72(Info *iip)
312 87a52e04 2005-12-26 devnull {
313 87a52e04 2005-12-26 devnull uchar net[IPaddrlen];
314 87a52e04 2005-12-26 devnull
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);
318 87a52e04 2005-12-26 devnull }