| #!/bin/sh |
| # para 1 add/del/bypass --- para 2&3&4 needed only in add |
| # para 2 cid --- translate specific skb from v4 to v6 |
| # para 3 local v4 addr --- default is 192.0.0.1/32 if not assign |
| # para 4 remote v6 prefix --- default is 64:ff9b::/96 if not assign |
| |
| network_cfg() { |
| if [ "$PIPE" == "1" ]; then |
| uci set network.lan.ipaddr=$gw |
| uci set network.lan.netmask=255.255.255.0 |
| uci commit network |
| /etc/init.d/network reload |
| option=`uci get dhcp.lan.dhcp_option` |
| for i in $option |
| do |
| uci del_list dhcp.lan.dhcp_option="$i" |
| done |
| uci set dhcp.lan.start=$host |
| uci set dhcp.lan.limit=1 |
| uci add_list dhcp.lan.dhcp_option=3,$gw |
| uci add_list dhcp.lan.dhcp_option=6,8.8.8.8,114.114.114.114 |
| uci add_list dhcp.lan.dhcp_option=1,255.255.255.0 |
| uci commit dhcp |
| /etc/init.d/dnsmasq reload |
| else |
| ifconfig $iface $ipaddr |
| ip route add default dev $iface |
| fi |
| } |
| |
| if [ -d /sys/kernel/debug/tel/psd/data-pathv1 ]; then |
| psd_ver=data-pathv1 |
| elif [ -d /sys/kernel/debug/tel/psd/data-pathv3 ]; then |
| psd_ver=data-pathv3 |
| else |
| echo "464xlat:wrong datapath version" > /dev/kmsg |
| exit 0 |
| fi |
| |
| if [ $1 == "del" ]; then |
| echo del nat46 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control |
| exit 0 |
| fi |
| |
| if [ $1 == "bypass" ]; then |
| echo 1 > /sys/kernel/debug/tel/psd/$psd_ver/bypass_nat46 |
| exit 0 |
| fi |
| |
| [ $1 == "add" ] || exit 0 |
| |
| if [ -z $3 ]; then |
| ipaddr=192.0.0.1 |
| else |
| ipaddr=$3 |
| fi |
| |
| if [ -z $4 ]; then |
| remote=64:ff9b::/96 |
| else |
| remote=$4 |
| fi |
| |
| iface=ccinet$2 |
| |
| PIPE=`uci get cmdline.PIPE 2> /dev/null` |
| if [ "$PIPE" == "1" ]; then |
| host=`echo $ipaddr | awk -F "." '{print $4}'` |
| gw_host=$((255 - $((host)) )) |
| net=`echo $ipaddr | awk '{split($ipaddr, a, "."); print a[1]"."a[2]"."a[3]}'` |
| gw=$net.$gw_host |
| network_cfg |
| echo "464xlat:ver=$psd_ver,cid=$2,local.v4=$ipaddr,remote.v6=$remote,pipe=$PIPE" > /dev/kmsg |
| local_v6=`cat /sys/kernel/mpipe/devices/$iface/gb6addr` |
| echo $ipaddr > /sys/kernel/mpipe/devices/$iface/ipaddr |
| echo 1 > /sys/kernel/mpipe/devices/$iface/up |
| else |
| PIPE=0 |
| network_cfg |
| local_v6=`ifconfig ccinet0 | grep Global | awk '{print $3}' | awk -F "/" '{print $1}'` |
| echo "464xlat:ver=$psd_ver,cid=$2,local.v4=$ipaddr,remote.v6=$remote,pipe=$PIPE" > /dev/kmsg |
| fi |
| |
| echo add nat46 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control |
| echo config nat46 local.v4 $ipaddr/32 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control |
| echo config nat46 local.v6 $local_v6/96 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control |
| echo config nat46 local.style RFC6052 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control |
| echo config nat46 remote.v6 $remote | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control |
| echo config nat46 remote.style RFC6052 | tee /sys/kernel/debug/tel/psd/$psd_ver/nat46_control |
| |