8 typedef struct Rarp Rarp;
26 uchar myip[IPaddrlen];
28 char rlog[] = "ipboot";
29 char *device = "ether0";
33 char* lookup(char*, char*, char*, char*, int);
38 syslog(1, rlog, "error %s: %r", s);
47 fprint(2, "usage: %s [-e device] [-x netmtpt] [-f ndb-file] [-d]\n", argv0);
52 main(int argc, char *argv[])
65 setnetmtpt(net, sizeof(net), nil);
86 setnetmtpt(net, sizeof(net), p);
91 fmtinstall('E', eipfmt);
92 fmtinstall('I', eipfmt);
93 fmtinstall('V', eipfmt);
95 db = ndbopen(ndbfile);
97 error("can't open the database");
99 edata = dial(netmkaddr("0x8035", device, 0), 0, 0, &ectl);
101 error("can't open ethernet");
103 if(myipaddr(myip, net) < 0)
104 error("can't get my ip address");
105 sprint(ebuf, "%s/%s", net, device);
106 if(myetheraddr(myether, ebuf) < 0)
107 error("can't get my ether address");
109 snprint(file, sizeof(file), "%s/arp", net);
110 if((arp = open(file, ORDWR)) < 0)
111 fprint(2, "rarpd: can't open %s\n", file);
113 switch(rfork(RFNOTEG|RFPROC|RFFDG)) {
123 n = read(edata, buf, sizeof(buf));
126 if(n < sizeof(Rarp)){
127 syslog(debug, rlog, "bad packet size %ld", n);
131 if(rp->op[0]!=0 && rp->op[1]!=3){
132 syslog(debug, rlog, "bad op %d %d %E",
133 rp->op[1], rp->op[0], rp->esrc);
138 syslog(debug, rlog, "rcv se %E si %V te %E ti %V",
139 rp->sha, rp->spa, rp->tha, rp->tpa);
141 sprint(ebuf, "%E", rp->tha);
142 if(lookup("ether", ebuf, "ip", ipbuf, sizeof ipbuf) == nil){
143 syslog(debug, rlog, "client lookup failed: %s", ebuf);
146 v4parseip(rp->tpa, ipbuf);
148 memmove(rp->sha, myether, sizeof(rp->sha));
149 v6tov4(rp->spa, myip);
153 memmove(rp->edst, rp->esrc, sizeof(rp->edst));
156 syslog(debug, rlog, "send se %E si %V te %E ti %V",
157 rp->sha, rp->spa, rp->tha, rp->tpa);
159 if(write(edata, buf, 60) != 60)
160 error("write failed");
164 if(fprint(arp, "add %E %V", rp->esrc, rp->tpa) < 0)
165 fprint(2, "can't write arp entry\n");
170 lookup(char *sattr, char *sval, char *tattr, char *tval, int len)
182 sattr = ipattr(sval);
185 t = ndbipinfo(db, sattr, sval, attrs, 1);
188 strncpy(tval, t->val, len);