[dhcp] correctly set IB's hw->hlen (#1185075)

Jiří Popelka jpopelka at fedoraproject.org
Thu Feb 26 09:17:07 UTC 2015


commit d4e0705ffa4d6705e927a0c09ed030a5ed498d6c
Author: Jiri Popelka <jpopelka at redhat.com>
Date:   Wed Feb 25 18:06:19 2015 +0100

    correctly set IB's hw->hlen (#1185075)

 dhcp-IPoIB-log-id.patch | 95 -------------------------------------------------
 dhcp-duidv4.patch       | 44 -----------------------
 dhcp-lpf-ib.patch       | 69 ++++++++++++++++++++---------------
 dhcp.spec               |  5 ++-
 4 files changed, 44 insertions(+), 169 deletions(-)
---
diff --git a/dhcp-IPoIB-log-id.patch b/dhcp-IPoIB-log-id.patch
index 407d50f..68b4e00 100644
--- a/dhcp-IPoIB-log-id.patch
+++ b/dhcp-IPoIB-log-id.patch
@@ -1,101 +1,6 @@
 diff -up dhcp-4.3.2b1/common/lpf.c.IPoIB-log-id dhcp-4.3.2b1/common/lpf.c
 --- dhcp-4.3.2b1/common/lpf.c.IPoIB-log-id	2015-02-08 17:37:47.055023959 +0100
 +++ dhcp-4.3.2b1/common/lpf.c	2015-02-08 17:41:21.294972666 +0100
-@@ -152,6 +152,8 @@ int if_register_lpf (info)
- void if_register_send (info)
- 	struct interface_info *info;
- {
-+	int hlen;
-+
- 	/* If we're using the lpf API for sending and receiving,
- 	   we don't need to register this interface twice. */
- #ifndef USE_LPF_RECEIVE
-@@ -159,11 +161,15 @@ void if_register_send (info)
- #else
- 	info -> wfdesc = info -> rfdesc;
- #endif
-+	if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND)
-+		hlen = 9;
-+	else
-+		hlen = info -> hw_address.hlen;
- 	if (!quiet_interface_discovery)
- 		log_info ("Sending on   LPF/%s/%s%s%s",
- 		      info -> name,
- 		      print_hw_addr (info -> hw_address.hbuf [0],
--				     info -> hw_address.hlen - 1,
-+				     hlen - 1,
- 				     &info -> hw_address.hbuf [1]),
- 		      (info -> shared_network ? "/" : ""),
- 		      (info -> shared_network ?
-@@ -173,6 +179,10 @@ void if_register_send (info)
- void if_deregister_send (info)
- 	struct interface_info *info;
- {
-+	int hlen = info -> hw_address.hlen;
-+	if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND)
-+		hlen = 9;
-+
- 	/* don't need to close twice if we are using lpf for sending and
- 	   receiving */
- #ifndef USE_LPF_RECEIVE
-@@ -185,7 +195,7 @@ void if_deregister_send (info)
- 		log_info ("Disabling output on LPF/%s/%s%s%s",
- 		      info -> name,
- 		      print_hw_addr (info -> hw_address.hbuf [0],
--				     info -> hw_address.hlen - 1,
-+				     hlen - 1,
- 				     &info -> hw_address.hbuf [1]),
- 		      (info -> shared_network ? "/" : ""),
- 		      (info -> shared_network ?
-@@ -212,6 +222,8 @@ static void lpf_gen_filter_setup (struct
- void if_register_receive (info)
- 	struct interface_info *info;
- {
-+	int hlen;
-+
- 	/* Open a LPF device and hang it on this interface... */
- 	info -> rfdesc = if_register_lpf (info);
- 
-@@ -225,7 +237,9 @@ void if_register_receive (info)
- 				log_fatal ("Failed to set auxiliary packet data: %m");
- 			}
- 		}
--	}
-+		hlen = info -> hw_address.hlen;
-+	} else
-+		hlen = 9;
- 	}
- #endif
- 
-@@ -241,7 +255,7 @@ void if_register_receive (info)
- 		log_info ("Listening on LPF/%s/%s%s%s",
- 			  info -> name,
- 			  print_hw_addr (info -> hw_address.hbuf [0],
--					 info -> hw_address.hlen - 1,
-+					 hlen - 1,
- 					 &info -> hw_address.hbuf [1]),
- 			  (info -> shared_network ? "/" : ""),
- 			  (info -> shared_network ?
-@@ -251,6 +265,10 @@ void if_register_receive (info)
- void if_deregister_receive (info)
- 	struct interface_info *info;
- {
-+	int hlen = info -> hw_address.hlen;
-+	if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND)
-+		hlen = 9;
-+
- 	/* for LPF this is simple, packet filters are removed when sockets
- 	   are closed */
- 	close (info -> rfdesc);
-@@ -259,7 +277,7 @@ void if_deregister_receive (info)
- 		log_info ("Disabling input on LPF/%s/%s%s%s",
- 			  info -> name,
- 			  print_hw_addr (info -> hw_address.hbuf [0],
--					 info -> hw_address.hlen - 1,
-+					 hlen - 1,
- 					 &info -> hw_address.hbuf [1]),
- 			  (info -> shared_network ? "/" : ""),
- 			  (info -> shared_network ?
 diff -up dhcp-4.3.2b1/server/dhcp.c.IPoIB-log-id dhcp-4.3.2b1/server/dhcp.c
 --- dhcp-4.3.2b1/server/dhcp.c.IPoIB-log-id	2015-02-08 17:37:46.980025024 +0100
 +++ dhcp-4.3.2b1/server/dhcp.c	2015-02-08 17:37:47.061023874 +0100
diff --git a/dhcp-duidv4.patch b/dhcp-duidv4.patch
index 7b2dfab..52fde3b 100644
--- a/dhcp-duidv4.patch
+++ b/dhcp-duidv4.patch
@@ -32,47 +32,3 @@ diff -up dhcp-4.3.1b1/client/dhclient.c.KrJcIv dhcp-4.3.1b1/client/dhclient.c
  }
  
  /* Individual States:
-@@ -3342,6 +3342,7 @@ form_duid(struct data_string *duid, cons
- 	struct interface_info *ip;
- 	int len;
- 	char *str;
-+	unsigned hlen;
- 
- 	/* For now, just use the first interface on the list. */
- 	ip = interfaces;
-@@ -3365,6 +3366,11 @@ form_duid(struct data_string *duid, cons
- 	if (duid_type == 0)
- 		duid_type = stateless ? DUID_LL : DUID_LLT;
- 
-+	if (ip->hw_address.hbuf[0] == HTYPE_INFINIBAND)
-+		hlen = 9;
-+	else
-+		hlen = ip->hw_address.hlen;
-+
- 	/*
- 	 * 2 bytes for the 'duid type' field.
- 	 * 2 bytes for the 'htype' field.
-@@ -3372,7 +3378,7 @@ form_duid(struct data_string *duid, cons
- 	 * enough bytes for the hardware address (note that hw_address has
- 	 * the 'htype' on byte zero).
- 	 */
--	len = 4 + (ip->hw_address.hlen - 1);
-+	len = 4 + (hlen - 1);
- 	if (duid_type == DUID_LLT)
- 		len += 4;
- 	if (!buffer_allocate(&duid->buffer, len, MDL))
-@@ -3386,12 +3392,12 @@ form_duid(struct data_string *duid, cons
- 		putUShort(duid->buffer->data + 2, ip->hw_address.hbuf[0]);
- 		putULong(duid->buffer->data + 4, cur_time - DUID_TIME_EPOCH);
- 		memcpy(duid->buffer->data + 8, ip->hw_address.hbuf + 1,
--		       ip->hw_address.hlen - 1);
-+		       hlen - 1);
- 	} else {
- 		putUShort(duid->buffer->data, DUID_LL);
- 		putUShort(duid->buffer->data + 2, ip->hw_address.hbuf[0]);
- 		memcpy(duid->buffer->data + 4, ip->hw_address.hbuf + 1,
--		       ip->hw_address.hlen - 1);
-+		       hlen - 1);
- 	}
- 
- 	str = quotify_buf(duid->data, duid->len, MDL);
diff --git a/dhcp-lpf-ib.patch b/dhcp-lpf-ib.patch
index b5487e0..4955dcf 100644
--- a/dhcp-lpf-ib.patch
+++ b/dhcp-lpf-ib.patch
@@ -1,6 +1,6 @@
 diff -up dhcp-4.3.2b1/client/dhclient.c.lpf-ib dhcp-4.3.2b1/client/dhclient.c
---- dhcp-4.3.2b1/client/dhclient.c.lpf-ib	2015-02-08 17:19:42.107405843 +0100
-+++ dhcp-4.3.2b1/client/dhclient.c	2015-02-08 17:19:42.116405716 +0100
+--- dhcp-4.3.2b1/client/dhclient.c.lpf-ib	2015-02-26 09:49:40.553785504 +0100
++++ dhcp-4.3.2b1/client/dhclient.c	2015-02-26 09:49:40.561785398 +0100
 @@ -114,6 +114,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);
@@ -55,8 +55,8 @@ diff -up dhcp-4.3.2b1/client/dhclient.c.lpf-ib dhcp-4.3.2b1/client/dhclient.c
   *
   * Each routine is called from the dhclient_state_machine() in one of
 diff -up dhcp-4.3.2b1/common/bpf.c.lpf-ib dhcp-4.3.2b1/common/bpf.c
---- dhcp-4.3.2b1/common/bpf.c.lpf-ib	2015-02-08 17:19:42.101405928 +0100
-+++ dhcp-4.3.2b1/common/bpf.c	2015-02-08 17:19:42.116405716 +0100
+--- dhcp-4.3.2b1/common/bpf.c.lpf-ib	2015-02-26 09:49:40.546785596 +0100
++++ dhcp-4.3.2b1/common/bpf.c	2015-02-26 09:49:40.561785398 +0100
 @@ -199,11 +199,44 @@ struct bpf_insn dhcp_bpf_filter [] = {
  	BPF_STMT(BPF_RET+BPF_K, 0),
  };
@@ -103,8 +103,8 @@ diff -up dhcp-4.3.2b1/common/bpf.c.lpf-ib dhcp-4.3.2b1/common/bpf.c
  struct bpf_insn dhcp_bpf_tr_filter [] = {
          /* accept all token ring packets due to variable length header */
 diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
---- dhcp-4.3.2b1/common/lpf.c.lpf-ib	2015-02-08 17:19:42.101405928 +0100
-+++ dhcp-4.3.2b1/common/lpf.c	2015-02-08 17:36:15.072329845 +0100
+--- dhcp-4.3.2b1/common/lpf.c.lpf-ib	2015-02-26 09:49:40.546785596 +0100
++++ dhcp-4.3.2b1/common/lpf.c	2015-02-26 09:49:40.562785385 +0100
 @@ -47,6 +47,17 @@
  #include <sys/ioctl.h>
  #include <sys/socket.h>
@@ -123,7 +123,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  #endif
  
  #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
-@@ -80,10 +91,20 @@ int if_register_lpf (info)
+@@ -80,10 +94,20 @@ int if_register_lpf (info)
  		struct sockaddr common;
  		} sa;
  	struct ifreq ifr;
@@ -146,7 +146,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  		if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
  		    errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
  		    errno == EAFNOSUPPORT || errno == EINVAL) {
-@@ -106,6 +127,7 @@ int if_register_lpf (info)
+@@ -106,6 +130,7 @@ int if_register_lpf (info)
  	/* Bind to the interface name */
  	memset (&sa, 0, sizeof sa);
  	sa.ll.sll_family = AF_PACKET;
@@ -154,7 +154,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  	sa.ll.sll_ifindex = ifr.ifr_ifindex;
  	if (bind (sock, &sa.common, sizeof sa)) {
  		if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
-@@ -122,8 +144,6 @@ int if_register_lpf (info)
+@@ -122,8 +147,6 @@ int if_register_lpf (info)
  
  	}
  
@@ -163,7 +163,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  	return sock;
  }
  #endif /* USE_LPF_SEND || USE_LPF_RECEIVE */
-@@ -178,6 +198,8 @@ void if_deregister_send (info)
+@@ -178,6 +201,8 @@ void if_deregister_send (info)
     in bpf includes... */
  extern struct sock_filter dhcp_bpf_filter [];
  extern int dhcp_bpf_filter_len;
@@ -172,7 +172,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  
  #if defined (HAVE_TR_SUPPORT)
  extern struct sock_filter dhcp_bpf_tr_filter [];
-@@ -196,11 +218,12 @@ void if_register_receive (info)
+@@ -196,11 +221,12 @@ void if_register_receive (info)
  #ifdef PACKET_AUXDATA
  	{
  	int val = 1;
@@ -190,7 +190,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  		}
  	}
  	}
-@@ -250,15 +273,28 @@ static void lpf_gen_filter_setup (info)
+@@ -250,15 +276,28 @@ static void lpf_gen_filter_setup (info)
  
  	memset(&p, 0, sizeof(p));
  
@@ -228,7 +228,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  
  	if (setsockopt (info -> rfdesc, SOL_SOCKET, SO_ATTACH_FILTER, &p,
  			sizeof p) < 0) {
-@@ -315,6 +351,54 @@ static void lpf_tr_filter_setup (info)
+@@ -315,6 +354,54 @@ static void lpf_tr_filter_setup (info)
  #endif /* USE_LPF_RECEIVE */
  
  #ifdef USE_LPF_SEND
@@ -283,7 +283,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  ssize_t send_packet (interface, packet, raw, len, from, to, hto)
  	struct interface_info *interface;
  	struct packet *packet;
-@@ -335,6 +419,11 @@ ssize_t send_packet (interface, packet,
+@@ -335,6 +422,11 @@ ssize_t send_packet (interface, packet,
  		return send_fallback (interface, packet, raw,
  				      len, from, to, hto);
  
@@ -295,7 +295,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  	if (hto == NULL && interface->anycast_mac_addr.hlen)
  		hto = &interface->anycast_mac_addr;
  
-@@ -355,6 +444,42 @@ ssize_t send_packet (interface, packet,
+@@ -355,6 +447,42 @@ ssize_t send_packet (interface, packet,
  #endif /* USE_LPF_SEND */
  
  #ifdef USE_LPF_RECEIVE
@@ -338,7 +338,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  ssize_t receive_packet (interface, buf, len, from, hfrom)
  	struct interface_info *interface;
  	unsigned char *buf;
-@@ -380,6 +505,10 @@ ssize_t receive_packet (interface, buf,
+@@ -380,6 +508,10 @@ ssize_t receive_packet (interface, buf,
  		.msg_controllen = sizeof(cmsgbuf),
  	};
  
@@ -349,7 +349,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  	length = recvmsg (interface->rfdesc, &msg, 0);
  	if (length <= 0)
  		return length;
-@@ -489,11 +618,33 @@ void maybe_setup_fallback ()
+@@ -489,11 +621,33 @@ void maybe_setup_fallback ()
  #endif
  
  #if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
@@ -386,7 +386,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  
  	if (strlen(name) >= sizeof(tmp.ifr_name)) {
  		log_fatal("Device name too long: \"%s\"", name);
-@@ -507,16 +658,62 @@ get_hw_addr(const char *name, struct har
+@@ -507,16 +661,61 @@ get_hw_addr(const char *name, struct har
  	memset(&tmp, 0, sizeof(tmp));
  	strcpy(tmp.ifr_name, name);
  	if (ioctl(sock, SIOCGIFHWADDR, &tmp) < 0) {
@@ -406,8 +406,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
 +	memcpy(sll->sll_addr, sa->sa_data, sizeof (sll->sll_addr));
 +	switch (sll->sll_hatype) {
 +		case ARPHRD_INFINIBAND:
-+			/* ioctl limits hardware addresses to 8 bytes */
-+			sll->sll_halen = 8;
++			sll->sll_halen = HARDWARE_ADDR_LEN_IOCTL;
 +			break;
 +		default:
 +			break;
@@ -452,7 +451,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  			break;
  		case ARPHRD_IEEE802:
  #ifdef ARPHRD_IEEE802_TR
-@@ -524,18 +721,48 @@ get_hw_addr(const char *name, struct har
+@@ -524,18 +723,50 @@ get_hw_addr(const char *name, struct har
  #endif /* ARPHRD_IEEE802_TR */
  			hw->hlen = 7;
  			hw->hbuf[0] = HTYPE_IEEE802;
@@ -491,9 +490,11 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
 +				       20);
 +			}
 +
-+			hw->hlen = 1;
++			hw->hlen = HARDWARE_ADDR_LEN_IOCTL + 1;
 +			hw->hbuf[0] = HTYPE_INFINIBAND;
-+			memcpy(&hw->hbuf[1], &sll->sll_addr[sll->sll_halen - 8], 8);
++			memcpy(&hw->hbuf[1],
++			       &sll->sll_addr[sll->sll_halen - HARDWARE_ADDR_LEN_IOCTL],
++			       HARDWARE_ADDR_LEN_IOCTL);
  			break;
  #if defined(ARPHRD_PPP)
  		case ARPHRD_PPP:
@@ -505,7 +506,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  			hw->hlen = 0;
  			hw->hbuf[0] = HTYPE_RESERVED;
  			/* 0xdeadbeef should never occur on the wire,
-@@ -548,10 +775,13 @@ get_hw_addr(const char *name, struct har
+@@ -548,10 +779,13 @@ get_hw_addr(const char *name, struct har
  			break;
  #endif
  		default:
@@ -524,7 +525,7 @@ diff -up dhcp-4.3.2b1/common/lpf.c.lpf-ib dhcp-4.3.2b1/common/lpf.c
  #endif
 diff -up dhcp-4.3.2b1/common/socket.c.lpf-ib dhcp-4.3.2b1/common/socket.c
 --- dhcp-4.3.2b1/common/socket.c.lpf-ib	2015-01-29 14:52:57.000000000 +0100
-+++ dhcp-4.3.2b1/common/socket.c	2015-02-08 17:19:42.118405688 +0100
++++ dhcp-4.3.2b1/common/socket.c	2015-02-26 09:49:40.562785385 +0100
 @@ -328,7 +328,7 @@ void if_register_send (info)
  	info->wfdesc = if_register_socket(info, AF_INET, 0, NULL);
  	/* If this is a normal IPv4 address, get the hardware address. */
@@ -562,9 +563,19 @@ diff -up dhcp-4.3.2b1/common/socket.c.lpf-ib dhcp-4.3.2b1/common/socket.c
  	if (!quiet_interface_discovery) {
  		if (info->shared_network != NULL) {
 diff -up dhcp-4.3.2b1/includes/dhcpd.h.lpf-ib dhcp-4.3.2b1/includes/dhcpd.h
---- dhcp-4.3.2b1/includes/dhcpd.h.lpf-ib	2015-02-08 17:19:42.108405829 +0100
-+++ dhcp-4.3.2b1/includes/dhcpd.h	2015-02-08 17:19:42.119405674 +0100
-@@ -1264,6 +1264,7 @@ struct interface_info {
+--- dhcp-4.3.2b1/includes/dhcpd.h.lpf-ib	2015-02-26 09:49:40.554785491 +0100
++++ dhcp-4.3.2b1/includes/dhcpd.h	2015-02-26 09:50:12.210369312 +0100
+@@ -440,6 +440,9 @@ struct packet {
+ 
+ #define HARDWARE_ADDR_LEN 20
+ 
++/* ioctl limits hardware addresses to 8 bytes */
++#define HARDWARE_ADDR_LEN_IOCTL	8
++
+ struct hardware {
+ 	u_int8_t hlen;
+ 	u_int8_t hbuf[HARDWARE_ADDR_LEN + 1];
+@@ -1264,6 +1267,7 @@ struct interface_info {
  	struct shared_network *shared_network;
  				/* Networks connected to this interface. */
  	struct hardware hw_address;	/* Its physical address. */
@@ -572,7 +583,7 @@ diff -up dhcp-4.3.2b1/includes/dhcpd.h.lpf-ib dhcp-4.3.2b1/includes/dhcpd.h
  	struct in_addr *addresses;	/* Addresses associated with this
  					 * interface.
  					 */
-@@ -2475,7 +2476,7 @@ void print_dns_status (int, struct dhcp_
+@@ -2475,7 +2479,7 @@ void print_dns_status (int, struct dhcp_
  #endif
  const char *print_time(TIME);
  
diff --git a/dhcp.spec b/dhcp.spec
index 48236ec..93b6bb1 100644
--- a/dhcp.spec
+++ b/dhcp.spec
@@ -18,7 +18,7 @@
 Summary:  Dynamic host configuration protocol software
 Name:     dhcp
 Version:  4.3.2
-Release:  0.5%{prever}%{?dist}
+Release:  0.6%{prever}%{?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.
@@ -675,6 +675,9 @@ done
 %doc doc/html/
 
 %changelog
+* Wed Feb 25 2015 Jiri Popelka <jpopelka at redhat.com> - 12:4.3.2-0.6b1
+- correctly set IB's hw->hlen (#1185075)
+
 * Wed Feb 25 2015 Tomas Hozza <thozza at redhat.com> - 12:4.3.2-0.5b1
 - Rebuild against bind-9.10.2rc2
 


More information about the scm-commits mailing list