ref: 59d4a6261f42044f3c6ba340fc9844524afa1983
parent: f0ac2d01765f938a4f3656efef440cf2c1bca69d
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Jan 1 16:14:28 EST 2024
ip/dhcpd: don't override local address for gateway case
--- a/sys/src/cmd/ip/dhcpd/dhcpd.c
+++ b/sys/src/cmd/ip/dhcpd/dhcpd.c
@@ -726,20 +726,21 @@
bp = rp->bp;
up = rp->up;
- localip(up->laddr, ip, rp->ifc);
-
flags = nhgets(bp->flags);
if(validip(rp->giaddr)){
ipmove(up->raddr, rp->giaddr);
hnputs(up->rport, 67);
- } else if(flags & Fbroadcast){
- ipmove(up->raddr, IPv4bcast);
- hnputs(up->rport, 68);
} else {
- ipmove(up->raddr, ip);
- if(bp->htype == 1)
- arpenter(up->raddr, bp->chaddr, up->laddr);
- hnputs(up->rport, 68);
+ localip(up->laddr, ip, rp->ifc);
+ if(flags & Fbroadcast){
+ ipmove(up->raddr, IPv4bcast);
+ hnputs(up->rport, 68);
+ } else {
+ ipmove(up->raddr, ip);
+ if(bp->htype == 1)
+ arpenter(up->raddr, bp->chaddr, up->laddr);
+ hnputs(up->rport, 68);
+ }
}
/*
@@ -785,20 +786,21 @@
bp = rp->bp;
up = rp->up;
- localip(up->laddr, ip, rp->ifc);
-
flags = nhgets(bp->flags);
if(validip(rp->giaddr)){
ipmove(up->raddr, rp->giaddr);
hnputs(up->rport, 67);
- } else if(flags & Fbroadcast){
- ipmove(up->raddr, IPv4bcast);
- hnputs(up->rport, 68);
} else {
- ipmove(up->raddr, ip);
- if(bp->htype == 1)
- arpenter(up->raddr, bp->chaddr, up->laddr);
- hnputs(up->rport, 68);
+ localip(up->laddr, ip, rp->ifc);
+ if(flags & Fbroadcast){
+ ipmove(up->raddr, IPv4bcast);
+ hnputs(up->rport, 68);
+ } else {
+ ipmove(up->raddr, ip);
+ if(bp->htype == 1)
+ arpenter(up->raddr, bp->chaddr, up->laddr);
+ hnputs(up->rport, 68);
+ }
}
/*
@@ -844,8 +846,6 @@
bp = rp->bp;
up = rp->up;
- localip(up->laddr, ip, rp->ifc);
-
/*
* set destination (always broadcast)
*/
@@ -853,6 +853,7 @@
ipmove(up->raddr, rp->giaddr);
hnputs(up->rport, 67);
} else {
+ localip(up->laddr, ip, rp->ifc);
ipmove(up->raddr, IPv4bcast);
hnputs(up->rport, 68);
}
@@ -973,20 +974,21 @@
rp->p += 128-4;
}
- localip(up->laddr, iip->ipaddr, iip->ifc);
-
flags = nhgets(bp->flags);
if(validip(rp->giaddr)){
ipmove(up->raddr, rp->giaddr);
hnputs(up->rport, 67);
- } else if(flags & Fbroadcast){
- ipmove(up->raddr, IPv4bcast);
- hnputs(up->rport, 68);
} else {
- v4tov6(up->raddr, bp->yiaddr);
- if(bp->htype == 1)
- arpenter(up->raddr, bp->chaddr, up->laddr);
- hnputs(up->rport, 68);
+ localip(up->laddr, iip->ipaddr, rp->ifc);
+ if(flags & Fbroadcast){
+ ipmove(up->raddr, IPv4bcast);
+ hnputs(up->rport, 68);
+ } else {
+ v4tov6(up->raddr, bp->yiaddr);
+ if(bp->htype == 1)
+ arpenter(up->raddr, bp->chaddr, up->laddr);
+ hnputs(up->rport, 68);
+ }
}
/*