90#if defined (USE_DLPI_SEND) || defined (USE_DLPI_RECEIVE) || \
91 defined(USE_DLPI_HWADDR)
93# include <sys/ioctl.h>
98# include <sys/pfmod.h>
103# include <netinet/in_systm.h>
108# ifdef USE_DLPI_PFMOD
110# define DLPI_MODNAME "DLPI+RAW+PFMOD"
112# define DLPI_MODNAME "DLPI+PFMOD"
116# define DLPI_MODNAME "DLPI+RAW"
118# define DLPI_MODNAME "DLPI"
123# define ABS(x) ((x) >= 0 ? (x) : 0-(x))
126#if defined(USE_DLPI_PFMOD) || defined(USE_DLPI_RAW)
130#define DLPI_MAXDLBUF 8192
131#define DLPI_MAXDLADDR 1024
134#if defined(USE_DEV_NET)
135#define DLPI_DEVDIR "/dev/net/"
137#define DLPI_DEVDIR "/dev/"
148#if defined(UNUSED_DLPI_INTERFACE)
159#if defined(USE_DLPI_SEND) || defined(USE_DLPI_RECEIVE)
165 unsigned char *data,
int datalen);
190#ifdef USE_DLPI_RECEIVE
213 log_fatal (
"Can't open DLPI device for %s: %m",
info -> name);
221 log_fatal (
"Can't get DLPI MAC type for %s: %m",
info -> name);
237 (
unsigned long)
dlp->info_ack.dl_mac_type);
262 log_fatal (
"Can't attach DLPI device for %s: %m",
info -> name);
271 log_fatal (
"Can't bind DLPI device for %s: %m",
info -> name);
280 log_fatal (
"Can't get DLPI hardware address for %s: %m",
291 log_fatal (
"Can't set DLPI RAW mode for %s: %m",
298 log_fatal (
"Can't push packet filter onto DLPI for %s: %m",
306#if defined(USE_DLPI_PFMOD) || defined(USE_DLPI_RAW)
337#ifndef USE_DLPI_RECEIVE
338# ifdef USE_DLPI_PFMOD
344# ifdef USE_DLPI_PFMOD
352 sizeof (
pf), (
char *)&
pf) < 0) {
353 log_fatal (
"Can't set PFMOD send filter on %s: %m",
info -> name);
366 log_info (
"Sending on DLPI/%s/%s%s%s",
369 info -> hw_address.hlen - 1,
370 &
info -> hw_address.hbuf [1]),
375#ifdef DLPI_FIRST_SEND_WAIT
377# ifdef USE_DLPI_RECEIVE
390#ifndef USE_DLPI_RECEIVE
396 log_info (
"Disabling output on DLPI/%s/%s%s%s",
407#ifdef USE_DLPI_RECEIVE
412#if defined(RELAY_PORT)
413#error "Relay port is not yet supported for DLPI"
436#if defined (USE_DLPI_RAW)
437# define ETHER_H_PREFIX (14)
446# define ETHER_H_PREFIX (0)
473 pf.Pf_Filter [
pf.Pf_FilterLen++] =
htons (0x00FF);
479 sizeof (
pf), (
char *)&
pf) < 0) {
480 log_fatal (
"Can't set PFMOD receive filter on %s: %m",
info -> name);
485 log_info (
"Listening on DLPI/%s/%s%s%s",
488 info -> hw_address.hlen - 1,
489 &
info -> hw_address.hbuf [1]),
494#ifdef DLPI_FIRST_SEND_WAIT
515 log_info (
"Disabling input on DLPI/%s/%s%s%s",
541 unsigned char *
dbuf = (
unsigned char *)
ih;
547 if (!
strcmp (interface -> name,
"fallback"))
560 log_fatal (
"send_packet: hh buffer too small.\n");
567 (
unsigned char *)raw, len);
588 unsigned char sap [4];
594# if (BYTE_ORDER == LITTLE_ENDIAN)
602 if (hto && hto -> hlen == interface -> hw_address.hlen)
628#ifdef USE_DLPI_RECEIVE
636 unsigned char dbuf [1536];
645 length =
read (interface -> rfdesc,
dbuf,
sizeof (
dbuf));
657# if !defined (USE_DLPI_RAW)
681 memset (hfrom,
'\0',
sizeof *hfrom);
703 from, length, &
paylen, 1);
747#define DLPI_MAXWAIT 15
768 while ((*(
cp-1) >=
'0' && *(
cp-1) <=
'9') || *(
cp - 1) ==
':')
cp--;
772 while (*
cp >=
'0' && *
cp <=
'9') {
808#if !defined(USE_DEV_NET)
810 while ((*(
ep - 1) >=
'0' && *(
ep - 1) <=
'9') || *(
ep - 1) ==
':')
850 unsigned long addrtype;
922#if defined(UNUSED_DLPI_INTERFACE)
988 (
struct strbuf*)
NULL, &flags,
"dlpibindack") < 0) {
1022 (
struct strbuf*)
NULL, &flags,
"dlpiokack") < 0) {
1056 "dlpiinfoack") < 0) {
1090 "dlpiphysaddrack") < 0) {
1108#if defined(USE_DLPI_SEND) || defined(USE_DLPI_RECEIVE)
1111 unsigned char *addr;
1115 unsigned char *
dbuf;
1136 ctl.buf = (
char *)buf;
1139 data.buf = (
char *)
dbuf;
1149 unsigned char *
daddr;
1151 unsigned char *
saddr;
1154 unsigned char *
dbuf;
1169 ctl.buf = (
char *)buf;
1173 data.buf = (
char *)
dbuf;
1187 if (data.len <= 0) {
1232 if (
dlp->dl_primitive !=
prim) {
1271 }
else if (count < 0) {
1302 if (
ctlp -> len <
sizeof (
long)) {
1309#if defined(USE_DLPI_SEND)
1338 log_fatal (
"Can't register I/O handle for %s: %s",
1358 log_fatal(
"Can't open DLPI device for %s: %m", name);
1366 log_fatal(
"Can't request DLPI MAC type for %s: %m", name);
1369 log_fatal(
"Can't get DLPI MAC type for %s: %m", name);
1371 switch (
dlp->info_ack.dl_mac_type) {
1383 log_fatal(
"%s: unsupported DLPI MAC type %lu", name,
1384 (
unsigned long)
dlp->info_ack.dl_mac_type);
1396 log_fatal(
"Can't attach DLPI device for %s: %m",
1406 log_fatal(
"Can't request DLPI hardware address for %s: %m",
1410 log_fatal(
"Can't get DLPI hardware address for %s: %m",
1413 if (
dlp->physaddr_ack.dl_addr_length <
sizeof(
hw->hbuf)) {
1415 (
char *)buf +
dlp->physaddr_ack.dl_addr_offset,
1416 dlp->physaddr_ack.dl_addr_length);
1417 hw->hlen =
dlp->physaddr_ack.dl_addr_length + 1;
1420 (
char *)buf +
dlp->physaddr_ack.dl_addr_offset,
1421 sizeof(
hw->hbuf)-1);
1422 hw->hlen =
sizeof(
hw->hbuf);
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 *)
void assemble_hw_header(struct interface_info *, unsigned char *, unsigned *, struct hardware *)
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 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 *)
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 *))
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__
u_int8_t hbuf[HARDWARE_ADDR_LEN+1]
struct hardware anycast_mac_addr
struct hardware hw_address