2
0
mirror of https://gitlab.isc.org/isc-projects/dhcp synced 2025-08-22 09:57:20 +00:00

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]
This commit is contained in:
Tomek Mrugalski 2011-05-10 14:27:56 +00:00
parent c6455252e8
commit 9369bdc121
2 changed files with 12 additions and 5 deletions

View File

@ -120,6 +120,10 @@ work on other platforms. Please report any problems and suggested fixes to
- Relay now properly logs that packet was received over interface without
global IPv6 address [ISC-Bugs #24070]
- 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.0
- Documentation cleanup covering multiple tickets

View 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;