diff --git a/SOURCES/dhcp-4.2.4-dhclient-options.patch b/SOURCES/dhcp-4.2.4-dhclient-options.patch index 40c3271..d6ed322 100644 --- a/SOURCES/dhcp-4.2.4-dhclient-options.patch +++ b/SOURCES/dhcp-4.2.4-dhclient-options.patch @@ -161,7 +161,7 @@ diff -up dhcp-4.2.4-P2/client/dhclient.c.options dhcp-4.2.4-P2/client/dhclient.c char *mockup_relay = NULL; +int bootp_broadcast_always = 0; + -+extern u_int32_t default_requested_options[]; ++extern struct option *default_requested_options[]; void run_stateless(int exit_mode); diff --git a/SOURCES/dhcp-4.2.4-improved-xid.patch b/SOURCES/dhcp-4.2.4-improved-xid.patch index f353fb0..06ef278 100644 --- a/SOURCES/dhcp-4.2.4-improved-xid.patch +++ b/SOURCES/dhcp-4.2.4-improved-xid.patch @@ -59,10 +59,10 @@ diff -up dhcp-4.2.4b1/client/dhclient.c.improved-xid dhcp-4.2.4b1/client/dhclien + } + /* we only use seed and no current time as a broadcast reply */ + /* will certainly be used by the hwaddrless interface */ -+ srandom(seed); ++ srandom(seed + ((unsigned)(cur_tv.tv_usec * 1000000)) + (unsigned)getpid()); + } + else -+ srandom(seed + cur_time + (unsigned)getpid()); ++ srandom(seed + ((unsigned)(cur_tv.tv_usec * 1000000)) + (unsigned)getpid()); /* Setup specific Infiniband options */ for (ip = interfaces; ip; ip = ip->next) { diff --git a/SOURCES/dhcp-4.2.5-centos-branding.patch b/SOURCES/dhcp-4.2.5-centos-branding.patch deleted file mode 100644 index f3e7113..0000000 --- a/SOURCES/dhcp-4.2.5-centos-branding.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff -uNrp dhcp-4.1.1-P1.orig/omapip/errwarn.c dhcp-4.1.1-P1/omapip/errwarn.c ---- dhcp-4.1.1-P1.orig/omapip/errwarn.c 2012-08-15 14:04:33.149141000 +0000 -+++ dhcp-4.1.1-P1/omapip/errwarn.c 2012-08-15 14:13:05.582416057 +0000 -@@ -81,8 +81,8 @@ void log_fatal (const char * fmt, ... ) - log_error ("have been made to the base software release in order to make"); - log_error ("it work better with this distribution."); - log_error ("%s", ""); -- log_error ("Please report for this software via the Red Hat Bugzilla site:"); -- log_error (" http://bugzilla.redhat.com"); -+ log_error ("Please report for this software via the CentOS Bugs Database:"); -+ log_error (" http://bugs.centos.org/"); - log_error ("%s", ""); - log_error ("exiting."); - #endif diff --git a/SOURCES/dhcp-4.2.5-lpf-ib.patch b/SOURCES/dhcp-4.2.5-lpf-ib.patch index 58b924a..132af50 100644 --- a/SOURCES/dhcp-4.2.5-lpf-ib.patch +++ b/SOURCES/dhcp-4.2.5-lpf-ib.patch @@ -1,6 +1,6 @@ diff -up dhcp-4.2.5/client/dhclient.c.lpf-ib dhcp-4.2.5/client/dhclient.c ---- dhcp-4.2.5/client/dhclient.c.lpf-ib 2013-08-26 12:13:31.509170257 +0200 -+++ dhcp-4.2.5/client/dhclient.c 2013-08-26 12:13:31.515170176 +0200 +--- dhcp-4.2.5/client/dhclient.c.lpf-ib 2015-06-05 16:18:03.387948658 +0200 ++++ dhcp-4.2.5/client/dhclient.c 2015-06-05 16:18:03.391948646 +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.5/client/dhclient.c.lpf-ib dhcp-4.2.5/client/dhclient.c * * Each routine is called from the dhclient_state_machine() in one of diff -up dhcp-4.2.5/common/bpf.c.lpf-ib dhcp-4.2.5/common/bpf.c ---- dhcp-4.2.5/common/bpf.c.lpf-ib 2013-08-26 12:13:31.503170337 +0200 -+++ dhcp-4.2.5/common/bpf.c 2013-08-26 12:13:31.515170176 +0200 +--- dhcp-4.2.5/common/bpf.c.lpf-ib 2015-06-05 16:18:03.384948667 +0200 ++++ dhcp-4.2.5/common/bpf.c 2015-06-05 16:18:03.392948643 +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.5/common/bpf.c.lpf-ib dhcp-4.2.5/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.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c ---- dhcp-4.2.5/common/lpf.c.lpf-ib 2013-08-26 12:13:31.503170337 +0200 -+++ dhcp-4.2.5/common/lpf.c 2013-08-26 12:14:00.196783751 +0200 +--- dhcp-4.2.5/common/lpf.c.lpf-ib 2015-06-05 16:18:03.384948667 +0200 ++++ dhcp-4.2.5/common/lpf.c 2015-06-05 16:33:15.183955199 +0200 @@ -43,6 +43,7 @@ #include "includes/netinet/udp.h" #include "includes/netinet/if_ether.h" @@ -395,7 +395,7 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c if (strlen(name) >= sizeof(tmp.ifr_name)) { log_fatal("Device name too long: \"%s\"", name); -@@ -480,16 +632,62 @@ get_hw_addr(const char *name, struct har +@@ -480,16 +632,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) { @@ -415,8 +415,7 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/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; @@ -461,7 +460,7 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c break; case ARPHRD_IEEE802: #ifdef ARPHRD_IEEE802_TR -@@ -497,18 +695,48 @@ get_hw_addr(const char *name, struct har +@@ -497,18 +694,50 @@ get_hw_addr(const char *name, struct har #endif /* ARPHRD_IEEE802_TR */ hw->hlen = 7; hw->hbuf[0] = HTYPE_IEEE802; @@ -500,9 +499,11 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/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: @@ -514,7 +515,7 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c hw->hlen = 0; hw->hbuf[0] = HTYPE_RESERVED; /* 0xdeadbeef should never occur on the wire, -@@ -521,10 +749,13 @@ get_hw_addr(const char *name, struct har +@@ -521,10 +750,13 @@ get_hw_addr(const char *name, struct har break; #endif default: @@ -533,7 +534,7 @@ diff -up dhcp-4.2.5/common/lpf.c.lpf-ib dhcp-4.2.5/common/lpf.c #endif diff -up dhcp-4.2.5/common/socket.c.lpf-ib dhcp-4.2.5/common/socket.c --- dhcp-4.2.5/common/socket.c.lpf-ib 2013-01-03 01:02:24.000000000 +0100 -+++ dhcp-4.2.5/common/socket.c 2013-08-26 12:13:31.516170162 +0200 ++++ dhcp-4.2.5/common/socket.c 2015-06-05 16:18:03.392948643 +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. */ @@ -562,9 +563,19 @@ diff -up dhcp-4.2.5/common/socket.c.lpf-ib dhcp-4.2.5/common/socket.c if (!quiet_interface_discovery) { if (info->shared_network != NULL) { diff -up dhcp-4.2.5/includes/dhcpd.h.lpf-ib dhcp-4.2.5/includes/dhcpd.h ---- dhcp-4.2.5/includes/dhcpd.h.lpf-ib 2013-08-26 12:13:31.510170243 +0200 -+++ dhcp-4.2.5/includes/dhcpd.h 2013-08-26 12:13:31.517170149 +0200 -@@ -1249,6 +1249,7 @@ struct interface_info { +--- dhcp-4.2.5/includes/dhcpd.h.lpf-ib 2015-06-05 16:18:03.388948655 +0200 ++++ dhcp-4.2.5/includes/dhcpd.h 2015-06-05 16:33:58.988803266 +0200 +@@ -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]; +@@ -1249,6 +1252,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.2.5/includes/dhcpd.h.lpf-ib dhcp-4.2.5/includes/dhcpd.h struct in_addr *addresses; /* Addresses associated with this * interface. */ -@@ -2372,7 +2373,7 @@ void print_dns_status (int, struct dhcp_ +@@ -2372,7 +2376,7 @@ void print_dns_status (int, struct dhcp_ #endif const char *print_time(TIME); diff --git a/SOURCES/dhcp-IPoIB-log-id.patch b/SOURCES/dhcp-IPoIB-log-id.patch index 4b4f71b..8517ab4 100644 --- a/SOURCES/dhcp-IPoIB-log-id.patch +++ b/SOURCES/dhcp-IPoIB-log-id.patch @@ -1,98 +1,3 @@ -diff -up dhcp-4.2.5/common/lpf.c.IPoIB-log-id dhcp-4.2.5/common/lpf.c ---- dhcp-4.2.5/common/lpf.c.IPoIB-log-id 2014-09-08 14:50:39.000000000 +0200 -+++ dhcp-4.2.5/common/lpf.c 2014-09-08 14:54:43.935612705 +0200 -@@ -158,6 +158,7 @@ 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 -@@ -165,11 +166,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 ? -@@ -179,6 +184,9 @@ 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 -@@ -191,7 +199,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 ? -@@ -218,7 +226,7 @@ static void lpf_gen_filter_setup (struct - void if_register_receive (info) - struct interface_info *info; - { -- int val; -+ int val, hlen; - - /* Open a LPF device and hang it on this interface... */ - info -> rfdesc = if_register_lpf (info); -@@ -230,7 +238,9 @@ void if_register_receive (info) - if (errno != ENOPROTOOPT) - log_fatal ("Failed to set auxiliary packet data: %m"); - } -- } -+ hlen = info -> hw_address.hlen; -+ } else -+ hlen = 9; - - #if defined (HAVE_TR_SUPPORT) - if (info -> hw_address.hbuf [0] == HTYPE_IEEE802) -@@ -243,7 +253,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 ? -@@ -253,6 +263,9 @@ 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); -@@ -261,7 +274,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.2.5/server/dhcp.c.IPoIB-log-id dhcp-4.2.5/server/dhcp.c --- dhcp-4.2.5/server/dhcp.c.IPoIB-log-id 2014-09-08 14:50:39.000000000 +0200 +++ dhcp-4.2.5/server/dhcp.c 2014-09-08 15:06:28.367697349 +0200 diff --git a/SOURCES/dhcp-client-request-release-bind-iface.patch b/SOURCES/dhcp-client-request-release-bind-iface.patch new file mode 100644 index 0000000..de8475c --- /dev/null +++ b/SOURCES/dhcp-client-request-release-bind-iface.patch @@ -0,0 +1,61 @@ +diff -up dhcp-4.2.5/client/dhclient.c.bind-iface dhcp-4.2.5/client/dhclient.c +--- dhcp-4.2.5/client/dhclient.c.bind-iface 2015-02-03 12:24:08.076213363 +0100 ++++ dhcp-4.2.5/client/dhclient.c 2015-02-03 12:25:02.399168410 +0100 +@@ -2670,6 +2670,14 @@ void send_request (cpp) + + if (destination.sin_addr.s_addr != INADDR_BROADCAST && + fallback_interface) { ++#if defined(SO_BINDTODEVICE) ++ if (setsockopt(fallback_interface -> wfdesc, SOL_SOCKET, ++ SO_BINDTODEVICE, client->interface->name, ++ strlen(client->interface->name)) < 0) { ++ log_error("%s:%d: Failed to bind fallback interface" ++ " to %s: %m", MDL, client->interface->name); ++ } ++#endif + result = send_packet(fallback_interface, NULL, &client->packet, + client->packet_length, from, &destination, + NULL); +@@ -2679,6 +2687,13 @@ void send_request (cpp) + client->packet_length, + fallback_interface->name); + } ++#if defined(SO_BINDTODEVICE) ++ if (setsockopt(fallback_interface -> wfdesc, SOL_SOCKET, ++ SO_BINDTODEVICE, NULL, 0) < 0) { ++ log_fatal("%s:%d: Failed to unbind fallback interface:" ++ " %m", MDL); ++ } ++#endif + } + else { + /* Send out a packet. */ +@@ -2758,6 +2773,14 @@ void send_release (cpp) + ntohs (destination.sin_port), client -> xid); + + if (fallback_interface) { ++#if defined(SO_BINDTODEVICE) ++ if (setsockopt(fallback_interface -> wfdesc, SOL_SOCKET, ++ SO_BINDTODEVICE, client->interface->name, ++ strlen(client->interface->name)) < 0) { ++ log_error("%s:%d: Failed to bind fallback interface" ++ " to %s: %m", MDL, client->interface->name); ++ } ++#endif + result = send_packet(fallback_interface, NULL, &client->packet, + client->packet_length, from, &destination, + NULL); +@@ -2767,6 +2790,13 @@ void send_release (cpp) + client->packet_length, + fallback_interface->name); + } ++#if defined(SO_BINDTODEVICE) ++ if (setsockopt(fallback_interface -> wfdesc, SOL_SOCKET, ++ SO_BINDTODEVICE, NULL, 0) < 0) { ++ log_fatal("%s:%d: Failed to unbind fallback interface:" ++ " %m", MDL); ++ } ++#endif + } else { + /* Send out a packet. */ + result = send_packet(client->interface, NULL, &client->packet, diff --git a/SOURCES/dhcp-dns_client_cancelupdate.patch b/SOURCES/dhcp-dns_client_cancelupdate.patch new file mode 100644 index 0000000..0258273 --- /dev/null +++ b/SOURCES/dhcp-dns_client_cancelupdate.patch @@ -0,0 +1,69 @@ +diff -up dhcp-4.2.5/client/dhclient.c.dns_client_cancelupdate dhcp-4.2.5/client/dhclient.c +--- dhcp-4.2.5/client/dhclient.c.dns_client_cancelupdate 2015-06-25 14:31:27.309035906 +0200 ++++ dhcp-4.2.5/client/dhclient.c 2015-06-25 14:34:26.477642016 +0200 +@@ -121,6 +121,8 @@ static int check_option_values(struct un + const char *ptr, size_t len); + + static void setup_ib_interface(struct interface_info *ip); ++static void dhclient_ddns_cb_free(dhcp_ddns_cb_t *ddns_cb, ++ char* file, int line); + + int + main(int argc, char **argv) { +@@ -4306,7 +4308,7 @@ client_dns_remove_action(dhcp_ddns_cb_t + } + + /* If we are done or have an error clean up */ +- ddns_cb_free(ddns_cb, MDL); ++ dhclient_ddns_cb_free(ddns_cb, MDL); + return; + } + +@@ -4335,7 +4337,7 @@ client_dns_remove(struct client_state *c + result = client_dns_update(client, ddns_cb); + + if (result != ISC_R_TIMEDOUT) { +- ddns_cb_free(ddns_cb, MDL); ++ dhclient_ddns_cb_free(ddns_cb, MDL); + } + } + } +@@ -4418,10 +4420,7 @@ client_dns_update_timeout (void *cp) + * the control block and should free it. + */ + if (status != ISC_R_TIMEDOUT) { +- if (client != NULL) { +- client->ddns_cb = NULL; +- } +- ddns_cb_free(ddns_cb, MDL); ++ dhclient_ddns_cb_free(ddns_cb, MDL); + } + } + +@@ -4510,7 +4509,7 @@ client_dns_update_action(dhcp_ddns_cb_t + return; + } + +- ddns_cb_free(ddns_cb, MDL); ++ dhclient_ddns_cb_free(ddns_cb, MDL); + return; + } + +@@ -4873,3 +4872,17 @@ add_reject(struct packet *packet) { + */ + log_info("Server added to list of rejected servers."); + } ++ ++/* Wrapper function around common ddns_cb_free function that ensures ++ * we set the client_state pointer to the control block to NULL. */ ++static void ++dhclient_ddns_cb_free(dhcp_ddns_cb_t *ddns_cb, char* file, int line) { ++ if (ddns_cb) { ++ struct client_state *client = (struct client_state *)ddns_cb->lease; ++ if (client != NULL) { ++ client->ddns_cb = NULL; ++ } ++ ++ ddns_cb_free(ddns_cb, file, line); ++ } ++} diff --git a/SOURCES/dhcp-option97-pxe-client-id.patch b/SOURCES/dhcp-option97-pxe-client-id.patch new file mode 100644 index 0000000..64000dc --- /dev/null +++ b/SOURCES/dhcp-option97-pxe-client-id.patch @@ -0,0 +1,207 @@ +diff -up dhcp-4.2.5/common/options.c.option97 dhcp-4.2.5/common/options.c +--- dhcp-4.2.5/common/options.c.option97 2015-05-20 16:44:34.958765179 +0200 ++++ dhcp-4.2.5/common/options.c 2015-05-20 16:44:35.078763436 +0200 +@@ -4222,13 +4222,26 @@ int validate_packet(struct packet *packe + "a future version of ISC DHCP will reject this"); + } + } else { +- /* +- * If hlen is 0 we don't have any identifier, we warn the user +- * but continue processing the packet as we can. +- */ +- if (packet->raw->hlen == 0) { +- log_debug("Received DHCPv4 packet without client-id" +- " option and empty hlen field."); ++ oc = lookup_option (&dhcp_universe, packet->options, ++ DHO_PXE_CLIENT_ID); ++ if (oc) { ++ /* Let's check if pxe-client-id is sane */ ++ if ((oc->data.len < 2) || ++ (oc->data.data[0] == '\0' && ++ oc->data.len != 17)) { ++ log_debug("Dropped DHCPv4 packet with wrong " ++ "(len == %d) pxe-client-id", oc->data.len); ++ return (0); ++ } ++ } else { ++ /* ++ * If hlen is 0 we don't have any identifier, we warn the user ++ * but continue processing the packet as we can. ++ */ ++ if (packet->raw->hlen == 0) { ++ log_debug("Received DHCPv4 packet without client-id" ++ " option and empty hlen field."); ++ } + } + } + +diff -up dhcp-4.2.5/common/tables.c.option97 dhcp-4.2.5/common/tables.c +--- dhcp-4.2.5/common/tables.c.option97 2015-05-20 16:44:35.079763422 +0200 ++++ dhcp-4.2.5/common/tables.c 2015-05-20 16:47:50.172931400 +0200 +@@ -203,8 +203,9 @@ static struct option dhcp_options[] = { + /* Defined by RFC 4578 */ + { "pxe-system-type", "S", &dhcp_universe, 93, 1 }, + { "pxe-interface-id", "BBB", &dhcp_universe, 94, 1 }, +- { "pxe-client-id", "BX", &dhcp_universe, 97, 1 }, + #endif ++ { "pxe-client-id", "BX", &dhcp_universe, 97, 1 }, ++ + { "uap-servers", "t", &dhcp_universe, 98, 1 }, + { "netinfo-server-address", "Ia", &dhcp_universe, 112, 1 }, + { "netinfo-server-tag", "t", &dhcp_universe, 113, 1 }, +diff -up dhcp-4.2.5/includes/dhcp.h.option97 dhcp-4.2.5/includes/dhcp.h +--- dhcp-4.2.5/includes/dhcp.h.option97 2015-05-20 16:44:34.975764932 +0200 ++++ dhcp-4.2.5/includes/dhcp.h 2015-05-20 16:44:35.079763422 +0200 +@@ -163,6 +163,7 @@ struct dhcp_packet { + #define DHO_AUTHENTICATE 90 /* RFC3118, was 210 */ + #define DHO_CLIENT_LAST_TRANSACTION_TIME 91 + #define DHO_ASSOCIATED_IP 92 ++#define DHO_PXE_CLIENT_ID 97 /* RFC4578 */ + #define DHO_SUBNET_SELECTION 118 /* RFC3011! */ + #define DHO_DOMAIN_SEARCH 119 /* RFC3397 */ + #define DHO_CLASSLESS_STATIC_ROUTES 121 /* RFC3442 */ +diff -up dhcp-4.2.5/server/dhcp.c.option97 dhcp-4.2.5/server/dhcp.c +--- dhcp-4.2.5/server/dhcp.c.option97 2015-05-20 16:44:35.060763698 +0200 ++++ dhcp-4.2.5/server/dhcp.c 2015-05-20 16:51:26.718798033 +0200 +@@ -202,6 +205,10 @@ dhcp (struct packet *packet) { + oc = lookup_option (&dhcp_universe, packet -> options, + DHO_DHCP_CLIENT_IDENTIFIER); + if (!oc) ++ oc = lookup_option (&dhcp_universe, ++ packet -> options, ++ DHO_PXE_CLIENT_ID); ++ if (!oc) + goto nolease; + + memset (&data, 0, sizeof data); +@@ -770,6 +777,9 @@ void dhcprelease (packet, ms_nulltp) + + oc = lookup_option (&dhcp_universe, packet -> options, + DHO_DHCP_CLIENT_IDENTIFIER); ++ if (!oc) ++ oc = lookup_option (&dhcp_universe, packet -> options, ++ DHO_PXE_CLIENT_ID); + memset (&data, 0, sizeof data); + if (oc && + evaluate_option_cache (&data, packet, (struct lease *)0, +@@ -1841,6 +1851,9 @@ void ack_lease (packet, lease, offer, wh + can be used. */ + oc = lookup_option (&dhcp_universe, packet -> options, + DHO_DHCP_CLIENT_IDENTIFIER); ++ if (!oc) ++ oc = lookup_option (&dhcp_universe, packet -> options, ++ DHO_PXE_CLIENT_ID); + if (oc && + evaluate_option_cache (&d1, packet, lease, + (struct client_state *)0, +@@ -2386,6 +2399,9 @@ void ack_lease (packet, lease, offer, wh + /* Record the uid, if given... */ + oc = lookup_option (&dhcp_universe, packet -> options, + DHO_DHCP_CLIENT_IDENTIFIER); ++ if (!oc) ++ oc = lookup_option (&dhcp_universe, packet -> options, ++ DHO_PXE_CLIENT_ID); + if (oc && + evaluate_option_cache (&d1, packet, lease, + (struct client_state *)0, +@@ -3429,6 +3445,9 @@ int find_lease (struct lease **lp, + specified unique client identifier. */ + oc = lookup_option (&dhcp_universe, packet -> options, + DHO_DHCP_CLIENT_IDENTIFIER); ++ if (!oc) ++ oc = lookup_option (&dhcp_universe, packet -> options, ++ DHO_PXE_CLIENT_ID); + memset (&client_identifier, 0, sizeof client_identifier); + if (oc && + evaluate_option_cache (&client_identifier, +diff -up dhcp-4.2.5/server/dhcpd.conf.5.option97 dhcp-4.2.5/server/dhcpd.conf.5 +--- dhcp-4.2.5/server/dhcpd.conf.5.option97 2015-05-20 16:44:34.908765906 +0200 ++++ dhcp-4.2.5/server/dhcpd.conf.5 2015-05-20 16:44:35.081763393 +0200 +@@ -1657,10 +1657,12 @@ should be a name identifying the host. + not specified for the host, \fIhostname\fR is used. + .PP + \fIHost\fR declarations are matched to actual DHCP or BOOTP clients +-by matching the \fRdhcp-client-identifier\fR option specified in the ++by matching the \fIdhcp-client-identifier\fR or \fIpxe-client-id\fR ++options specified in the + \fIhost\fR declaration to the one supplied by the client, or, if the + \fIhost\fR declaration or the client does not provide a +-\fRdhcp-client-identifier\fR option, by matching the \fIhardware\fR ++\fIdhcp-client-identifier\fR or \fIpxe-client-id\fR options, ++by matching the \fIhardware\fR + parameter in the \fIhost\fR declaration to the network hardware + address supplied by the client. BOOTP clients do not normally + provide a \fIdhcp-client-identifier\fR, so the hardware address must +@@ -1672,7 +1674,8 @@ to identify hosts. + .PP + Please be aware that + .B only +-the \fIdhcp-client-identifier\fR option and the hardware address can be ++the \fIdhcp-client-identifier\fR and \fIpxe-client-id\fR ++options and the hardware address can be + used to match a host declaration, or the \fIhost-identifier option\fR + parameter for DHCPv6 servers. For example, it is not possible to + match a host declaration to a \fIhost-name\fR option. This is +diff -up dhcp-4.2.5/server/dhcpleasequery.c.option97 dhcp-4.2.5/server/dhcpleasequery.c +--- dhcp-4.2.5/server/dhcpleasequery.c.option97 2013-01-03 01:02:25.000000000 +0100 ++++ dhcp-4.2.5/server/dhcpleasequery.c 2015-05-20 16:44:35.082763378 +0200 +@@ -279,7 +279,7 @@ dhcpleasequery(struct packet *packet, in + */ + + memset(&uid, 0, sizeof(uid)); +- if (get_option(&uid, ++ i = get_option(&uid, + &dhcp_universe, + packet, + NULL, +@@ -289,8 +289,20 @@ dhcpleasequery(struct packet *packet, in + packet->options, + &global_scope, + DHO_DHCP_CLIENT_IDENTIFIER, +- MDL)) { +- ++ MDL); ++ if (!i) ++ i = get_option(&uid, ++ &dhcp_universe, ++ packet, ++ NULL, ++ NULL, ++ packet->options, ++ NULL, ++ packet->options, ++ &global_scope, ++ DHO_PXE_CLIENT_ID, ++ MDL); ++ if (i) { + snprintf(dbg_info, + sizeof(dbg_info), + "client-id %s", +diff -up dhcp-4.2.5/server/failover.c.option97 dhcp-4.2.5/server/failover.c +--- dhcp-4.2.5/server/failover.c.option97 2015-05-20 16:44:35.001764555 +0200 ++++ dhcp-4.2.5/server/failover.c 2015-05-20 16:44:35.083763364 +0200 +@@ -5875,6 +5875,9 @@ int load_balance_mine (struct packet *pa + + oc = lookup_option(&dhcp_universe, packet->options, + DHO_DHCP_CLIENT_IDENTIFIER); ++ if (!oc) ++ oc = lookup_option(&dhcp_universe, packet -> options, ++ DHO_PXE_CLIENT_ID); + memset(&ds, 0, sizeof ds); + if (oc && + evaluate_option_cache(&ds, packet, NULL, NULL, +diff -up dhcp-4.2.5/server/mdb.c.option97 dhcp-4.2.5/server/mdb.c +--- dhcp-4.2.5/server/mdb.c.option97 2013-01-03 01:02:25.000000000 +0100 ++++ dhcp-4.2.5/server/mdb.c 2015-05-20 16:44:35.084763349 +0200 +@@ -127,8 +127,9 @@ static int find_uid_statement (struct ex + esp -> data.option && + (esp -> data.option -> option -> universe == + &dhcp_universe) && +- (esp -> data.option -> option -> code == +- DHO_DHCP_CLIENT_IDENTIFIER)) { ++ ((esp -> data.option -> option -> code == ++ DHO_DHCP_CLIENT_IDENTIFIER) || ++ (esp -> data.option -> option -> code == DHO_PXE_CLIENT_ID))) { + if (condp) { + log_error ("dhcp client identifier may not be %s", + "specified conditionally."); diff --git a/SOURCES/dhcp-vlanfilter.patch b/SOURCES/dhcp-vlanfilter.patch new file mode 100644 index 0000000..1c62dc7 --- /dev/null +++ b/SOURCES/dhcp-vlanfilter.patch @@ -0,0 +1,14 @@ +diff -up dhcp-4.2.5/common/lpf.c.vlan dhcp-4.2.5/common/lpf.c +--- dhcp-4.2.5/common/lpf.c.vlan 2015-10-13 18:48:35.180447618 +0200 ++++ dhcp-4.2.5/common/lpf.c 2015-10-13 18:51:29.797079032 +0200 +@@ -521,6 +521,10 @@ ssize_t receive_packet (interface, buf, + if (cmsg->cmsg_level == SOL_PACKET && + cmsg->cmsg_type == PACKET_AUXDATA) { + struct tpacket_auxdata *aux = (void *)CMSG_DATA(cmsg); ++ /* Discard packets with stripped vlan id */ ++ /* VLAN ID is only bottom 12-bits of TCI */ ++ if (aux->tp_vlan_tci & 0x0fff) ++ return 0; + nocsum = aux->tp_status & TP_STATUS_CSUMNOTREADY; + } + } diff --git a/SPECS/dhcp.spec b/SPECS/dhcp.spec index 8f45080..78ac4bb 100644 --- a/SPECS/dhcp.spec +++ b/SPECS/dhcp.spec @@ -18,7 +18,7 @@ Summary: Dynamic host configuration protocol software Name: dhcp Version: 4.2.5 -Release: 36%{?dist} +Release: 42%{?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. @@ -86,7 +86,10 @@ Patch52: dhcp-IPoIB-log-id.patch Patch53: dhcp-dhc6-life.patch Patch54: dhcp-hop-limit.patch Patch55: dhcp-stateless-store-duid.patch -Patch56: dhcp-4.2.5-centos-branding.patch +Patch56: dhcp-vlanfilter.patch +Patch57: dhcp-option97-pxe-client-id.patch +Patch58: dhcp-client-request-release-bind-iface.patch +Patch59: dhcp-dns_client_cancelupdate.patch BuildRequires: autoconf BuildRequires: automake @@ -372,7 +375,18 @@ rm -rf includes/isc-dhcp # Write DUID_LLT even in stateless mode (#1156356) %patch55 -p1 -b .stateless-store-duid -%patch56 -p1 + +# dhcpd generates spurious responses when seeing requests from vlans on plain interface (#1175350) +%patch56 -p1 -b .vlan + +# option 97 - pxe-client-id (#1175422) +%patch57 -p1 -b .option97 + +# send unicast request/release via correct interface (#1177351) +%patch58 -p1 -b .bind-iface + +# dhclient crashes in dns_client_cancelupdate (#1187856) +%patch59 -p1 -b .dns_client_cancelupdate # Update paths in all man pages for page in client/dhclient.conf.5 client/dhclient.leases.5 \ @@ -640,8 +654,25 @@ done %changelog -* Thu Mar 05 2015 CentOS Sources - 4.2.5-36.el7.centos -- Roll in CentOS Branding +* Tue Oct 13 2015 Jiri Popelka - 12:4.2.5-42 +- regenerate dhcp-vlanfilter.patch (#1175350) + +* Thu Sep 03 2015 Jiri Popelka - 12:4.2.5-41 +- VLAN ID is only bottom 12-bits of TCI (#1175350) + +* Tue Jul 07 2015 Jiri Popelka - 12:4.2.5-40 +- rebuilt (#1238461) + +* Thu Jun 25 2015 Jiri Popelka - 12:4.2.5-39 +- dhclient crashes in dns_client_cancelupdate (#1187856) + +* Wed Jun 24 2015 Jiri Popelka - 12:4.2.5-38 +- correctly set IB's hw->hlen and add more randomness into xid generation (#1195693) +- send unicast request/release via correct interface (#1177351) + +* Wed May 20 2015 Jiri Popelka - 12:4.2.5-37 +- dhcpd generates spurious responses when seeing requests from vlans on plain interface (#1175350) +- option 97 - pxe-client-id (#1175422) * Tue Jan 20 2015 Jiri Popelka - 12:4.2.5-36 - use upstream patch for #1147240 (Relay-forward's Hop Limit)