1*83ee113eSDavid van Moolenbroek#!/bin/sh 2*83ee113eSDavid van Moolenbroek# 3*83ee113eSDavid van Moolenbroek# Id: freebsd,v 1.24 2011/05/18 19:55:44 sar Exp 4*83ee113eSDavid van Moolenbroek# 5*83ee113eSDavid van Moolenbroek# $FreeBSD$ 6*83ee113eSDavid van Moolenbroek 7*83ee113eSDavid van Moolenbroekif [ -x /usr/bin/logger ]; then 8*83ee113eSDavid van Moolenbroek LOGGER="/usr/bin/logger -s -p user.notice -t dhclient" 9*83ee113eSDavid van Moolenbroekelse 10*83ee113eSDavid van Moolenbroek LOGGER=echo 11*83ee113eSDavid van Moolenbroekfi 12*83ee113eSDavid van Moolenbroek 13*83ee113eSDavid van Moolenbroekmake_resolv_conf() { 14*83ee113eSDavid van Moolenbroek if [ x"$new_domain_name_servers" != x ]; then 15*83ee113eSDavid van Moolenbroek ( cat /dev/null > /etc/resolv.conf.dhclient ) 16*83ee113eSDavid van Moolenbroek exit_status=$? 17*83ee113eSDavid van Moolenbroek if [ $exit_status -ne 0 ]; then 18*83ee113eSDavid van Moolenbroek $LOGGER "Unable to create /etc/resolv.conf.dhclient: Error $exit_status" 19*83ee113eSDavid van Moolenbroek else 20*83ee113eSDavid van Moolenbroek if [ "x$new_domain_search" != x ]; then 21*83ee113eSDavid van Moolenbroek ( echo search $new_domain_search >> /etc/resolv.conf.dhclient ) 22*83ee113eSDavid van Moolenbroek exit_status=$? 23*83ee113eSDavid van Moolenbroek elif [ "x$new_domain_name" != x ]; then 24*83ee113eSDavid van Moolenbroek # Note that the DHCP 'Domain Name Option' is really just a domain 25*83ee113eSDavid van Moolenbroek # name, and that this practice of using the domain name option as 26*83ee113eSDavid van Moolenbroek # a search path is both nonstandard and deprecated. 27*83ee113eSDavid van Moolenbroek ( echo search $new_domain_name >> /etc/resolv.conf.dhclient ) 28*83ee113eSDavid van Moolenbroek exit_status=$? 29*83ee113eSDavid van Moolenbroek fi 30*83ee113eSDavid van Moolenbroek for nameserver in $new_domain_name_servers; do 31*83ee113eSDavid van Moolenbroek if [ $exit_status -ne 0 ]; then 32*83ee113eSDavid van Moolenbroek break 33*83ee113eSDavid van Moolenbroek fi 34*83ee113eSDavid van Moolenbroek ( echo nameserver $nameserver >>/etc/resolv.conf.dhclient ) 35*83ee113eSDavid van Moolenbroek exit_status=$? 36*83ee113eSDavid van Moolenbroek done 37*83ee113eSDavid van Moolenbroek 38*83ee113eSDavid van Moolenbroek # If there were no errors, attempt to mv the new file into place. 39*83ee113eSDavid van Moolenbroek if [ $exit_status -eq 0 ]; then 40*83ee113eSDavid van Moolenbroek ( mv /etc/resolv.conf.dhclient /etc/resolv.conf ) 41*83ee113eSDavid van Moolenbroek exit_status=$? 42*83ee113eSDavid van Moolenbroek fi 43*83ee113eSDavid van Moolenbroek 44*83ee113eSDavid van Moolenbroek if [ $exit_status -ne 0 ]; then 45*83ee113eSDavid van Moolenbroek $LOGGER "Error while writing new /etc/resolv.conf." 46*83ee113eSDavid van Moolenbroek fi 47*83ee113eSDavid van Moolenbroek fi 48*83ee113eSDavid van Moolenbroek elif [ "x${new_dhcp6_name_servers}" != x ] ; then 49*83ee113eSDavid van Moolenbroek ( cat /dev/null > /etc/resolv.conf.dhclient6 ) 50*83ee113eSDavid van Moolenbroek exit_status=$? 51*83ee113eSDavid van Moolenbroek if [ $exit_status -ne 0 ] ; then 52*83ee113eSDavid van Moolenbroek $LOGGER "Unable to create /etc/resolv.conf.dhclient6: Error $exit_status" 53*83ee113eSDavid van Moolenbroek else 54*83ee113eSDavid van Moolenbroek if [ "x${new_dhcp6_domain_search}" != x ] ; then 55*83ee113eSDavid van Moolenbroek ( echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6 ) 56*83ee113eSDavid van Moolenbroek exit_status=$? 57*83ee113eSDavid van Moolenbroek fi 58*83ee113eSDavid van Moolenbroek for nameserver in ${new_dhcp6_name_servers} ; do 59*83ee113eSDavid van Moolenbroek if [ $exit_status -ne 0 ] ; then 60*83ee113eSDavid van Moolenbroek break 61*83ee113eSDavid van Moolenbroek fi 62*83ee113eSDavid van Moolenbroek # If the nameserver has a link-local address 63*83ee113eSDavid van Moolenbroek # add a <zone_id> (interface name) to it. 64*83ee113eSDavid van Moolenbroek case $nameserver in 65*83ee113eSDavid van Moolenbroek fe80:*) zone_id="%$interface";; 66*83ee113eSDavid van Moolenbroek FE80:*) zone_id="%$interface";; 67*83ee113eSDavid van Moolenbroek *) zone_id="";; 68*83ee113eSDavid van Moolenbroek esac 69*83ee113eSDavid van Moolenbroek ( echo nameserver ${nameserver}$zone_id >> /etc/resolv.conf.dhclient6 ) 70*83ee113eSDavid van Moolenbroek exit_status=$? 71*83ee113eSDavid van Moolenbroek done 72*83ee113eSDavid van Moolenbroek 73*83ee113eSDavid van Moolenbroek if [ $exit_status -eq 0 ] ; then 74*83ee113eSDavid van Moolenbroek ( mv /etc/resolv.conf.dhclient6 /etc/resolv.conf ) 75*83ee113eSDavid van Moolenbroek exit_status=$? 76*83ee113eSDavid van Moolenbroek fi 77*83ee113eSDavid van Moolenbroek 78*83ee113eSDavid van Moolenbroek if [ $exit_status -ne 0 ] ; then 79*83ee113eSDavid van Moolenbroek $LOGGER "Error while writing new /etc/resolv.conf." 80*83ee113eSDavid van Moolenbroek fi 81*83ee113eSDavid van Moolenbroek fi 82*83ee113eSDavid van Moolenbroek fi 83*83ee113eSDavid van Moolenbroek} 84*83ee113eSDavid van Moolenbroek 85*83ee113eSDavid van Moolenbroek# Must be used on exit. Invokes the local dhcp client exit hooks, if any. 86*83ee113eSDavid van Moolenbroekexit_with_hooks() { 87*83ee113eSDavid van Moolenbroek exit_status=$1 88*83ee113eSDavid van Moolenbroek if [ -f /etc/dhclient-exit-hooks ]; then 89*83ee113eSDavid van Moolenbroek . /etc/dhclient-exit-hooks 90*83ee113eSDavid van Moolenbroek fi 91*83ee113eSDavid van Moolenbroek# probably should do something with exit status of the local script 92*83ee113eSDavid van Moolenbroek exit $exit_status 93*83ee113eSDavid van Moolenbroek} 94*83ee113eSDavid van Moolenbroek 95*83ee113eSDavid van Moolenbroek# Invoke the local dhcp client enter hooks, if they exist. 96*83ee113eSDavid van Moolenbroekif [ -f /etc/dhclient-enter-hooks ]; then 97*83ee113eSDavid van Moolenbroek exit_status=0 98*83ee113eSDavid van Moolenbroek . /etc/dhclient-enter-hooks 99*83ee113eSDavid van Moolenbroek # allow the local script to abort processing of this state 100*83ee113eSDavid van Moolenbroek # local script must set exit_status variable to nonzero. 101*83ee113eSDavid van Moolenbroek if [ $exit_status -ne 0 ]; then 102*83ee113eSDavid van Moolenbroek exit $exit_status 103*83ee113eSDavid van Moolenbroek fi 104*83ee113eSDavid van Moolenbroekfi 105*83ee113eSDavid van Moolenbroek 106*83ee113eSDavid van Moolenbroekif [ x$new_network_number != x ]; then 107*83ee113eSDavid van Moolenbroek $LOGGER New Network Number: $new_network_number 108*83ee113eSDavid van Moolenbroekfi 109*83ee113eSDavid van Moolenbroek 110*83ee113eSDavid van Moolenbroekif [ x$new_broadcast_address != x ]; then 111*83ee113eSDavid van Moolenbroek $LOGGER New Broadcast Address: $new_broadcast_address 112*83ee113eSDavid van Moolenbroek new_broadcast_arg="broadcast $new_broadcast_address" 113*83ee113eSDavid van Moolenbroekfi 114*83ee113eSDavid van Moolenbroekif [ x$old_broadcast_address != x ]; then 115*83ee113eSDavid van Moolenbroek old_broadcast_arg="broadcast $old_broadcast_address" 116*83ee113eSDavid van Moolenbroekfi 117*83ee113eSDavid van Moolenbroekif [ x$new_subnet_mask != x ]; then 118*83ee113eSDavid van Moolenbroek new_netmask_arg="netmask $new_subnet_mask" 119*83ee113eSDavid van Moolenbroekfi 120*83ee113eSDavid van Moolenbroekif [ x$old_subnet_mask != x ]; then 121*83ee113eSDavid van Moolenbroek old_netmask_arg="netmask $old_subnet_mask" 122*83ee113eSDavid van Moolenbroekfi 123*83ee113eSDavid van Moolenbroekif [ x$alias_subnet_mask != x ]; then 124*83ee113eSDavid van Moolenbroek alias_subnet_arg="netmask $alias_subnet_mask" 125*83ee113eSDavid van Moolenbroekfi 126*83ee113eSDavid van Moolenbroekif [ x$new_interface_mtu != x ]; then 127*83ee113eSDavid van Moolenbroek mtu_arg="mtu $new_interface_mtu" 128*83ee113eSDavid van Moolenbroekfi 129*83ee113eSDavid van Moolenbroekif [ x$IF_METRIC != x ]; then 130*83ee113eSDavid van Moolenbroek metric_arg="metric $IF_METRIC" 131*83ee113eSDavid van Moolenbroekfi 132*83ee113eSDavid van Moolenbroek 133*83ee113eSDavid van Moolenbroekif [ x$reason = xMEDIUM ]; then 134*83ee113eSDavid van Moolenbroek eval "ifconfig $interface $medium" 135*83ee113eSDavid van Moolenbroek eval "ifconfig $interface inet -alias 0.0.0.0 $medium" >/dev/null 2>&1 136*83ee113eSDavid van Moolenbroek sleep 1 137*83ee113eSDavid van Moolenbroek exit_with_hooks 0 138*83ee113eSDavid van Moolenbroekfi 139*83ee113eSDavid van Moolenbroek 140*83ee113eSDavid van Moolenbroek### 141*83ee113eSDavid van Moolenbroek### DHCPv4 Handlers 142*83ee113eSDavid van Moolenbroek### 143*83ee113eSDavid van Moolenbroek 144*83ee113eSDavid van Moolenbroekif [ x$reason = xPREINIT ]; then 145*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 146*83ee113eSDavid van Moolenbroek ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1 147*83ee113eSDavid van Moolenbroek route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 148*83ee113eSDavid van Moolenbroek fi 149*83ee113eSDavid van Moolenbroek ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \ 150*83ee113eSDavid van Moolenbroek broadcast 255.255.255.255 up 151*83ee113eSDavid van Moolenbroek exit_with_hooks 0 152*83ee113eSDavid van Moolenbroekfi 153*83ee113eSDavid van Moolenbroek 154*83ee113eSDavid van Moolenbroekif [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then 155*83ee113eSDavid van Moolenbroek exit_with_hooks 0; 156*83ee113eSDavid van Moolenbroekfi 157*83ee113eSDavid van Moolenbroek 158*83ee113eSDavid van Moolenbroekif [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \ 159*83ee113eSDavid van Moolenbroek [ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then 160*83ee113eSDavid van Moolenbroek current_hostname=`/bin/hostname` 161*83ee113eSDavid van Moolenbroek if [ x$current_hostname = x ] || \ 162*83ee113eSDavid van Moolenbroek [ x$current_hostname = x$old_host_name ]; then 163*83ee113eSDavid van Moolenbroek if [ x$current_hostname = x ] || \ 164*83ee113eSDavid van Moolenbroek [ x$new_host_name != x$old_host_name ]; then 165*83ee113eSDavid van Moolenbroek $LOGGER "New Hostname: $new_host_name" 166*83ee113eSDavid van Moolenbroek hostname $new_host_name 167*83ee113eSDavid van Moolenbroek fi 168*83ee113eSDavid van Moolenbroek fi 169*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \ 170*83ee113eSDavid van Moolenbroek [ x$alias_ip_address != x$old_ip_address ]; then 171*83ee113eSDavid van Moolenbroek ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1 172*83ee113eSDavid van Moolenbroek route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 173*83ee113eSDavid van Moolenbroek fi 174*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ] 175*83ee113eSDavid van Moolenbroek then 176*83ee113eSDavid van Moolenbroek eval "ifconfig $interface inet -alias $old_ip_address $medium" 177*83ee113eSDavid van Moolenbroek route delete $old_ip_address 127.1 >/dev/null 2>&1 178*83ee113eSDavid van Moolenbroek for router in $old_routers; do 179*83ee113eSDavid van Moolenbroek route delete default $router >/dev/null 2>&1 180*83ee113eSDavid van Moolenbroek done 181*83ee113eSDavid van Moolenbroek if [ -n "$old_static_routes" ]; then 182*83ee113eSDavid van Moolenbroek set -- $old_static_routes 183*83ee113eSDavid van Moolenbroek while [ $# -gt 1 ]; do 184*83ee113eSDavid van Moolenbroek route delete $1 $2 185*83ee113eSDavid van Moolenbroek shift; shift 186*83ee113eSDavid van Moolenbroek done 187*83ee113eSDavid van Moolenbroek fi 188*83ee113eSDavid van Moolenbroek arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' |sh 189*83ee113eSDavid van Moolenbroek fi 190*83ee113eSDavid van Moolenbroek if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \ 191*83ee113eSDavid van Moolenbroek [ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then 192*83ee113eSDavid van Moolenbroek eval "ifconfig $interface inet $new_ip_address $new_netmask_arg \ 193*83ee113eSDavid van Moolenbroek $new_broadcast_arg $mtu_arg $metric_arg $medium" 194*83ee113eSDavid van Moolenbroek $LOGGER "New IP Address ($interface): $new_ip_address" 195*83ee113eSDavid van Moolenbroek $LOGGER "New Subnet Mask ($interface): $new_subnet_mask" 196*83ee113eSDavid van Moolenbroek $LOGGER "New Broadcast Address ($interface): $new_broadcast_address" 197*83ee113eSDavid van Moolenbroek if [ -n "$new_routers" ]; then 198*83ee113eSDavid van Moolenbroek $LOGGER "New Routers: $new_routers" 199*83ee113eSDavid van Moolenbroek fi 200*83ee113eSDavid van Moolenbroek route add $new_ip_address 127.1 >/dev/null 2>&1 201*83ee113eSDavid van Moolenbroek for router in $new_routers; do 202*83ee113eSDavid van Moolenbroek # If the subnet is captive, eg the netmask is /32 but the default 203*83ee113eSDavid van Moolenbroek # gateway is (obviously) outside of this, then we need to produce a 204*83ee113eSDavid van Moolenbroek # host route to reach the gateway. 205*83ee113eSDavid van Moolenbroek if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then 206*83ee113eSDavid van Moolenbroek route add -host $router -interface $interface 207*83ee113eSDavid van Moolenbroek fi 208*83ee113eSDavid van Moolenbroek route add default $router >/dev/null 2>&1 209*83ee113eSDavid van Moolenbroek done 210*83ee113eSDavid van Moolenbroek if [ -n "$new_static_routes" ]; then 211*83ee113eSDavid van Moolenbroek $LOGGER "New Static Routes: $new_static_routes" 212*83ee113eSDavid van Moolenbroek set -- $new_static_routes 213*83ee113eSDavid van Moolenbroek while [ $# -gt 1 ]; do 214*83ee113eSDavid van Moolenbroek route add $1 $2 215*83ee113eSDavid van Moolenbroek shift; shift 216*83ee113eSDavid van Moolenbroek done 217*83ee113eSDavid van Moolenbroek fi 218*83ee113eSDavid van Moolenbroek else 219*83ee113eSDavid van Moolenbroek # we haven't changed the address, have we changed other options 220*83ee113eSDavid van Moolenbroek # that we wish to update? 221*83ee113eSDavid van Moolenbroek if [ x$new_routers != x ] && [ x$new_routers != x$old_routers ] ; then 222*83ee113eSDavid van Moolenbroek # if we've changed routers delete the old and add the new. 223*83ee113eSDavid van Moolenbroek $LOGGER "New Routers: $new_routers" 224*83ee113eSDavid van Moolenbroek for router in $old_routers; do 225*83ee113eSDavid van Moolenbroek route delete default $router >/dev/null 2>&1 226*83ee113eSDavid van Moolenbroek done 227*83ee113eSDavid van Moolenbroek for router in $new_routers; do 228*83ee113eSDavid van Moolenbroek # If the subnet is captive, eg the netmask is /32 but the default 229*83ee113eSDavid van Moolenbroek # gateway is (obviously) outside of this, then we need to produce a 230*83ee113eSDavid van Moolenbroek # host route to reach the gateway. 231*83ee113eSDavid van Moolenbroek if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then 232*83ee113eSDavid van Moolenbroek route add -host $router -interface $interface 233*83ee113eSDavid van Moolenbroek fi 234*83ee113eSDavid van Moolenbroek route add default $router >/dev/null 2>&1 235*83ee113eSDavid van Moolenbroek done 236*83ee113eSDavid van Moolenbroek fi 237*83ee113eSDavid van Moolenbroek fi 238*83ee113eSDavid van Moolenbroek if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ]; 239*83ee113eSDavid van Moolenbroek then 240*83ee113eSDavid van Moolenbroek ifconfig $interface inet alias $alias_ip_address $alias_subnet_arg 241*83ee113eSDavid van Moolenbroek route add $alias_ip_address 127.0.0.1 242*83ee113eSDavid van Moolenbroek fi 243*83ee113eSDavid van Moolenbroek make_resolv_conf 244*83ee113eSDavid van Moolenbroek exit_with_hooks 0 245*83ee113eSDavid van Moolenbroekfi 246*83ee113eSDavid van Moolenbroek 247*83ee113eSDavid van Moolenbroekif [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \ 248*83ee113eSDavid van Moolenbroek || [ x$reason = xSTOP ]; then 249*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 250*83ee113eSDavid van Moolenbroek ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1 251*83ee113eSDavid van Moolenbroek route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 252*83ee113eSDavid van Moolenbroek fi 253*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ]; then 254*83ee113eSDavid van Moolenbroek eval "ifconfig $interface inet -alias $old_ip_address $medium" 255*83ee113eSDavid van Moolenbroek route delete $old_ip_address 127.1 >/dev/null 2>&1 256*83ee113eSDavid van Moolenbroek for router in $old_routers; do 257*83ee113eSDavid van Moolenbroek route delete default $router >/dev/null 2>&1 258*83ee113eSDavid van Moolenbroek done 259*83ee113eSDavid van Moolenbroek if [ -n "$old_static_routes" ]; then 260*83ee113eSDavid van Moolenbroek set -- $old_static_routes 261*83ee113eSDavid van Moolenbroek while [ $# -gt 1 ]; do 262*83ee113eSDavid van Moolenbroek route delete $1 $2 263*83ee113eSDavid van Moolenbroek shift; shift 264*83ee113eSDavid van Moolenbroek done 265*83ee113eSDavid van Moolenbroek fi 266*83ee113eSDavid van Moolenbroek arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' \ 267*83ee113eSDavid van Moolenbroek |sh >/dev/null 2>&1 268*83ee113eSDavid van Moolenbroek fi 269*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 270*83ee113eSDavid van Moolenbroek ifconfig $interface inet alias $alias_ip_address $alias_subnet_arg 271*83ee113eSDavid van Moolenbroek route add $alias_ip_address 127.0.0.1 272*83ee113eSDavid van Moolenbroek fi 273*83ee113eSDavid van Moolenbroek exit_with_hooks 0 274*83ee113eSDavid van Moolenbroekfi 275*83ee113eSDavid van Moolenbroek 276*83ee113eSDavid van Moolenbroekif [ x$reason = xTIMEOUT ]; then 277*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 278*83ee113eSDavid van Moolenbroek ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1 279*83ee113eSDavid van Moolenbroek route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1 280*83ee113eSDavid van Moolenbroek fi 281*83ee113eSDavid van Moolenbroek eval "ifconfig $interface inet $new_ip_address $new_netmask_arg \ 282*83ee113eSDavid van Moolenbroek $new_broadcast_arg $mtu_arg $metric_arg $medium" 283*83ee113eSDavid van Moolenbroek $LOGGER "New IP Address ($interface): $new_ip_address" 284*83ee113eSDavid van Moolenbroek $LOGGER "New Subnet Mask ($interface): $new_subnet_mask" 285*83ee113eSDavid van Moolenbroek $LOGGER "New Broadcast Address ($interface): $new_broadcast_address" 286*83ee113eSDavid van Moolenbroek sleep 1 287*83ee113eSDavid van Moolenbroek if [ -n "$new_routers" ]; then 288*83ee113eSDavid van Moolenbroek $LOGGER "New Routers: $new_routers" 289*83ee113eSDavid van Moolenbroek set -- $new_routers 290*83ee113eSDavid van Moolenbroek if ping -q -c 1 $1; then 291*83ee113eSDavid van Moolenbroek if [ x$new_ip_address != x$alias_ip_address ] && \ 292*83ee113eSDavid van Moolenbroek [ x$alias_ip_address != x ]; then 293*83ee113eSDavid van Moolenbroek ifconfig $interface inet alias $alias_ip_address $alias_subnet_arg 294*83ee113eSDavid van Moolenbroek route add $alias_ip_address 127.0.0.1 295*83ee113eSDavid van Moolenbroek fi 296*83ee113eSDavid van Moolenbroek route add $new_ip_address 127.1 >/dev/null 2>&1 297*83ee113eSDavid van Moolenbroek for router in $new_routers; do 298*83ee113eSDavid van Moolenbroek if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then 299*83ee113eSDavid van Moolenbroek route add -host $router -interface $interface 300*83ee113eSDavid van Moolenbroek fi 301*83ee113eSDavid van Moolenbroek route add default $router >/dev/null 2>&1 302*83ee113eSDavid van Moolenbroek done 303*83ee113eSDavid van Moolenbroek set -- $new_static_routes 304*83ee113eSDavid van Moolenbroek while [ $# -gt 1 ]; do 305*83ee113eSDavid van Moolenbroek route add $1 $2 306*83ee113eSDavid van Moolenbroek shift; shift 307*83ee113eSDavid van Moolenbroek done 308*83ee113eSDavid van Moolenbroek make_resolv_conf 309*83ee113eSDavid van Moolenbroek exit_with_hooks 0 310*83ee113eSDavid van Moolenbroek fi 311*83ee113eSDavid van Moolenbroek fi 312*83ee113eSDavid van Moolenbroek eval "ifconfig $interface inet -alias $new_ip_address $medium" 313*83ee113eSDavid van Moolenbroek for router in $old_routers; do 314*83ee113eSDavid van Moolenbroek route delete default $router >/dev/null 2>&1 315*83ee113eSDavid van Moolenbroek done 316*83ee113eSDavid van Moolenbroek if [ -n "$old_static_routes" ]; then 317*83ee113eSDavid van Moolenbroek set -- $old_static_routes 318*83ee113eSDavid van Moolenbroek while [ $# -gt 1 ]; do 319*83ee113eSDavid van Moolenbroek route delete $1 $2 320*83ee113eSDavid van Moolenbroek shift; shift 321*83ee113eSDavid van Moolenbroek done 322*83ee113eSDavid van Moolenbroek fi 323*83ee113eSDavid van Moolenbroek arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' \ 324*83ee113eSDavid van Moolenbroek |sh >/dev/null 2>&1 325*83ee113eSDavid van Moolenbroek exit_with_hooks 1 326*83ee113eSDavid van Moolenbroekfi 327*83ee113eSDavid van Moolenbroek 328*83ee113eSDavid van Moolenbroek### 329*83ee113eSDavid van Moolenbroek### DHCPv6 Handlers 330*83ee113eSDavid van Moolenbroek### 331*83ee113eSDavid van Moolenbroek 332*83ee113eSDavid van Moolenbroekif [ ${reason} = PREINIT6 ] ; then 333*83ee113eSDavid van Moolenbroek # Ensure interface is up. 334*83ee113eSDavid van Moolenbroek ifconfig ${interface} up 335*83ee113eSDavid van Moolenbroek 336*83ee113eSDavid van Moolenbroek # XXX: Remove any stale addresses from aborted clients. 337*83ee113eSDavid van Moolenbroek 338*83ee113eSDavid van Moolenbroek exit_with_hooks 0 339*83ee113eSDavid van Moolenbroekfi 340*83ee113eSDavid van Moolenbroek 341*83ee113eSDavid van Moolenbroekif [ x${old_ip6_prefix} != x ] || [ x${new_ip6_prefix} != x ] ; then 342*83ee113eSDavid van Moolenbroek echo Prefix ${reason} old=${old_ip6_prefix} new=${new_ip6_prefix} 343*83ee113eSDavid van Moolenbroek 344*83ee113eSDavid van Moolenbroek exit_with_hooks 0 345*83ee113eSDavid van Moolenbroekfi 346*83ee113eSDavid van Moolenbroek 347*83ee113eSDavid van Moolenbroekif [ ${reason} = BOUND6 ] ; then 348*83ee113eSDavid van Moolenbroek if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then 349*83ee113eSDavid van Moolenbroek exit_with_hooks 2; 350*83ee113eSDavid van Moolenbroek fi 351*83ee113eSDavid van Moolenbroek 352*83ee113eSDavid van Moolenbroek ifconfig ${interface} inet6 ${new_ip6_address}/${new_ip6_prefixlen} alias 353*83ee113eSDavid van Moolenbroek 354*83ee113eSDavid van Moolenbroek # Check for nameserver options. 355*83ee113eSDavid van Moolenbroek make_resolv_conf 356*83ee113eSDavid van Moolenbroek 357*83ee113eSDavid van Moolenbroek exit_with_hooks 0 358*83ee113eSDavid van Moolenbroekfi 359*83ee113eSDavid van Moolenbroek 360*83ee113eSDavid van Moolenbroekif [ ${reason} = RENEW6 ] || [ ${reason} = REBIND6 ] ; then 361*83ee113eSDavid van Moolenbroek # Make sure nothing has moved around on us. 362*83ee113eSDavid van Moolenbroek 363*83ee113eSDavid van Moolenbroek # Nameservers/domains/etc. 364*83ee113eSDavid van Moolenbroek if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] || 365*83ee113eSDavid van Moolenbroek [ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then 366*83ee113eSDavid van Moolenbroek make_resolv_conf 367*83ee113eSDavid van Moolenbroek fi 368*83ee113eSDavid van Moolenbroek 369*83ee113eSDavid van Moolenbroek exit_with_hooks 0 370*83ee113eSDavid van Moolenbroekfi 371*83ee113eSDavid van Moolenbroek 372*83ee113eSDavid van Moolenbroekif [ ${reason} = DEPREF6 ] ; then 373*83ee113eSDavid van Moolenbroek if [ x${new_ip6_address} = x ] ; then 374*83ee113eSDavid van Moolenbroek exit_with_hooks 2; 375*83ee113eSDavid van Moolenbroek fi 376*83ee113eSDavid van Moolenbroek 377*83ee113eSDavid van Moolenbroek ifconfig ${interface} inet6 ${new_ip6_address} deprecated 378*83ee113eSDavid van Moolenbroek 379*83ee113eSDavid van Moolenbroek exit_with_hooks 0 380*83ee113eSDavid van Moolenbroekfi 381*83ee113eSDavid van Moolenbroek 382*83ee113eSDavid van Moolenbroekif [ ${reason} = EXPIRE6 -o ${reason} = RELEASE6 -o ${reason} = STOP6 ] ; then 383*83ee113eSDavid van Moolenbroek if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then 384*83ee113eSDavid van Moolenbroek exit_with_hooks 2; 385*83ee113eSDavid van Moolenbroek fi 386*83ee113eSDavid van Moolenbroek 387*83ee113eSDavid van Moolenbroek ifconfig ${interface} inet6 ${old_ip6_address}/${old_ip6_prefixlen} -alias 388*83ee113eSDavid van Moolenbroek 389*83ee113eSDavid van Moolenbroek exit_with_hooks 0 390*83ee113eSDavid van Moolenbroekfi 391*83ee113eSDavid van Moolenbroek 392*83ee113eSDavid van Moolenbroekexit_with_hooks 0 393