@@ -, +, @@ --- sbin/dhclient/dhclient.c | 12 ++++++++++++ sbin/dhclient/packet.c | 4 +++- 2 files changed, 15 insertions(+), 1 deletions(-) --- b/sbin/dhclient/dhclient.c +++ b/sbin/dhclient/dhclient.c @@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include @@ -96,6 +97,8 @@ int nullfd = -1; char hostname[_POSIX_HOST_NAME_MAX + 1]; +int is_xen_guest = -1; + struct iaddr iaddr_broadcast = { 4, { 255, 255, 255, 255 } }; struct in_addr inaddr_any, inaddr_broadcast; @@ -351,6 +354,8 @@ main(int argc, char *argv[]) struct passwd *pw; pid_t otherpid; cap_rights_t rights; + char vm_guest[16]; + size_t sysctl_len = sizeof(vm_guest); /* Initially, log errors to stderr as well as to syslogd. */ openlog(__progname, LOG_PID | LOG_NDELAY, DHCPD_LOG_FACILITY); @@ -462,6 +467,13 @@ main(int argc, char *argv[]) if (gethostname(hostname, sizeof(hostname)) < 0) hostname[0] = '\0'; + /* + * Check if running in a Xen VM before entering capability mode. + */ + if (sysctlbyname("kern.vm_guest", vm_guest, &sysctl_len, NULL, 0) == 0) + if (strcasecmp(vm_guest, "xen") == 0) + is_xen_guest = 1; + priv_script_init("PREINIT", NULL); if (ifi->client->alias) priv_script_write_params("alias_", ifi->client->alias); --- b/sbin/dhclient/packet.c +++ b/sbin/dhclient/packet.c @@ -55,6 +55,8 @@ __FBSDID("$FreeBSD$"); u_int32_t checksum(unsigned char *, unsigned, u_int32_t); u_int32_t wrapsum(u_int32_t); +extern int is_xen_guest; + u_int32_t checksum(unsigned char *buf, unsigned nbytes, u_int32_t sum) { @@ -231,7 +233,7 @@ decode_udp_ip_header(unsigned char *buf, int bufix, struct sockaddr_in *from, IPPROTO_UDP + (u_int32_t)ntohs(udp->uh_ulen))))); udp_packets_seen++; - if (usum && usum != sum) { + if (usum && usum != sum && is_xen_guest != 1) { udp_packets_bad_checksum++; if (udp_packets_seen > 4 && (udp_packets_seen / udp_packets_bad_checksum) < 2) { --