Changeset 30949 for trunk


Ignore:
Timestamp:
2012-03-15T10:49:33+01:00 (4 years ago)
Author:
nbd
Message:

6to4: add netifd support

Location:
trunk/package/6to4
Files:
1 added
3 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/package/6to4/Makefile

    r28223 r30949  
    3535endef 
    3636 
    37 define Package/6to4/install 
    38         $(INSTALL_DIR) $(1)/lib/network 
    39         $(INSTALL_DATA) ./files/6to4.sh $(1)/lib/network/6to4.sh 
     37ifneq ($(CONFIG_PACKAGE_netifd),) 
     38  define Package/6to4/install 
     39        $(INSTALL_DIR) $(1)/lib/netifd/proto 
     40        $(INSTALL_BIN) ./files/6to4.sh $(1)/lib/netifd/proto/6to4.sh 
    4041        $(INSTALL_DIR) $(1)/etc/hotplug.d/iface 
    4142        $(INSTALL_DATA) ./files/6to4.hotplug $(1)/etc/hotplug.d/iface/91-6to4 
    42 endef 
     43  endef 
     44else 
     45  define Package/6to4/install 
     46        $(INSTALL_DIR) $(1)/lib/network 
     47        $(INSTALL_DATA) ./files.old/6to4.sh $(1)/lib/network/6to4.sh 
     48        $(INSTALL_DIR) $(1)/etc/hotplug.d/iface 
     49        $(INSTALL_DATA) ./files.old/6to4.hotplug $(1)/etc/hotplug.d/iface/91-6to4 
     50  endef 
     51endif 
    4352 
    4453$(eval $(call BuildPackage,6to4)) 
  • trunk/package/6to4/files/6to4.hotplug

    r27449 r30949  
    33if [ "$ACTION" = ifup ]; then 
    44        . /etc/functions.sh 
     5 
     6        INCLUDE_ONLY=1 
     7        . /lib/netifd/proto/6to4.sh 
    58 
    69        include /lib/network 
     
    2023                local wanip=$(find_6to4_wanip "$wandev") 
    2124 
    22                 [ -n "$wanip" ] && { 
    23                         lsmod | grep -q ^sit || { 
    24                                 logger -t 6to4 "Tunneling driver not loaded yet, deferring action" 
    25                                 exit 0 
    26                         } 
    27  
    28                         uci_set_state network "$cfg" ipaddr "$wanip" 
    29                         ( ifup "$cfg" )& 
    30                 } 
     25                [ -n "$wanip" ] && ifup "$cfg" 
    3126        } 
    3227 
  • trunk/package/6to4/files/6to4.sh

    r28223 r30949  
     1#!/bin/sh 
    12# 6to4.sh - IPv6-in-IPv4 tunnel backend 
    2 # Copyright (c) 2010-2011 OpenWrt.org 
     3# Copyright (c) 2010-2012 OpenWrt.org 
     4 
     5[ -n "$INCLUDE_ONLY" ] || { 
     6        . /etc/functions.sh 
     7        . ../netifd-proto.sh 
     8        init_proto "$@" 
     9} 
    310 
    411find_6to4_wanif() { 
     
    97104} 
    98105 
    99  
    100 # Hook into scan_interfaces() to synthesize a .device option 
    101 # This is needed for /sbin/ifup to properly dispatch control 
    102 # to setup_interface_6to4() even if no .ifname is set in 
    103 # the configuration. 
    104 scan_6to4() { 
    105         config_set "$1" device "6to4-$1" 
    106 } 
    107  
    108 coldplug_interface_6to4() { 
    109         setup_interface_6to4 "6to4-$1" "$1" 
    110 } 
    111  
    112 setup_interface_6to4() { 
    113         local iface="$1" 
    114         local cfg="$2" 
     106tun_error() { 
     107        local cfg="$1"; shift; 
     108 
     109        [ -n "$1" ] && proto_notify_error "$cfg" "$@" 
     110        proto_block_restart "$cfg" 
     111} 
     112 
     113proto_6to4_setup() { 
     114        local cfg="$1" 
     115        local iface="$2" 
    115116        local link="6to4-$cfg" 
    116117 
    117         local local4=$(uci_get network "$cfg" ipaddr) 
    118  
    119         local mtu 
    120         config_get mtu "$cfg" mtu 
    121  
    122         local ttl 
    123         config_get ttl "$cfg" ttl 
    124  
    125         local metric 
    126         config_get metric "$cfg" metric 
    127  
    128         local defaultroute 
    129         config_get_bool defaultroute "$cfg" defaultroute 1 
     118        json_get_var mtu mtu 
     119        json_get_var ttl ttl 
     120        json_get_var local4 ipaddr 
     121 
     122        json_get_var adv_subnet adv_subnet 
     123        json_get_var adv_interface adv_interface 
     124        json_get_var adv_valid_lifetime adv_valid_lifetime 
     125        json_get_var adv_preferred_lifetime adv_preferred_lifetime 
    130126 
    131127        local wanif=$(find_6to4_wanif) 
    132128        [ -z "$wanif" ] && { 
    133                 logger -t "$link" "Cannot find wan interface - aborting" 
    134                 return 
    135         } 
    136  
    137         local wancfg=$(find_config "$wanif") 
     129                tun_error "NO_WAN_LINK" 
     130                return 
     131        } 
     132 
     133        . /lib/network/config.sh 
     134        local wancfg="$(find_config "$wanif")" 
    138135        [ -z "$wancfg" ] && { 
    139                 logger -t "$link" "Cannot find wan network - aborting" 
     136                tun_error "NO_WAN_LINK" 
    140137                return 
    141138        } 
     
    144141        # interface used by the default route. 
    145142        [ -z "$local4" ] && { 
    146                 [ -n "$wanif" ] && { 
    147                         local4=$(find_6to4_wanip "$wanif") 
    148                         uci_set_state network "$cfg" wan_device "$wanif" 
    149                 } 
     143                [ -n "$wanif" ] && local4=$(find_6to4_wanip "$wanif") 
     144        } 
     145 
     146        [ -z "$local4" ] && { 
     147                tun_error "NO_WAN_LINK" 
     148                return 
    150149        } 
    151150 
    152151        test_6to4_rfc1918 "$local4" && { 
    153                 logger -t "$link" "Local wan ip $local4 is private - aborting" 
    154                 return 
    155         } 
    156  
    157         [ -n "$local4" ] && { 
    158                 logger -t "$link" "Starting ..." 
    159  
    160                 # creating the tunnel below will trigger a net subsystem event 
    161                 # prevent it from touching or iface by disabling .auto here 
    162                 uci_set_state network "$cfg" ifname $link 
    163                 uci_set_state network "$cfg" auto 0 
    164  
    165                 # find our local prefix 
    166                 local prefix6=$(find_6to4_prefix "$local4") 
    167                 local local6="$prefix6::1/16" 
    168  
    169                 logger -t "$link" " * IPv4 address is $local4" 
    170                 logger -t "$link" " * IPv6 address is $local6" 
    171                 ip tunnel add $link mode sit remote any local $local4 ttl ${ttl:-64} 
    172                 ip link set $link up 
    173                 ip link set mtu ${mtu:-1280} dev $link 
    174                 ip addr add $local6 dev $link 
    175  
    176                 uci_set_state network "$cfg" ipaddr $local4 
    177                 uci_set_state network "$cfg" ip6addr $local6 
    178  
    179                 [ "$defaultroute" = 1 ] && { 
    180                         logger -t "$link" " * Adding default route" 
    181                         ip -6 route add ::/0 via ::192.88.99.1 metric ${metric:-1} dev $link 
    182                         uci_set_state network "$cfg" defaultroute 1 
    183                 } 
    184  
    185                 [ -f /etc/config/radvd ] && /etc/init.d/radvd enabled && { 
    186                         local sid="6to4_$cfg" 
    187  
    188                         uci_revert_state radvd 
    189                         config_load radvd 
    190  
    191                         # find delegation target 
    192                         local adv_interface 
    193                         config_get adv_interface "$cfg" adv_interface 
    194  
    195                         local adv_subnet=$(uci_get network "$cfg" adv_subnet) 
    196                               adv_subnet=$((0x${adv_subnet:-1})) 
    197  
    198                         local adv_subnets="" 
    199  
    200                         for adv_interface in ${adv_interface:-lan}; do 
    201                                 local adv_ifname 
    202                                 config_get adv_ifname "${adv_interface:-lan}" ifname 
    203  
    204                                 grep -qs "^ *$adv_ifname:" /proc/net/dev && { 
    205                                         local adv_valid_lifetime adv_preferred_lifetime 
    206                                         config_get adv_valid_lifetime     "$cfg" adv_valid_lifetime 
    207                                         config_get adv_preferred_lifetime "$cfg" adv_preferred_lifetime 
    208  
    209                                         local subnet6="$(printf "%s:%x::1/64" "$prefix6" $adv_subnet)" 
    210  
    211                                         logger -t "$link" " * Advertising IPv6 subnet $subnet6 on ${adv_interface:-lan} ($adv_ifname)" 
    212                                         ip -6 addr add $subnet6 dev $adv_ifname 
    213  
    214                                         set_6to4_radvd_interface "$sid" "$adv_interface" "$mtu" 
    215                                         set_6to4_radvd_prefix    "$sid" "$adv_interface" \ 
    216                                                 "$wancfg" "$(printf "0:0:0:%x::/64" $adv_subnet)" \ 
    217                                                 "$adv_valid_lifetime" "$adv_preferred_lifetime" 
    218  
    219                                         adv_subnets="${adv_subnets:+$adv_subnets }$adv_ifname:$subnet6" 
    220                                         adv_subnet=$(($adv_subnet + 1)) 
    221                                 } 
    222                         done 
    223  
    224                         uci_set_state network "$cfg" adv_subnets "$adv_subnets" 
    225  
    226                         /etc/init.d/radvd restart 
    227                 } 
    228  
    229                 logger -t "$link" "... started" 
    230  
    231                 env -i ACTION="ifup" INTERFACE="$cfg" DEVICE="$link" PROTO=6to4 /sbin/hotplug-call "iface" & 
    232         } || { 
    233                 echo "Cannot determine local IPv4 address for 6to4 tunnel $cfg - skipping" 
    234         } 
    235 } 
    236  
    237 stop_interface_6to4() { 
     152                tun_error "INVALID_LOCAL_ADDRESS" 
     153                return 
     154        } 
     155 
     156        # find our local prefix 
     157        local prefix6=$(find_6to4_prefix "$local4") 
     158        local local6="$prefix6::1" 
     159 
     160        proto_init_update "$link" 1 
     161        proto_add_ipv6_address "$local6" 16 
     162        proto_add_ipv6_route "::" 0 
     163 
     164        proto_add_tunnel 
     165        json_add_string mode sit 
     166        json_add_int mtu "${mtu:-1280}" 
     167        json_add_int ttl "${ttl:-64}" 
     168        json_add_string local "$local4" 
     169        json_add_string remote "192.88.99.1" 
     170        proto_close_tunnel 
     171 
     172        proto_send_update "$cfg" 
     173 
     174        [ -f /etc/config/radvd ] && /etc/init.d/radvd enabled && { 
     175                local sid="6to4_$cfg" 
     176 
     177                uci_revert_state radvd 
     178                config_load radvd 
     179 
     180                adv_subnet=$((0x${adv_subnet:-1})) 
     181 
     182                local adv_subnets="" 
     183 
     184                for adv_interface in ${adv_interface:-lan}; do 
     185                        local adv_ifname 
     186                        config_get adv_ifname "${adv_interface:-lan}" ifname 
     187 
     188                        grep -qs "^ *$adv_ifname:" /proc/net/dev && { 
     189                                local subnet6="$(printf "%s:%x::1/64" "$prefix6" $adv_subnet)" 
     190 
     191                                logger -t "$link" " * Advertising IPv6 subnet $subnet6 on ${adv_interface:-lan} ($adv_ifname)" 
     192                                ip -6 addr add $subnet6 dev $adv_ifname 
     193 
     194                                set_6to4_radvd_interface "$sid" "$adv_interface" "$mtu" 
     195                                set_6to4_radvd_prefix    "$sid" "$adv_interface" \ 
     196                                        "$wancfg" "$(printf "0:0:0:%x::/64" $adv_subnet)" \ 
     197                                        "$adv_valid_lifetime" "$adv_preferred_lifetime" 
     198 
     199                                adv_subnets="${adv_subnets:+$adv_subnets }$adv_ifname:$subnet6" 
     200                                adv_subnet=$(($adv_subnet + 1)) 
     201                        } 
     202                done 
     203 
     204                uci_set_state network "$cfg" adv_subnets "$adv_subnets" 
     205 
     206                /etc/init.d/radvd restart 
     207        } 
     208} 
     209 
     210proto_6to4_teardown() { 
    238211        local cfg="$1" 
    239212        local link="6to4-$cfg" 
    240213 
    241         local local6=$(uci_get_state network "$cfg" ip6addr) 
    242         local defaultroute=$(uci_get_state network "$cfg" defaultroute) 
    243  
    244214        local adv_subnets=$(uci_get_state network "$cfg" adv_subnets) 
    245215 
    246216        grep -qs "^ *$link:" /proc/net/dev && { 
    247                 logger -t "$link" "Shutting down ..." 
    248                 env -i ACTION="ifdown" INTERFACE="$cfg" DEVICE="$link" PROTO=6to4 /sbin/hotplug-call "iface" & 
    249  
    250217                [ -n "$adv_subnets" ] && { 
    251218                        uci_revert_state radvd 
    252219                        /etc/init.d/radvd enabled && /etc/init.d/radvd restart 
    253  
    254                         local adv_subnet 
    255                         for adv_subnet in $adv_subnets; do 
    256                                 local ifname="${adv_subnet%%:*}" 
    257                                 local subnet="${adv_subnet#*:}" 
    258  
    259                                 logger -t "$link" " * Removing IPv6 subnet $subnet from interface $ifname" 
    260                                 ip -6 addr del $subnet dev $ifname 
    261                         done 
    262220                } 
    263  
    264                 [ "$defaultroute" = "1" ] && \ 
    265                         ip -6 route del ::/0 via ::192.88.99.1 dev $link 
    266  
    267                 ip addr del $local6 dev $link 
    268                 ip link set $link down 
    269                 ip tunnel del $link 
    270  
    271                 logger -t "$link" "... stopped" 
    272         } 
    273 } 
     221        } 
     222} 
     223 
     224proto_6to4_init_config() { 
     225        no_device=1              
     226        available=1 
     227 
     228        proto_config_add_string "ipaddr" 
     229        proto_config_add_int "mtu" 
     230        proto_config_add_int "ttl" 
     231        proto_config_add_string "adv_interface" 
     232        proto_config_add_string "adv_subnet" 
     233        proto_config_add_int "adv_valid_lifetime" 
     234        proto_config_add_int "adv_preferred_lifetime" 
     235} 
     236 
     237[ -n "$INCLUDE_ONLY" ] || { 
     238        add_protocol 6to4 
     239} 
Note: See TracChangeset for help on using the changeset viewer.