#!/bin/sh

echo "enter & execute dhcp6c-script"

DHCP6_FILE=/etc/dhcp6/dhcp6c_conf
RA_CONF_FILE=/etc/dhcp6/dhcp6c_radvd.conf
RESOLV_FILE=/etc/resolv.conf
PF_FILE=/etc/dhcp6/dhcp6c_pf

LAN_INF=br0
V6_WAN_MODE=$(nvram_get v6_wan_mode)

resolv_remove() {
  DHCLIENT6=/etc/resolv.conf.dhclient6
  cp $RESOLV_FILE $DHCLIENT6
  grep -Ev $1 $DHCLIENT6 > $RESOLV_FILE
}

make_resolv_conf() {
  if [ "$new_dhcp6_name_servers" ]; then
    if [ "$new_dhcp6_domain_search" ]; then
      resolv_remove ":|^search"     # remove search domain & IPv6 nameservers
      echo search $new_dhcp6_domain_search >> $RESOLV_FILE
    else
      resolv_remove ":"             # remove IPv6 nameservers
    fi

    for nameserver in $new_dhcp6_name_servers; do
      echo nameserver $nameserver >> $RESOLV_FILE
    done
  fi
}

exit_with_hook_radvd() {
  echo $1 > /tmp/dhcp6c_radvd
}

exit_with_hook_dhcp6s() {
  echo $1 > /tmp/dhcp6c_6s
}

###
### DHCPv6 Handlers
###

config_radvd() {
  new_max_life=$(cat $DHCP6_FILE | grep -m 1 [n]ew_max_life | awk '{print $2}')
  new_preferred_life=$(cat $DHCP6_FILE | grep -m 1 [n]ew_preferred_life | awk '{print $2}')
  default_life=$(nvram_get v6_radvd_lifetime)

  echo "interface $LAN_INF"  > $RA_CONF_FILE
  echo "{"  >> $RA_CONF_FILE
  echo "   AdvSendAdvert on;"  >> $RA_CONF_FILE
  if [ x${default_life} != x ]; then
    echo "   AdvDefaultLifetime $default_life;"  >> $RA_CONF_FILE
  fi
  echo "" >> $RA_CONF_FILE
  echo "   prefix $new_ip6_prefix_radvd"  >> $RA_CONF_FILE
  echo "   {"  >> $RA_CONF_FILE
  echo "     AdvOnLink on;"  >> $RA_CONF_FILE
  echo "     AdvAutonomous on;"  >> $RA_CONF_FILE

  if [ x${new_preferred_life} != x ]; then
    echo "     AdvPreferredLifetime $new_preferred_life;"  >> $RA_CONF_FILE
  fi

  if [ x${new_max_life} != x ]; then
    echo "     AdvValidLifetime $new_max_life;"  >> $RA_CONF_FILE
  fi

  echo "   };"  >> $RA_CONF_FILE

  echo "" >> $RA_CONF_FILE
  if [ "$new_dhcp6_name_servers" != "" ]; then
    echo "   RDNSS $new_dhcp6_name_servers"  >> $RA_CONF_FILE
    echo "   {"  >> $RA_CONF_FILE
    echo "   };"  >> $RA_CONF_FILE
  fi

  echo "};"  >> $RA_CONF_FILE
}

radvd() {
  radvd_pid=$(ps | grep -m 1 [r]advd | awk '{print $1}')
  if [ "$radvd_pid" != "" ]; then
    echo "enter radvd 1"
    if [ -f $RA_CONF_FILE ]; then
      old_ip6_prefix=$(cat $RA_CONF_FILE | grep -m 1 [p]refix | awk '{print $2}')

      if [ x${old_ip6_prefix} != x${new_ip6_prefix_radvd} ] ; then
        kill $radvd_pid
        config_radvd
        exit_with_hook_radvd 1
        #radvd -C $RA_CONF_FILE -m stderr_syslog -p /var/run/radvd.pid
      else
        exit_with_hook_radvd 0
      fi
    else
      kill $radvd_pid
      config_radvd
      exit_with_hook_radvd 1
      #radvd -C $RA_CONF_FILE -m stderr_syslog -p /var/run/radvd.pid
    fi
  else
    echo "enter radvd 2"
    config_radvd
    exit_with_hook_radvd 1
    #radvd -C $RA_CONF_FILE -m stderr_syslog -p /var/run/radvd.pid
  fi
}

echo "DHCPv6 Handlers: x$reason"

if [ x${new_ip6_prefix} != x ] ; then
  echo Prefix ${reason} new=${new_ip6_prefix}
fi

if [ -f $PF_FILE ] ; then
  new_ip6_prefix_radvd=$(cat $PF_FILE | grep -m 1 "$LAN_INF-prefix" | awk '{print $2}')
fi

if [ x$reason = xBOUND6 ]; then
  if [ x${new_ip6_address} != x ] && [ x${new_ip6_prefixlen} != x ] ; then
    ifconfig ${interface} inet6 ${new_ip6_address}/${new_ip6_prefixlen} alias
  fi

  # Check for nameserver options.
  make_resolv_conf

  if [ x${new_ip6_prefix} != x ] ; then
    # check radvd config
    radvd
  fi

  if [ "$V6_WAN_MODE" != "4" ] ; then   # not PPP mode
    ip -6 route del 2000::/3 2>/dev/null
    ip -6 route add 2000::/3 dev eth2.2
  fi

elif [ x$reason = xRELEASE6 ]; then
  proc_radvd=$(ps | grep radvd | grep $RA_CONF_FILE)
  if [ "$proc_radvd" != "" ]; then
    killall radvd
  fi
fi

