--- a/net/ip6rd.sh.orig 2021-05-01 10:02:07.979716992 +0200 +++ b/net/ip6rd.sh 2021-05-01 14:18:15.972098342 +0200 @@ -7,6 +7,7 @@ ip6rd_depend() { program ip + program ipv6calc after interface } @@ -58,17 +59,17 @@ fi for addr in ${addrs}; do # Strip the subnet - local ip="${addr%/*}" subnet="${addr#*/}" + local ip="${addr%/*}" subnet="$(_ip6rd_inet_get_network ${addr%/*} ${ipv4mask})" # We don't work on private IPv4 addresses if _ip6rd_inet_is_private_network "${ip}" then continue fi - local ip6= ip6_prefix="${prefix%::/*}" ip6_subnet="${prefix#*/}" - ip6_subnet=$((ip6_subnet + (32-ipv4mask))) - eval ip6="$(printf "${ip6_prefix}:%s::%s" \ - $(_ip6rd_prefix_shave_bits ${ip} ${ipv4mask}) ${suffix})" + local ip6 ip6_subnet + ip6=$(ipv6calc --in ipv4addr --out ipv6addr --action 6rd_local_prefix --6rd_prefix "${prefix}" --6rd_relay_prefix "${subnet}/${ipv4mask}" "${ip}") + ip6_subnet=${ip6#*/} + ip6=${ip6%/*} veinfo "Derived IPv6 address: ${ip6}" # Now apply our IPv6 address to our config @@ -90,11 +91,11 @@ if [ "${IFACE}" != "sit0" ]; then _tunnel add "${IFACE}" mode sit ttl 255 remote any local "${localip}" fi - _tunnel 6rd dev "${IFACE}" 6rd-prefix "${prefix}" + _tunnel 6rd dev "${IFACE}" 6rd-prefix "${prefix}" 6rd-relay_prefix "${subnet}/${ipv4mask}" eend $? || return 1 _up - routes_ip6rd="2003::/3 via ::${relay} metric 2147483647" + routes_ip6rd="::/0 via ::${relay} dev ${IFACE}" service_set_value "config_ip6rd_$IFVAR" "$config_ip6rd" service_set_value "routes_ip6rd_$IFVAR" "$routes_ip6rd" } @@ -143,9 +144,8 @@ _ip6rd_inet_get_network() { local a=$(_ip6rd_inet_atoi $1) - local net=$(( a & ( (1<<$2)-1 ) )) - local cidr=$(( 32 - $2 )) - echo $(_ip6rd_inet_itoa $(( (net << cidr ) )) ) + local net=$(( a & ( 0xffffffff << (32 - $2)) )) + echo $(_ip6rd_inet_itoa $net) } _ip6rd_inet_is_private_network()