44#if defined(sun) && defined(USE_V4_PKTINFO)
45#include <sys/sysmacros.h>
47#include <sys/sockio.h>
52#ifdef USE_SOCKET_FALLBACK
53# if !defined (USE_SOCKET_SEND)
54# define if_register_send if_register_fallback
55# define send_packet send_fallback
56# define if_reinitialize_send if_reinitialize_fallback
68#if defined(RELAY_PORT)
81#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) && defined(USE_V4_PKTINFO)
91#if !defined(SO_BINDTODEVICE) && !defined(USE_FALLBACK)
98#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_FALLBACK)
103#ifndef USE_SOCKET_RECEIVE
112#ifdef USE_SOCKET_RECEIVE
124#if defined (USE_SOCKET_SEND) || \
125 defined (USE_SOCKET_RECEIVE) || \
126 defined (USE_SOCKET_FALLBACK)
144#if !defined(SO_BINDTODEVICE) && !defined(USE_FALLBACK)
147 log_fatal (
"The standard socket API can only support %s",
148 "hosts with a single network interface.");
157 memset(&name, 0,
sizeof(name));
164#if defined(RELAY_PORT)
173 sizeof(
addr6->sin6_addr));
179 sizeof(
addr6->sin6_addr));
185 addr6->sin6_len =
sizeof(*addr6);
202 sizeof(addr->sin_addr));
204 addr->sin_len =
sizeof(*addr);
214 log_fatal(
"Can't create dhcp socket for %s: %m",
info->name);
222 log_fatal(
"Can't set SO_REUSEADDR on dhcp socket for"
223 " %s: %m",
info->name);
231 (
char *)&
flag,
sizeof(
flag)) < 0)) {
232 log_fatal(
"Can't set SO_BROADCAST on dhcp socket for"
233 " %s: %m",
info->name);
236#if defined(DHCPv6) && defined(SO_REUSEPORT)
249 (
char *)&
flag,
sizeof(
flag)) < 0) &&
251 log_fatal(
"Can't set SO_REUSEPORT on dhcp socket for"
252 " %s: %m",
info->name);
259 log_error(
"Can't bind to dhcp address: %m");
260 log_error(
"Please make sure there is no other dhcp server");
261 log_error(
"running and that there's no entry for dhcp or");
262 log_error(
"bootp in /etc/inetd.conf. Also make sure you");
263 log_error(
"are not running HP JetAdmin software, which");
267#if defined(SO_BINDTODEVICE)
271 (
char *)(
info -> ifp),
sizeof(*(
info -> ifp))) < 0) {
272 log_fatal(
"Can't set SO_BINDTODEVICE on dhcp socket for"
273 " %s : %m", (
char *)(
info->ifp));
284#if defined(SCO) && defined(IP_BROADCAST_IF)
285 if (
info->address_count &&
287 sizeof(
info->addresses[0])) < 0)
288 log_fatal(
"Can't set IP_BROADCAST_IF on dhcp socket for"
289 " %s: %m",
info->name);
292#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) && defined(USE_V4_PKTINFO)
300 &on,
sizeof(on)) != 0) {
301 log_fatal(
"Can't set IP_RECVPTKINFO on dhcp socket for"
302 " %s: %m",
info->name);
315#ifdef IPV6_RECVPKTINFO
318 &on,
sizeof(on)) != 0) {
319 log_fatal(
"setsockopt: IPV6_RECVPKTINFO for %s: %m",
325 &on,
sizeof(on)) != 0) {
326 log_fatal(
"setsockopt: IPV6_PKTINFO for %s: %m",
341 log_fatal(
"setsockopt: IPV6_MULTICAST_HOPS for %s: %m",
345 log_debug(
"Setting hop count limit to %d for interface %s",
353#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_FALLBACK)
357#ifndef USE_SOCKET_RECEIVE
362#if defined (USE_SOCKET_FALLBACK)
371 log_info (
"Sending on Socket/%s%s%s",
373 (
info->shared_network ?
"/" :
""),
378#if defined (USE_SOCKET_SEND)
382#ifndef USE_SOCKET_RECEIVE
388 log_info (
"Disabling output on Socket/%s%s%s",
397#ifdef USE_SOCKET_RECEIVE
402#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) && defined(USE_V4_PKTINFO)
410 log_fatal(
"Failed to create AF_INET socket %s:%d",
427 log_info (
"Listening on Socket/%s%s%s",
429 (
info->shared_network ?
"/" :
""),
437#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) && defined(USE_V4_PKTINFO)
456 log_info (
"Disabling input on Socket/%s%s%s",
472 int sock =
info->rfdesc;
476 &
mreq.ipv6mr_multiaddr) <= 0) {
477 log_fatal(
"inet_pton: unable to convert '%s'",
483 log_fatal(
"setsockopt: IPV6_JOIN_GROUP for %s: %m",
496 &
mreq.ipv6mr_multiaddr) <= 0) {
497 log_fatal(
"inet_pton: unable to convert '%s'",
503 log_fatal(
"setsockopt: IPV6_JOIN_GROUP for %s: %m",
518#if defined(RELAY_PORT)
538 log_fatal(
"inet_ntop: unable to convert "
553#if defined(RELAY_PORT)
567 log_info(
"Bound to relay port *:%d",
584 log_info(
"Listening on Socket/%d/%s/%s",
586 info->shared_network->name);
587 log_info(
"Sending on Socket/%d/%s/%s",
589 info->shared_network->name);
617 for (count = 0; count <
info->v6address_count; count++) {
640 log_info(
"Listening on Socket/%d/%s/%s",
642 info->shared_network->name);
643 log_info(
"Sending on Socket/%d/%s/%s",
645 info->shared_network->name);
667#if defined(RELAY_PORT)
684 info->shared_network->name);
685 log_info(
"Disabling output on Socket/%s/%s",
info->name,
686 info->shared_network->name);
701#if defined(RELAY_PORT)
706 log_info(
"Unbound from relay port *:%d",
714#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_FALLBACK)
725#ifdef IGNORE_HOSTUNREACH
729#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) && defined(USE_V4_PKTINFO)
734 pktinfo.ipi_ifindex = interface->
ifp->ifr_index;
738 log_fatal(
"setsockopt: IP_PKTINFO for %s: %m",
739 (
char*)(interface->
ifp));
742 result =
sendto (interface -> wfdesc, (
char *)raw, len, 0,
744#ifdef IGNORE_HOSTUNREACH
754 log_error (
"send_packet: please consult README file%s",
755 " regarding broadcast address.");
803 return (
char *)
cmsgp - (
char *)
msg.msg_control;
812#if defined(DHCPv6) || \
813 (defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) && \
814 defined(USE_V4_PKTINFO))
854 const unsigned char *raw,
size_t len,
872 log_error(
"send_packet6: unable to allocate cmsg header");
889 m.msg_namelen =
sizeof(
dst);
905 v.iov_base = (
char *)raw;
938#ifdef USE_SOCKET_RECEIVE
946#if !(defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) && defined(USE_V4_PKTINFO))
956 memset(hfrom, 0,
sizeof(*hfrom));
958#ifdef IGNORE_HOSTUNREACH
963#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) && defined(USE_V4_PKTINFO)
977 log_error(
"receive_packet: unable to allocate cmsg "
993 m.msg_namelen =
sizeof(*from);
1053#ifdef IGNORE_HOSTUNREACH
1067 unsigned char *buf,
size_t len,
1084 log_error(
"receive_packet6: unable to allocate cmsg "
1100 m.msg_namelen =
sizeof(*from);
1156#if defined (USE_SOCKET_FALLBACK)
1172 status =
recvfrom (interface -> wfdesc, buf,
sizeof buf, 0,
1188#if defined (USE_SOCKET_SEND)
1198#if defined (SOCKET_CAN_RECEIVE_UNICAST_UNCONFIGURED)
1208#if defined(SO_BINDTODEVICE) || \
1209 (defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) && \
1210 defined(USE_V4_PKTINFO))
1222#if defined (USE_SOCKET_FALLBACK)
1228 log_info (
"Sending on Socket/%s%s%s",
1238 log_fatal (
"Can't register I/O handle for %s: %s",
1246#if defined(sun) && defined(USE_V4_PKTINFO)
1276 log_fatal(
"Couldn't get interface flags for %s: %m", name);
1282 hw->hlen =
sizeof (
hw->hbuf);
1286 for (
i = 1;
i <
hw->hlen; ++
i) {
1296 log_fatal(
"Couldn't get interface hardware address for %s: %m",
1315 log_fatal(
"%s: unsupported DLPI MAC type %lu", name,
1316 (
unsigned long)
dladdrp->sdl_type);
#define All_DHCP_Relay_Agents_and_Servers
void if_reinitialize_receive(struct interface_info *)
void maybe_setup_fallback(void)
#define INTERFACE_UPSTREAM
#define INTERFACE_DOWNSTREAM
int supports_multiple_interfaces(struct interface_info *)
void if_deregister_send(struct interface_info *)
#define INTERFACE_STREAMS
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 if_register_linklocal6(struct interface_info *info)
void if_deregister6(struct interface_info *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)
struct in6_addr local_address6
void if_register_receive(struct interface_info *)
void if_register6(struct interface_info *info, int do_multicast)
int if_register_socket(struct interface_info *, int, int *, struct in6_addr *)
ssize_t send_packet6(struct interface_info *, const unsigned char *, size_t, struct sockaddr_in6 *)
void set_multicast_hop_limit(struct interface_info *info, int hop_limit)
int can_unicast_without_arp(struct interface_info *)
void if_deregister_receive(struct interface_info *)
ssize_t receive_packet6(struct interface_info *interface, unsigned char *buf, size_t len, struct sockaddr_in6 *from, struct in6_addr *to_addr, unsigned int *if_index)
void if_register_send(struct interface_info *)
int setup_fallback(struct interface_info **fp, const char *file, int line)
int quiet_interface_discovery
struct in_addr local_address
omapi_object_type_t * dhcp_type_interface
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)
int log_error(const char *,...) __attribute__((__format__(__printf__
int int int log_debug(const char *,...) __attribute__((__format__(__printf__
void log_fatal(const char *,...) __attribute__((__format__(__printf__
int int log_info(const char *,...) __attribute__((__format__(__printf__
#define DHCP_R_INVALIDARG
u_int8_t hbuf[HARDWARE_ADDR_LEN+1]