[dhcp/f17] ib.patch: added fall-back method ioctl_get_ll() (#626514-c#63, #840601).

Jiří Popelka jpopelka at fedoraproject.org
Mon Jul 23 11:44:06 UTC 2012


commit cd552e5d9933d6d2a28a8096177e7c8d2e06d7f1
Author: Jiri Popelka <jpopelka at redhat.com>
Date:   Mon Jul 23 13:39:43 2012 +0200

    ib.patch: added fall-back method ioctl_get_ll() (#626514-c#63, #840601).

 dhcp-4.2.2-gpxe-cid.patch |    2 +-
 dhcp-4.2.4-lpf-ib.patch   |  108 +++++++++++++++++++++++----------------------
 dhcp.spec                 |    6 ++-
 3 files changed, 61 insertions(+), 55 deletions(-)
---
diff --git a/dhcp-4.2.2-gpxe-cid.patch b/dhcp-4.2.2-gpxe-cid.patch
index 595511b..d9dea5c 100644
--- a/dhcp-4.2.2-gpxe-cid.patch
+++ b/dhcp-4.2.2-gpxe-cid.patch
@@ -74,7 +74,7 @@ diff -up dhcp-4.2.2/common/lpf.c.gpxe-cid dhcp-4.2.2/common/lpf.c
 --- dhcp-4.2.2/common/lpf.c.gpxe-cid	2011-09-16 18:23:20.183453996 +0200
 +++ dhcp-4.2.2/common/lpf.c	2011-09-16 18:25:28.235804421 +0200
 @@ -591,6 +591,37 @@ void maybe_setup_fallback ()
- 	return NULL;
+ 	return sll;
  }
  
 +static unsigned char * get_ib_hw_addr(char * name)
diff --git a/dhcp-4.2.4-lpf-ib.patch b/dhcp-4.2.4-lpf-ib.patch
index 0692b59..fa54c9e 100644
--- a/dhcp-4.2.4-lpf-ib.patch
+++ b/dhcp-4.2.4-lpf-ib.patch
@@ -1,6 +1,6 @@
 diff -up dhcp-4.2.4/client/dhclient.c.lpf-ib dhcp-4.2.4/client/dhclient.c
---- dhcp-4.2.4/client/dhclient.c.lpf-ib	2012-07-18 16:41:17.958560314 +0200
-+++ dhcp-4.2.4/client/dhclient.c	2012-07-18 16:41:17.971560135 +0200
+--- dhcp-4.2.4/client/dhclient.c.lpf-ib	2012-07-18 21:08:48.100835005 +0200
++++ dhcp-4.2.4/client/dhclient.c	2012-07-18 21:08:48.111834856 +0200
 @@ -113,6 +113,8 @@ static int check_domain_name_list(const
  static int check_option_values(struct universe *universe, unsigned int opt,
  			       const char *ptr, size_t len);
@@ -56,8 +56,8 @@ diff -up dhcp-4.2.4/client/dhclient.c.lpf-ib dhcp-4.2.4/client/dhclient.c
   *
   * Each routine is called from the dhclient_state_machine() in one of
 diff -up dhcp-4.2.4/common/bpf.c.lpf-ib dhcp-4.2.4/common/bpf.c
---- dhcp-4.2.4/common/bpf.c.lpf-ib	2012-07-18 16:41:17.959560300 +0200
-+++ dhcp-4.2.4/common/bpf.c	2012-07-18 16:41:17.972560121 +0200
+--- dhcp-4.2.4/common/bpf.c.lpf-ib	2012-07-18 21:08:48.101834991 +0200
++++ dhcp-4.2.4/common/bpf.c	2012-07-18 21:08:48.111834856 +0200
 @@ -198,11 +198,44 @@ struct bpf_insn dhcp_bpf_filter [] = {
  	BPF_STMT(BPF_RET+BPF_K, 0),
  };
@@ -104,8 +104,8 @@ diff -up dhcp-4.2.4/common/bpf.c.lpf-ib dhcp-4.2.4/common/bpf.c
  struct bpf_insn dhcp_bpf_tr_filter [] = {
          /* accept all token ring packets due to variable length header */
 diff -up dhcp-4.2.4/common/lpf.c.lpf-ib dhcp-4.2.4/common/lpf.c
---- dhcp-4.2.4/common/lpf.c.lpf-ib	2012-07-18 16:41:17.960560286 +0200
-+++ dhcp-4.2.4/common/lpf.c	2012-07-18 16:41:35.004325607 +0200
+--- dhcp-4.2.4/common/lpf.c.lpf-ib	2012-07-18 21:08:48.101834991 +0200
++++ dhcp-4.2.4/common/lpf.c	2012-07-18 21:10:47.367210799 +0200
 @@ -42,6 +42,7 @@
  #include "includes/netinet/udp.h"
  #include "includes/netinet/if_ether.h"
@@ -358,45 +358,61 @@ diff -up dhcp-4.2.4/common/lpf.c.lpf-ib dhcp-4.2.4/common/lpf.c
  	length = recvmsg (interface -> rfdesc, &msg, 0);
  	if (length <= 0)
  		return length;
-@@ -461,34 +591,63 @@ void maybe_setup_fallback ()
+@@ -461,11 +591,32 @@ void maybe_setup_fallback ()
  	}
  }
  
 -void
 -get_hw_addr(const char *name, struct hardware *hw) {
--	int sock;
--	struct ifreq tmp;
--	struct sockaddr *sa;
 +struct sockaddr_ll *
 +get_ll (struct ifaddrs *ifaddrs, struct ifaddrs **ifa, char *name)
 +{
 +	for (*ifa = ifaddrs; *ifa != NULL; *ifa = (*ifa)->ifa_next) {
 +		if ((*ifa)->ifa_addr == NULL)
 +			continue;
- 
--	if (strlen(name) >= sizeof(tmp.ifr_name)) {
--		log_fatal("Device name too long: \"%s\"", name);
--	}
++
 +		if ((*ifa)->ifa_addr->sa_family != AF_PACKET)
 +			continue;
 +
 +		if ((*ifa)->ifa_flags & IFF_LOOPBACK)
 +			continue;
- 
--	sock = socket(AF_INET, SOCK_DGRAM, 0);
--	if (sock < 0) {
--		log_fatal("Can't create socket for \"%s\": %m", name);
++
 +		if (strcmp((*ifa)->ifa_name, name) == 0)
-+			return (struct sockaddr_ll **)(*ifa)->ifa_addr;
- 	}
++			return (struct sockaddr_ll *)(*ifa)->ifa_addr;
++	}
 +	return NULL;
 +}
++
++struct sockaddr_ll *
++ioctl_get_ll(char *name)
++{
+ 	int sock;
+ 	struct ifreq tmp;
+-	struct sockaddr *sa;
++	struct sockaddr *sa = NULL;
++	struct sockaddr_ll *sll = NULL;
  
--	memset(&tmp, 0, sizeof(tmp));
--	strcpy(tmp.ifr_name, name);
--	if (ioctl(sock, SIOCGIFHWADDR, &tmp) < 0) {
+ 	if (strlen(name) >= sizeof(tmp.ifr_name)) {
+ 		log_fatal("Device name too long: \"%s\"", name);
+@@ -479,16 +630,44 @@ get_hw_addr(const char *name, struct har
+ 	memset(&tmp, 0, sizeof(tmp));
+ 	strcpy(tmp.ifr_name, name);
+ 	if (ioctl(sock, SIOCGIFHWADDR, &tmp) < 0) {
 -		log_fatal("Error getting hardware address for \"%s\": %m", 
--			  name);
++		log_fatal("Error getting hardware address for \"%s\": %m",
+ 			  name);
+ 	}
+ 
+ 	sa = &tmp.ifr_hwaddr;
+-	switch (sa->sa_family) {
++	sll = dmalloc (sizeof (struct sockaddr_ll), MDL);
++	if (!sll)
++		log_fatal("Unable to allocate memory for link layer address");
++	memcpy(&sll->sll_hatype, &sa->sa_family, sizeof (sll->sll_hatype));
++	memcpy(sll->sll_addr, sa->sa_data, sizeof (sll->sll_addr));
++	return sll;
++}
++
 +void
 +get_hw_addr(struct interface_info *info)
 +{
@@ -410,28 +426,13 @@ diff -up dhcp-4.2.4/common/lpf.c.lpf-ib dhcp-4.2.4/common/lpf.c
 +		log_fatal("Failed to get interfaces");
 +
 +	if ((sll = get_ll(ifaddrs, &ifa, name)) == NULL) {
-+		char *tmp = NULL;
-+		char *real_name = strdup (name);
 +		/*
 +		 * We were unable to get link-layer address for name.
-+		 * Reason could be RHBZ#840601.
++		 * Fall back to ioctl(SIOCGIFHWADDR).
 +		 */
-+		if ((tmp = strrchr (real_name, ':')) != NULL) {
-+			*tmp = '\0';
-+			log_debug("Failed to get HW address for %s. Seems to be an alias, trying %s instead.\n", name, real_name);
-+			if ((sll = get_ll(ifaddrs, &ifa, real_name)) == NULL) {
-+				freeifaddrs(ifaddrs);
-+				log_fatal("Failed to get HW address for %s\n", name);
-+			}
-+		} else {
-+			freeifaddrs(ifaddrs);
-+			log_fatal("Failed to get HW address for %s\n", name);
-+		}
-+		free (real_name);
- 	}
- 
--	sa = &tmp.ifr_hwaddr;
--	switch (sa->sa_family) {
++		sll = ioctl_get_ll(name);
++	}
++
 +	switch (sll->sll_hatype) {
  		case ARPHRD_ETHER:
  			hw->hlen = 7;
@@ -441,7 +442,7 @@ diff -up dhcp-4.2.4/common/lpf.c.lpf-ib dhcp-4.2.4/common/lpf.c
  			break;
  		case ARPHRD_IEEE802:
  #ifdef ARPHRD_IEEE802_TR
-@@ -496,18 +655,35 @@ get_hw_addr(const char *name, struct har
+@@ -496,18 +675,35 @@ get_hw_addr(const char *name, struct har
  #endif /* ARPHRD_IEEE802_TR */
  			hw->hlen = 7;
  			hw->hbuf[0] = HTYPE_IEEE802;
@@ -476,19 +477,20 @@ diff -up dhcp-4.2.4/common/lpf.c.lpf-ib dhcp-4.2.4/common/lpf.c
  			if (local_family != AF_INET6)
 -				log_fatal("Unsupported device type %d for \"%s\"",
 -				           sa->sa_family, name);
-+				log_fatal("Unsupported device type %ld for \"%s\"",
-+					  (long int)sll->sll_family, name);
++				log_fatal("local_family != AF_INET6 for \"%s\"",
++					  name);
  			hw->hlen = 0;
  			hw->hbuf[0] = HTYPE_RESERVED;
  			/* 0xdeadbeef should never occur on the wire,
-@@ -520,10 +696,11 @@ get_hw_addr(const char *name, struct har
+@@ -520,10 +716,11 @@ get_hw_addr(const char *name, struct har
  			break;
  #endif
  		default:
-+			freeifaddrs(ifaddrs);
- 			log_fatal("Unsupported device type %ld for \"%s\"",
+-			log_fatal("Unsupported device type %ld for \"%s\"",
 -				  (long int)sa->sa_family, name);
-+				  (long int)sll->sll_family, name);
++			freeifaddrs(ifaddrs);
++			log_fatal("Unsupported device type %h for \"%s\"",
++				  sll->sll_hatype, name);
  	}
  
 -	close(sock);
@@ -497,7 +499,7 @@ diff -up dhcp-4.2.4/common/lpf.c.lpf-ib dhcp-4.2.4/common/lpf.c
  #endif
 diff -up dhcp-4.2.4/common/socket.c.lpf-ib dhcp-4.2.4/common/socket.c
 --- dhcp-4.2.4/common/socket.c.lpf-ib	2012-03-09 12:28:11.000000000 +0100
-+++ dhcp-4.2.4/common/socket.c	2012-07-18 16:41:17.973560107 +0200
++++ dhcp-4.2.4/common/socket.c	2012-07-18 21:08:48.112834843 +0200
 @@ -325,7 +325,7 @@ void if_register_send (info)
  	info->wfdesc = if_register_socket(info, AF_INET, 0);
  	/* If this is a normal IPv4 address, get the hardware address. */
@@ -526,8 +528,8 @@ diff -up dhcp-4.2.4/common/socket.c.lpf-ib dhcp-4.2.4/common/socket.c
  	if (!quiet_interface_discovery) {
  		if (info->shared_network != NULL) {
 diff -up dhcp-4.2.4/includes/dhcpd.h.lpf-ib dhcp-4.2.4/includes/dhcpd.h
---- dhcp-4.2.4/includes/dhcpd.h.lpf-ib	2012-07-18 16:41:17.961560272 +0200
-+++ dhcp-4.2.4/includes/dhcpd.h	2012-07-18 16:41:17.975560079 +0200
+--- dhcp-4.2.4/includes/dhcpd.h.lpf-ib	2012-07-18 21:08:48.102834978 +0200
++++ dhcp-4.2.4/includes/dhcpd.h	2012-07-18 21:08:48.114834815 +0200
 @@ -1243,6 +1243,7 @@ struct interface_info {
  	struct shared_network *shared_network;
  				/* Networks connected to this interface. */
diff --git a/dhcp.spec b/dhcp.spec
index f6cdeb9..b9b2f53 100644
--- a/dhcp.spec
+++ b/dhcp.spec
@@ -18,7 +18,7 @@
 Summary:  Dynamic host configuration protocol software
 Name:     dhcp
 Version:  4.2.4
-Release:  5%{?dist}
+Release:  6%{?dist}
 # NEVER CHANGE THE EPOCH on this package.  The previous maintainer (prior to
 # dcantrell maintaining the package) made incorrect use of the epoch and
 # that's why it is at 12 now.  It should have never been used, but it was.
@@ -571,6 +571,10 @@ fi
 
 
 %changelog
+* Mon Jul 23 2012 Jiri Popelka <jpopelka at redhat.com> - 12:4.2.4-6
+- ib.patch: added fall-back method (using ioctl(SIOCGIFHWADDR)) when getting
+            of HW address with getifaddrs() fails (#626514-c#63, #840601).
+
 * Mon Jul 23 2012 Tomas Hozza <thozza at redhat.com> - 12:4.2.4-5
 - Dhcpd does not correctly follow DhcpFailOverPeerDN (#838400)
 


More information about the scm-commits mailing list