diff --git a/dhcp-3.0.5-xen-checksum.patch b/dhcp-3.0.5-xen-checksum.patch deleted file mode 100644 index 8eada53..0000000 --- a/dhcp-3.0.5-xen-checksum.patch +++ /dev/null @@ -1,242 +0,0 @@ ---- dhcp-3.0.5/common/bpf.c.xen 2004-11-24 12:39:15.000000000 -0500 -+++ dhcp-3.0.5/common/bpf.c 2007-03-30 16:34:45.000000000 -0400 -@@ -478,7 +478,8 @@ - interface -> rbuf, - interface -> rbuf_offset, - from, -- hdr.bh_caplen); -+ hdr.bh_caplen, -+ 0); - - /* If the IP or UDP checksum was bad, skip the packet... */ - if (offset < 0) { ---- dhcp-3.0.5/common/dlpi.c.xen 2004-11-24 12:39:15.000000000 -0500 -+++ dhcp-3.0.5/common/dlpi.c 2007-03-30 16:34:45.000000000 -0400 -@@ -679,7 +679,7 @@ - length -= offset; - #endif - offset = decode_udp_ip_header (interface, dbuf, bufix, -- from, length); -+ from, length, 0); - - /* If the IP or UDP checksum was bad, skip the packet... */ - if (offset < 0) { ---- dhcp-3.0.5/common/lpf.c.xen 2007-03-30 16:34:26.000000000 -0400 -+++ dhcp-3.0.5/common/lpf.c 2007-03-30 16:34:45.000000000 -0400 -@@ -34,16 +34,31 @@ - #include "dhcpd.h" - #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE) - #include -+#include - #include - - #include - #include - #include -+#include - #include - #include "includes/netinet/ip.h" - #include "includes/netinet/udp.h" - #include "includes/netinet/if_ether.h" - -+#ifndef PACKET_AUXDATA -+#define PACKET_AUXDATA 8 -+ -+struct tpacket_auxdata -+{ -+ __u32 tp_status; -+ __u32 tp_len; -+ __u32 tp_snaplen; -+ __u16 tp_mac; -+ __u16 tp_net; -+}; -+#endif -+ - /* Reinitializes the specified interface after an address change. This - is not required for packet-filter APIs. */ - -@@ -69,10 +84,14 @@ - struct interface_info *info; - { - int sock; -- struct sockaddr sa; -+ union { -+ struct sockaddr_ll ll; -+ struct sockaddr common; -+ } sa; -+ struct ifreq ifr; - - /* Make an LPF socket. */ -- if ((sock = socket(PF_PACKET, SOCK_PACKET, -+ if ((sock = socket(PF_PACKET, SOCK_RAW, - htons((short)ETH_P_ALL))) < 0) { - if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT || - errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT || -@@ -87,11 +106,16 @@ - log_fatal ("Open a socket for LPF: %m"); - } - -+ memset (&ifr, 0, sizeof ifr); -+ strncpy (ifr.ifr_name, (const char *)info -> ifp, sizeof ifr.ifr_name); -+ if (ioctl (sock, SIOCGIFINDEX, &ifr)) -+ log_fatal ("Failed to get interface index: %m"); -+ - /* Bind to the interface name */ - memset (&sa, 0, sizeof sa); -- sa.sa_family = AF_PACKET; -- strncpy (sa.sa_data, (const char *)info -> ifp, sizeof sa.sa_data); -- if (bind (sock, &sa, sizeof sa)) { -+ sa.ll.sll_family = AF_PACKET; -+ sa.ll.sll_ifindex = ifr.ifr_ifindex; -+ if (bind (sock, &sa.common, sizeof sa)) { - if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT || - errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT || - errno == EAFNOSUPPORT || errno == EINVAL) { -@@ -171,9 +195,18 @@ - void if_register_receive (info) - struct interface_info *info; - { -+ int val; -+ - /* 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 defined (HAVE_TR_SUPPORT) - if (info -> hw_address.hbuf [0] == HTYPE_IEEE802) - lpf_tr_filter_setup (info); -@@ -291,7 +324,6 @@ - double hh [16]; - double ih [1536 / sizeof (double)]; - unsigned char *buf = (unsigned char *)ih; -- struct sockaddr sa; - int result; - int fudge; - -@@ -309,15 +341,7 @@ - (unsigned char *)raw, len); - memcpy (buf + ibufp, raw, len); - -- /* For some reason, SOCK_PACKET sockets can't be connected, -- so we have to do a sentdo every time. */ -- memset (&sa, 0, sizeof sa); -- sa.sa_family = AF_PACKET; -- strncpy (sa.sa_data, -- (const char *)interface -> ifp, sizeof sa.sa_data); -- -- result = sendto (interface -> wfdesc, -- buf + fudge, ibufp + len - fudge, 0, &sa, sizeof sa); -+ result = write (interface -> wfdesc, buf + fudge, ibufp + len - fudge); - if (result < 0) - log_error ("send_packet: %m"); - return result; -@@ -334,13 +358,34 @@ - { - int length = 0; - int offset = 0; -+ int nocsum = 0; - unsigned char ibuf [1536]; - unsigned bufix = 0; -+ unsigned char cmsgbuf[CMSG_LEN(sizeof(struct tpacket_auxdata))]; -+ struct iovec iov = { -+ .iov_base = ibuf, -+ .iov_len = sizeof ibuf, -+ }; -+ struct msghdr msg = { -+ .msg_iov = &iov, -+ .msg_iovlen = 1, -+ .msg_control = cmsgbuf, -+ .msg_controllen = sizeof(cmsgbuf), -+ }; -+ struct cmsghdr *cmsg; - -- length = read (interface -> rfdesc, ibuf, sizeof ibuf); -+ length = recvmsg (interface -> rfdesc, &msg, 0); - if (length <= 0) - return length; - -+ for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { -+ if (cmsg->cmsg_level == SOL_PACKET && -+ cmsg->cmsg_type == PACKET_AUXDATA) { -+ struct tpacket_auxdata *aux = (void *)CMSG_DATA(cmsg); -+ nocsum = aux->tp_status & TP_STATUS_CSUMNOTREADY; -+ } -+ } -+ - bufix = 0; - /* Decode the physical header... */ - offset = decode_hw_header (interface, ibuf, bufix, hfrom); -@@ -357,7 +402,7 @@ - - /* Decode the IP and UDP headers... */ - offset = decode_udp_ip_header (interface, ibuf, bufix, from, -- (unsigned)length); -+ (unsigned)length, nocsum); - - /* If the IP or UDP checksum was bad, skip the packet... */ - if (offset < 0) ---- dhcp-3.0.5/common/nit.c.xen 2004-11-24 12:39:15.000000000 -0500 -+++ dhcp-3.0.5/common/nit.c 2007-03-30 16:34:45.000000000 -0400 -@@ -370,7 +370,7 @@ - - /* Decode the IP and UDP headers... */ - offset = decode_udp_ip_header (interface, ibuf, bufix, -- from, length); -+ from, length, 0); - - /* If the IP or UDP checksum was bad, skip the packet... */ - if (offset < 0) ---- dhcp-3.0.5/common/packet.c.xen 2007-03-30 16:34:26.000000000 -0400 -+++ dhcp-3.0.5/common/packet.c 2007-03-30 16:34:45.000000000 -0400 -@@ -211,12 +211,13 @@ - - /* UDP header and IP header decoded together for convenience. */ - --ssize_t decode_udp_ip_header (interface, buf, bufix, from, buflen) -+ssize_t decode_udp_ip_header (interface, buf, bufix, from, buflen, nocsum) - struct interface_info *interface; - unsigned char *buf; - unsigned bufix; - struct sockaddr_in *from; - unsigned buflen; -+ int nocsum; - { - unsigned char *data; - struct ip ip; -@@ -319,7 +320,7 @@ - (u_int32_t)ulen)))); - - udp_packets_seen++; -- if (usum && usum != sum) { -+ if (!nocsum && usum && usum != sum) { - udp_packets_bad_checksum++; - if (udp_packets_seen > 4 && - (udp_packets_seen / udp_packets_bad_checksum) < 2) { ---- dhcp-3.0.5/common/upf.c.xen 2004-11-24 12:39:16.000000000 -0500 -+++ dhcp-3.0.5/common/upf.c 2007-03-30 16:34:45.000000000 -0400 -@@ -321,7 +321,7 @@ - - /* Decode the IP and UDP headers... */ - offset = decode_udp_ip_header (interface, ibuf, bufix, -- from, length); -+ from, length, 0); - - /* If the IP or UDP checksum was bad, skip the packet... */ - if (offset < 0) ---- dhcp-3.0.5/includes/dhcpd.h.xen 2007-03-30 16:34:26.000000000 -0400 -+++ dhcp-3.0.5/includes/dhcpd.h 2007-03-30 16:34:45.000000000 -0400 -@@ -1988,7 +1988,7 @@ - unsigned, struct hardware *)); - ssize_t decode_udp_ip_header PROTO ((struct interface_info *, unsigned char *, - unsigned, struct sockaddr_in *, -- unsigned)); -+ unsigned, int)); - - /* ethernet.c */ - void assemble_ethernet_header PROTO ((struct interface_info *, unsigned char *, diff --git a/dhcp.spec b/dhcp.spec index 8541406..9daf0c2 100644 --- a/dhcp.spec +++ b/dhcp.spec @@ -10,7 +10,7 @@ Summary: DHCP (Dynamic Host Configuration Protocol) server and relay agent Name: dhcp Version: 3.0.5 -Release: 27%{?dist} +Release: 28%{?dist} Epoch: 12 License: ISC Group: System Environment/Daemons @@ -46,12 +46,11 @@ Patch12: %{name}-%{version}-selinux.patch Patch13: %{name}-%{version}-unicast-bootp.patch Patch14: %{name}-%{version}-fast-timeout.patch Patch15: %{name}-%{version}-failover-ports.patch -Patch16: %{name}-%{version}-xen-checksum.patch -Patch17: %{name}-%{version}-dhclient-usage.patch -Patch18: %{name}-%{version}-default-requested-options.patch -Patch19: %{name}-%{version}-prototypes.patch -Patch20: %{name}-%{version}-manpages.patch -Patch21: %{name}-%{version}-libdhcp4client.patch +Patch16: %{name}-%{version}-dhclient-usage.patch +Patch17: %{name}-%{version}-default-requested-options.patch +Patch18: %{name}-%{version}-prototypes.patch +Patch19: %{name}-%{version}-manpages.patch +Patch20: %{name}-%{version}-libdhcp4client.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires(post): chkconfig, coreutils @@ -178,17 +177,14 @@ client library . # dhcp-failover 847/udp %patch15 -p1 -b .failover -# Fix Xen host networking problems (partial checksums) -%patch16 -p1 -b .xen - # Update the usage screen for dhclient(8) indicating new options # Use printf() rather than log_info() to display the information # Also, return EXIT_FAILURE when the usage() screen is displayed (stop parsing) -%patch17 -p1 -b .usage +%patch16 -p1 -b .usage # Add NIS domain, NIS servers, and NTP servers to the list of default # requested DHCP options -%patch18 -p1 -b .dho +%patch17 -p1 -b .dho # Add missing prototypes to take care of gcc warnings # in dst/dst_api.c: add b64_pton() and b64_ntop() @@ -197,7 +193,7 @@ client library . # in minires/res_comp.c: add ns_name_uncompress(), ns_name_compress(), and # ns_name_skip() # in minires/res_init.c: add res_randomid() -%patch19 -p1 -b .prototypes +%patch18 -p1 -b .prototypes # Man page updates explaining new features added from the above patches. # Normally these man page changes would be included in the feature patch, @@ -207,10 +203,10 @@ client library . # and not affect the code changes in the other patches. It's actually # pretty common to update or alter these man pages independent of the code # changes. -%patch20 -p1 -b .manpages +%patch19 -p1 -b .manpages # Add the libdhcp4client target (library version of dhclient) -%patch21 -p1 -b .libdhcp4client +%patch20 -p1 -b .libdhcp4client # Copy in documentation and example scripts for LDAP patch to dhcpd %{__cp} -p %SOURCE6 . @@ -395,6 +391,9 @@ exit 0 %{_libdir}/libdhcp4client.so %changelog +* Mon Apr 09 2007 David Cantrell - 12:3.0.5-28 +- Remove Xen patch (#235649, from RHEL-5, doesn't work correctly for Fedora) + * Sun Apr 01 2007 David Cantrell - 12:3.0.5-27 - Ensure that Perl and Perl modules are not added as dependencies (#234688) - Reorganize patches by feature/bug per packaging guidelines (#225691)