1#!/bin/sh 2# 6to4.sh - IPv6-in-IPv4 tunnel backend 3# Copyright (c) 2010-2012 OpenWrt.org 4 5[ -n "$INCLUDE_ONLY" ] || { 6 . /lib/functions.sh 7 . /lib/functions/network.sh 8 . ../netifd-proto.sh 9 init_proto "$@" 10} 11 12find_6to4_prefix() { 13 local ip4="$1" 14 local oIFS="$IFS"; IFS="."; set -- $ip4; IFS="$oIFS" 15 16 printf "2002:%02x%02x:%02x%02x\n" $1 $2 $3 $4 17} 18 19test_6to4_rfc1918() 20{ 21 local oIFS="$IFS"; IFS="."; set -- $1; IFS="$oIFS" 22 [ $1 -eq 10 ] && return 0 23 [ $1 -eq 192 ] && [ $2 -eq 168 ] && return 0 24 [ $1 -eq 172 ] && [ $2 -ge 16 ] && [ $2 -le 31 ] && return 0 25 26 # RFC 6598 27 [ $1 -eq 100 ] && [ $2 -ge 64 ] && [ $2 -le 127 ] && return 0 28 29 return 1 30} 31 32proto_6to4_setup() { 33 local cfg="$1" 34 local iface="$2" 35 local link="6to4-$cfg" 36 37 local mtu ttl tos ipaddr 38 json_get_vars mtu ttl tos ipaddr 39 40 ( proto_add_host_dependency "$cfg" 0.0.0.0 ) 41 42 local wanif 43 if ! network_find_wan wanif; then 44 proto_notify_error "$cfg" "NO_WAN_LINK" 45 return 46 fi 47 48 [ -z "$ipaddr" ] && { 49 if ! network_get_ipaddr ipaddr "$wanif"; then 50 proto_notify_error "$cfg" "NO_WAN_ADDRESS" 51 return 52 fi 53 } 54 55 test_6to4_rfc1918 "$ipaddr" && { 56 proto_notify_error "$cfg" "INVALID_LOCAL_ADDRESS" 57 return 58 } 59 60 # find our local prefix 61 local prefix6=$(find_6to4_prefix "$ipaddr") 62 local local6="$prefix6::1" 63 64 proto_init_update "$link" 1 65 proto_add_ipv6_address "$local6" 16 66 proto_add_ipv6_prefix "$prefix6::/48" 67 68 proto_add_ipv6_route "::" 0 "::192.88.99.1" "" "" "$local6/16" 69 proto_add_ipv6_route "::" 0 "::192.88.99.1" "" "" "$prefix6::/48" 70 71 proto_add_tunnel 72 json_add_string mode sit 73 json_add_int mtu "${mtu:-1280}" 74 json_add_int ttl "${ttl:-64}" 75 [ -n "$tos" ] && json_add_string tos "$tos" 76 json_add_string local "$ipaddr" 77 proto_close_tunnel 78 79 proto_send_update "$cfg" 80} 81 82proto_6to4_teardown() { 83 local cfg="$1" 84} 85 86proto_6to4_init_config() { 87 no_device=1 88 available=1 89 90 proto_config_add_string "ipaddr" 91 proto_config_add_int "mtu" 92 proto_config_add_int "ttl" 93 proto_config_add_string "tos" 94} 95 96[ -n "$INCLUDE_ONLY" ] || { 97 add_protocol 6to4 98} 99