ref: 33e87e2fa10d3fbc53b032e759f9e206fc1ddef7
parent: d7d0dcfcc65fc4f8ab0b8c213469ecb91ea9f7e9
	author: cinap_lenrek <cinap_lenrek@felloff.net>
	date: Sat Sep  1 11:08:40 EDT 2018
	
ip/dhcpd: bring back interface address for arpenter() the arp table is per interface, so it is possible to have the same netwrok on multiple physical interfaces, tho with different source ip address. one example would be a ethernet and a wlan interface. the mac addresses on these mediums can differ (arp proxying taking place). so provide our source address on the interface we received the request on. the previous change used the ifcaddr; which is correct; but due to a oversight in the kernel, had to match the ip of the arp entry. source address will always work.
--- a/sys/src/cmd/ip/dhcpd/dhcpd.c
+++ b/sys/src/cmd/ip/dhcpd/dhcpd.c
@@ -165,7 +165,7 @@
void addropt(Req*, int, uchar*);
void addrsopt(Req*, int, uchar**, int);
-void arpenter(uchar*, uchar*);
+void arpenter(uchar*, uchar*, uchar*);
void bootp(Req*);
void byteopt(Req*, int, uchar);
void dhcp(Req*);
@@ -746,7 +746,7 @@
 	} else {ipmove(up->raddr, ip);
if(bp->htype == 1)
- arpenter(up->raddr, bp->chaddr);
+ arpenter(up->raddr, bp->chaddr, up->laddr);
hnputs(up->rport, 68);
}
@@ -805,7 +805,7 @@
 	} else {ipmove(up->raddr, ip);
if(bp->htype == 1)
- arpenter(up->raddr, bp->chaddr);
+ arpenter(up->raddr, bp->chaddr, up->laddr);
hnputs(up->rport, 68);
}
@@ -993,7 +993,7 @@
 	} else {v4tov6(up->raddr, bp->yiaddr);
if(bp->htype == 1)
- arpenter(up->raddr, bp->chaddr);
+ arpenter(up->raddr, bp->chaddr, up->laddr);
hnputs(up->rport, 68);
}
@@ -1576,19 +1576,20 @@
}
void
-arpenter(uchar *ip, uchar *ether)
+arpenter(uchar *ip, uchar *mac, uchar *src)
 {- int f;
char buf[256];
+ int fd, n;
- sprint(buf, "%s/arp", net);
- f = open(buf, OWRITE);
-	if(f < 0){- syslog(debug, blog, "open %s: %r", buf);
+ snprint(buf, sizeof buf, "%s/arp", net);
+	if((fd = open(buf, OWRITE)) < 0){+		warning("couldn't open %s: %r", buf);return;
}
- fprint(f, "add ether %I %E", ip, ether);
- close(f);
+ n = snprint(buf, sizeof buf, "add ether %I %E %I\n", ip, mac, src);
+ if(write(fd, buf, n) != n)
+		warning("arpenter: %s: %r", buf);+ close(fd);
}
char *dhcpmsgname[] =
--
⑨