Rather than simply assuming that the kernel supports PACKET_AUXDATA, check to see if it is defined before trying to use it.
Signed-off-by: Dan Moulding <[email protected]> --- networking/udhcp/dhcpc.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index 7dfc160..052ad86 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c @@ -845,10 +845,13 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd) int bytes; struct ip_udp_dhcp_packet packet; uint16_t check; - unsigned char cmsgbuf[CMSG_LEN(sizeof(struct tpacket_auxdata))]; struct iovec iov; struct msghdr msg; + +#ifdef PACKET_AUXDATA + unsigned char cmsgbuf[CMSG_LEN(sizeof(struct tpacket_auxdata))]; struct cmsghdr *cmsg; +#endif /* used to use just safe_read(fd, &packet, sizeof(packet)) * but we need to check for TP_STATUS_CSUMNOTREADY :( @@ -858,8 +861,12 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd) memset(&msg, 0, sizeof(msg)); msg.msg_iov = &iov; msg.msg_iovlen = 1; + +#ifdef PACKET_AUXDATA msg.msg_control = cmsgbuf; msg.msg_controllen = sizeof(cmsgbuf); +#endif + for (;;) { bytes = recvmsg(fd, &msg, 0); if (bytes < 0) { @@ -906,6 +913,7 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd) return -2; } +#ifdef PACKET_AUXDATA for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { if (cmsg->cmsg_level == SOL_PACKET && cmsg->cmsg_type == PACKET_AUXDATA @@ -919,6 +927,7 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd) goto skip_udp_sum_check; } } +#endif /* verify UDP checksum. IP header has to be modified for this */ memset(&packet.ip, 0, offsetof(struct iphdr, protocol)); @@ -930,7 +939,10 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd) log1("Packet with bad UDP checksum received, ignoring"); return -2; } + +#ifdef PACKET_AUXDATA skip_udp_sum_check: +#endif if (packet.data.cookie != htonl(DHCP_MAGIC)) { bb_info_msg("Packet with bad magic, ignoring"); @@ -1043,12 +1055,14 @@ static int udhcp_raw_socket(int ifindex) } #endif +#ifdef PACKET_AUXDATA if (setsockopt(fd, SOL_PACKET, PACKET_AUXDATA, &const_int_1, sizeof(int)) < 0 ) { if (errno != ENOPROTOOPT) log1("Can't set PACKET_AUXDATA on raw socket"); } +#endif log1("Created raw socket"); -- 1.8.2.1 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
