# # dhclient-6rd by Nathan Lutchansky for Ubuntu 10.04 # # Any possessor of a copy of this program may treat it as if it # were in the public domain. I waive all rights. # # Last modified 2010-06-28 # # # ************************* Installation Instructions ************************* # # Place this script in /etc/dhcp3/dhclient-exit-hooks.d to log the 6RD # parameters from the DHCP server to syslog. # # You must edit /etc/dhcp3/dhclient.conf to add the option-6rd definition: # # option option-6rd code 212 = { integer 8, integer 8, integer 16, integer 16, # integer 16, integer 16, integer 16, integer 16, # integer 16, integer 16, array of ip-address }; # # In the same file you must also add option-6rd to the "request" list. # # ***************************************************************************** # log_6rd() { if [ -z "$new_option_6rd" ]; then logger -p daemon.info -t dhclient-6rd "no 6RD parameters available" return fi srd_vals=(${new_option_6rd}) srd_masklen=${srd_vals[0]} srd_prefixlen=${srd_vals[1]} srd_prefix="`printf "%x:%x:%x:%x:%x:%x:%x:%x" ${srd_vals[@]:2:8} | sed -E s/\(:0\)+$/::/`" srd_braddr=${srd_vals[10]} ipsep=(${new_ip_address//\./ }) if (( srd_masklen==0 )); then logger -p daemon.info -t dhclient-6rd "6RD parameters: 6rd-prefix ${srd_prefix}/${srd_prefixlen} br ${srd_braddr}" return elif (( srd_masklen <= 8 )); then masked=$((${ipsep[0]} & ~((1 << (8 - srd_masklen)) - 1))) srd_relayprefix=${masked}.0.0.0 elif (( srd_masklen <= 16 )); then masked=$((${ipsep[1]} & ~((1 << (16 - srd_masklen)) - 1))) srd_relayprefix=${ipsep[0]}.${masked}.0.0 elif (( srd_masklen <= 24 )); then masked=$((${ipsep[2]} & ~((1 << (24 - srd_masklen)) - 1))) srd_relayprefix=${ipsep[0]}.${ipsep[1]}.${masked}.0 elif (( srd_masklen <= 32 )); then masked=$((${ipsep[3]} & ~((1 << (32 - srd_masklen)) - 1))) srd_relayprefix=${ipsep[0]}.${ipsep[1]}.${ipsep[2]}.${masked} else logger -p daemon.info -t dhclient-6rd "invalid IPv4MaskLen $srd_masklen" return fi logger -p daemon.info -t dhclient-6rd "6RD parameters: 6rd-prefix ${srd_prefix}/${srd_prefixlen} 6rd-relay_prefix ${srd_relayprefix}/${srd_masklen} br ${srd_braddr}" } case $reason in BOUND|RENEW|REBIND|REBOOT) log_6rd ;; esac