30#if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
35#include <linux/filter.h>
36#include <linux/if_ether.h>
37#include <linux/if_packet.h>
38#include <netinet/in_systm.h>
44#if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
46#include <sys/socket.h>
52 0x00, 0xff, 0xff, 0xff,
53 0xff, 0x12, 0x40, 0x1b,
54 0x00, 0x00, 0x00, 0x00,
55 0x00, 0x00, 0x00, 0x00,
56 0xff, 0xff, 0xff, 0xff
61#if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
110 log_error (
"CONFIG_PACKET (Packet socket) %s",
111 "and CONFIG_FILTER");
112 log_error (
"(Socket Filtering) are enabled %s",
123 log_fatal (
"Failed to get interface index: %m");
129 sa.ll.sll_ifindex =
ifr.ifr_ifindex;
130 if (
bind (sock, &
sa.common,
sizeof sa)) {
135 log_error (
"CONFIG_PACKET (Packet socket) %s",
136 "and CONFIG_FILTER");
137 log_error (
"(Socket Filtering) are enabled %s",
141 log_fatal (
"Bind socket to interface: %m");
155#ifndef USE_LPF_RECEIVE
161 log_info (
"Sending on LPF/%s/%s%s%s",
176#ifndef USE_LPF_RECEIVE
183 log_info (
"Disabling output on LPF/%s/%s%s%s",
194#ifdef USE_LPF_RECEIVE
202#if defined(RELAY_PORT)
207#if defined (HAVE_TR_SUPPORT)
226 &val,
sizeof(val)) < 0) {
228 log_fatal (
"Failed to set auxiliary packet data: %m");
236#if defined (HAVE_TR_SUPPORT)
244 log_info (
"Listening on LPF/%s/%s%s%s",
262 log_info (
"Disabling input on LPF/%s/%s%s%s",
299#if defined(RELAY_PORT)
321 log_error (
"CONFIG_PACKET (Packet socket) %s",
322 "and CONFIG_FILTER");
323 log_error (
"(Socket Filtering) are enabled %s",
327 log_fatal (
"Can't install packet filter program: %m");
331#if defined (HAVE_TR_SUPPORT)
357 log_error (
"CONFIG_PACKET (Packet socket) %s",
358 "and CONFIG_FILTER");
359 log_error (
"(Socket Filtering) are enabled %s",
363 log_fatal (
"Can't install packet filter program: %m");
381 unsigned char *buf = (
unsigned char *)
ih;
391 to->sin_addr.s_addr, to->sin_port,
392 (
unsigned char *)raw, len);
401 log_error (
"send_packet_ib: %m - failed to get if index");
430 unsigned char *buf = (
unsigned char *)
ih;
434 if (!
strcmp (interface -> name,
"fallback"))
453 (
unsigned char *)raw, len);
462#ifdef USE_LPF_RECEIVE
472 unsigned char ibuf [1536];
482 (
unsigned)length, &
paylen, 0);
509 unsigned char ibuf [1536];
514 .iov_len =
sizeof ibuf,
526 .msg_controllen =
sizeof(
cmsgbuf),
570#ifdef VLAN_TCI_PRESENT
573 if (
aux->tp_vlan_tci & 0x0fff)
646 log_fatal (
"Can't register I/O handle for \"%s\": %s",
653#if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
658 if ((*ifa)->ifa_addr ==
NULL)
661 if ((*ifa)->ifa_addr->sa_family !=
AF_PACKET)
667 if (
strcmp((*ifa)->ifa_name, name) == 0)
668 return (
struct sockaddr_ll *)(
void *)(*ifa)->ifa_addr;
682 if (
strlen(name) >=
sizeof(
tmp.ifr_name)) {
683 log_fatal(
"Device name too long: \"%s\"", name);
688 log_fatal(
"Can't create socket for \"%s\": %m", name);
694 log_fatal(
"Error getting hardware address for \"%s\": %m",
699 sa = &
tmp.ifr_hwaddr;
703 log_fatal(
"Unable to allocate memory for link layer address");
706 switch (
sll->sll_hatype) {
725 log_fatal(
"Unsupported device type for \"%s\"",
734 char *name =
info->name;
759 switch (
sll->sll_hatype) {
766#ifdef ARPHRD_IEEE802_TR
788 log_fatal(
"Error getting hardware address for \"%s\": %m", name);
810#if defined(ARPHRD_PPP)
813 log_fatal(
"local_family != AF_INET6 for \"%s\"",
827 log_error(
"Unsupported device type %hu for \"%s\"",
828 sll->sll_hatype, name);
char * print_hw_addr(int htype, const int hlen, const unsigned char *data) const
void if_reinitialize_receive(struct interface_info *)
void maybe_setup_fallback(void)
int supports_multiple_interfaces(struct interface_info *)
void if_deregister_send(struct interface_info *)
#define HARDWARE_ADDR_LEN_IOCTL
void assemble_hw_header(struct interface_info *, unsigned char *, unsigned *, struct hardware *)
void try_hw_addr(struct interface_info *info)
ssize_t decode_udp_ip_header(struct interface_info *, unsigned char *, unsigned, struct sockaddr_in *, unsigned, unsigned *, int)
void if_reinitialize_send(struct interface_info *)
isc_result_t fallback_discard(omapi_object_t *)
ssize_t send_packet(struct interface_info *, struct packet *, struct dhcp_packet *, size_t, struct in_addr, struct sockaddr_in *, struct hardware *)
void assemble_udp_ip_header(struct interface_info *, unsigned char *, unsigned *, u_int32_t, u_int32_t, u_int32_t, unsigned char *, unsigned)
int if_register_lpf(struct interface_info *)
int can_receive_unicast_unconfigured(struct interface_info *)
ssize_t receive_packet(struct interface_info *, unsigned char *, size_t, struct sockaddr_in *, struct hardware *)
void get_hw_addr(struct interface_info *info)
void if_register_receive(struct interface_info *)
isc_result_t get_hw_addr2(struct interface_info *info)
ssize_t send_fallback(struct interface_info *, struct packet *, struct dhcp_packet *, size_t, struct in_addr, struct sockaddr_in *, struct hardware *)
int can_unicast_without_arp(struct interface_info *)
void if_deregister_receive(struct interface_info *)
void if_register_fallback(struct interface_info *)
ssize_t decode_hw_header(struct interface_info *, unsigned char *, unsigned, struct hardware *)
void if_register_send(struct interface_info *)
int setup_fallback(struct interface_info **fp, const char *file, int line)
int quiet_interface_discovery
int if_readsocket(omapi_object_t *h)
isc_result_t omapi_register_io_object(omapi_object_t *, int(*)(omapi_object_t *), int(*)(omapi_object_t *), isc_result_t(*)(omapi_object_t *), isc_result_t(*)(omapi_object_t *), isc_result_t(*)(omapi_object_t *))
void * dmalloc(size_t, const char *, int)
void dfree(void *, const char *, int)
int log_error(const char *,...) __attribute__((__format__(__printf__
void log_fatal(const char *,...) __attribute__((__format__(__printf__
int int log_info(const char *,...) __attribute__((__format__(__printf__
u_int8_t hbuf[HARDWARE_ADDR_LEN+1]
struct hardware anycast_mac_addr
struct hardware hw_address