# HG changeset patch # User Rishi Srivatsavai # Date 1313441203 25200 # Node ID b88384d5a7aedd6f6820e42b47a682a36a486095 # Parent b4bf6ad34a2d35122a463763a0622d4cf3620b68 7079458 Update ISC DHCP to 4.1-ESV-R3 7078575 Problem with network/dhcp_server 7076635 isc-dhcp missing dependency on system/network for net_include.sh diff -r b4bf6ad34a2d -r b88384d5a7ae components/isc-dhcp/Makefile --- a/components/isc-dhcp/Makefile Mon Aug 15 11:41:24 2011 -0700 +++ b/components/isc-dhcp/Makefile Mon Aug 15 13:46:43 2011 -0700 @@ -24,9 +24,9 @@ COMPONENT_NAME= dhcp COMPONENT_VERSION= 4.1 -COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION)-ESV-R1 +COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION)-ESV-R3 COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.gz -COMPONENT_ARCHIVE_HASH= sha1:64664b2fd3ce9e372785cbbef685f86ee3dcd53a +COMPONENT_ARCHIVE_HASH= sha1:6fc5ad06b1192c76edb1a35980fcf070a393c075 COMPONENT_ARCHIVE_URL= http://ftp.isc.org/isc/dhcp/$(COMPONENT_ARCHIVE) include ../../make-rules/prep.mk @@ -39,7 +39,7 @@ CONFIGURE_OPTIONS += --sysconfdir=$(ETCDIR)/inet CONFIGURE_OPTIONS += --sbindir=$(USRLIBDIR)/inet CONFIGURE_OPTIONS += --bindir=$(USRSBINDIR) -CONFIGURE_OPTIONS += CFLAGS="$(CFLAGS) -DUSE_SOCKETS" +CONFIGURE_OPTIONS += --enable-use-sockets --enable-ipv4-pktinfo build: $(BUILD_32) diff -r b4bf6ad34a2d -r b88384d5a7ae components/isc-dhcp/dhcp.p5m --- a/components/isc-dhcp/dhcp.p5m Mon Aug 15 11:41:24 2011 -0700 +++ b/components/isc-dhcp/dhcp.p5m Mon Aug 15 13:46:43 2011 -0700 @@ -30,8 +30,7 @@ value=org.opensolaris.category.2008:System/Services set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) set name=info.upstream-url value=http://www.isc.org/software/dhcp/ -set name=org.opensolaris.arc-caseid \ - value=PSARC/2011/043 +set name=org.opensolaris.arc-caseid value=PSARC/2011/043 set name=org.opensolaris.consolidation value=$(CONSOLIDATION) # dir path=etc @@ -94,3 +93,5 @@ license LICENSE license="ISC BSD" user username=dhcpserv ftpuser=false gcos-field="DHCP Configuration Admin" \ group=netadm uid=18 +depend fmri=__TBD pkg.debug.depend.file=lib/svc/share/net_include.sh \ + pkg.debug.reason=lib/svc/method/isc-dhcp type=require diff -r b4bf6ad34a2d -r b88384d5a7ae components/isc-dhcp/patches/nopidfile.patch --- a/components/isc-dhcp/patches/nopidfile.patch Mon Aug 15 11:41:24 2011 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,657 +0,0 @@ -Index: DHCP/configure -=================================================================== -RCS file: /proj/cvs/prod/DHCP/configure,v -retrieving revision 1.119 -retrieving revision 1.119.6.1 -diff -u -c -r1.119 -r1.119.6.1 -*** DHCP/configure 18 Feb 2011 18:48:44 -0000 1.119 ---- DHCP/configure 11 Apr 2011 21:12:20 -0000 1.119.6.1 -*************** -*** 1328,1333 **** ---- 1328,1336 ---- - --with-relay-pid-file=PATH - File for dhcrelay process information (default is - LOCALSTATEDIR/run/dhcrelay.pid) -+ --with-relay6-pid-file=PATH -+ File for dhcrelay6 process information (default is -+ LOCALSTATEDIR/run/dhcrelay6.pid) - - Some influential environment variables: - CC C compiler command -*************** -*** 5062,5067 **** ---- 5065,5080 ---- - fi - - -+ # Check whether --with-relay6-pid-file was given. -+ if test "${with_relay6_pid_file+set}" = set; then -+ withval=$with_relay6_pid_file; -+ cat >>confdefs.h <<_ACEOF -+ #define _PATH_DHCRELAY6_PID "$withval" -+ _ACEOF -+ -+ fi -+ -+ - # Check basic types. - - { echo "$as_me:$LINENO: checking for int8_t" >&5 -Index: DHCP/configure.ac -=================================================================== -RCS file: /proj/cvs/prod/DHCP/configure.ac,v -retrieving revision 1.47 -retrieving revision 1.47.6.1 -diff -u -c -r1.47 -r1.47.6.1 -*** DHCP/configure.ac 18 Feb 2011 18:41:25 -0000 1.47 ---- DHCP/configure.ac 9 Apr 2011 00:03:51 -0000 1.47.6.1 -*************** -*** 317,322 **** ---- 317,328 ---- - (default is LOCALSTATEDIR/run/dhcrelay.pid)]), - AC_DEFINE_UNQUOTED([_PATH_DHCRELAY_PID], ["$withval"], - [File for dhcrelay process information.])) -+ AC_ARG_WITH(relay6-pid-file, -+ AC_HELP_STRING([--with-relay6-pid-file=PATH], -+ [File for dhcrelay6 process information -+ (default is LOCALSTATEDIR/run/dhcrelay6.pid)]), -+ AC_DEFINE_UNQUOTED([_PATH_DHCRELAY6_PID], ["$withval"], -+ [File for dhcrelay6 process information.])) - - # Check basic types. - AC_TYPE_INT8_T -Index: DHCP/client/dhclient.8 -=================================================================== -RCS file: /proj/cvs/prod/DHCP/client/dhclient.8,v -retrieving revision 1.35 -retrieving revision 1.35.56.2 -diff -u -c -r1.35 -r1.35.56.2 -*** DHCP/client/dhclient.8 14 Jul 2010 20:01:14 -0000 1.35 ---- DHCP/client/dhclient.8 12 Apr 2011 20:47:25 -0000 1.35.56.2 -*************** -*** 90,95 **** ---- 90,98 ---- - .I pid-file - ] - [ -+ .B --no-pid -+ ] -+ [ - .B -cf - .I config-file - ] -*************** -*** 99,105 **** - ] - [ - .B -s -! .I server - ] - [ - .B -g ---- 102,108 ---- - ] - [ - .B -s -! .I server-addr - ] - [ - .B -g -*************** -*** 305,311 **** - transmit, the client will also use a different destination port - - one less than the specified port. - .TP -! .BI \-s \ server - Specify the server IP address or fully qualified domain name to use as - a destination for DHCP protocol messages before - .B dhclient ---- 308,314 ---- - transmit, the client will also use a different destination port - - one less than the specified port. - .TP -! .BI \-s \ server-addr - Specify the server IP address or fully qualified domain name to use as - a destination for DHCP protocol messages before - .B dhclient -*************** -*** 381,386 **** ---- 384,395 ---- - .B RUNDIR/dhclient.pid - is used. - .TP -+ .BI \--no-pid -+ Option to disable writing pid files. By default the program -+ will write a pid file. If the program is invoked with this -+ option it will not attempt to kill any existing client processes -+ even if invoked with \fB-r\fR or \fB-x\fR. -+ .TP - .BI \-sf \ script-file - Path to the network configuration script invoked by - .B dhclient -Index: DHCP/client/dhclient.c -=================================================================== -RCS file: /proj/cvs/prod/DHCP/client/dhclient.c,v -retrieving revision 1.178 -retrieving revision 1.178.2.2 -diff -u -c -r1.178 -r1.178.2.2 -*** DHCP/client/dhclient.c 24 Mar 2011 21:11:00 -0000 1.178 ---- DHCP/client/dhclient.c 12 Apr 2011 20:47:25 -0000 1.178.2.2 -*************** -*** 48,53 **** ---- 48,56 ---- - static char path_dhclient_script_array[] = _PATH_DHCLIENT_SCRIPT; - char *path_dhclient_script = path_dhclient_script_array; - -+ /* False (default) => we write and use a pid file */ -+ isc_boolean_t no_pid_file = ISC_FALSE; -+ - int dhcp_max_agent_option_packet_length = 0; - - int interfaces_requested = 0; -*************** -*** 196,201 **** ---- 199,206 ---- - usage(); - path_dhclient_pid = argv[i]; - no_dhclient_pid = 1; -+ } else if (!strcmp(argv[i], "--no-pid")) { -+ no_pid_file = ISC_TRUE; - } else if (!strcmp(argv[i], "-cf")) { - if (++i == argc) - usage(); -*************** -*** 385,392 **** - log_fatal("%s: %s", path, strerror(errno)); - } - -! /* first kill off any currently running client */ -! if (release_mode || exit_mode) { - FILE *pidfd; - pid_t oldpid; - long temp; ---- 390,402 ---- - log_fatal("%s: %s", path, strerror(errno)); - } - -! /* -! * See if we should kill off any currently running client -! * we don't try to kill it off if the user told us not -! * to write a pid file - we assume they are controlling -! * the process in some other fashion. -! */ -! if ((release_mode || exit_mode) && (no_pid_file == ISC_FALSE)) { - FILE *pidfd; - pid_t oldpid; - long temp; -*************** -*** 677,692 **** - log_info(arr); - log_info(url); - -! log_error("Usage: dhclient %s %s", - #ifdef DHCPv6 -! "[-4|-6] [-SNTP1dvrx] [-nw] [-p ]", - #else /* DHCPv6 */ -! "[-1dvrx] [-nw] [-p ]", - #endif /* DHCPv6 */ -! "[-s server]"); -! log_error(" [-cf config-file] [-lf lease-file]%s", -! "[-pf pid-file] [-e VAR=val]"); -! log_fatal(" [-sf script-file] [interface]"); - } - - void run_stateless(int exit_mode) ---- 687,703 ---- - log_info(arr); - log_info(url); - -! -! log_fatal("Usage: dhclient " - #ifdef DHCPv6 -! "[-4|-6] [-SNTP1dvrx] [-nw] [-p ]\n" - #else /* DHCPv6 */ -! "[-1dvrx] [-nw] [-p ]\n" - #endif /* DHCPv6 */ -! " [-s server-addr] [-cf config-file] " -! "[-lf lease-file]\n" -! " [-pf pid-file] [--no-pid] [-e VAR=val]\n" -! " [-sf script-file] [interface]"); - } - - void run_stateless(int exit_mode) -*************** -*** 3369,3374 **** ---- 3380,3390 ---- - FILE *pf; - int pfdesc; - -+ /* nothing to do if the user doesn't want a pid file */ -+ if (no_pid_file == ISC_TRUE) { -+ return; -+ } -+ - pfdesc = open (path_dhclient_pid, O_CREAT | O_TRUNC | O_WRONLY, 0644); - - if (pfdesc < 0) { -Index: DHCP/includes/config.h.in -=================================================================== -RCS file: /proj/cvs/prod/DHCP/includes/config.h.in,v -retrieving revision 1.60 -retrieving revision 1.60.6.1 -diff -u -c -r1.60 -r1.60.6.1 -*** DHCP/includes/config.h.in 18 Feb 2011 18:48:15 -0000 1.60 ---- DHCP/includes/config.h.in 11 Apr 2011 21:12:03 -0000 1.60.6.1 -*************** -*** 175,180 **** ---- 175,183 ---- - /* File for dhcpd process information. */ - #undef _PATH_DHCPD_PID - -+ /* File for dhcrelay6 process information. */ -+ #undef _PATH_DHCRELAY6_PID -+ - /* File for dhcrelay process information. */ - #undef _PATH_DHCRELAY_PID - -Index: DHCP/relay/dhcrelay.8 -=================================================================== -RCS file: /proj/cvs/prod/DHCP/relay/dhcrelay.8,v -retrieving revision 1.18 -retrieving revision 1.18.58.2 -diff -u -c -r1.18 -r1.18.58.2 -*** DHCP/relay/dhcrelay.8 2 Jul 2010 23:09:14 -0000 1.18 ---- DHCP/relay/dhcrelay.8 12 Apr 2011 20:47:26 -0000 1.18.58.2 -*************** -*** 54,59 **** ---- 54,66 ---- - .I length - ] - [ -+ .B -pf -+ .I pid-file -+ ] -+ [ -+ .B --no-pid -+ ] -+ [ - .B -m - .I append - | -*************** -*** 89,94 **** ---- 96,108 ---- - .B -c - .I count - ] -+ [ -+ .B -pf -+ .I pid-file -+ ] -+ [ -+ .B --no-pid -+ ] - .B -l - .I lower0 - [ -*************** -*** 150,155 **** ---- 164,176 ---- - -q - Quiet mode. Prevents dhcrelay6 from printing its network configuration - on startup. -+ .TP -+ -pf pid-file -+ Path to alternate pid file. -+ .TP -+ --no-pid -+ Option to disable writing pid files. By default the program -+ will write a pid file. - .PP - \fIOptions available in DHCPv4 mode only:\fR - .TP -Index: DHCP/relay/dhcrelay.c -=================================================================== -RCS file: /proj/cvs/prod/DHCP/relay/dhcrelay.c,v -retrieving revision 1.79 -retrieving revision 1.79.106.2 -diff -u -c -r1.79 -r1.79.106.2 -*** DHCP/relay/dhcrelay.c 2 Feb 2010 19:58:18 -0000 1.79 ---- DHCP/relay/dhcrelay.c 12 Apr 2011 20:47:26 -0000 1.79.106.2 -*************** -*** 49,54 **** ---- 49,57 ---- - char *tlname; - - const char *path_dhcrelay_pid = _PATH_DHCRELAY_PID; -+ isc_boolean_t no_dhcrelay_pid = ISC_FALSE; -+ /* False (default) => we write and use a pid file */ -+ isc_boolean_t no_pid_file = ISC_FALSE; - - int bogus_agent_drops = 0; /* Packets dropped because agent option - field was specified and we're not relaying -*************** -*** 138,147 **** ---- 141,152 ---- - #define DHCRELAY_USAGE \ - "Usage: dhcrelay [-4] [-d] [-q] [-a] [-D]\n"\ - " [-A ] [-c ] [-p ]\n" \ -+ " [-pf ] [--no-pid]\n"\ - " [-m append|replace|forward|discard]\n" \ - " [-i interface0 [ ... -i interfaceN]\n" \ - " server0 [ ... serverN]\n\n" \ - " dhcrelay -6 [-d] [-q] [-I] [-c ] [-p ]\n" \ -+ " [-pf ] [--no-pid]\n"\ - " -l lower0 [ ... -l lowerN]\n" \ - " -u upper0 [ ... -u upperN]\n" \ - " lower (client link): [address%%]interface[#index]\n" \ -*************** -*** 149,154 **** ---- 154,160 ---- - #else - #define DHCRELAY_USAGE \ - "Usage: dhcrelay [-d] [-q] [-a] [-D] [-A ] [-c ] [-p ]\n" \ -+ " [-pf ] [--no-pid]\n"\ - " [-m append|replace|forward|discard]\n" \ - " [-i interface0 [ ... -i interfaceN]\n" \ - " server0 [ ... serverN]\n\n" -*************** -*** 350,355 **** ---- 356,368 ---- - sl->next = upstreams; - upstreams = sl; - #endif -+ } else if (!strcmp(argv[i], "-pf")) { -+ if (++i == argc) -+ usage(); -+ path_dhcrelay_pid = argv[i]; -+ no_dhcrelay_pid = ISC_TRUE; -+ } else if (!strcmp(argv[i], "--no-pid")) { -+ no_pid_file = ISC_TRUE; - } else if (!strcmp(argv[i], "--version")) { - log_info("isc-dhcrelay-%s", PACKAGE_VERSION); - exit(0); -*************** -*** 394,411 **** - } - } - -! if (local_family == AF_INET) { -! path_dhcrelay_pid = getenv("PATH_DHCRELAY_PID"); -! if (path_dhcrelay_pid == NULL) -! path_dhcrelay_pid = _PATH_DHCRELAY_PID; -! } - #ifdef DHCPv6 -! else { -! path_dhcrelay_pid = getenv("PATH_DHCRELAY6_PID"); -! if (path_dhcrelay_pid == NULL) -! path_dhcrelay_pid = _PATH_DHCRELAY6_PID; -! } - #endif - - if (!quiet) { - log_info("%s %s", message, PACKAGE_VERSION); ---- 407,430 ---- - } - } - -! /* -! * If the user didn't specify a pid file directly -! * find one from environment variables or defaults -! */ -! if (no_dhcrelay_pid == ISC_FALSE) { -! if (local_family == AF_INET) { -! path_dhcrelay_pid = getenv("PATH_DHCRELAY_PID"); -! if (path_dhcrelay_pid == NULL) -! path_dhcrelay_pid = _PATH_DHCRELAY_PID; -! } - #ifdef DHCPv6 -! else { -! path_dhcrelay_pid = getenv("PATH_DHCRELAY6_PID"); -! if (path_dhcrelay_pid == NULL) -! path_dhcrelay_pid = _PATH_DHCRELAY6_PID; -! } - #endif -+ } - - if (!quiet) { - log_info("%s %s", message, PACKAGE_VERSION); -*************** -*** 519,538 **** - else if (pid) - exit(0); - -! pfdesc = open(path_dhcrelay_pid, -! O_CREAT | O_TRUNC | O_WRONLY, 0644); -! -! if (pfdesc < 0) { -! log_error("Can't create %s: %m", path_dhcrelay_pid); -! } else { -! pf = fdopen(pfdesc, "w"); -! if (!pf) -! log_error("Can't fdopen %s: %m", -! path_dhcrelay_pid); -! else { -! fprintf(pf, "%ld\n",(long)getpid()); -! fclose(pf); -! } - } - - close(0); ---- 538,560 ---- - else if (pid) - exit(0); - -! if (no_pid_file == ISC_FALSE) { -! pfdesc = open(path_dhcrelay_pid, -! O_CREAT | O_TRUNC | O_WRONLY, 0644); -! -! if (pfdesc < 0) { -! log_error("Can't create %s: %m", -! path_dhcrelay_pid); -! } else { -! pf = fdopen(pfdesc, "w"); -! if (!pf) -! log_error("Can't fdopen %s: %m", -! path_dhcrelay_pid); -! else { -! fprintf(pf, "%ld\n",(long)getpid()); -! fclose(pf); -! } -! } - } - - close(0); -Index: DHCP/server/dhcpd.8 -=================================================================== -RCS file: /proj/cvs/prod/DHCP/server/dhcpd.8,v -retrieving revision 1.33 -retrieving revision 1.33.56.2 -diff -u -c -r1.33 -r1.33.56.2 -*** DHCP/server/dhcpd.8 14 Jul 2010 20:01:14 -0000 1.33 ---- DHCP/server/dhcpd.8 12 Apr 2011 20:47:26 -0000 1.33.56.2 -*************** -*** 75,80 **** ---- 75,83 ---- - .I pid-file - ] - [ -+ .B --no-pid -+ ] -+ [ - .B -tf - .I trace-output-file - ] -*************** -*** 283,288 **** ---- 286,296 ---- - .TP - .BI \-pf \ pid-file - Path to alternate pid file. -+ .TP -+ .BI \--no-pid -+ Option to disable writing pid files. By default the program -+ will write a pid file. If the program is invoked with this -+ option it will not check for an existing server process. - .PP - .SH CONFIGURATION - The syntax of the dhcpd.conf(5) file is discussed separately. This -Index: DHCP/server/dhcpd.c -=================================================================== -RCS file: /proj/cvs/prod/DHCP/server/dhcpd.c,v -retrieving revision 1.156 -retrieving revision 1.156.42.2 -diff -u -c -r1.156 -r1.156.42.2 -*** DHCP/server/dhcpd.c 8 Sep 2010 22:13:05 -0000 1.156 ---- DHCP/server/dhcpd.c 12 Apr 2011 20:47:26 -0000 1.156.42.2 -*************** -*** 160,165 **** ---- 160,167 ---- - const char *path_dhcpd_conf = _PATH_DHCPD_CONF; - const char *path_dhcpd_db = _PATH_DHCPD_DB; - const char *path_dhcpd_pid = _PATH_DHCPD_PID; -+ /* False (default) => we write and use a pid file */ -+ isc_boolean_t no_pid_file = ISC_FALSE; - - int dhcp_max_agent_option_packet_length = DHCP_MTU_MAX; - -*************** -*** 351,356 **** ---- 353,360 ---- - usage (); - path_dhcpd_pid = argv [i]; - no_dhcpd_pid = 1; -+ } else if (!strcmp(argv[i], "--no-pid")) { -+ no_pid_file = ISC_TRUE; - } else if (!strcmp (argv [i], "-t")) { - /* test configurations only */ - #ifndef DEBUG -*************** -*** 783,815 **** - } - #endif /* PARANOIA */ - -! /* Read previous pid file. */ -! if ((i = open (path_dhcpd_pid, O_RDONLY)) >= 0) { -! status = read(i, pbuf, (sizeof pbuf) - 1); -! close (i); -! if (status > 0) { -! pbuf[status] = 0; -! pid = atoi(pbuf); -! -! /* -! * If there was a previous server process and it's -! * is still running, abort -! */ -! if (!pid || (pid != getpid() && kill(pid, 0) == 0)) -! log_fatal("There's already a " -! "DHCP server running."); - } -- } -- -- /* Write new pid file. */ -- if ((i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC, 0644)) >= 0) { -- sprintf(pbuf, "%d\n", (int) getpid()); -- IGNORE_RET (write(i, pbuf, strlen(pbuf))); -- close(i); -- } else { -- log_error("Can't create PID file %s: %m.", path_dhcpd_pid); -- } - - - /* If we were requested to log to stdout on the command line, - keep doing so; otherwise, stop. */ ---- 787,827 ---- - } - #endif /* PARANOIA */ - -! /* -! * Deal with pid files. If the user told us -! * not to write a file we don't read one either -! */ -! if (no_pid_file == ISC_FALSE) { -! /*Read previous pid file. */ -! if ((i = open (path_dhcpd_pid, O_RDONLY)) >= 0) { -! status = read(i, pbuf, (sizeof pbuf) - 1); -! close (i); -! if (status > 0) { -! pbuf[status] = 0; -! pid = atoi(pbuf); -! -! /* -! * If there was a previous server process and -! * it is still running, abort -! */ -! if (!pid || -! (pid != getpid() && kill(pid, 0) == 0)) -! log_fatal("There's already a " -! "DHCP server running."); -! } - } - -+ /* Write new pid file. */ -+ i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC, 0644); -+ if (i >= 0) { -+ sprintf(pbuf, "%d\n", (int) getpid()); -+ IGNORE_RET (write(i, pbuf, strlen(pbuf))); -+ close(i); -+ } else { -+ log_error("Can't create PID file %s: %m.", -+ path_dhcpd_pid); -+ } -+ } - - /* If we were requested to log to stdout on the command line, - keep doing so; otherwise, stop. */ -*************** -*** 902,908 **** - &global_scope, oc, MDL)) { - s = dmalloc (db.len + 1, MDL); - if (!s) -! log_fatal ("no memory for lease db filename."); - memcpy (s, db.data, db.len); - s [db.len] = 0; - data_string_forget (&db, MDL); ---- 914,920 ---- - &global_scope, oc, MDL)) { - s = dmalloc (db.len + 1, MDL); - if (!s) -! log_fatal ("no memory for pid filename."); - memcpy (s, db.data, db.len); - s [db.len] = 0; - data_string_forget (&db, MDL); -*************** -*** 938,944 **** - oc, MDL)) { - s = dmalloc (db.len + 1, MDL); - if (!s) -! log_fatal ("no memory for lease db filename."); - memcpy (s, db.data, db.len); - s [db.len] = 0; - data_string_forget (&db, MDL); ---- 950,956 ---- - oc, MDL)) { - s = dmalloc (db.len + 1, MDL); - if (!s) -! log_fatal ("no memory for pid filename."); - memcpy (s, db.data, db.len); - s [db.len] = 0; - data_string_forget (&db, MDL); -*************** -*** 1210,1216 **** - " [-tf trace-output-file]\n" - " [-play trace-input-file]\n" - #endif /* TRACING */ -! " [-pf pid-file] [-s server] [if0 [...ifN]]"); - } - - void lease_pinged (from, packet, length) ---- 1222,1229 ---- - " [-tf trace-output-file]\n" - " [-play trace-input-file]\n" - #endif /* TRACING */ -! " [-pf pid-file] [--no-pid] [-s server]\n" -! " [if0 [...ifN]]"); - } - - void lease_pinged (from, packet, length) diff -r b4bf6ad34a2d -r b88384d5a7ae components/isc-dhcp/patches/sockets.patch --- a/components/isc-dhcp/patches/sockets.patch Mon Aug 15 11:41:24 2011 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,457 +0,0 @@ ---- dhcp-4.1-ESV-R1/common/discover.c Tue Sep 29 12:44:49 2009 -+++ dhcp-4.1-ESV-R1-patched/common/discover.c Thu May 26 11:49:33 2011 -@@ -309,6 +309,7 @@ - next_iface(struct iface_info *info, int *err, struct iface_conf_list *ifaces) { - struct LIFREQ *p; - struct LIFREQ tmp; -+ isc_boolean_t foundif; - #if defined(sun) || defined(__linux) - /* Pointer used to remove interface aliases. */ - char *s; -@@ -315,6 +316,7 @@ - #endif - - do { -+ foundif = ISC_FALSE; - if (ifaces->next >= ifaces->num) { - *err = 0; - return 0; -@@ -328,6 +330,13 @@ - log_error("Interface name '%s' too long", p->lifr_name); - return 0; - } -+ -+ /* Reject if interface address family does not match */ -+ if (p->lifr_addr.ss_family != local_family) { -+ ifaces->next++; -+ continue; -+ } -+ - strcpy(info->name, p->lifr_name); - memset(&info->addr, 0, sizeof(info->addr)); - memcpy(&info->addr, &p->lifr_addr, sizeof(p->lifr_addr)); -@@ -340,7 +349,9 @@ - } - #endif /* defined(sun) || defined(__linux) */ - -- } while (strncmp(info->name, "dummy", 5) == 0); -+ foundif = ISC_TRUE; -+ } while ((foundif == ISC_FALSE) || -+ (strncmp(p->lifr_name, "dummy", 5) == 0)); - - memset(&tmp, 0, sizeof(tmp)); - strcpy(tmp.lifr_name, info->name); -@@ -958,7 +969,12 @@ - point-to-point in case an OS incorrectly marks them - as broadcast). Also skip down interfaces unless we're - trying to get a list of configurable interfaces. */ -- if (((!(info.flags & IFF_BROADCAST) || -+ if ((((local_family == AF_INET && -+ !(info.flags & IFF_BROADCAST)) || -+#ifdef DHCPv6 -+ (local_family == AF_INET6 && -+ !(info.flags & IFF_MULTICAST)) || -+#endif - info.flags & IFF_LOOPBACK || - info.flags & IFF_POINTOPOINT) && !tmp) || - (!(info.flags & IFF_UP) && -@@ -1386,6 +1402,25 @@ - if (result < DHCP_FIXED_NON_UDP - DHCP_SNAME_LEN - DHCP_FILE_LEN) - return ISC_R_UNEXPECTED; - -+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) -+ { -+ /* We retrieve the ifindex from the unused hfrom variable */ -+ unsigned int ifindex; -+ -+ memcpy(&ifindex, hfrom.hbuf, sizeof (ifindex)); -+ -+ /* -+ * Seek forward from the first interface to find the matching -+ * source interface by interface index. -+ */ -+ ip = interfaces; -+ while ((ip != NULL) && (if_nametoindex(ip->name) != ifindex)) -+ ip = ip->next; -+ if (ip == NULL) -+ return ISC_R_NOTFOUND; -+ } -+#endif -+ - if (bootp_packet_handler) { - ifrom.len = 4; - memcpy (ifrom.iabuf, &from.sin_addr, ifrom.len); -@@ -1442,7 +1477,11 @@ - ifrom.len = 16; - memcpy(ifrom.iabuf, &from.sin6_addr, ifrom.len); - -- /* Seek forward to find the matching source interface. */ -+ /* -+ * Seek forward from the first interface to find the matching -+ * source interface by interface index. -+ */ -+ ip = interfaces; - while ((ip != NULL) && (if_nametoindex(ip->name) != if_idx)) - ip = ip->next; - ---- dhcp-4.1-ESV-R1/common/socket.c Tue Oct 5 17:32:52 2010 -+++ dhcp-4.1-ESV-R1-patched/common/socket.c Thu May 12 16:11:13 2011 -@@ -45,6 +45,16 @@ - #include - #include - #include -+#if defined(sun) -+#include -+#include -+#include -+#if defined(SIOCGLIFHWADDR) -+#include -+#else -+#include -+#endif -+#endif - #include - - #ifdef USE_SOCKET_FALLBACK -@@ -67,6 +77,16 @@ - #endif - - /* -+ * We can use a single socket for AF_INET (similar to AF_INET6) on all -+ * interfaces configured for DHCP if the system has support for IP_PKTINFO -+ * and IP_RECVPKTINFO (f.e. Solaris 11). -+ */ -+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) -+static unsigned int global_v4_socket_references = 0; -+static int global_v4_socket = -1; -+#endif -+ -+/* - * If we can't bind() to a specific interface, then we can only have - * a single socket. This variable insures that we don't try to listen - * on two sockets. -@@ -242,6 +262,20 @@ - log_fatal("Can't set IP_BROADCAST_IF on dhcp socket: %m"); - #endif - -+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) -+ /* -+ * If we turn on IP_RECVPKTINFO we will be able to receive -+ * the interface index information of the received packet. -+ */ -+ if (family == AF_INET) { -+ int on = 1; -+ if (setsockopt(sock, IPPROTO_IP, IP_RECVPKTINFO, -+ &on, sizeof(on)) != 0) { -+ log_fatal("setsockopt: IPV_RECVPKTINFO: %m"); -+ } -+ } -+#endif -+ - #ifdef DHCPv6 - /* - * If we turn on IPV6_PKTINFO, we will be able to receive -@@ -275,10 +309,6 @@ - } - #endif /* DHCPv6 */ - -- /* If this is a normal IPv4 address, get the hardware address. */ -- if ((local_family == AF_INET) && (strcmp(info->name, "fallback") != 0)) -- get_hw_addr(info->name, &info->hw_address); -- - return sock; - } - #endif /* USE_SOCKET_SEND || USE_SOCKET_RECEIVE || USE_SOCKET_FALLBACK */ -@@ -328,9 +358,25 @@ - void if_register_receive (info) - struct interface_info *info; - { -+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) -+ if (global_v4_socket_references == 0) { -+ global_v4_socket = if_register_socket(info, AF_INET, 0); -+ if (global_v4_socket < 0) { -+ /* -+ * if_register_socket() fatally logs if it fails to -+ * create a socket, this is just a sanity check. -+ */ -+ log_fatal("Failed to create AF_INET socket %s:%d", MDL); -+ } -+ } -+ -+ info->rfdesc = global_v4_socket; -+ global_v4_socket_references++; -+#else - /* If we're using the socket API for sending and receiving, - we don't need to register this interface twice. */ - info -> rfdesc = if_register_socket (info, AF_INET, 0); -+#endif - if (!quiet_interface_discovery) - log_info ("Listening on Socket/%s%s%s", - info -> name, -@@ -337,13 +383,34 @@ - (info -> shared_network ? "/" : ""), - (info -> shared_network ? - info -> shared_network -> name : "")); -+ -+ /* 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); - } - - void if_deregister_receive (info) - struct interface_info *info; - { -+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) -+ /* Dereference the global v4 socket. */ -+ if ((info->rfdesc == global_v4_socket) && -+ (info->wfdesc == global_v4_socket) && -+ (global_v4_socket_references > 0)) { -+ global_v4_socket_references--; -+ info->rfdesc = -1; -+ } else { -+ log_fatal("Impossible condition at %s:%d", MDL); -+ } -+ -+ if (global_v4_socket_references == 0) { -+ close(global_v4_socket); -+ global_v4_socket = -1; -+ } -+#else - close (info -> rfdesc); - info -> rfdesc = -1; -+#endif - - if (!quiet_interface_discovery) - log_info ("Disabling input on Socket/%s%s%s", -@@ -489,6 +556,17 @@ - int retry = 0; - do { - #endif -+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) -+ struct in_pktinfo pktinfo; -+ -+ if (interface->ifp != NULL) { -+ memset(&pktinfo, 0, sizeof (pktinfo)); -+ pktinfo.ipi_ifindex = interface->ifp->ifr_index; -+ if (setsockopt(interface -> wfdesc, IPPROTO_IP, -+ IP_PKTINFO, (char *)&pktinfo, sizeof (pktinfo)) < 0) -+ log_fatal("setsockopt: IP_PKTINFO: %m"); -+ } -+#endif - result = sendto (interface -> wfdesc, (char *)raw, len, 0, - (struct sockaddr *)to, sizeof *to); - #ifdef IGNORE_HOSTUNREACH -@@ -559,11 +637,13 @@ - - #endif /* DHCPv6 */ - --#ifdef DHCPv6 -+#ifdef DHCPv6 || (defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)) - /* - * For both send_packet6() and receive_packet6() we need to allocate - * space for the cmsg header information. We do this once and reuse -- * the buffer. -+ * the buffer. We also need the control buf for send_packet and -+ * receive_packet for AF_INET when we use a single socket and IP_PKTINFO -+ * to send the packet out the right interface. - */ - static void *control_buf = NULL; - static size_t control_buf_len = 0; -@@ -574,7 +654,9 @@ - control_buf = dmalloc(control_buf_len, MDL); - return; - } -+#endif - -+#ifdef DHCPv6 - /* - * For both send_packet6() and receive_packet6() we need to use the - * sendmsg()/recvmsg() functions rather than the simpler send()/recv() -@@ -687,8 +769,97 @@ - int retry = 0; - do { - #endif -+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO) -+ struct msghdr m; -+ struct iovec v; -+ struct cmsghdr *cmsg; -+ struct in_pktinfo *pktinfo; -+ unsigned int ifindex; -+ int found_pktinfo; -+ -+ /* -+ * If necessary allocate space for the control message header. -+ * The space is common between send and receive. -+ */ -+ if (control_buf == NULL) { -+ allocate_cmsg_cbuf(); -+ if (control_buf == NULL) { -+ log_error("receive_packet: unable to allocate cmsg " -+ "header"); -+ return(ENOMEM); -+ } -+ } -+ memset(control_buf, 0, control_buf_len); -+ -+ /* -+ * Initialize our message header structure. -+ */ -+ memset(&m, 0, sizeof(m)); -+ -+ /* -+ * Point so we can get the from address. -+ */ -+ m.msg_name = from; -+ m.msg_namelen = sizeof(*from); -+ -+ /* -+ * Set the data buffer we're receiving. (Using this wacky -+ * "scatter-gather" stuff... but we that doesn't really make -+ * sense for us, so we use a single vector entry.) -+ */ -+ v.iov_base = buf; -+ v.iov_len = len; -+ m.msg_iov = &v; -+ m.msg_iovlen = 1; -+ -+ /* -+ * Getting the interface is a bit more involved. -+ * -+ * We set up some space for a "control message". We have -+ * previously asked the kernel to give us packet -+ * information (when we initialized the interface), so we -+ * should get the destination address from that. -+ */ -+ m.msg_control = control_buf; -+ m.msg_controllen = control_buf_len; -+ -+ result = recvmsg(interface->rfdesc, &m, 0); -+ -+ if (result >= 0) { -+ /* -+ * If we did read successfully, then we need to loop -+ * through the control messages we received and -+ * find the one with our destination address. -+ * -+ * We also keep a flag to see if we found it. If we -+ * didn't, then we consider this to be an error. -+ */ -+ found_pktinfo = 0; -+ cmsg = CMSG_FIRSTHDR(&m); -+ while (cmsg != NULL) { -+ if ((cmsg->cmsg_level == IPPROTO_IP) && -+ (cmsg->cmsg_type == IP_PKTINFO)) { -+ pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg); -+ ifindex = pktinfo->ipi_ifindex; -+ /* -+ * We pass the ifindex back to the caller using -+ * the unused hfrom parameter avoiding interface -+ * changes between sockets and the discover code. -+ */ -+ memcpy(hfrom->hbuf, &ifindex, sizeof (ifindex)); -+ found_pktinfo = 1; -+ } -+ cmsg = CMSG_NXTHDR(&m, cmsg); -+ } -+ if (!found_pktinfo) { -+ result = -1; -+ errno = EIO; -+ } -+ } -+#else - result = recvfrom (interface -> rfdesc, (char *)buf, len, 0, - (struct sockaddr *)from, &flen); -+#endif - #ifdef IGNORE_HOSTUNREACH - } while (result < 0 && - (errno == EHOSTUNREACH || -@@ -842,7 +1013,7 @@ - int supports_multiple_interfaces (ip) - struct interface_info *ip; - { --#if defined (SO_BINDTODEVICE) -+#if defined (SO_BINDTODEVICE) || (defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)) - return 1; - #else - return 0; -@@ -876,6 +1047,80 @@ - } - #endif - } -+ -+#if defined(sun) -+void -+get_hw_addr(const char *name, struct hardware *hw) { -+#if defined(SIOCGLIFHWADDR) -+ struct sockaddr_dl *dladdrp; -+#else -+ dlpi_handle_t dh; -+ uint8_t pa_buf[DLPI_PHYSADDR_MAX]; -+ size_t len = sizeof (pa_buf); -+#endif -+ int rv, sock, i; -+ struct lifreq lifr; -+ -+ memset(&lifr, 0, sizeof (lifr)); -+ (void) strlcpy(lifr.lifr_name, name, sizeof (lifr.lifr_name)); -+ /* -+ * Check if the interface is a virtual or IPMP interface - in those -+ * cases it has no hw address, so generate a random one. -+ */ -+ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0 || -+ ioctl(sock, SIOCGLIFFLAGS, &lifr) < 0) { -+ /* -+ * If the interface only has IPv6, try this with an IPv6 socket. -+ */ -+ if (sock != -1) -+ (void) close(sock); -+ -+ if ((sock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0 || -+ ioctl(sock, SIOCGLIFFLAGS, &lifr) < 0) { -+ log_fatal("Couldn't get interface flags for %s: %m", name); -+ } -+ } -+ -+ if (lifr.lifr_flags & (IFF_VIRTUAL|IFF_IPMP)) { -+ hw->hlen = sizeof (hw->hbuf); -+ srandom((long)gethrtime()); -+ -+ for (i = 0; i < hw->hlen; ++i) { -+ hw->hbuf[i] = random() % 256; -+ } -+ -+ if (sock != -1) -+ (void) close(sock); -+ return; -+ } -+ -+#if defined(SIOCGLIFHWADDR) -+ if (ioctl(sock, SIOCGLIFHWADDR, &lifr) < 0) -+ log_fatal("Couldn't get interface hardware address for %s: %m", name); -+ dladdrp = (struct sockaddr_dl *)&lifr.lifr_addr; -+ hw->hlen = dladdrp->sdl_alen; -+ memcpy(hw->hbuf, LLADDR(dladdrp), hw->hlen); -+#else -+ if ((rv = dlpi_open(name, &dh, 0)) != DLPI_SUCCESS) { -+ log_fatal("Couldn't open DLPI device for %s: %s", name, -+ dlpi_strerror(rv)); -+ } -+ -+ if ((rv = dlpi_get_physaddr(dh, DL_CURR_PHYS_ADDR, pa_buf, &len)) -+ != DLPI_SUCCESS) { -+ log_fatal("Couldn't get physical address for device %s: %s", -+ name, dlpi_strerror(rv)); -+ } -+ -+ hw->hlen = MIN(sizeof (hw->hbuf), len); -+ memcpy(hw->hbuf, pa_buf, hw->hlen); -+ -+ dlpi_close(dh); -+#endif -+ if (sock != -1) -+ (void) close(sock); -+} -+#endif /* defined(sun) */ - #endif /* USE_SOCKET_SEND */ - - /*