]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
3.0.x - dhcpclient - raw socket fixes 2155/head
authorNicolas C <nchaigne@capgemini.fr>
Wed, 10 Jan 2018 08:19:43 +0000 (09:19 +0100)
committerNicolas C <nchaigne@capgemini.fr>
Wed, 10 Jan 2018 08:19:43 +0000 (09:19 +0100)
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
configure.ac
src/include/autoconf.h.in
src/modules/proto_dhcp/dhcp.c
src/modules/proto_dhcp/dhcpclient.c

index 2f69a8a71508de62dab36c91f376d6a4791669e8..1968a4a4cd4e455373c554df6401597dda12e92d 100755 (executable)
--- 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 \
index 03a8da21ae7be11644a60b60d8598466e99e7bde..ed61c3ac05f03d4acf89e5f2e8fb1d17bc288139 100644 (file)
@@ -1033,6 +1033,7 @@ AC_CHECK_HEADERS( \
   grp.h \
   inttypes.h \
   limits.h \
+  linux/if_packet.h \
   malloc.h \
   netdb.h \
   netinet/in.h \
index 851a423d383d22a0c9d7bc9466ce9a1703f856b2..122bf332a2cc366bc0a8bc6308fd3d6c9b3643d1 100644 (file)
@@ -60,6 +60,9 @@
 /* Define to 1 if you have the <sys/capability.h> header file. */
 #undef HAVE_CAPABILITY_H
 
+/* Define to 1 if you have the <linux/if_packet.h> header file. */
+#undef HAVE_LINUX_IF_PACKET_H
+
 /* Define to 1 if you have the `clock_gettime' function. */
 #undef HAVE_CLOCK_GETTIME
 
index c8b34a5424c3a016cb0fde4dd5c518318d7b27b6..3b654ed5ea8c108ba30502569a877b301df52ae5 100644 (file)
@@ -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);
 
index fde15f3e76127eedf1577051d834962939e75c5d..2ae0a763cb1a983a6c738d1609aedad11ecb1ddf 100644 (file)
@@ -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) {