Submitted By: BLFS Book Date: 2004-07-31 Initial Package Version: 3.0.1 Origin: Jim Gifford Upstream Status: N/A Description: Fixes dhclient-script to work with iproute2 diff -Naur dhcp-3.0.1-orig/client/scripts/linux dhcp-3.0.1/client/scripts/linux --- dhcp-3.0.1-orig/client/scripts/linux 2002-11-14 19:09:09.000000000 -0600 +++ dhcp-3.0.1/client/scripts/linux 2004-07-31 22:08:46.205463208 -0500 @@ -1,26 +1,16 @@ #!/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. +# 1. This script was modified to work with iproute2 -# 4. TIMEOUT not tested. ping has a flag I don't know, and I'm suspicious -# of the $1 in its args. +# 2. cidr_convert based on a script by Kevin Fleming (kpfleming@linuxfromscratch.org) make_resolv_conf() { if [ "x$new_domain_name" != x ] && [ x"$new_domain_name_servers" != x ]; then @@ -32,6 +22,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 @@ -65,13 +79,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,16 +95,16 @@ 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 + ip link set $interface down 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 + ip link set $interface up + ip addr add 0.0.0.0/32 broadcast 255.255.255.255 label $interface dev $interface # Add route to make broadcast work. Do not omit netmask. - route add default dev $interface netmask 0.0.0.0 + ip route add default dev $interface else - ifconfig $interface 0 up + ip link set $interface up fi # We need to give the kernel some time to get the interface up. @@ -115,83 +128,52 @@ 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, # and clear the ARP cache. - ifconfig $interface inet 0 down - + ip link set $interface down 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 + ip route add via $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 + ip link set $interface down 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 + ip route add $new_network_number dev $interface fi for router in $new_routers; do - route add default gw $router + ip route add default via $router done make_resolv_conf exit_with_hooks 0 - fi - ifconfig $interface inet 0 down + ip link set $interface down exit_with_hooks 1 fi