X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=package%2Fnetwork%2Fipv6%2Fodhcp6c%2Ffiles%2Fdhcpv6.script;h=5a3b7ecba60773e7fa08ea2b97c3920d92521b93;hb=a9a0b62785b4cac88c8a1a6bf93b9b85ab510da8;hp=8f258f5c3757b88d11b8437a3c76859a21803f82;hpb=f0df2006af4b7d365c313f6028addc80467cb10f;p=librecmc%2Flibrecmc.git diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.script b/package/network/ipv6/odhcp6c/files/dhcpv6.script index 8f258f5c37..5a3b7ecba6 100755 --- a/package/network/ipv6/odhcp6c/files/dhcpv6.script +++ b/package/network/ipv6/odhcp6c/files/dhcpv6.script @@ -3,37 +3,19 @@ . /lib/functions.sh . /lib/netifd/netifd-proto.sh -ipv6_conf() { - echo "$3" > "/proc/sys/net/ipv6/conf/$1/$2" -} - -# RFC 6204 requires us to block forwarding until address acquisition is complete -ipv6_block_forwarding() { - ip6tables "-$2" forwarding_rule -o "$1" -j REJECT --reject-with no-route 2>/dev/null -} - -prepare_interface() { - local device="$1" - - ipv6_block_forwarding "$device" A - - ipv6_conf "$device" accept_ra 2 - ipv6_conf "$device" forwarding 2 -} - -cleanup_interface() { - local device="$1" - ipv6_conf "$device" accept_ra 1 - ipv6_conf "$device" forwarding 1 - ipv6_block_forwarding "$device" D -} - setup_interface () { local device="$1" - ipv6_block_forwarding "$device" D - proto_init_update "*" 1 + # Merge RA-DNS + for radns in $RA_DNS; do + local duplicate=0 + for dns in $RDNSS; do + [ "$radns" = "$dns" ] && duplicate=1 + done + [ "$duplicate" = 0 ] && RDNSS="$RDNSS $radns" + done + for dns in $RDNSS; do proto_add_dns_server "$dns" done @@ -46,8 +28,66 @@ setup_interface () { proto_add_ipv6_prefix "$prefix" done + [ -n "$USERPREFIX" ] && proto_add_ipv6_prefix "$USERPREFIX" + + # Merge addresses + for entry in $RA_ADDRESSES; do + local duplicate=0 + local addr="${entry%%/*}" + for dentry in $ADDRESSES; do + local daddr="${dentry%%/*}" + [ "$addr" = "$daddr" ] && duplicate=1 + done + [ "$duplicate" = "0" ] && ADDRESSES="$ADDRESSES $entry" + done + + for entry in $ADDRESSES; do + local addr="${entry%%/*}" + entry="${entry#*/}" + local mask="${entry%%,*}" + entry="${entry#*,}" + local preferred="${entry%%,*}" + entry="${entry#*,}" + local valid="${entry%%,*}" + + proto_add_ipv6_address "$addr" "$mask" "$preferred" "$valid" + done + + for entry in $RA_ROUTES; do + local addr="${entry%%/*}" + entry="${entry#*/}" + local mask="${entry%%,*}" + entry="${entry#*,}" + local gw="${entry%%,*}" + entry="${entry#*,}" + local valid="${entry%%,*}" + entry="${entry#*,}" + local metric="${entry%%,*}" + + if [ -z "$SOURCE_ROUTING" -o -z "$gw" ]; then + proto_add_ipv6_route "$addr" "$mask" "$gw" "$metric" "$valid" + else + proto_add_ipv6_route "$addr" "$mask" "$gw" "$metric" "$valid" "::/128" + for prefix in $PREFIXES $ADDRESSES; do + local paddr="${prefix%%,*}" + proto_add_ipv6_route "$addr" "$mask" "$gw" "$metric" "$valid" "$paddr" + done + fi + done + proto_send_update "$INTERFACE" + if [ -n "$AFTR_IP " -a -n "$IFACE_DSLITE" ]; then + json_init + json_add_string name "$IFACE_DSLITE" + json_add_string ifname "@$INTERFACE" + json_add_string proto "dslite" + json_add_string peeraddr "$AFTR_IP" + json_add_string tunlink "$INTERFACE" + json_close_object + ubus call network add_dynamic "$(json_dump)" + fi + # TODO: $SNTP_IP $SIP_IP $SNTP_FQDN $SIP_DOMAIN } @@ -57,16 +97,14 @@ teardown_interface() { } case "$2" in - started) - prepare_interface "$1" - ;; - stopped) - cleanup_interface "$1" + bound) + teardown_interface "$1" + setup_interface "$1" ;; - informed|bound|updated|rebound) + informed|updated|rebound|ra-updated) setup_interface "$1" ;; - unbound|timeout) + started|stopped|unbound) teardown_interface "$1" ;; esac