Submitted By: DJ Lucas (dj at linuxfromscratch dot org) Date: 2005-06-18 Initial Package Version: 3.0.2 Origin: Jim Gifford, Bruce Dubbs, DJ Lucas Description: Fixes client script to use iproute2 (added flush to previous unversioned patches) Upstream Status: Not submitted --- dhcp-3.0.2-orig/client/scripts/linux 2002-11-14 19:09:09.000000000 -0600 +++ dhcp-3.0.2/client/scripts/linux 2005-06-18 22:54:59.000000000 -0500 @@ -1,26 +1,15 @@ #!/bin/bash # dhclient-script for Linux. Dan Halbert, March, 1997. # Updated for Linux 2.[12] by Brian J. Murrell, January 1999. -# No guarantees about this. I'm a novice at the details of Linux -# networking. + +# Updated to iproute2 by Jim Gifford (scripts@jg555.com) # Notes: # 0. This script is based on the netbsd script supplied with dhcp-970306. - -# 1. ifconfig down apparently deletes all relevant routes and flushes -# the arp cache, so this doesn't need to be done explicitly. - -# 2. The alias address handling here has not been tested AT ALL. -# I'm just going by the doc of modern Linux ip aliasing, which uses -# notations like eth0:0, eth0:1, for each alias. - -# 3. I have to calculate the network address, and calculate the broadcast -# address if it is not supplied. This might be much more easily done -# by the dhclient C code, and passed on. - -# 4. TIMEOUT not tested. ping has a flag I don't know, and I'm suspicious -# of the $1 in its args. +# 1. This script was modified to work with iproute2 +# 2. cidr_convert based on a script by Kevin Fleming (kpfleming@linuxfromscratch.org) +# 3. Updated to delete addresses when taking an interface down (bdubbs@linuxfromscratch.org) make_resolv_conf() { if [ "x$new_domain_name" != x ] && [ x"$new_domain_name_servers" != x ]; then @@ -32,6 +21,30 @@ fi } +dec2binary() +{ + local n=$1 + local ret="" + while [ $n != 0 ]; do + ret=$[$n%2]$ret + n=$[$n>>1] + done + echo $ret +} + +mask_to_binary() +{ + echo `dec2binary $1``dec2binary $2``dec2binary $3``dec2binary $4` +} + +cidr_convert() +{ + netmask=$1 + local mask=`mask_to_binary ${netmask//./ }` + mask=${mask%%0*} + cidr=${#mask} +} + # Must be used on exit. Invokes the local dhcp client exit hooks, if any. exit_with_hooks() { exit_status=$1 @@ -53,11 +66,6 @@ fi fi -release=`uname -r` -release=`expr $release : '\(.*\)\..*'` -relminor=`echo $release |sed -e 's/[0-9]*\.\([0-9][0-9]*\)\(\..*\)*$/\1/'` -relmajor=`echo $release |sed -e 's/\([0-9][0-9]*\)\..*$/\1/'` - if [ x$new_broadcast_address != x ]; then new_broadcast_arg="broadcast $new_broadcast_address" fi @@ -65,13 +73,12 @@ old_broadcast_arg="broadcast $old_broadcast_address" fi if [ x$new_subnet_mask != x ]; then - new_subnet_arg="netmask $new_subnet_mask" + cidr_convert $new_subnet_mask + new_subnet_arg="$cidr" fi if [ x$old_subnet_mask != x ]; then - old_subnet_arg="netmask $old_subnet_mask" -fi -if [ x$alias_subnet_mask != x ]; then - alias_subnet_arg="netmask $alias_subnet_mask" + cidr_convert $old_subnet_mask + old_subnet_arg="$cidr" fi if [ x$reason = xMEDIUM ]; then @@ -82,17 +89,10 @@ if [ x$reason = xPREINIT ]; then if [ x$alias_ip_address != x ]; then # Bring down alias interface. Its routes will disappear too. - ifconfig $interface:0- inet 0 - fi - if [ $relmajor -lt 2 ] || ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ) - then - ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \ - broadcast 255.255.255.255 up - # Add route to make broadcast work. Do not omit netmask. - route add default dev $interface netmask 0.0.0.0 - else - ifconfig $interface 0 up + ip link set $interface down + ip addr del $alias_ip_address dev $interface fi + ip link set $interface up # We need to give the kernel some time to get the interface up. sleep 1 @@ -115,83 +115,51 @@ fi fi - if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \ - [ x$alias_ip_address != x$old_ip_address ]; then - # Possible new alias. Remove old alias. - ifconfig $interface:0- inet 0 - fi if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ]; then - # IP address changed. Bringing down the interface will delete all routes, + # IP address changed. Bring down the interface, delete all routes, # and clear the ARP cache. - ifconfig $interface inet 0 down - + ip link set $interface down + ip addr flush dev $interface fi if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \ [ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then - ifconfig $interface inet $new_ip_address $new_subnet_arg \ - $new_broadcast_arg + ip link set $interface up + ip addr add $new_ip_address/$new_subnet_arg $new_broadcast_arg \ + label $interface dev $interface # Add a network route to the computed network address. - if [ $relmajor -lt 2 ] || \ - ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then - route add -net $new_network_number $new_subnet_arg dev $interface - fi for router in $new_routers; do - route add default gw $router + ip route add default via $router done fi - if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ]; - then - ifconfig $interface:0- inet 0 - ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg - route add -host $alias_ip_address $interface:0 - fi make_resolv_conf exit_with_hooks 0 fi if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \ || [ x$reason = xSTOP ]; then - if [ x$alias_ip_address != x ]; then - # Turn off alias interface. - ifconfig $interface:0- inet 0 - fi if [ x$old_ip_address != x ]; then - # Shut down interface, which will delete routes and clear arp cache. - ifconfig $interface inet 0 down - fi - if [ x$alias_ip_address != x ]; then - ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg - route add -host $alias_ip_address $interface:0 + # Shut down interface, delete routes, and clear arp cache. + ip link set $interface down + ip addr flush dev $interface fi exit_with_hooks 0 fi if [ x$reason = xTIMEOUT ]; then - if [ x$alias_ip_address != x ]; then - ifconfig $interface:0- inet 0 - fi - ifconfig $interface inet $new_ip_address $new_subnet_arg \ - $new_broadcast_arg + ip link set $interface up + ip addr set $new_ip_address/$new_subnet_arg $new_broadcast_arg \ + label $interface dev $interface set $new_routers - ############## what is -w in ping? - if ping -q -c 1 $1; then - if [ x$new_ip_address != x$alias_ip_address ] && \ - [ x$alias_ip_address != x ]; then - ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg - route add -host $alias_ip_address dev $interface:0 - fi - if [ $relmajor -lt 2 ] || \ - ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then - route add -net $new_network_number - fi - for router in $new_routers; do - route add default gw $router - done - make_resolv_conf - exit_with_hooks 0 - fi - ifconfig $interface inet 0 down + + for router in $new_routers; do + ip route add default via $router + done + + make_resolv_conf + exit_with_hooks 0 + ip link set $interface down + ip addr flush dev $interface exit_with_hooks 1 fi