From: David Hankins Date: Mon, 17 Jul 2006 15:16:43 +0000 (+0000) Subject: - The DHCP Relay Agent Information Option / Link Selection Sub-Option X-Git-Tag: DHCPv6_parsing_base~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=334bf4910f7cf24813cedf312b60cb22a7864cec;p=thirdparty%2Fdhcp.git - The DHCP Relay Agent Information Option / Link Selection Sub-Option is now supported. (See RFC3527 for details). [ISC-Bugs #16251] --- diff --git a/RELNOTES b/RELNOTES index b4b3266f3..e6247cc6f 100644 --- a/RELNOTES +++ b/RELNOTES @@ -119,6 +119,9 @@ and for prodding me into improving it. lease. Instead, they happen on a schedule. See 'man dhcpd.conf' for the min-balance and max-balance statements for more information. +- The DHCP Relay Agent Information Option / Link Selection Sub-Option + is now supported. (See RFC3527 for details). + Changes since 3.0.4 - A warning that host statements declared within subnet or shared-network diff --git a/includes/dhcp.h b/includes/dhcp.h index cb4ac5abe..abdb85497 100644 --- a/includes/dhcp.h +++ b/includes/dhcp.h @@ -174,6 +174,7 @@ struct dhcp_packet { #define RAI_CIRCUIT_ID 1 #define RAI_REMOTE_ID 2 #define RAI_AGENT_ID 3 +#define RAI_LINK_SELECT 5 /* FQDN suboptions: */ #define FQDN_NO_CLIENT_UPDATE 1 diff --git a/server/dhcp.c b/server/dhcp.c index f9c71e950..ff3db5285 100644 --- a/server/dhcp.c +++ b/server/dhcp.c @@ -34,7 +34,7 @@ #ifndef lint static char copyright[] = -"$Id: dhcp.c,v 1.207 2006/06/19 20:39:28 shane Exp $ Copyright (c) 2004-2006 Internet Systems Consortium. All rights reserved.\n"; +"$Id: dhcp.c,v 1.208 2006/07/17 15:16:43 dhankins Exp $ Copyright (c) 2004-2006 Internet Systems Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -3902,9 +3902,15 @@ int locate_network (packet) struct subnet *subnet = (struct subnet *)0; struct option_cache *oc; - /* See if there's a subnet selection option. */ - oc = lookup_option (&dhcp_universe, packet -> options, - DHO_SUBNET_SELECTION); + /* See if there's a Relay Agent Link Selection Option, or a + * Subnet Selection Option. The Link-Select and Subnet-Select + * are formatted and used precisely the same, but we must prefer + * the link-select over the subnet-select. + */ + if ((oc = lookup_option(&agent_universe, packet->options, + RAI_LINK_SELECT)) == NULL) + oc = lookup_option(&dhcp_universe, packet->options, + DHO_SUBNET_SELECTION); /* If there's no SSO and no giaddr, then use the shared_network from the interface, if there is one. If not, fail. */ @@ -3918,8 +3924,9 @@ int locate_network (packet) return 0; } - /* If there's an SSO, and it's valid, use it to figure out the - subnet. If it's not valid, fail. */ + /* If there's an option indicating link connection, and it's valid, + * use it to figure out the subnet. If it's not valid, fail. + */ if (oc) { memset (&data, 0, sizeof data); if (!evaluate_option_cache (&data, packet, (struct lease *)0, diff --git a/server/stables.c b/server/stables.c index 5f83df497..7c7df5cab 100644 --- a/server/stables.c +++ b/server/stables.c @@ -34,7 +34,7 @@ #ifndef lint static char copyright[] = -"$Id: stables.c,v 1.30 2006/06/15 17:49:49 dhankins Exp $ Copyright (c) 2004 Internet Systems Consortium. All rights reserved.\n"; +"$Id: stables.c,v 1.31 2006/07/17 15:16:43 dhankins Exp $ Copyright (c) 2004 Internet Systems Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -178,6 +178,7 @@ static struct option agent_options[] = { { "remote-id", "X", &agent_universe, 2, 1 }, { "agent-id", "I", &agent_universe, 3, 1 }, { "DOCSIS-device-class", "L", &agent_universe, 4, 1 }, + { "link-selection", "I", &agent_universe, 5, 1 }, { NULL, NULL, NULL, 0, 0 } };