Hello community,

here is the log from the commit of package dhcp for openSUSE:Factory checked in 
at 2014-04-01 11:34:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/dhcp (Old)
 and      /work/SRC/openSUSE:Factory/.dhcp.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "dhcp"

Changes:
--------
--- /work/SRC/openSUSE:Factory/dhcp/dhcp.changes        2014-03-18 
16:21:48.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.dhcp.new/dhcp.changes   2014-04-01 
11:34:15.000000000 +0200
@@ -1,0 +2,7 @@
+Fri Mar 28 18:53:28 UTC 2014 - [email protected]
+
+- Applied fixes for DHCP over IPoIB by Mellanox (bnc#870535)
+  [+ 0017-dhcp-4.2.6-lpf-ip-over-ib-support.patch,
+   + 0018-dhcp-4.2.6-improved-xid.patch]
+
+-------------------------------------------------------------------

New:
----
  0017-dhcp-4.2.6-lpf-ip-over-ib-support.patch
  0018-dhcp-4.2.6-improved-xid.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ dhcp.spec ++++++
--- /var/tmp/diff_new_pack.KqRgiX/_old  2014-04-01 11:34:16.000000000 +0200
+++ /var/tmp/diff_new_pack.KqRgiX/_new  2014-04-01 11:34:16.000000000 +0200
@@ -112,6 +112,10 @@
 Patch15:        0015-Ignore-SIGPIPE-to-not-die-in-socket-code.patch
 # PATCH-FEATURE-UPSTREAM log-dhcpv6-client-addresses ISC-Bugs#26377
 Patch16:        0016-server-log-DHCPv6-addresses-assigned-to-clients.patch
+# PATCH-FIX-SLE dhcp-4.2.6-lpf-ip-over-ib-support bnc#870535
+Patch17:        0017-dhcp-4.2.6-lpf-ip-over-ib-support.patch
+# PATCH-FIX-SLE dhcp-4.2.6-improved-xid bnc#870535
+Patch18:        0018-dhcp-4.2.6-improved-xid.patch
 ##
 PreReq:         /bin/touch /sbin/chkconfig sysconfig
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
@@ -248,6 +252,8 @@
 %patch14 -p1
 %patch15 -p1
 %patch16 -p1
+%patch17 -p1
+%patch18 -p1
 ##
 find . -type f -name \*.cat\* -exec rm -f {} \;
 dos2unix contrib/ms2isc/*

++++++ 0017-dhcp-4.2.6-lpf-ip-over-ib-support.patch ++++++
>From 6bf4a955f815967826994f787d2608d6dadadd91 Mon Sep 17 00:00:00 2001
From: root <[email protected]>
Date: Tue, 25 Mar 2014 23:15:58 +0200
Subject: [PATCH 1/2] dhcp 4.2.6 lpf ip over ib support

---
 client/dhclient.c |  31 +++++++
 common/bpf.c      |  33 ++++++++
 common/lpf.c      | 236 +++++++++++++++++++++++++++++++++++++++++++++---------
 common/socket.c   |   8 +-
 includes/dhcpd.h  |   3 +-
 5 files changed, 266 insertions(+), 45 deletions(-)

diff --git a/client/dhclient.c b/client/dhclient.c
index 8af0a42..f7dfbef 100644
--- a/client/dhclient.c
+++ b/client/dhclient.c
@@ -100,6 +100,29 @@ static int check_domain_name_list(const char *ptr, size_t 
len, int dots);
 static int check_option_values(struct universe *universe, unsigned int opt,
                               const char *ptr, size_t len);
 
+static void setup_ib_interface(struct interface_info *ip)
+{
+       struct group *g;
+
+       /* Set the broadcast flag */
+       //ip->client->config->bootp_broadcast_always = 1;
+
+       /*
+        * Find out if a dhcp-client-identifier option was specified either
+        * in the config file or on the command line
+        */
+       for (g = ip->client->config->on_transmission; g != NULL; g = g->next) {
+               if ((g->statements != NULL) &&
+                   (strcmp(g->statements->data.option->option->name,
+                           "dhcp-client-identifier") == 0)) {
+                       return;
+               }
+       }
+
+       /* No client ID specified */
+       log_fatal("dhcp-client-identifier must be specified for InfiniBand");
+}
+
 int
 main(int argc, char **argv) {
        int fd;
@@ -619,6 +642,14 @@ main(int argc, char **argv) {
        }
        srandom(seed + cur_time + (unsigned)getpid());
 
+       /* Setup specific Infiniband options */
+       for (ip = interfaces; ip; ip = ip->next) {
+               if (ip->client &&
+                   (ip->hw_address.hbuf[0] == HTYPE_INFINIBAND)) {
+                       setup_ib_interface(ip);
+                }
+       }
+
        /* Start a configuration state machine for each interface. */
 #ifdef DHCPv6
        if (local_family == AF_INET6) {
diff --git a/common/bpf.c b/common/bpf.c
index 076d9bc..124281b 100644
--- a/common/bpf.c
+++ b/common/bpf.c
@@ -198,11 +198,44 @@ struct bpf_insn dhcp_bpf_filter [] = {
        BPF_STMT(BPF_RET+BPF_K, 0),
 };
 
+/* Packet filter program for DHCP over Infiniband.
+ *
+ * XXX
+ * Changes to the filter program may require changes to the constant offsets
+ * used in lpf_gen_filter_setup to patch the port in the BPF program!
+ * XXX
+ */
+struct bpf_insn dhcp_ib_bpf_filter [] = {
+       /* Packet filter for Infiniband */
+       /* Make sure it's a UDP packet... */
+       BPF_STMT(BPF_LD + BPF_B + BPF_ABS, 9),
+       BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 0, 6),
+
+       /* Make sure this isn't a fragment... */
+       BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 6),
+       BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, 0x1fff, 4, 0),
+
+       /* Get the IP header length... */
+       BPF_STMT(BPF_LDX + BPF_B + BPF_MSH, 0),
+
+       /* Make sure it's to the right port... */
+       BPF_STMT(BPF_LD + BPF_H + BPF_IND, 2),
+       BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 67, 0, 1),
+
+       /* If we passed all the tests, ask for the whole packet. */
+       BPF_STMT(BPF_RET + BPF_K, (u_int)-1),
+
+       /* Otherwise, drop it. */
+       BPF_STMT(BPF_RET + BPF_K, 0),
+};
+
 #if defined (DEC_FDDI)
 struct bpf_insn *bpf_fddi_filter;
 #endif
 
 int dhcp_bpf_filter_len = sizeof dhcp_bpf_filter / sizeof (struct bpf_insn);
+int dhcp_ib_bpf_filter_len = sizeof dhcp_ib_bpf_filter / sizeof (struct 
bpf_insn);
+
 #if defined (HAVE_TR_SUPPORT)
 struct bpf_insn dhcp_bpf_tr_filter [] = {
         /* accept all token ring packets due to variable length header */
diff --git a/common/lpf.c b/common/lpf.c
index 6639809..a428870 100644
--- a/common/lpf.c
+++ b/common/lpf.c
@@ -43,6 +43,7 @@
 #include "includes/netinet/udp.h"
 #include "includes/netinet/if_ether.h"
 #include <net/if.h>
+#include <ifaddrs.h>
 
 #ifndef PACKET_AUXDATA
 #define PACKET_AUXDATA 8
@@ -60,6 +61,15 @@ struct tpacket_auxdata
 /* Reinitializes the specified interface after an address change.   This
    is not required for packet-filter APIs. */
 
+/* Default broadcast address for IPoIB */
+static unsigned char default_ib_bcast_addr[20] = {
+       0x00, 0xff, 0xff, 0xff,
+       0xff, 0x12, 0x40, 0x1b,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0xff, 0xff, 0xff, 0xff
+};
+
 #ifdef USE_LPF_SEND
 void if_reinitialize_send (info)
        struct interface_info *info;
@@ -87,10 +97,21 @@ int if_register_lpf (info)
                struct sockaddr common;
        } sa;
        struct ifreq ifr;
+       int type;
+       int protocol;
 
        /* Make an LPF socket. */
-       if ((sock = socket(PF_PACKET, SOCK_RAW,
-                          htons((short)ETH_P_ALL))) < 0) {
+       get_hw_addr(info);
+
+       if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
+               type = SOCK_DGRAM;
+               protocol = ETHERTYPE_IP;
+       } else {
+               type = SOCK_RAW;
+               protocol = ETH_P_ALL;
+       }
+
+       if ((sock = socket(PF_PACKET, type, htons((short)protocol))) < 0) {
                if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
                    errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
                    errno == EAFNOSUPPORT || errno == EINVAL) {
@@ -112,6 +133,7 @@ int if_register_lpf (info)
        /* Bind to the interface name */
        memset (&sa, 0, sizeof sa);
        sa.ll.sll_family = AF_PACKET;
+       sa.ll.sll_protocol = htons(protocol);
        sa.ll.sll_ifindex = ifr.ifr_ifindex;
        if (bind (sock, &sa.common, sizeof sa)) {
                if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
@@ -127,8 +149,6 @@ int if_register_lpf (info)
                log_fatal ("Bind socket to interface: %m");
        }
 
-       get_hw_addr(info->name, &info->hw_address);
-
        return sock;
 }
 #endif /* USE_LPF_SEND || USE_LPF_RECEIVE */
@@ -183,6 +203,8 @@ void if_deregister_send (info)
    in bpf includes... */
 extern struct sock_filter dhcp_bpf_filter [];
 extern int dhcp_bpf_filter_len;
+extern struct sock_filter dhcp_ib_bpf_filter [];
+extern int dhcp_ib_bpf_filter_len;
 
 #if defined (HAVE_TR_SUPPORT)
 extern struct sock_filter dhcp_bpf_tr_filter [];
@@ -200,11 +222,13 @@ void if_register_receive (info)
        /* Open a LPF device and hang it on this interface... */
        info -> rfdesc = if_register_lpf (info);
 
-       val = 1;
-       if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA, &val,
-                       sizeof val) < 0) {
-               if (errno != ENOPROTOOPT)
-                       log_fatal ("Failed to set auxiliary packet data: %m");
+       if (info->hw_address.hbuf[0] != HTYPE_INFINIBAND) {
+               val = 1;
+               if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA,
+                               &val, sizeof val) < 0) {
+                       if (errno != ENOPROTOOPT)
+                               log_fatal ("Failed to set auxiliary packet 
data: %m");
+               }
        }
 
 #if defined (HAVE_TR_SUPPORT)
@@ -250,15 +274,28 @@ static void lpf_gen_filter_setup (info)
 
        memset(&p, 0, sizeof(p));
 
-       /* Set up the bpf filter program structure.    This is defined in
-          bpf.c */
-       p.len = dhcp_bpf_filter_len;
-       p.filter = dhcp_bpf_filter;
-
-        /* Patch the server port into the LPF  program...
-          XXX changes to filter program may require changes
-          to the insn number(s) used below! XXX */
-       dhcp_bpf_filter [8].k = ntohs ((short)local_port);
+       if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
+               /* Set up the bpf filter program structure. */
+               p.len = dhcp_ib_bpf_filter_len;
+               p.filter = dhcp_ib_bpf_filter;
+
+               /* Patch the server port into the LPF program...
+                  XXX
+                  changes to filter program may require changes
+                  to the insn number(s) used below!
+                  XXX */
+               dhcp_ib_bpf_filter[6].k = ntohs ((short)local_port);
+       } else {
+               /* Set up the bpf filter program structure.
+                  This is defined in bpf.c */
+               p.len = dhcp_bpf_filter_len;
+               p.filter = dhcp_bpf_filter;
+
+               /* Patch the server port into the LPF  program...
+                  XXX changes to filter program may require changes
+                  to the insn number(s) used below! XXX */
+               dhcp_bpf_filter [8].k = ntohs ((short)local_port);
+       }
 
        if (setsockopt (info -> rfdesc, SOL_SOCKET, SO_ATTACH_FILTER, &p,
                        sizeof p) < 0) {
@@ -315,6 +352,54 @@ static void lpf_tr_filter_setup (info)
 #endif /* USE_LPF_RECEIVE */
 
 #ifdef USE_LPF_SEND
+ssize_t send_packet_ib(interface, packet, raw, len, from, to, hto)
+       struct interface_info *interface;
+       struct packet *packet;
+       struct dhcp_packet *raw;
+       size_t len;
+       struct in_addr from;
+       struct sockaddr_in *to;
+       struct hardware *hto;
+{
+       unsigned ibufp = 0;
+       double ih [1536 / sizeof (double)];
+       unsigned char *buf = (unsigned char *)ih;
+       ssize_t result;
+
+       union sockunion {
+               struct sockaddr sa;
+               struct sockaddr_ll sll;
+               struct sockaddr_storage ss;
+       } su;
+
+       assemble_udp_ip_header (interface, buf, &ibufp, from.s_addr,
+                               to->sin_addr.s_addr, to->sin_port,
+                               (unsigned char *)raw, len);
+       memcpy (buf + ibufp, raw, len);
+
+       memset(&su, 0, sizeof(su));
+       su.sll.sll_family = AF_PACKET;
+       su.sll.sll_protocol = htons(ETHERTYPE_IP);
+
+       if (!(su.sll.sll_ifindex = if_nametoindex(interface->name))) {
+               errno = ENOENT;
+               log_error ("send_packet_ib: %m - failed to get if index");
+               return -1;
+       }
+
+       su.sll.sll_hatype = htons(HTYPE_INFINIBAND);
+       su.sll.sll_halen = sizeof(interface->bcast_addr);
+       memcpy(&su.sll.sll_addr, interface->bcast_addr, 20);
+
+       result = sendto(interface->wfdesc, buf, ibufp + len, 0,
+                       &su.sa, sizeof(su));
+
+       if (result < 0)
+               log_error ("send_packet_ib: %m");
+
+       return result;
+}
+
 ssize_t send_packet (interface, packet, raw, len, from, to, hto)
        struct interface_info *interface;
        struct packet *packet;
@@ -335,6 +420,11 @@ ssize_t send_packet (interface, packet, raw, len, from, 
to, hto)
                return send_fallback (interface, packet, raw,
                                      len, from, to, hto);
 
+       if (interface->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
+               return send_packet_ib(interface, packet, raw, len, from,
+                                     to, hto);
+       }
+
        if (hto == NULL && interface->anycast_mac_addr.hlen)
                hto = &interface->anycast_mac_addr;
 
@@ -356,6 +446,42 @@ ssize_t send_packet (interface, packet, raw, len, from, 
to, hto)
 #endif /* USE_LPF_SEND */
 
 #ifdef USE_LPF_RECEIVE
+ssize_t receive_packet_ib (interface, buf, len, from, hfrom)
+       struct interface_info *interface;
+       unsigned char *buf;
+       size_t len;
+       struct sockaddr_in *from;
+       struct hardware *hfrom;
+{
+       int length = 0;
+       int offset = 0;
+       unsigned char ibuf [1536];
+       unsigned bufix = 0;
+       unsigned paylen;
+
+       length = read(interface->rfdesc, ibuf, sizeof(ibuf));
+
+       if (length <= 0)
+               return length;
+
+       offset = decode_udp_ip_header(interface, ibuf, bufix, from,
+                                      (unsigned)length, &paylen, 0);
+
+       if (offset < 0)
+               return 0;
+
+       bufix += offset;
+       length -= offset;
+
+       if (length < paylen)
+               log_fatal("Internal inconsistency at %s:%d.", MDL);
+
+       /* Copy out the data in the packet... */
+       memcpy(buf, &ibuf[bufix], paylen);
+
+       return (ssize_t)paylen;
+}
+
 ssize_t receive_packet (interface, buf, len, from, hfrom)
        struct interface_info *interface;
        unsigned char *buf;
@@ -382,6 +508,10 @@ ssize_t receive_packet (interface, buf, len, from, hfrom)
        };
        struct cmsghdr *cmsg;
 
+       if (interface->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
+               return receive_packet_ib(interface, buf, len, from, hfrom);
+       }
+
        length = recvmsg (interface -> rfdesc, &msg, 0);
        if (length <= 0)
                return length;
@@ -462,33 +592,41 @@ void maybe_setup_fallback ()
 }
 
 void
-get_hw_addr(const char *name, struct hardware *hw) {
-       int sock;
-       struct ifreq tmp;
-       struct sockaddr *sa;
+get_hw_addr(struct interface_info *info)
+{
+       struct hardware *hw = &info->hw_address;
+       char *name = info->name;
+       struct ifaddrs *ifaddrs;
+       struct ifaddrs *ifa;
+       struct sockaddr_ll *sll = NULL;
 
-       if (strlen(name) >= sizeof(tmp.ifr_name)) {
-               log_fatal("Device name too long: \"%s\"", name);
-       }
+       if (getifaddrs(&ifaddrs) == -1)
+               log_fatal("Failed to get interfaces");
 
-       sock = socket(AF_INET, SOCK_DGRAM, 0);
-       if (sock < 0) {
-               log_fatal("Can't create socket for \"%s\": %m", name);
+       for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
+
+               if (ifa->ifa_addr->sa_family != AF_PACKET)
+                       continue;
+
+               if (ifa->ifa_flags & IFF_LOOPBACK)
+                       continue;
+
+               if (strcmp(ifa->ifa_name, name) == 0) {
+                       sll = (struct sockaddr_ll *)(void *)ifa->ifa_addr;
+                       break;
+               }
        }
 
-       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);
+       if (sll == NULL) {
+               freeifaddrs(ifaddrs);
+               log_fatal("Failed to get HW address for %s\n", name);
        }
 
-       sa = &tmp.ifr_hwaddr;
-       switch (sa->sa_family) {
+       switch (sll->sll_hatype) {
                case ARPHRD_ETHER:
                        hw->hlen = 7;
                        hw->hbuf[0] = HTYPE_ETHER;
-                       memcpy(&hw->hbuf[1], sa->sa_data, 6);
+                       memcpy(&hw->hbuf[1], sll->sll_addr, 6);
                        break;
                case ARPHRD_IEEE802:
 #ifdef ARPHRD_IEEE802_TR
@@ -496,18 +634,36 @@ get_hw_addr(const char *name, struct hardware *hw) {
 #endif /* ARPHRD_IEEE802_TR */
                        hw->hlen = 7;
                        hw->hbuf[0] = HTYPE_IEEE802;
-                       memcpy(&hw->hbuf[1], sa->sa_data, 6);
+                       memcpy(&hw->hbuf[1], sll->sll_addr, 6);
                        break;
                case ARPHRD_FDDI:
                        hw->hlen = 7;
                        hw->hbuf[0] = HTYPE_FDDI;
-                       memcpy(&hw->hbuf[1], sa->sa_data, 6);
+                       memcpy(&hw->hbuf[1], sll->sll_addr, 6);
                        break;
+                case ARPHRD_INFINIBAND:
+                        /* For Infiniband, save the broadcast address and store
+                         * the port GUID into the hardware address.
+                         */
+                        if (ifa->ifa_flags & IFF_BROADCAST) {
+                                struct sockaddr_ll *bll;
+
+                                bll = (struct sockaddr_ll *)ifa->ifa_broadaddr;
+                                memcpy(&info->bcast_addr, bll->sll_addr, 20);
+                        } else {
+                                memcpy(&info->bcast_addr, 
default_ib_bcast_addr,
+                                       20);
+                        }
+  
+                        hw->hlen = 1;
+                        hw->hbuf[0] = HTYPE_INFINIBAND;
+                        break;
                default:
+                       freeifaddrs(ifaddrs);
                        log_fatal("Unsupported device type %ld for \"%s\"",
-                                 (long int)sa->sa_family, name);
+                                 (long int)sll->sll_family, name);
        }
 
-       close(sock);
+       freeifaddrs(ifaddrs);
 }
 #endif
diff --git a/common/socket.c b/common/socket.c
index e111d82..04c86e3 100644
--- a/common/socket.c
+++ b/common/socket.c
@@ -322,7 +322,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. */
        if (strcmp(info->name, "fallback") != 0)
-               get_hw_addr(info->name, &info->hw_address);
+               get_hw_addr(info);
 #if defined (USE_SOCKET_FALLBACK)
        /* Fallback only registers for send, but may need to receive as
           well. */
@@ -385,7 +385,7 @@ void if_register_receive (info)
 #endif /* IP_PKTINFO... */
        /* If this is a normal IPv4 address, get the hardware address. */
        if (strcmp(info->name, "fallback") != 0)
-               get_hw_addr(info->name, &info->hw_address);
+               get_hw_addr(info);
 
        if (!quiet_interface_discovery)
                log_info ("Listening on Socket/%s%s%s",
@@ -499,7 +499,7 @@ if_register6(struct interface_info *info, int do_multicast) 
{
        if (req_multi)
                if_register_multicast(info);
 
-       get_hw_addr(info->name, &info->hw_address);
+       get_hw_addr(info);
 
        if (!quiet_interface_discovery) {
                if (info->shared_network != NULL) {
@@ -555,7 +555,7 @@ if_register_linklocal6(struct interface_info *info) {
        info->rfdesc = sock;
        info->wfdesc = sock;
 
-       get_hw_addr(info->name, &info->hw_address);
+       get_hw_addr(info);
 
        if (!quiet_interface_discovery) {
                if (info->shared_network != NULL) {
diff --git a/includes/dhcpd.h b/includes/dhcpd.h
index 68262e9..a52992b 100644
--- a/includes/dhcpd.h
+++ b/includes/dhcpd.h
@@ -1217,6 +1217,7 @@ struct interface_info {
        struct shared_network *shared_network;
                                /* Networks connected to this interface. */
        struct hardware hw_address;     /* Its physical address. */
+       u_int8_t bcast_addr[20];        /* Infiniband broadcast address */
        struct in_addr *addresses;      /* Addresses associated with this
                                         * interface.
                                         */
@@ -2346,7 +2347,7 @@ void print_dns_status (int, struct dhcp_ddns_cb *, 
isc_result_t);
 #endif
 const char *print_time(TIME);
 
-void get_hw_addr(const char *name, struct hardware *hw);
+void get_hw_addr(struct interface_info *info);
 
 /* socket.c */
 #if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE) \
-- 
1.7.12.4

++++++ 0018-dhcp-4.2.6-improved-xid.patch ++++++
>From 3a2059b67c3adfccd65f1e10aebf8ba73d51bcd1 Mon Sep 17 00:00:00 2001
From: root <[email protected]>
Date: Tue, 25 Mar 2014 23:30:18 +0200
Subject: [PATCH 2/2] dhcp 4.2.6 improved xid

---
 client/dhclient.c | 70 ++++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 56 insertions(+), 14 deletions(-)

diff --git a/client/dhclient.c b/client/dhclient.c
index f7dfbef..bfa99fb 100644
--- a/client/dhclient.c
+++ b/client/dhclient.c
@@ -619,6 +619,26 @@ main(int argc, char **argv) {
                }
        }
 
+       /* We create a backup seed before rediscovering interfaces in order to
+          have a seed built using all of the available interfaces
+          It's interesting if required interfaces doesn't let us defined
+          a really unique seed due to a lack of valid HW addr later
+          (this is the case with DHCP over IB)
+          We only use the last device as using a sum could broke the
+          uniqueness of the seed among multiple nodes
+        */
+       unsigned backup_seed = 0;
+       for (ip = interfaces; ip; ip = ip -> next) {
+               int junk;
+               if ( ip -> hw_address.hlen <= sizeof seed )
+                 continue;
+               memcpy (&junk,
+                       &ip -> hw_address.hbuf [ip -> hw_address.hlen -
+                                               sizeof seed], sizeof seed);
+               backup_seed = junk;
+       }
+
+
        /* At this point, all the interfaces that the script thinks
           are relevant should be running, so now we once again call
           discover_interfaces(), and this time ask it to actually set
@@ -633,14 +653,36 @@ main(int argc, char **argv) {
           Not much entropy, but we're booting, so we're not likely to
           find anything better. */
        seed = 0;
+       int seed_flag = 0;
        for (ip = interfaces; ip; ip = ip->next) {
                int junk;
+               if (ip->hw_address.hlen <= sizeof seed)
+                       continue;
                memcpy(&junk,
                       &ip->hw_address.hbuf[ip->hw_address.hlen -
                                            sizeof seed], sizeof seed);
                seed += junk;
+               seed_flag = 1;
        }
-       srandom(seed + cur_time + (unsigned)getpid());
+       if ( seed_flag == 0 ) {
+                if ( backup_seed != 0 ) {
+                        seed = backup_seed;
+                        log_info ("xid: rand init seed (0x%x) built using all"
+                                  " available interfaces",seed);
+                }
+                else {
+                       seed = cur_time^((unsigned) gethostid()) ;
+                       log_info ("xid: warning: no netdev with useable HWADDR 
found"
+                                 " for seed's uniqueness enforcement");
+                       log_info ("xid: rand init seed (0x%x) built using 
gethostid",
+                                 seed);
+                }
+                /* we only use seed and no current time as a broadcast reply */
+                /* will certainly be used by the hwaddrless interface */
+                srandom(seed);
+        }
+        else
+               srandom(seed + cur_time + (unsigned)getpid());
 
        /* Setup specific Infiniband options */
        for (ip = interfaces; ip; ip = ip->next) {
@@ -1143,7 +1185,7 @@ void dhcpack (packet)
                return;
        }
 
-       log_info ("DHCPACK from %s", piaddr (packet -> client_addr));
+       log_info ("DHCPACK from %s (xid=0x%x)", piaddr (packet -> client_addr), 
client -> xid);
 
        lease = packet_to_lease (packet, client);
        if (!lease) {
@@ -1861,7 +1903,7 @@ void dhcpnak (packet)
                return;
        }
 
-       log_info ("DHCPNAK from %s", piaddr (packet -> client_addr));
+       log_info ("DHCPNAK from %s (xid=0x%x)", piaddr (packet -> client_addr), 
client -> xid);
 
        if (!client -> active) {
 #if defined (DEBUG)
@@ -1988,10 +2030,10 @@ void send_discover (cpp)
                client -> packet.secs = htons (65535);
        client -> secs = client -> packet.secs;
 
-       log_info ("DHCPDISCOVER on %s to %s port %d interval %ld",
-             client -> name ? client -> name : client -> interface -> name,
-             inet_ntoa (sockaddr_broadcast.sin_addr),
-             ntohs (sockaddr_broadcast.sin_port), (long)(client -> interval));
+       log_info ("DHCPDISCOVER on %s to %s port %d interval %ld (xid=0x%x)",
+               client -> name ? client -> name : client -> interface -> name,
+               inet_ntoa (sockaddr_broadcast.sin_addr),
+               ntohs (sockaddr_broadcast.sin_port), (long)(client -> 
interval), client -> xid);
 
        /* Send out a packet. */
        result = send_packet(client->interface, NULL, &client->packet,
@@ -2260,10 +2302,10 @@ void send_request (cpp)
                        client -> packet.secs = htons (65535);
        }
 
-       log_info ("DHCPREQUEST on %s to %s port %d",
+       log_info ("DHCPREQUEST on %s to %s port %d (xid=0x%x)",
              client -> name ? client -> name : client -> interface -> name,
              inet_ntoa (destination.sin_addr),
-             ntohs (destination.sin_port));
+              ntohs (destination.sin_port), client -> xid);
 
        if (destination.sin_addr.s_addr != INADDR_BROADCAST &&
            fallback_interface) {
@@ -2303,10 +2345,10 @@ void send_decline (cpp)
 
        int result;
 
-       log_info ("DHCPDECLINE on %s to %s port %d",
-             client->name ? client->name : client->interface->name,
+       log_info ("DHCPDECLINE on %s to %s port %d (xid=0x%x)",       
+              client->name ? client->name : client->interface->name,
              inet_ntoa(sockaddr_broadcast.sin_addr),
-             ntohs(sockaddr_broadcast.sin_port));
+              ntohs (sockaddr_broadcast.sin_port), client -> xid);
 
        /* Send out a packet. */
        result = send_packet(client->interface, NULL, &client->packet,
@@ -2349,10 +2391,10 @@ void send_release (cpp)
                return;
        }
 
-       log_info ("DHCPRELEASE on %s to %s port %d",
+       log_info ("DHCPRELEASE on %s to %s port %d (xid=0x%x)",
              client -> name ? client -> name : client -> interface -> name,
              inet_ntoa (destination.sin_addr),
-             ntohs (destination.sin_port));
+             ntohs (destination.sin_port), client -> xid);
 
        if (fallback_interface) {
                result = send_packet(fallback_interface, NULL, &client->packet,
-- 
1.7.12.4




-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to