From d5066397a80e34744a6af2573eceb47ac62c8c9a Mon Sep 17 00:00:00 2001 From: Nicolas C Date: Wed, 10 Jan 2018 09:19:43 +0100 Subject: [PATCH] 3.0.x - dhcpclient - raw socket fixes Following the commits by Alan to reintroduce the raw socket code to dhcpclient, I have: - fixed a few compilation warnings - added autoconf for HAVE_LINUX_IF_PACKET_H I'm not so sure of myself for the autoconf part, can you check it's done properly? Thanks! --- configure | 1 + configure.ac | 1 + src/include/autoconf.h.in | 3 +++ src/modules/proto_dhcp/dhcp.c | 8 +++----- src/modules/proto_dhcp/dhcpclient.c | 10 +++++----- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/configure b/configure index 2f69a8a7150..1968a4a4cd4 100755 --- a/configure +++ b/configure @@ -8041,6 +8041,7 @@ for ac_header in \ grp.h \ inttypes.h \ limits.h \ + linux/if_packet.h \ malloc.h \ netdb.h \ netinet/in.h \ diff --git a/configure.ac b/configure.ac index 03a8da21ae7..ed61c3ac05f 100644 --- a/configure.ac +++ b/configure.ac @@ -1033,6 +1033,7 @@ AC_CHECK_HEADERS( \ grp.h \ inttypes.h \ limits.h \ + linux/if_packet.h \ malloc.h \ netdb.h \ netinet/in.h \ diff --git a/src/include/autoconf.h.in b/src/include/autoconf.h.in index 851a423d383..122bf332a2c 100644 --- a/src/include/autoconf.h.in +++ b/src/include/autoconf.h.in @@ -60,6 +60,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_CAPABILITY_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_IF_PACKET_H + /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME diff --git a/src/modules/proto_dhcp/dhcp.c b/src/modules/proto_dhcp/dhcp.c index c8b34a5424c..3b654ed5ea8 100644 --- a/src/modules/proto_dhcp/dhcp.c +++ b/src/modules/proto_dhcp/dhcp.c @@ -1942,7 +1942,7 @@ int fr_dhcp_send_raw_packet(int sockfd, struct sockaddr_ll *p_ll, RADIUS_PACKET /* * print an ethernet address in a buffer */ -char * ether_addr_print(const uint8_t *addr, char *buf) +static char * ether_addr_print(const uint8_t *addr, char *buf) { sprintf (buf, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); @@ -1971,9 +1971,7 @@ RADIUS_PACKET *fr_dhcp_recv_raw_packet(int sockfd, struct sockaddr_ll *p_ll, RAD uint16_t udp_src_port; uint16_t udp_dst_port; size_t dhcp_data_len; - int retval; socklen_t sock_len; - fd_set read_fd; packet = rad_alloc(NULL, false); if (!packet) { @@ -2054,8 +2052,8 @@ RADIUS_PACKET *fr_dhcp_recv_raw_packet(int sockfd, struct sockaddr_ll *p_ll, RAD /* d. Check DHCP layer data */ dhcp_data_len = data_len - data_offset; - if (dhcp_data_len < MIN_PACKET_SIZE) DISCARD_RP("DHCP packet is too small (%d < %d)", dhcp_data_len, MIN_PACKET_SIZE); - if (dhcp_data_len > MAX_PACKET_SIZE) DISCARD_RP("DHCP packet is too large (%d > %d)", dhcp_data_len, MAX_PACKET_SIZE); + if (dhcp_data_len < MIN_PACKET_SIZE) DISCARD_RP("DHCP packet is too small (%zu < %d)", dhcp_data_len, MIN_PACKET_SIZE); + if (dhcp_data_len > MAX_PACKET_SIZE) DISCARD_RP("DHCP packet is too large (%zu > %d)", dhcp_data_len, MAX_PACKET_SIZE); dhcp_hdr = (dhcp_packet_t *)(raw_packet + ETH_HDR_SIZE + IP_HDR_SIZE + UDP_HDR_SIZE); diff --git a/src/modules/proto_dhcp/dhcpclient.c b/src/modules/proto_dhcp/dhcpclient.c index fde15f3e761..2ae0a763cb1 100644 --- a/src/modules/proto_dhcp/dhcpclient.c +++ b/src/modules/proto_dhcp/dhcpclient.c @@ -332,7 +332,7 @@ static void send_with_socket(RADIUS_PACKET *request) * A real client would pick one of the proposed replies. * We'll just return the first eligible reply, and display the others. */ -static RADIUS_PACKET *fr_dhcp_recv_raw_loop(int sockfd, struct sockaddr_ll *p_ll, RADIUS_PACKET *request_p) +static RADIUS_PACKET *fr_dhcp_recv_raw_loop(int sockfd_r, struct sockaddr_ll *p_ll, RADIUS_PACKET *request_p) { struct timeval tval; RADIUS_PACKET *reply_p = NULL; @@ -354,17 +354,17 @@ static RADIUS_PACKET *fr_dhcp_recv_raw_loop(int sockfd, struct sockaddr_ll *p_ll cur_reply_p = NULL; FD_ZERO(&read_fd); - FD_SET(sockfd, &read_fd); - retval = select(sockfd + 1, &read_fd, NULL, NULL, &tval); + FD_SET(sockfd_r, &read_fd); + retval = select(sockfd_r + 1, &read_fd, NULL, NULL, &tval); if (retval < 0) { fr_strerror_printf("Select on DHCP socket failed: %s", fr_syserror(errno)); return NULL; } - if ( retval > 0 && FD_ISSET(sockfd, &read_fd)) { + if ( retval > 0 && FD_ISSET(sockfd_r, &read_fd)) { /* There is something to read on our socket */ - cur_reply_p = fr_dhcp_recv_raw_packet(sockfd, p_ll, request_p); + cur_reply_p = fr_dhcp_recv_raw_packet(sockfd_r, p_ll, request_p); } if (cur_reply_p) { -- 2.47.3