components/isc-dhcp/patches/sockets.patch
author Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
Thu, 02 Jun 2011 13:26:03 -0700
changeset 280 c0dae1e3ca2f
permissions -rw-r--r--
PSARC 2011/043 Import ISC DHCP 7022308 Integrate ISC DHCP server and relay agent
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
280
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
     1
--- dhcp-4.1-ESV-R1/common/discover.c	Tue Sep 29 12:44:49 2009
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
     2
+++ dhcp-4.1-ESV-R1-patched/common/discover.c	Thu May 26 11:49:33 2011
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
     3
@@ -309,6 +309,7 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
     4
 next_iface(struct iface_info *info, int *err, struct iface_conf_list *ifaces) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
     5
 	struct LIFREQ *p;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
     6
 	struct LIFREQ tmp;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
     7
+	isc_boolean_t foundif;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
     8
 #if defined(sun) || defined(__linux)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
     9
 	/* Pointer used to remove interface aliases. */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    10
 	char *s;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    11
@@ -315,6 +316,7 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    12
 #endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    13
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    14
 	do {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    15
+		foundif = ISC_FALSE;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    16
 		if (ifaces->next >= ifaces->num) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    17
 			*err = 0;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    18
 			return 0;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    19
@@ -328,6 +330,13 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    20
 			log_error("Interface name '%s' too long", p->lifr_name);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    21
 			return 0;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    22
 		}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    23
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    24
+		/* Reject if interface address family does not match */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    25
+		if (p->lifr_addr.ss_family != local_family) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    26
+			ifaces->next++;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    27
+			continue;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    28
+		}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    29
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    30
 		strcpy(info->name, p->lifr_name);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    31
 		memset(&info->addr, 0, sizeof(info->addr));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    32
 		memcpy(&info->addr, &p->lifr_addr, sizeof(p->lifr_addr));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    33
@@ -340,7 +349,9 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    34
 		}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    35
 #endif /* defined(sun) || defined(__linux) */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    36
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    37
-	} while (strncmp(info->name, "dummy", 5) == 0);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    38
+		foundif = ISC_TRUE;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    39
+	} while ((foundif == ISC_FALSE) ||
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    40
+	    (strncmp(p->lifr_name, "dummy", 5) == 0));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    41
 	
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    42
 	memset(&tmp, 0, sizeof(tmp));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    43
 	strcpy(tmp.lifr_name, info->name);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    44
@@ -958,7 +969,12 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    45
 		   point-to-point in case an OS incorrectly marks them
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    46
 		   as broadcast). Also skip down interfaces unless we're
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    47
 		   trying to get a list of configurable interfaces. */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    48
-		if (((!(info.flags & IFF_BROADCAST) ||
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    49
+		if ((((local_family == AF_INET &&
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    50
+		    !(info.flags & IFF_BROADCAST)) ||
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    51
+#ifdef DHCPv6
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    52
+		    (local_family == AF_INET6 &&
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    53
+		    !(info.flags & IFF_MULTICAST)) ||
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    54
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    55
 		      info.flags & IFF_LOOPBACK ||
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    56
 		      info.flags & IFF_POINTOPOINT) && !tmp) ||
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    57
 		    (!(info.flags & IFF_UP) &&
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    58
@@ -1386,6 +1402,25 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    59
 	if (result < DHCP_FIXED_NON_UDP - DHCP_SNAME_LEN - DHCP_FILE_LEN)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    60
 		return ISC_R_UNEXPECTED;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    61
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    62
+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    63
+	{
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    64
+		/* We retrieve the ifindex from the unused hfrom variable */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    65
+		unsigned int ifindex;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    66
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    67
+		memcpy(&ifindex, hfrom.hbuf, sizeof (ifindex));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    68
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    69
+		/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    70
+		 * Seek forward from the first interface to find the matching
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    71
+		 * source interface by interface index.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    72
+		 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    73
+		ip = interfaces;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    74
+		while ((ip != NULL) && (if_nametoindex(ip->name) != ifindex))
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    75
+			ip = ip->next;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    76
+		if (ip == NULL)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    77
+			return ISC_R_NOTFOUND;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    78
+	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    79
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    80
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    81
 	if (bootp_packet_handler) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    82
 		ifrom.len = 4;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    83
 		memcpy (ifrom.iabuf, &from.sin_addr, ifrom.len);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    84
@@ -1442,7 +1477,11 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    85
 		ifrom.len = 16;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    86
 		memcpy(ifrom.iabuf, &from.sin6_addr, ifrom.len);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    87
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    88
-		/* Seek forward to find the matching source interface. */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    89
+		/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    90
+		 * Seek forward from the first interface to find the matching
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    91
+		 * source interface by interface index.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    92
+		 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    93
+		ip = interfaces;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    94
 		while ((ip != NULL) && (if_nametoindex(ip->name) != if_idx))
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    95
 			ip = ip->next;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    96
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    97
--- dhcp-4.1-ESV-R1/common/socket.c	Tue Oct  5 17:32:52 2010
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    98
+++ dhcp-4.1-ESV-R1-patched/common/socket.c	Thu May 12 16:11:13 2011
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
    99
@@ -45,6 +45,16 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   100
 #include <sys/ioctl.h>
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   101
 #include <sys/uio.h>
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   102
 #include <sys/uio.h>
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   103
+#if defined(sun)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   104
+#include <sys/sysmacros.h>
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   105
+#include <net/if.h>
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   106
+#include <sys/sockio.h>
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   107
+#if defined(SIOCGLIFHWADDR)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   108
+#include <net/if_dl.h>
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   109
+#else
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   110
+#include <libdlpi.h>
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   111
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   112
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   113
 #include <signal.h>
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   114
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   115
 #ifdef USE_SOCKET_FALLBACK
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   116
@@ -67,6 +77,16 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   117
 #endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   118
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   119
 /*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   120
+ * We can use a single socket for AF_INET (similar to AF_INET6) on all
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   121
+ * interfaces configured for DHCP if the system has support for IP_PKTINFO
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   122
+ * and IP_RECVPKTINFO (f.e. Solaris 11).
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   123
+ */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   124
+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   125
+static unsigned int global_v4_socket_references = 0;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   126
+static int global_v4_socket = -1;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   127
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   128
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   129
+/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   130
  * If we can't bind() to a specific interface, then we can only have
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   131
  * a single socket. This variable insures that we don't try to listen
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   132
  * on two sockets.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   133
@@ -242,6 +262,20 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   134
 		log_fatal("Can't set IP_BROADCAST_IF on dhcp socket: %m");
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   135
 #endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   136
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   137
+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   138
+	/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   139
+	 * If we turn on IP_RECVPKTINFO we will be able to receive
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   140
+	 * the interface index information of the received packet.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   141
+	 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   142
+	if (family == AF_INET) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   143
+		int on = 1;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   144
+		if (setsockopt(sock, IPPROTO_IP, IP_RECVPKTINFO, 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   145
+		               &on, sizeof(on)) != 0) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   146
+			log_fatal("setsockopt: IPV_RECVPKTINFO: %m");
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   147
+		}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   148
+	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   149
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   150
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   151
 #ifdef DHCPv6
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   152
 	/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   153
 	 * If we turn on IPV6_PKTINFO, we will be able to receive 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   154
@@ -275,10 +309,6 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   155
 	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   156
 #endif /* DHCPv6 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   157
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   158
-	/* If this is a normal IPv4 address, get the hardware address. */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   159
-	if ((local_family == AF_INET) && (strcmp(info->name, "fallback") != 0))
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   160
-		get_hw_addr(info->name, &info->hw_address);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   161
-
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   162
 	return sock;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   163
 }
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   164
 #endif /* USE_SOCKET_SEND || USE_SOCKET_RECEIVE || USE_SOCKET_FALLBACK */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   165
@@ -328,9 +358,25 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   166
 void if_register_receive (info)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   167
 	struct interface_info *info;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   168
 {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   169
+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   170
+	if (global_v4_socket_references == 0) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   171
+		global_v4_socket = if_register_socket(info, AF_INET, 0);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   172
+		if (global_v4_socket < 0) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   173
+			/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   174
+			 * if_register_socket() fatally logs if it fails to
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   175
+			 * create a socket, this is just a sanity check.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   176
+			 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   177
+			log_fatal("Failed to create AF_INET socket %s:%d", MDL);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   178
+		}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   179
+	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   180
+		
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   181
+	info->rfdesc = global_v4_socket;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   182
+	global_v4_socket_references++;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   183
+#else
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   184
 	/* If we're using the socket API for sending and receiving,
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   185
 	   we don't need to register this interface twice. */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   186
 	info -> rfdesc = if_register_socket (info, AF_INET, 0);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   187
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   188
 	if (!quiet_interface_discovery)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   189
 		log_info ("Listening on Socket/%s%s%s",
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   190
 		      info -> name,
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   191
@@ -337,13 +383,34 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   192
 		      (info -> shared_network ? "/" : ""),
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   193
 		      (info -> shared_network ?
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   194
 		       info -> shared_network -> name : ""));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   195
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   196
+	/* If this is a normal IPv4 address, get the hardware address. */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   197
+	if (strcmp(info->name, "fallback") != 0)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   198
+		get_hw_addr(info->name, &info->hw_address);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   199
 }
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   200
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   201
 void if_deregister_receive (info)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   202
 	struct interface_info *info;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   203
 {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   204
+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   205
+	/* Dereference the global v4 socket. */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   206
+	if ((info->rfdesc == global_v4_socket) &&
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   207
+	    (info->wfdesc == global_v4_socket) &&
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   208
+	    (global_v4_socket_references > 0)) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   209
+		global_v4_socket_references--;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   210
+		info->rfdesc = -1;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   211
+	} else {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   212
+		log_fatal("Impossible condition at %s:%d", MDL);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   213
+	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   214
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   215
+	if (global_v4_socket_references == 0) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   216
+		close(global_v4_socket);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   217
+		global_v4_socket = -1;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   218
+	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   219
+#else
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   220
 	close (info -> rfdesc);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   221
 	info -> rfdesc = -1;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   222
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   223
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   224
 	if (!quiet_interface_discovery)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   225
 		log_info ("Disabling input on Socket/%s%s%s",
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   226
@@ -489,6 +556,17 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   227
 	int retry = 0;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   228
 	do {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   229
 #endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   230
+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   231
+		struct in_pktinfo pktinfo;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   232
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   233
+		if (interface->ifp != NULL) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   234
+			memset(&pktinfo, 0, sizeof (pktinfo));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   235
+			pktinfo.ipi_ifindex = interface->ifp->ifr_index;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   236
+			if (setsockopt(interface -> wfdesc, IPPROTO_IP,
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   237
+			    IP_PKTINFO, (char *)&pktinfo, sizeof (pktinfo)) < 0)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   238
+				log_fatal("setsockopt: IP_PKTINFO: %m");
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   239
+		}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   240
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   241
 		result = sendto (interface -> wfdesc, (char *)raw, len, 0,
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   242
 				 (struct sockaddr *)to, sizeof *to);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   243
 #ifdef IGNORE_HOSTUNREACH
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   244
@@ -559,11 +637,13 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   245
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   246
 #endif /* DHCPv6 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   247
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   248
-#ifdef DHCPv6
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   249
+#ifdef DHCPv6 || (defined(IP_PKTINFO) && defined(IP_RECVPKTINFO))
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   250
 /*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   251
  * For both send_packet6() and receive_packet6() we need to allocate
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   252
  * space for the cmsg header information.  We do this once and reuse
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   253
- * the buffer.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   254
+ * the buffer. We also need the control buf for send_packet and
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   255
+ * receive_packet for AF_INET when we use a single socket and IP_PKTINFO
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   256
+ * to send the packet out the right interface.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   257
  */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   258
 static void   *control_buf = NULL;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   259
 static size_t  control_buf_len = 0;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   260
@@ -574,7 +654,9 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   261
 	control_buf = dmalloc(control_buf_len, MDL);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   262
 	return;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   263
 }
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   264
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   265
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   266
+#ifdef DHCPv6
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   267
 /* 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   268
  * For both send_packet6() and receive_packet6() we need to use the 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   269
  * sendmsg()/recvmsg() functions rather than the simpler send()/recv()
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   270
@@ -687,8 +769,97 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   271
 	int retry = 0;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   272
 	do {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   273
 #endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   274
+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   275
+	struct msghdr m;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   276
+	struct iovec v;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   277
+	struct cmsghdr *cmsg;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   278
+	struct in_pktinfo *pktinfo;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   279
+	unsigned int ifindex;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   280
+	int found_pktinfo;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   281
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   282
+	/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   283
+	 * If necessary allocate space for the control message header.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   284
+	 * The space is common between send and receive.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   285
+	 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   286
+	if (control_buf == NULL) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   287
+		allocate_cmsg_cbuf();
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   288
+		if (control_buf == NULL) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   289
+			log_error("receive_packet: unable to allocate cmsg "
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   290
+				  "header");
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   291
+			return(ENOMEM);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   292
+		}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   293
+	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   294
+	memset(control_buf, 0, control_buf_len);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   295
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   296
+	/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   297
+	 * Initialize our message header structure.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   298
+	 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   299
+	memset(&m, 0, sizeof(m));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   300
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   301
+	/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   302
+	 * Point so we can get the from address.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   303
+	 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   304
+	m.msg_name = from;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   305
+	m.msg_namelen = sizeof(*from);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   306
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   307
+	/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   308
+	 * Set the data buffer we're receiving. (Using this wacky 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   309
+	 * "scatter-gather" stuff... but we that doesn't really make
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   310
+	 * sense for us, so we use a single vector entry.)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   311
+	 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   312
+	v.iov_base = buf;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   313
+	v.iov_len = len;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   314
+	m.msg_iov = &v;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   315
+	m.msg_iovlen = 1;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   316
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   317
+	/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   318
+	 * Getting the interface is a bit more involved.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   319
+	 *
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   320
+	 * We set up some space for a "control message". We have 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   321
+	 * previously asked the kernel to give us packet 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   322
+	 * information (when we initialized the interface), so we
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   323
+	 * should get the destination address from that.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   324
+	 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   325
+	m.msg_control = control_buf;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   326
+	m.msg_controllen = control_buf_len;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   327
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   328
+	result = recvmsg(interface->rfdesc, &m, 0);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   329
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   330
+	if (result >= 0) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   331
+		/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   332
+		 * If we did read successfully, then we need to loop
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   333
+		 * through the control messages we received and 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   334
+		 * find the one with our destination address.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   335
+		 *
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   336
+		 * We also keep a flag to see if we found it. If we 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   337
+		 * didn't, then we consider this to be an error.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   338
+		 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   339
+		found_pktinfo = 0;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   340
+		cmsg = CMSG_FIRSTHDR(&m);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   341
+		while (cmsg != NULL) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   342
+			if ((cmsg->cmsg_level == IPPROTO_IP) && 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   343
+			    (cmsg->cmsg_type == IP_PKTINFO)) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   344
+				pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   345
+				ifindex = pktinfo->ipi_ifindex;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   346
+				/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   347
+				 * We pass the ifindex back to the caller using
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   348
+				 * the unused hfrom parameter avoiding interface
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   349
+				 * changes between sockets and the discover code.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   350
+				 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   351
+				memcpy(hfrom->hbuf, &ifindex, sizeof (ifindex));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   352
+				found_pktinfo = 1;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   353
+			}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   354
+			cmsg = CMSG_NXTHDR(&m, cmsg);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   355
+		}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   356
+		if (!found_pktinfo) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   357
+			result = -1;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   358
+			errno = EIO;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   359
+		}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   360
+	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   361
+#else
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   362
 		result = recvfrom (interface -> rfdesc, (char *)buf, len, 0,
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   363
 				   (struct sockaddr *)from, &flen);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   364
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   365
 #ifdef IGNORE_HOSTUNREACH
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   366
 	} while (result < 0 &&
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   367
 		 (errno == EHOSTUNREACH ||
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   368
@@ -842,7 +1013,7 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   369
 int supports_multiple_interfaces (ip)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   370
 	struct interface_info *ip;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   371
 {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   372
-#if defined (SO_BINDTODEVICE)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   373
+#if defined (SO_BINDTODEVICE) || (defined(IP_PKTINFO) && defined(IP_RECVPKTINFO))
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   374
 	return 1;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   375
 #else
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   376
 	return 0;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   377
@@ -876,6 +1047,80 @@
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   378
 	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   379
 #endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   380
 }
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   381
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   382
+#if defined(sun)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   383
+void
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   384
+get_hw_addr(const char *name, struct hardware *hw) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   385
+#if defined(SIOCGLIFHWADDR)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   386
+	struct sockaddr_dl *dladdrp;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   387
+#else
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   388
+	dlpi_handle_t dh;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   389
+	uint8_t pa_buf[DLPI_PHYSADDR_MAX];
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   390
+	size_t  len = sizeof (pa_buf);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   391
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   392
+	int rv, sock, i;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   393
+	struct lifreq lifr;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   394
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   395
+	memset(&lifr, 0, sizeof (lifr));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   396
+	(void) strlcpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   397
+	/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   398
+	 * Check if the interface is a virtual or IPMP interface - in those
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   399
+	 * cases it has no hw address, so generate a random one.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   400
+	 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   401
+	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ||
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   402
+	    ioctl(sock, SIOCGLIFFLAGS, &lifr) < 0) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   403
+		/*
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   404
+		 * If the interface only has IPv6, try this with an IPv6 socket.
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   405
+		 */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   406
+		if (sock != -1)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   407
+			(void) close(sock);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   408
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   409
+		if ((sock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0 ||
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   410
+		    ioctl(sock, SIOCGLIFFLAGS, &lifr) < 0) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   411
+			log_fatal("Couldn't get interface flags for %s: %m", name);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   412
+		}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   413
+	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   414
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   415
+	if (lifr.lifr_flags & (IFF_VIRTUAL|IFF_IPMP)) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   416
+		hw->hlen = sizeof (hw->hbuf);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   417
+		srandom((long)gethrtime());
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   418
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   419
+		for (i = 0; i < hw->hlen; ++i) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   420
+			hw->hbuf[i] = random() % 256;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   421
+		}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   422
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   423
+		if (sock != -1)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   424
+			(void) close(sock);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   425
+		return;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   426
+	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   427
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   428
+#if defined(SIOCGLIFHWADDR)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   429
+	if (ioctl(sock, SIOCGLIFHWADDR, &lifr) < 0)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   430
+		log_fatal("Couldn't get interface hardware address for %s: %m", name);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   431
+	dladdrp = (struct sockaddr_dl *)&lifr.lifr_addr;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   432
+	hw->hlen = dladdrp->sdl_alen;
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   433
+	memcpy(hw->hbuf, LLADDR(dladdrp), hw->hlen);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   434
+#else
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   435
+	if ((rv = dlpi_open(name, &dh, 0)) != DLPI_SUCCESS) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   436
+		log_fatal("Couldn't open DLPI device for %s: %s", name,
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   437
+		dlpi_strerror(rv));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   438
+	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   439
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   440
+	if ((rv = dlpi_get_physaddr(dh, DL_CURR_PHYS_ADDR, pa_buf, &len))
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   441
+	    != DLPI_SUCCESS) {
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   442
+		log_fatal("Couldn't get physical address for device %s: %s",
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   443
+		name, dlpi_strerror(rv));
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   444
+	}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   445
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   446
+	hw->hlen = MIN(sizeof (hw->hbuf), len);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   447
+	memcpy(hw->hbuf, pa_buf, hw->hlen);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   448
+
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   449
+	dlpi_close(dh);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   450
+#endif
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   451
+	if (sock != -1)
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   452
+		(void) close(sock);
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   453
+}
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   454
+#endif /* defined(sun) */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   455
 #endif /* USE_SOCKET_SEND */
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   456
 
c0dae1e3ca2f PSARC 2011/043 Import ISC DHCP
Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com>
parents:
diff changeset
   457
 /*