It may be a bit late to consider this for 4.7. .... Ken
On Wed, Feb 10, 2010 at 04:10:05PM +0300, ????? ??????? wrote: > Hi All, > > could you please include to new release this patch to dhclient, > based on FreeBSD dhclient's patch. > The patch adds support of RFC 3442 (The Classless Static Route > Option for Dynamic Host) by dhclient. > > > > diff -u /tmp/src/sbin/dhclient/clparse.c /usr/src/sbin/dhclient/clparse.c > --- /tmp/src/sbin/dhclient/clparse.c Sun Jul 19 04:18:02 2009 > +++ /usr/src/sbin/dhclient/clparse.c Wed Feb 3 11:14:34 2010 > @@ -75,6 +75,8 @@ > config->requested_options > [config->requested_option_count++] = DHO_TIME_OFFSET; > config->requested_options > + [config->requested_option_count++] = DHO_CLASSLESS_ROUTES; > + config->requested_options > [config->requested_option_count++] = DHO_ROUTERS; > config->requested_options > [config->requested_option_count++] = DHO_DOMAIN_NAME; > diff -u /tmp/src/sbin/dhclient/dhclient-script > /usr/src/sbin/dhclient/dhclient-script > --- /tmp/src/sbin/dhclient/dhclient-script Wed Jun 3 09:12:51 2009 > +++ /usr/src/sbin/dhclient/dhclient-script Wed Feb 10 16:06:55 2010 > @@ -55,9 +55,44 @@ > fi > } > > +fill_classless_routes() { > + set $1 > + while [ $# -gt 5 ]; do > + if [ $1 -eq 0 ]; then > + route="default" > + elif [ $1 -lt 9 ]; then > + route="$2.0.0.0/$1" > + shift > + elif [ $1 -lt 17 ]; then > + route="$2.$3.0.0/$1" > + shift; shift > + elif [ $1 -lt 25 ]; then > + route="$2.$3.$4.0/$1" > + shift; shift; shift > + else > + route="$2.$3.$4.$5/$1" > + shift; shift; shift; shift > + fi > + shift > + router="$1.$2.$3.$4" > + classless_routes="$classless_routes $route $router" > + shift; shift; shift; shift > + done > +} > + > delete_old_routes() { > # Delete existing default route. We only allow one, so no need to > # process $old_routers list. > + if [ -n "$old_classless_routes" ]; then > + fill_classless_routes "$old_classless_routes" > + set $classless_routes > + while [ $# -gt 1 ]; do > + route delete "$1" "$2" > + shift; shift > + done > + return 0; > + fi > + > route -n flush -inet -iface $interface >/dev/null 2>&1 > > if [ -n "$old_static_routes" ]; then > @@ -73,6 +108,21 @@ > > add_new_routes() { > route -n flush -inet -iface $interface >/dev/null 2>&1 > + > + if [ -n "$new_classless_routes" ]; then > + fill_classless_routes "$new_classless_routes" > + set $classless_routes > + while [ $# -gt 1 ]; do > + if [ "0.0.0.0" = "$2" ]; then > + route add "$1" -iface "$interface" > + else > + route add "$1" "$2" > + fi > + shift; shift > + done > + return > + fi > + > for router in $new_routers; do > if [ "$new_ip_address" = "$router" ]; then > route add default -iface $router >/dev/null 2>&1 > diff -u /tmp/src/sbin/dhclient/dhclient.c /usr/src/sbin/dhclient/dhclient.c > --- /tmp/src/sbin/dhclient/dhclient.c Thu Nov 12 17:18:45 2009 > +++ /usr/src/sbin/dhclient/dhclient.c Wed Feb 3 11:14:34 2010 > @@ -88,6 +88,7 @@ > struct sockaddr *get_ifa(char *, int); > void usage(void); > int check_option(struct client_lease *l, int option); > +int check_classless_option(unsigned char *data, int len); > int ipv4addrs(char * buf); > int res_hnok(const char *dn); > char *option_as_string(unsigned int code, unsigned char > *data, int len); > @@ -2034,10 +2035,69 @@ > case DHO_DHCP_USER_CLASS_ID: > case DHO_END: > return (1); > + case DHO_CLASSLESS_ROUTES: > + return (check_classless_option(l->options[option].data, > + l->options[option].len)); > default: > warning("unknown dhcp option value 0x%x", option); > return (unknown_ok); > } > +} > + > +int > +check_classless_option(unsigned char *data, int len) > +{ > + int i = 0; > + unsigned char width; > + in_addr_t addr, mask; > + > + if (len < 5) { > + warning("Too small length: %d", len); > + return (0); > + } > + > + while(i < len) { > + width = data[i++]; > + if (width == 0) { > + i += 4; continue; > + } else if (width < 9) { > + addr = (in_addr_t)(data[i] << 24); > + i += 1; > + } else if (width < 17) { > + addr = (in_addr_t)(data[i] << 24) + > + (in_addr_t)(data[i + 1] << 16); > + i += 2; > + } else if (width < 25) { > + addr = (in_addr_t)(data[i] << 24) + > + (in_addr_t)(data[i + 1] << 16) + > + (in_addr_t)(data[i + 2] << 8); > + i += 3; > + } else if (width < 33) { > + addr = (in_addr_t)(data[i] << 24) + > + (in_addr_t)(data[i + 1] << 16) + > + (in_addr_t)(data[i + 2] << 8) + > + data[i + 3]; > + i += 4; > + } else { > + warning("Incorrect subnet width: %d", width); > + return(0); > + } > + mask = (in_addr_t)(~0) << (32 - width); > + addr = ntohl(addr); > + mask = ntohl(mask); > + > + if ((addr & mask) != addr) { > + addr &= mask; > + data[i - 1] = (unsigned char) > + ((addr >> (((32 - width)/8)*8)) & 0xFF); > + } > + i += 4; > + } > + if (i > len) { > + warning("Incorrect data length: %d (must be %d)", len, i); > + return (0); > + } > + return (1); > } > > int > diff -u /tmp/src/sbin/dhclient/dhclient.conf.5 > /usr/src/sbin/dhclient/dhclient.conf.5 > --- /tmp/src/sbin/dhclient/dhclient.conf.5 Mon Oct 6 00:36:00 2008 > +++ /usr/src/sbin/dhclient/dhclient.conf.5 Wed Feb 3 11:14:34 2010 > @@ -514,8 +514,9 @@ > send dhcp-lease-time 3600; > supersede domain-name "fugue.com rc.vix.com home.vix.com"; > prepend domain-name-servers 127.0.0.1; > - request subnet-mask, broadcast-address, time-offset, routers, > - domain-name, domain-name-servers, host-name; > + request subnet-mask, broadcast-address, time-offset, > + classless-routes, routers, domain-name, > + domain-name-servers, host-name; > require subnet-mask, domain-name-servers; > script "/etc/dhclient-script"; > media "media 10baseT/UTP", "media 10base2/BNC"; > diff -u /tmp/src/sbin/dhclient/dhcp.h /usr/src/sbin/dhclient/dhcp.h > --- /tmp/src/sbin/dhclient/dhcp.h Fri Feb 2 01:39:43 2007 > +++ /usr/src/sbin/dhclient/dhcp.h Wed Feb 3 11:14:34 2010 > @@ -153,6 +153,7 @@ > #define DHO_DHCP_CLASS_IDENTIFIER 60 > #define DHO_DHCP_CLIENT_IDENTIFIER 61 > #define DHO_DHCP_USER_CLASS_ID 77 > +#define DHO_CLASSLESS_ROUTES 121 > #define DHO_END 255 > > /* DHCP message types. */ > diff -u /tmp/src/sbin/dhclient/tables.c /usr/src/sbin/dhclient/tables.c > --- /tmp/src/sbin/dhclient/tables.c Sat Jul 16 20:31:46 2005 > +++ /usr/src/sbin/dhclient/tables.c Wed Feb 3 11:14:34 2010 > @@ -182,7 +182,7 @@ > /* 118 */ { "option-118", "X" }, > /* 119 */ { "option-119", "X" }, > /* 120 */ { "option-120", "X" }, > - /* 121 */ { "option-121", "X" }, > + /* 121 */ { "classless-routes", "BA" }, > /* 122 */ { "option-122", "X" }, > /* 123 */ { "option-123", "X" }, > /* 124 */ { "option-124", "X" }, > > > > > > -- > Anton Kasimov