2014-02-10 19:14:12 +01:00
|
|
|
From bd50ec560d7bec064190e4d430c066e170732c0e Mon Sep 17 00:00:00 2001
|
2013-01-11 12:58:29 +01:00
|
|
|
From: Marius Tomaschewski <mt@suse.de>
|
|
|
|
Date: Tue, 27 Nov 2012 17:44:06 +0100
|
|
|
|
Subject: [PATCH] Fixed linux interface discovery using getifaddrs
|
For complete changelog, please read the RELNOTES file shipped
along with this package or online at:
- Replaced hostname patch with a dhcpv6 and fqdn aware variant:
[- 0006-dhcp-4.2.5-dhclient-send-hostname-rml.patch,
+ 0006-dhcp-4.3.2-dhclient-send-hostname-or-fqdn.patch]
- Adjusted patch numbers in the spec file:
[- 0008-dhcp-4.1.1-P1-lpf-bind-msg-fix.patch,
- 0010-dhcp-4.2.2-dhclient-option-checks.patch,
- 0011-dhcp-4.2.6-close-on-exec.patch,
- 0012-dhcp-4.2.2-quiet-dhclient.patch,
- 0014-Fixed-linux-interface-discovery-using-getifaddrs.patch,
- 0020-dhcp-4.2.x-chown-server-leases.bnc868253.patch,
- 0024-dhcp-4.2.x-dhcpv6-decline-on-DAD-failure.872609.patch,
+ 0008-dhcp-4.2.2-dhclient-option-checks.patch,
+ 0009-dhcp-4.2.6-close-on-exec.patch,
+ 0010-dhcp-4.2.2-quiet-dhclient.patch,
+ 0011-Fixed-linux-interface-discovery-using-getifaddrs.patch,
+ 0012-dhcp-4.2.x-chown-server-leases.bnc868253.patch,
+ 0013-dhcp-4.2.x-dhcpv6-decline-on-DAD-failure.872609.patch]
- Fixed to not pass DHCPv6 address lifetimes a positive (unsigned
32bit) integers to scripts and properly format timestamps as long
to not break them on 64bit architectures (bsc#926159).
[+ 0014-dhclient6-unsigned-lifetimes-for-script-bsc-926159.patch]
- dhclient: expose next-server DHCPv4 option to script (bsc#928390)
[+ 0015-Expose-next-server-DHCPv4-option-to-dhclient-script.patch]
- Replaced infiniband support patch with fixed variant (bsc#910984):
[- 0017-dhcp-4.2.6-lpf-ip-over-ib-support.patch,
- 0018-dhcp-4.2.6-improved-xid.patch,
+ 0016-infiniband-support.patch]
- Moved dhcp-devel package include files and static libraries
OBS-URL: https://build.opensuse.org/package/show/network:dhcp/dhcp?expand=0&rev=154
2015-09-14 17:35:16 +02:00
|
|
|
References: bnc#791289,[ISC-Bugs #31992]
|
2013-01-11 12:58:29 +01:00
|
|
|
|
|
|
|
Unlike dhcp 3.x, dhcp 4.x scans interfaces from /proc/net/dev,
|
|
|
|
which provides only true interface names. When the address set
|
|
|
|
on the interface has a label assigned (linux 2.0 alias interface
|
|
|
|
compatibility), then the SIOCGIFADDR requires the label / alias
|
|
|
|
name as argument instead of the interface name to return this
|
|
|
|
address. When this is the only address assigned to an interface,
|
|
|
|
dhcp-server is unable to find any address and fails to start.
|
|
|
|
|
|
|
|
Changed to use getifaddrs() function, which retrieves all IP
|
|
|
|
addresses on linux systems and is available since GLIBC 2.3.
|
|
|
|
---
|
2014-02-10 19:14:12 +01:00
|
|
|
common/discover.c | 51 ++++++++++++++++++++++++++++++++++++++++++++-------
|
|
|
|
1 file changed, 44 insertions(+), 7 deletions(-)
|
2013-01-11 12:58:29 +01:00
|
|
|
|
|
|
|
diff --git a/common/discover.c b/common/discover.c
|
2014-02-10 19:14:12 +01:00
|
|
|
index 6a0540b..1dcaa02 100644
|
2013-01-11 12:58:29 +01:00
|
|
|
--- a/common/discover.c
|
|
|
|
+++ b/common/discover.c
|
2014-02-10 19:14:12 +01:00
|
|
|
@@ -370,7 +370,7 @@ end_iface_scan(struct iface_conf_list *ifaces) {
|
2013-01-11 12:58:29 +01:00
|
|
|
ifaces->sock = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
-#elif __linux /* !HAVE_SIOCGLIFCONF */
|
|
|
|
+#elif __linux && !(defined(__GNUC_PREREQ) && __GNUC_PREREQ(2,3)) /* !HAVE_SIOCGLIFCONF */
|
|
|
|
/*
|
|
|
|
* Linux support
|
|
|
|
* -------------
|
2014-02-10 19:14:12 +01:00
|
|
|
@@ -379,6 +379,14 @@ end_iface_scan(struct iface_conf_list *ifaces) {
|
2013-01-11 12:58:29 +01:00
|
|
|
* about interfaces, along with selected ioctl() calls.
|
|
|
|
*
|
|
|
|
* Linux low level access is documented in the netdevice man page.
|
|
|
|
+ *
|
|
|
|
+ * Note: Use getifaddrs instead
|
|
|
|
+ * Unfortunately this discover discards all interfaces where the
|
|
|
|
+ * only address has a label assigned (linux 2.0 alias interface
|
|
|
|
+ * compatibility) as the SIOCGIFADDR requires the the alias name
|
|
|
|
+ * (eth0:0) in ifr_name to fetch the address and /proc/net/dev
|
|
|
|
+ * on linux > 2.0 lists only the interface names (eth0) without
|
|
|
|
+ * any aliases.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
2014-02-10 19:14:12 +01:00
|
|
|
@@ -751,11 +759,11 @@ end_iface_scan(struct iface_conf_list *ifaces) {
|
2013-01-11 12:58:29 +01:00
|
|
|
#else
|
|
|
|
|
|
|
|
/*
|
|
|
|
- * BSD support
|
|
|
|
- * -----------
|
|
|
|
+ * BSD & Linux support
|
|
|
|
+ * -------------------
|
|
|
|
*
|
|
|
|
* FreeBSD, NetBSD, OpenBSD, and OS X all have the getifaddrs()
|
|
|
|
- * function.
|
|
|
|
+ * function. Linux has it since glibc 2.3.
|
|
|
|
*
|
|
|
|
* The getifaddrs() man page describes the use.
|
|
|
|
*/
|
2014-02-10 19:14:12 +01:00
|
|
|
@@ -812,10 +820,39 @@ next_iface(struct iface_info *info, int *err, struct iface_conf_list *ifaces) {
|
2013-01-11 12:58:29 +01:00
|
|
|
*err = 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
- strcpy(info->name, ifaces->next->ifa_name);
|
|
|
|
- memcpy(&info->addr, ifaces->next->ifa_addr,
|
|
|
|
- ifaces->next->ifa_addr->sa_len);
|
|
|
|
+ info->addr.ss_family = AF_UNSPEC;
|
|
|
|
info->flags = ifaces->next->ifa_flags;
|
|
|
|
+#ifdef __linux
|
|
|
|
+ if (strchr(ifaces->next->ifa_name, ':')) {
|
|
|
|
+ /*
|
|
|
|
+ * the name contains a ':', which may
|
|
|
|
+ * be a IPv4 "alias interface" label;
|
|
|
|
+ * resolve to the true interface name
|
|
|
|
+ */
|
|
|
|
+ if_indextoname(if_nametoindex(ifaces->next->ifa_name),
|
|
|
|
+ info->name);
|
|
|
|
+ } else {
|
|
|
|
+ strcpy(info->name, ifaces->next->ifa_name);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (ifaces->next->ifa_addr != NULL) {
|
|
|
|
+ if (ifaces->next->ifa_addr->sa_family == AF_INET) {
|
|
|
|
+ memcpy(&info->addr, ifaces->next->ifa_addr,
|
|
|
|
+ sizeof(struct sockaddr_in));
|
|
|
|
+ } else
|
|
|
|
+ if (ifaces->next->ifa_addr->sa_family == AF_INET6) {
|
|
|
|
+ memcpy(&info->addr, ifaces->next->ifa_addr,
|
|
|
|
+ sizeof(struct sockaddr_in6));
|
|
|
|
+ }
|
|
|
|
+ /* else e.g. AF_PACKET / link layer address */
|
|
|
|
+ }
|
|
|
|
+#else
|
|
|
|
+ strcpy(info->name, ifaces->next->ifa_name);
|
|
|
|
+ if (ifaces->next->ifa_addr != NULL) {
|
|
|
|
+ memcpy(&info->addr, ifaces->next->ifa_addr,
|
|
|
|
+ ifaces->next->ifa_addr->sa_len);
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
ifaces->next = ifaces->next->ifa_next;
|
|
|
|
*err = 0;
|
|
|
|
return 1;
|
|
|
|
--
|
2014-02-10 19:14:12 +01:00
|
|
|
1.8.4
|
2013-01-11 12:58:29 +01:00
|
|
|
|