1*83ee113eSDavid van Moolenbroek#!/bin/bash 2*83ee113eSDavid van Moolenbroek# dhclient-script for Linux. Dan Halbert, March, 1997. 3*83ee113eSDavid van Moolenbroek# Updated for Linux 2.[12] by Brian J. Murrell, January 1999. 4*83ee113eSDavid van Moolenbroek# No guarantees about this. I'm a novice at the details of Linux 5*83ee113eSDavid van Moolenbroek# networking. 6*83ee113eSDavid van Moolenbroek 7*83ee113eSDavid van Moolenbroek# Notes: 8*83ee113eSDavid van Moolenbroek 9*83ee113eSDavid van Moolenbroek# 0. This script is based on the netbsd script supplied with dhcp-970306. 10*83ee113eSDavid van Moolenbroek 11*83ee113eSDavid van Moolenbroek# 1. ifconfig down apparently deletes all relevant routes and flushes 12*83ee113eSDavid van Moolenbroek# the arp cache, so this doesn't need to be done explicitly. 13*83ee113eSDavid van Moolenbroek 14*83ee113eSDavid van Moolenbroek# 2. The alias address handling here has not been tested AT ALL. 15*83ee113eSDavid van Moolenbroek# I'm just going by the doc of modern Linux ip aliasing, which uses 16*83ee113eSDavid van Moolenbroek# notations like eth0:0, eth0:1, for each alias. 17*83ee113eSDavid van Moolenbroek 18*83ee113eSDavid van Moolenbroek# 3. I have to calculate the network address, and calculate the broadcast 19*83ee113eSDavid van Moolenbroek# address if it is not supplied. This might be much more easily done 20*83ee113eSDavid van Moolenbroek# by the dhclient C code, and passed on. 21*83ee113eSDavid van Moolenbroek 22*83ee113eSDavid van Moolenbroek# 4. TIMEOUT not tested. ping has a flag I don't know, and I'm suspicious 23*83ee113eSDavid van Moolenbroek# of the $1 in its args. 24*83ee113eSDavid van Moolenbroek 25*83ee113eSDavid van Moolenbroek# 'ip' just looks too weird. /sbin/ip looks less weird. 26*83ee113eSDavid van Moolenbroekip=/sbin/ip 27*83ee113eSDavid van Moolenbroek 28*83ee113eSDavid van Moolenbroekmake_resolv_conf() { 29*83ee113eSDavid van Moolenbroek if [ x"$new_domain_name_servers" != x ]; then 30*83ee113eSDavid van Moolenbroek cat /dev/null > /etc/resolv.conf.dhclient 31*83ee113eSDavid van Moolenbroek chmod 644 /etc/resolv.conf.dhclient 32*83ee113eSDavid van Moolenbroek if [ x"$new_domain_search" != x ]; then 33*83ee113eSDavid van Moolenbroek echo search $new_domain_search >> /etc/resolv.conf.dhclient 34*83ee113eSDavid van Moolenbroek elif [ x"$new_domain_name" != x ]; then 35*83ee113eSDavid van Moolenbroek # Note that the DHCP 'Domain Name Option' is really just a domain 36*83ee113eSDavid van Moolenbroek # name, and that this practice of using the domain name option as 37*83ee113eSDavid van Moolenbroek # a search path is both nonstandard and deprecated. 38*83ee113eSDavid van Moolenbroek echo search $new_domain_name >> /etc/resolv.conf.dhclient 39*83ee113eSDavid van Moolenbroek fi 40*83ee113eSDavid van Moolenbroek for nameserver in $new_domain_name_servers; do 41*83ee113eSDavid van Moolenbroek echo nameserver $nameserver >>/etc/resolv.conf.dhclient 42*83ee113eSDavid van Moolenbroek done 43*83ee113eSDavid van Moolenbroek 44*83ee113eSDavid van Moolenbroek mv /etc/resolv.conf.dhclient /etc/resolv.conf 45*83ee113eSDavid van Moolenbroek elif [ "x${new_dhcp6_name_servers}" != x ] ; then 46*83ee113eSDavid van Moolenbroek cat /dev/null > /etc/resolv.conf.dhclient6 47*83ee113eSDavid van Moolenbroek chmod 644 /etc/resolv.conf.dhclient6 48*83ee113eSDavid van Moolenbroek 49*83ee113eSDavid van Moolenbroek if [ "x${new_dhcp6_domain_search}" != x ] ; then 50*83ee113eSDavid van Moolenbroek echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6 51*83ee113eSDavid van Moolenbroek fi 52*83ee113eSDavid van Moolenbroek shopt -s nocasematch 53*83ee113eSDavid van Moolenbroek for nameserver in ${new_dhcp6_name_servers} ; do 54*83ee113eSDavid van Moolenbroek # If the nameserver has a link-local address 55*83ee113eSDavid van Moolenbroek # add a <zone_id> (interface name) to it. 56*83ee113eSDavid van Moolenbroek if [[ "$nameserver" =~ ^fe80:: ]] 57*83ee113eSDavid van Moolenbroek then 58*83ee113eSDavid van Moolenbroek zone_id="%$interface" 59*83ee113eSDavid van Moolenbroek else 60*83ee113eSDavid van Moolenbroek zone_id= 61*83ee113eSDavid van Moolenbroek fi 62*83ee113eSDavid van Moolenbroek echo nameserver ${nameserver}$zone_id >> /etc/resolv.conf.dhclient6 63*83ee113eSDavid van Moolenbroek done 64*83ee113eSDavid van Moolenbroek shopt -u nocasematch 65*83ee113eSDavid van Moolenbroek 66*83ee113eSDavid van Moolenbroek mv /etc/resolv.conf.dhclient6 /etc/resolv.conf 67*83ee113eSDavid van Moolenbroek fi 68*83ee113eSDavid van Moolenbroek} 69*83ee113eSDavid van Moolenbroek 70*83ee113eSDavid van Moolenbroek# Must be used on exit. Invokes the local dhcp client exit hooks, if any. 71*83ee113eSDavid van Moolenbroekexit_with_hooks() { 72*83ee113eSDavid van Moolenbroek exit_status=$1 73*83ee113eSDavid van Moolenbroek if [ -f /etc/dhclient-exit-hooks ]; then 74*83ee113eSDavid van Moolenbroek . /etc/dhclient-exit-hooks 75*83ee113eSDavid van Moolenbroek fi 76*83ee113eSDavid van Moolenbroek# probably should do something with exit status of the local script 77*83ee113eSDavid van Moolenbroek exit $exit_status 78*83ee113eSDavid van Moolenbroek} 79*83ee113eSDavid van Moolenbroek 80*83ee113eSDavid van Moolenbroek# Invoke the local dhcp client enter hooks, if they exist. 81*83ee113eSDavid van Moolenbroekif [ -f /etc/dhclient-enter-hooks ]; then 82*83ee113eSDavid van Moolenbroek exit_status=0 83*83ee113eSDavid van Moolenbroek . /etc/dhclient-enter-hooks 84*83ee113eSDavid van Moolenbroek # allow the local script to abort processing of this state 85*83ee113eSDavid van Moolenbroek # local script must set exit_status variable to nonzero. 86*83ee113eSDavid van Moolenbroek if [ $exit_status -ne 0 ]; then 87*83ee113eSDavid van Moolenbroek exit $exit_status 88*83ee113eSDavid van Moolenbroek fi 89*83ee113eSDavid van Moolenbroekfi 90*83ee113eSDavid van Moolenbroek 91*83ee113eSDavid van Moolenbroek### 92*83ee113eSDavid van Moolenbroek### DHCPv4 Handlers 93*83ee113eSDavid van Moolenbroek### 94*83ee113eSDavid van Moolenbroek 95*83ee113eSDavid van Moolenbroekif [ x$new_broadcast_address != x ]; then 96*83ee113eSDavid van Moolenbroek new_broadcast_arg="broadcast $new_broadcast_address" 97*83ee113eSDavid van Moolenbroekfi 98*83ee113eSDavid van Moolenbroekif [ x$old_broadcast_address != x ]; then 99*83ee113eSDavid van Moolenbroek old_broadcast_arg="broadcast $old_broadcast_address" 100*83ee113eSDavid van Moolenbroekfi 101*83ee113eSDavid van Moolenbroekif [ x$new_subnet_mask != x ]; then 102*83ee113eSDavid van Moolenbroek new_subnet_arg="netmask $new_subnet_mask" 103*83ee113eSDavid van Moolenbroekfi 104*83ee113eSDavid van Moolenbroekif [ x$old_subnet_mask != x ]; then 105*83ee113eSDavid van Moolenbroek old_subnet_arg="netmask $old_subnet_mask" 106*83ee113eSDavid van Moolenbroekfi 107*83ee113eSDavid van Moolenbroekif [ x$alias_subnet_mask != x ]; then 108*83ee113eSDavid van Moolenbroek alias_subnet_arg="netmask $alias_subnet_mask" 109*83ee113eSDavid van Moolenbroekfi 110*83ee113eSDavid van Moolenbroekif [ x$new_interface_mtu != x ]; then 111*83ee113eSDavid van Moolenbroek mtu_arg="mtu $new_interface_mtu" 112*83ee113eSDavid van Moolenbroekfi 113*83ee113eSDavid van Moolenbroekif [ x$IF_METRIC != x ]; then 114*83ee113eSDavid van Moolenbroek metric_arg="metric $IF_METRIC" 115*83ee113eSDavid van Moolenbroekfi 116*83ee113eSDavid van Moolenbroek 117*83ee113eSDavid van Moolenbroekif [ x$reason = xMEDIUM ]; then 118*83ee113eSDavid van Moolenbroek # Linux doesn't do mediums (ok, ok, media). 119*83ee113eSDavid van Moolenbroek exit_with_hooks 0 120*83ee113eSDavid van Moolenbroekfi 121*83ee113eSDavid van Moolenbroek 122*83ee113eSDavid van Moolenbroekif [ x$reason = xPREINIT ]; then 123*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 124*83ee113eSDavid van Moolenbroek # Bring down alias interface. Its routes will disappear too. 125*83ee113eSDavid van Moolenbroek ifconfig $interface:0- inet 0 126*83ee113eSDavid van Moolenbroek fi 127*83ee113eSDavid van Moolenbroek ifconfig $interface 0 up 128*83ee113eSDavid van Moolenbroek 129*83ee113eSDavid van Moolenbroek # We need to give the kernel some time to get the interface up. 130*83ee113eSDavid van Moolenbroek sleep 1 131*83ee113eSDavid van Moolenbroek 132*83ee113eSDavid van Moolenbroek exit_with_hooks 0 133*83ee113eSDavid van Moolenbroekfi 134*83ee113eSDavid van Moolenbroek 135*83ee113eSDavid van Moolenbroekif [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then 136*83ee113eSDavid van Moolenbroek exit_with_hooks 0 137*83ee113eSDavid van Moolenbroekfi 138*83ee113eSDavid van Moolenbroek 139*83ee113eSDavid van Moolenbroekif [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \ 140*83ee113eSDavid van Moolenbroek [ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then 141*83ee113eSDavid van Moolenbroek current_hostname=`hostname` 142*83ee113eSDavid van Moolenbroek if [ x$current_hostname = x ] || \ 143*83ee113eSDavid van Moolenbroek [ x$current_hostname = "x(none)" ] || \ 144*83ee113eSDavid van Moolenbroek [ x$current_hostname = xlocalhost ] || \ 145*83ee113eSDavid van Moolenbroek [ x$current_hostname = x$old_host_name ]; then 146*83ee113eSDavid van Moolenbroek if [ x$new_host_name != x$old_host_name ]; then 147*83ee113eSDavid van Moolenbroek hostname "$new_host_name" 148*83ee113eSDavid van Moolenbroek fi 149*83ee113eSDavid van Moolenbroek fi 150*83ee113eSDavid van Moolenbroek 151*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \ 152*83ee113eSDavid van Moolenbroek [ x$alias_ip_address != x$old_ip_address ]; then 153*83ee113eSDavid van Moolenbroek # Possible new alias. Remove old alias. 154*83ee113eSDavid van Moolenbroek ifconfig $interface:0- inet 0 155*83ee113eSDavid van Moolenbroek fi 156*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ]; then 157*83ee113eSDavid van Moolenbroek # IP address changed. Bringing down the interface will delete all routes, 158*83ee113eSDavid van Moolenbroek # and clear the ARP cache. 159*83ee113eSDavid van Moolenbroek ifconfig $interface inet 0 down 160*83ee113eSDavid van Moolenbroek 161*83ee113eSDavid van Moolenbroek fi 162*83ee113eSDavid van Moolenbroek if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \ 163*83ee113eSDavid van Moolenbroek [ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then 164*83ee113eSDavid van Moolenbroek 165*83ee113eSDavid van Moolenbroek ifconfig $interface inet $new_ip_address $new_subnet_arg \ 166*83ee113eSDavid van Moolenbroek $new_broadcast_arg $mtu_arg 167*83ee113eSDavid van Moolenbroek # Add a network route to the computed network address. 168*83ee113eSDavid van Moolenbroek for router in $new_routers; do 169*83ee113eSDavid van Moolenbroek if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then 170*83ee113eSDavid van Moolenbroek route add -host $router dev $interface 171*83ee113eSDavid van Moolenbroek fi 172*83ee113eSDavid van Moolenbroek route add default gw $router $metric_arg dev $interface 173*83ee113eSDavid van Moolenbroek done 174*83ee113eSDavid van Moolenbroek else 175*83ee113eSDavid van Moolenbroek # we haven't changed the address, have we changed other options 176*83ee113eSDavid van Moolenbroek # that we wish to update? 177*83ee113eSDavid van Moolenbroek if [ x$new_routers != x ] && [ x$new_routers != x$old_routers ] ; then 178*83ee113eSDavid van Moolenbroek # if we've changed routers delete the old and add the new. 179*83ee113eSDavid van Moolenbroek for router in $old_routers; do 180*83ee113eSDavid van Moolenbroek route del default gw $router 181*83ee113eSDavid van Moolenbroek done 182*83ee113eSDavid van Moolenbroek for router in $new_routers; do 183*83ee113eSDavid van Moolenbroek if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then 184*83ee113eSDavid van Moolenbroek route add -host $router dev $interface 185*83ee113eSDavid van Moolenbroek fi 186*83ee113eSDavid van Moolenbroek route add default gw $router $metric_arg dev $interface 187*83ee113eSDavid van Moolenbroek done 188*83ee113eSDavid van Moolenbroek fi 189*83ee113eSDavid van Moolenbroek fi 190*83ee113eSDavid van Moolenbroek if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ]; 191*83ee113eSDavid van Moolenbroek then 192*83ee113eSDavid van Moolenbroek ifconfig $interface:0- inet 0 193*83ee113eSDavid van Moolenbroek ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg 194*83ee113eSDavid van Moolenbroek route add -host $alias_ip_address $interface:0 195*83ee113eSDavid van Moolenbroek fi 196*83ee113eSDavid van Moolenbroek make_resolv_conf 197*83ee113eSDavid van Moolenbroek exit_with_hooks 0 198*83ee113eSDavid van Moolenbroekfi 199*83ee113eSDavid van Moolenbroek 200*83ee113eSDavid van Moolenbroekif [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \ 201*83ee113eSDavid van Moolenbroek || [ x$reason = xSTOP ]; then 202*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 203*83ee113eSDavid van Moolenbroek # Turn off alias interface. 204*83ee113eSDavid van Moolenbroek ifconfig $interface:0- inet 0 205*83ee113eSDavid van Moolenbroek fi 206*83ee113eSDavid van Moolenbroek if [ x$old_ip_address != x ]; then 207*83ee113eSDavid van Moolenbroek # Shut down interface, which will delete routes and clear arp cache. 208*83ee113eSDavid van Moolenbroek ifconfig $interface inet 0 down 209*83ee113eSDavid van Moolenbroek fi 210*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 211*83ee113eSDavid van Moolenbroek ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg 212*83ee113eSDavid van Moolenbroek route add -host $alias_ip_address $interface:0 213*83ee113eSDavid van Moolenbroek fi 214*83ee113eSDavid van Moolenbroek exit_with_hooks 0 215*83ee113eSDavid van Moolenbroekfi 216*83ee113eSDavid van Moolenbroek 217*83ee113eSDavid van Moolenbroekif [ x$reason = xTIMEOUT ]; then 218*83ee113eSDavid van Moolenbroek if [ x$alias_ip_address != x ]; then 219*83ee113eSDavid van Moolenbroek ifconfig $interface:0- inet 0 220*83ee113eSDavid van Moolenbroek fi 221*83ee113eSDavid van Moolenbroek ifconfig $interface inet $new_ip_address $new_subnet_arg \ 222*83ee113eSDavid van Moolenbroek $new_broadcast_arg $mtu_arg 223*83ee113eSDavid van Moolenbroek set $new_routers 224*83ee113eSDavid van Moolenbroek if ping -q -c 1 $1; then 225*83ee113eSDavid van Moolenbroek if [ x$new_ip_address != x$alias_ip_address ] && \ 226*83ee113eSDavid van Moolenbroek [ x$alias_ip_address != x ]; then 227*83ee113eSDavid van Moolenbroek ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg 228*83ee113eSDavid van Moolenbroek route add -host $alias_ip_address dev $interface:0 229*83ee113eSDavid van Moolenbroek fi 230*83ee113eSDavid van Moolenbroek for router in $new_routers; do 231*83ee113eSDavid van Moolenbroek if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then 232*83ee113eSDavid van Moolenbroek route add -host $router dev $interface 233*83ee113eSDavid van Moolenbroek fi 234*83ee113eSDavid van Moolenbroek route add default gw $router $metric_arg dev $interface 235*83ee113eSDavid van Moolenbroek done 236*83ee113eSDavid van Moolenbroek make_resolv_conf 237*83ee113eSDavid van Moolenbroek exit_with_hooks 0 238*83ee113eSDavid van Moolenbroek fi 239*83ee113eSDavid van Moolenbroek ifconfig $interface inet 0 down 240*83ee113eSDavid van Moolenbroek exit_with_hooks 1 241*83ee113eSDavid van Moolenbroekfi 242*83ee113eSDavid van Moolenbroek 243*83ee113eSDavid van Moolenbroek### 244*83ee113eSDavid van Moolenbroek### DHCPv6 Handlers 245*83ee113eSDavid van Moolenbroek### 246*83ee113eSDavid van Moolenbroek 247*83ee113eSDavid van Moolenbroekif [ x$reason = xPREINIT6 ] ; then 248*83ee113eSDavid van Moolenbroek # Ensure interface is up. 249*83ee113eSDavid van Moolenbroek ${ip} link set ${interface} up 250*83ee113eSDavid van Moolenbroek 251*83ee113eSDavid van Moolenbroek # Remove any stale addresses from aborted clients. 252*83ee113eSDavid van Moolenbroek ${ip} -f inet6 addr flush dev ${interface} scope global permanent 253*83ee113eSDavid van Moolenbroek 254*83ee113eSDavid van Moolenbroek exit_with_hooks 0 255*83ee113eSDavid van Moolenbroekfi 256*83ee113eSDavid van Moolenbroek 257*83ee113eSDavid van Moolenbroekif [ x${old_ip6_prefix} != x ] || [ x${new_ip6_prefix} != x ] ; then 258*83ee113eSDavid van Moolenbroek echo Prefix ${reason} old=${old_ip6_prefix} new=${new_ip6_prefix} 259*83ee113eSDavid van Moolenbroek 260*83ee113eSDavid van Moolenbroek exit_with_hooks 0 261*83ee113eSDavid van Moolenbroekfi 262*83ee113eSDavid van Moolenbroek 263*83ee113eSDavid van Moolenbroekif [ x$reason = xBOUND6 ] ; then 264*83ee113eSDavid van Moolenbroek if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then 265*83ee113eSDavid van Moolenbroek exit_with_hooks 2; 266*83ee113eSDavid van Moolenbroek fi 267*83ee113eSDavid van Moolenbroek 268*83ee113eSDavid van Moolenbroek ${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ 269*83ee113eSDavid van Moolenbroek dev ${interface} scope global 270*83ee113eSDavid van Moolenbroek 271*83ee113eSDavid van Moolenbroek # Check for nameserver options. 272*83ee113eSDavid van Moolenbroek make_resolv_conf 273*83ee113eSDavid van Moolenbroek 274*83ee113eSDavid van Moolenbroek exit_with_hooks 0 275*83ee113eSDavid van Moolenbroekfi 276*83ee113eSDavid van Moolenbroek 277*83ee113eSDavid van Moolenbroekif [ x$reason = xRENEW6 ] || [ x$reason = xREBIND6 ] ; then 278*83ee113eSDavid van Moolenbroek if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then 279*83ee113eSDavid van Moolenbroek exit_with_hooks 2; 280*83ee113eSDavid van Moolenbroek fi 281*83ee113eSDavid van Moolenbroek 282*83ee113eSDavid van Moolenbroek ${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ 283*83ee113eSDavid van Moolenbroek dev ${interface} scope global 284*83ee113eSDavid van Moolenbroek 285*83ee113eSDavid van Moolenbroek # Make sure nothing has moved around on us. 286*83ee113eSDavid van Moolenbroek 287*83ee113eSDavid van Moolenbroek # Nameservers/domains/etc. 288*83ee113eSDavid van Moolenbroek if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] || 289*83ee113eSDavid van Moolenbroek [ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then 290*83ee113eSDavid van Moolenbroek make_resolv_conf 291*83ee113eSDavid van Moolenbroek fi 292*83ee113eSDavid van Moolenbroek 293*83ee113eSDavid van Moolenbroek exit_with_hooks 0 294*83ee113eSDavid van Moolenbroekfi 295*83ee113eSDavid van Moolenbroek 296*83ee113eSDavid van Moolenbroekif [ x$reason = xDEPREF6 ] ; then 297*83ee113eSDavid van Moolenbroek if [ x${new_ip6_prefixlen} = x ] ; then 298*83ee113eSDavid van Moolenbroek exit_with_hooks 2; 299*83ee113eSDavid van Moolenbroek fi 300*83ee113eSDavid van Moolenbroek 301*83ee113eSDavid van Moolenbroek ${ip} -f inet6 addr change ${new_ip6_address}/${new_ip6_prefixlen} \ 302*83ee113eSDavid van Moolenbroek dev ${interface} scope global preferred_lft 0 303*83ee113eSDavid van Moolenbroek 304*83ee113eSDavid van Moolenbroek exit_with_hooks 0 305*83ee113eSDavid van Moolenbroekfi 306*83ee113eSDavid van Moolenbroek 307*83ee113eSDavid van Moolenbroekif [ x$reason = xEXPIRE6 -o x$reason = xRELEASE6 -o x$reason = xSTOP6 ] ; then 308*83ee113eSDavid van Moolenbroek if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then 309*83ee113eSDavid van Moolenbroek exit_with_hooks 2; 310*83ee113eSDavid van Moolenbroek fi 311*83ee113eSDavid van Moolenbroek 312*83ee113eSDavid van Moolenbroek ${ip} -f inet6 addr del ${old_ip6_address}/${old_ip6_prefixlen} \ 313*83ee113eSDavid van Moolenbroek dev ${interface} 314*83ee113eSDavid van Moolenbroek 315*83ee113eSDavid van Moolenbroek exit_with_hooks 0 316*83ee113eSDavid van Moolenbroekfi 317*83ee113eSDavid van Moolenbroek 318*83ee113eSDavid van Moolenbroekexit_with_hooks 0 319