Ignore:
Timestamp:
2012-03-19T22:10:04+01:00 (5 years ago)
Author:
nbd
Message:

6in4: add netifd support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/6in4/files/6in4.sh

    r24022 r31036  
     1#!/bin/sh 
    12# 6in4.sh - IPv6-in-IPv4 tunnel backend 
    23# Copyright (c) 2010 OpenWrt.org 
     4 
     5[ -n "$INCLUDE_ONLY" ] || { 
     6        . /etc/functions.sh 
     7        . ../netifd-proto.sh 
     8        init_proto "$@" 
     9} 
    310 
    411find_6in4_wanif() { 
     
    2431} 
    2532 
    26 setup_interface_6in4() { 
    27         local iface="$1" 
    28         local cfg="$2" 
     33 
     34tun_error() { 
     35        local cfg="$1"; shift; 
     36 
     37        [ -n "$1" ] && proto_notify_error "$cfg" "$@" 
     38        proto_block_restart "$cfg" 
     39} 
     40 
     41proto_6in4_setup() { 
     42        local cfg="$1" 
     43        local iface="$2" 
    2944        local link="6in4-$cfg" 
    3045 
    31         local local4=$(uci_get network "$cfg" ipaddr) 
     46        json_get_var mtu mtu 
     47        json_get_var ttl ttl 
     48        json_get_var local4 ipaddr 
     49        json_get_var remote4 peeraddr 
     50        json_get_var ip6addr ip6addr 
     51        json_get_var tunnelid tunnelid 
     52        json_get_var username username 
     53        json_get_var password password 
    3254 
    33         local remote4 
    34         config_get remote4 "$cfg" peeraddr 
     55        [ -z "$ip6addr" -o -z "$remote4" ] && { 
     56                tun_error "$cfg" "MISSING_ADDRESS" 
     57                return 
     58        } 
    3559 
    36         local local6 
    37         config_get local6 "$cfg" ip6addr 
    38  
    39         local mtu 
    40         config_get mtu "$cfg" mtu 
    41  
    42         local ttl 
    43         config_get ttl "$cfg" ttl 
    44  
    45         local metric 
    46         config_get metric "$cfg" metric 
    47  
    48         local defaultroute 
    49         config_get_bool defaultroute "$cfg" defaultroute 1 
    50  
    51         # If local4 is unset, guess local IPv4 address from the 
    52         # interface used by the default route. 
    5360        [ -z "$local4" ] && { 
    5461                local wanif=$(find_6in4_wanif) 
    55                 [ -n "$wanif" ] && { 
    56                         local4=$(find_6in4_wanip "$wanif") 
    57                         uci_set_state network "$cfg" wan_device "$wanif" 
     62                [ -z "$wanif" ] && { 
     63                        tun_error "$cfg" "NO_WAN_LINK" 
     64                        return 
     65                } 
     66 
     67                . /lib/network/config.sh 
     68                local wancfg="$(find_config "$wanif")" 
     69                [ -z "$wancfg" ] && { 
     70                        tun_error "$cfg" "NO_WAN_LINK" 
     71                        return 
     72                } 
     73 
     74                # If local4 is unset, guess local IPv4 address from the 
     75                # interface used by the default route. 
     76                [ -n "$wanif" ] && local4=$(find_6in4_wanip "$wanif") 
     77 
     78                [ -z "$local4" ] && { 
     79                        tun_error "$cfg" "NO_WAN_LINK" 
     80                        return 
    5881                } 
    5982        } 
    6083 
    61         [ -n "$local4" ] && { 
    62                 # creating the tunnel below will trigger a net subsystem event 
    63                 # prevent it from touching or iface by disabling .auto here 
    64                 uci_set_state network "$cfg" ifname $link 
    65                 uci_set_state network "$cfg" auto 0 
     84        local local6="${ip6addr%%/*}" 
     85        local mask6="${ip6addr##*/}" 
     86        [[ "$local6" = "$mask6" ]] && mask6= 
    6687 
    67                 ip tunnel add $link mode sit remote $remote4 local $local4 ttl ${ttl:-64} 
    68                 ip link set $link up 
    69                 ip link set mtu ${mtu:-1280} dev $link 
    70                 ip addr add $local6 dev $link 
     88        proto_init_update "$link" 1 
     89        proto_add_ipv6_address "$local6" "$mask6" 
     90        proto_add_ipv6_route "::" 0 
    7191 
    72                 uci_set_state network "$cfg" ipaddr $local4 
    73                 uci_set_state network "$cfg" ip6addr $local6 
     92        proto_add_tunnel 
     93        json_add_string mode sit 
     94        json_add_int mtu "${mtu:-1280}" 
     95        json_add_int ttl "${ttl:-64}" 
     96        json_add_string local "$local4" 
     97        json_add_string remote "$remote4" 
     98        proto_close_tunnel 
    7499 
    75                 [ "$defaultroute" = 1 ] && { 
    76                         ip -6 route add ::/0 ${metric:+metric $metric} dev $link 
    77                         uci_set_state network "$cfg" defaultroute 1 
     100        proto_send_update "$cfg" 
     101 
     102        [ -n "$tunnelid" -a -n "$username" -a -n "$password" ] && { 
     103                [ "${#password}" == 32 -a -z "${password//[a-fA-F0-9]/}" ] || { 
     104                        password="$(echo -n "$password" | md5sum)"; password="${password%% *}" 
    78105                } 
    79106 
    80                 env -i ACTION="ifup" INTERFACE="$cfg" DEVICE="$link" PROTO=6in4 /sbin/hotplug-call "iface" & 
    81         } || { 
    82                 echo "Cannot determine local IPv4 address for 6in4 tunnel $cfg - skipping" 
     107                local url="http://ipv4.tunnelbroker.net/ipv4_end.php?ip=AUTO&apikey=$username&pass=$password&tid=$tunnelid" 
     108                local try=0 
     109                local max=3 
     110 
     111                while [ $((++try)) -le $max ]; do 
     112                        wget -qO/dev/null "$url" 2>/dev/null && break 
     113                        sleep 1 
     114                done 
    83115        } 
    84116} 
    85117 
    86 stop_interface_6in4() { 
     118proto_6in4_teardown() { 
    87119        local cfg="$1" 
    88         local link="6in4-$cfg" 
     120} 
    89121 
    90         local local6=$(uci_get_state network "$cfg" ip6addr) 
    91         local defaultroute=$(uci_get_state network "$cfg" defaultroute) 
     122proto_6in4_init_config() { 
     123        no_device=1              
     124        available=1 
    92125 
    93         grep -qs "^ *$link:" /proc/net/dev && { 
    94                 env -i ACTION="ifdown" INTERFACE="$cfg" DEVICE="$link" PROTO=6in4 /sbin/hotplug-call "iface" & 
     126        proto_config_add_string "ipaddr" 
     127        proto_config_add_string "ip6addr" 
     128        proto_config_add_string "peeraddr" 
     129        proto_config_add_string "tunnelid" 
     130        proto_config_add_string "username" 
     131        proto_config_add_string "password" 
     132        proto_config_add_int "mtu" 
     133        proto_config_add_int "ttl" 
     134} 
    95135 
    96                 [ "$defaultroute" = "1" ] && { 
    97                         ip -6 route del ::/0 dev $link 
    98                 } 
    99  
    100                 ip addr del $local6 dev $link 
    101                 ip link set $link down 
    102                 ip tunnel del $link 
    103         } 
     136[ -n "$INCLUDE_ONLY" ] || { 
     137        add_protocol 6in4 
    104138} 
Note: See TracChangeset for help on using the changeset viewer.