]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Linux Packet Filter interface improvement. sockaddr_pkt structure is used,
authorTomek Mrugalski <tomek@isc.org>
Tue, 10 May 2011 14:38:58 +0000 (14:38 +0000)
committerTomek Mrugalski <tomek@isc.org>
Tue, 10 May 2011 14:38:58 +0000 (14:38 +0000)
rather than sockaddr. Packet ethertype is now forced to ETH_P_IP.
[ISC-Bugs #18975]

RELNOTES
common/lpf.c

index 5d2a1e7c3f56dc0760a4057f1d0e4ece8d2e9bcc..a33da14c1e569727f200b9ba3412030ac17d57e3 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -111,6 +111,10 @@ work on other platforms. Please report any problems and suggested fixes to
   [ISC-Bugs #19615] update the includes in dhcpctl/dhcpctl.3 to be more correct
   [ISC-Bugs #20676] update dhcpd.conf.5 to include the RFC numbers for DDNS
 
+- Linux Packet Filter interface improvement. sockaddr_pkt structure is used, 
+  rather than sockaddr. Packet etherType is now forced to ETH_P_IP. 
+  [ISC-Bugs #18975]
+
                        Changes since 4.2.1rc1
 
 - None
index f727b7cc5abcad54708e05d434ad7fbbb4dfbc16..16eecc95800280584cad0b0cf0df3b793f82586f 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/filter.h>
 #include <linux/if_ether.h>
 #include <netinet/in_systm.h>
+#include <net/if_packet.h>
 #include "includes/netinet/ip.h"
 #include "includes/netinet/udp.h"
 #include "includes/netinet/if_ether.h"
@@ -294,7 +295,7 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto)
        double hh [16];
        double ih [1536 / sizeof (double)];
        unsigned char *buf = (unsigned char *)ih;
-       struct sockaddr sa;
+       struct sockaddr_pkt sa;
        int result;
        int fudge;
 
@@ -318,12 +319,14 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto)
        /* For some reason, SOCK_PACKET sockets can't be connected,
           so we have to do a sentdo every time. */
        memset (&sa, 0, sizeof sa);
-       sa.sa_family = AF_PACKET;
-       strncpy (sa.sa_data,
-                (const char *)interface -> ifp, sizeof sa.sa_data);
+       sa.spkt_family = AF_PACKET;
+       strncpy ((char *)sa.spkt_device,
+                (const char *)interface -> ifp, sizeof sa.spkt_device);
+       sa.spkt_protocol = htons(ETH_P_IP);
 
        result = sendto (interface -> wfdesc,
-                        buf + fudge, ibufp + len - fudge, 0, &sa, sizeof sa);
+                        buf + fudge, ibufp + len - fudge, 0, 
+                        (const struct sockaddr *)&sa, sizeof sa);
        if (result < 0)
                log_error ("send_packet: %m");
        return result;