author | Rishi Srivatsavai <Rishi.Srivatsavai@oracle.com> |
Thu, 02 Jun 2011 13:26:03 -0700 | |
changeset 280 | c0dae1e3ca2f |
permissions | -rw-r--r-- |
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 |
/* |