summaryrefslogtreecommitdiff
path: root/accel-pppd/ctrl/ipoe/dhcpv4.c
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2013-09-06 21:00:12 +0400
committerDmitry Kozlov <xeb@mail.ru>2013-09-06 21:00:12 +0400
commit6c796b10ba8093828eccf5a29d13cb348a5f52a7 (patch)
treec81c284d40cdbfd9da398e569e2792da48d49525 /accel-pppd/ctrl/ipoe/dhcpv4.c
parent7ea5ddfb8cf3a2507b901882bd92c5c946e372c8 (diff)
downloadaccel-ppp-xebd-6c796b10ba8093828eccf5a29d13cb348a5f52a7.tar.gz
accel-ppp-xebd-6c796b10ba8093828eccf5a29d13cb348a5f52a7.zip
ipoe: send broadcast DHCP packets if BROADCAST flag is set
Diffstat (limited to 'accel-pppd/ctrl/ipoe/dhcpv4.c')
-rw-r--r--accel-pppd/ctrl/ipoe/dhcpv4.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/accel-pppd/ctrl/ipoe/dhcpv4.c b/accel-pppd/ctrl/ipoe/dhcpv4.c
index fc2a9d3..fa48636 100644
--- a/accel-pppd/ctrl/ipoe/dhcpv4.c
+++ b/accel-pppd/ctrl/ipoe/dhcpv4.c
@@ -574,8 +574,9 @@ static int dhcpv4_send_raw(struct dhcpv4_serv *serv, struct dhcpv4_packet *pack,
struct udphdr *udp = (struct udphdr *)(ip + 1);
int len = pack->ptr - pack->data;
struct iovec iov[2];
+ static uint8_t bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
- memcpy(eth->ether_dhost, pack->hdr->chaddr, ETH_ALEN);
+ memcpy(eth->ether_dhost, (pack->hdr->flags & DHCP_F_BROADCAST) ? bc_addr : pack->hdr->chaddr, ETH_ALEN);
memcpy(eth->ether_shost, serv->hwaddr, ETH_ALEN);
eth->ether_type = htons(ETH_P_IP);
@@ -589,7 +590,7 @@ static int dhcpv4_send_raw(struct dhcpv4_serv *serv, struct dhcpv4_packet *pack,
ip->protocol = IPPROTO_UDP;
ip->check = 0;
ip->saddr = saddr;
- ip->daddr = daddr;
+ ip->daddr = (pack->hdr->flags & DHCP_F_BROADCAST) ? INADDR_BROADCAST : daddr;
ip->check = ip_csum((uint16_t *)ip, 20);
udp->source = ntohs(DHCP_SERV_PORT);