X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=package%2Fnetwork%2Fipv6%2Fodhcp6c%2Ffiles%2Fdhcpv6.script;h=5a3b7ecba60773e7fa08ea2b97c3920d92521b93;hb=a9a0b62785b4cac88c8a1a6bf93b9b85ab510da8;hp=f2161c23394a1648e0b0d1c3e00508a36474d801;hpb=e964fa5d8f49edc5e731a82b1600313369b0ecaf;p=librecmc%2Flibrecmc.git diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.script b/package/network/ipv6/odhcp6c/files/dhcpv6.script index f2161c2339..5a3b7ecba6 100755 --- a/package/network/ipv6/odhcp6c/files/dhcpv6.script +++ b/package/network/ipv6/odhcp6c/files/dhcpv6.script @@ -3,35 +3,19 @@ . /lib/functions.sh . /lib/netifd/netifd-proto.sh -ipv6_conf() { - echo "$3" > "/proc/sys/net/ipv6/conf/$1/$2" -} - -prepare_interface() { - local device="$1" - ipv6_conf "$device" accept_ra 2 - ipv6_conf "$device" forwarding 2 - - # Send RS - if [ -x /usr/sbin/6relayd ]; then - sleep 1 - /usr/sbin/6relayd -s "$device" - sleep 4 - /usr/sbin/6relayd -s "$device" - fi - -} - -cleanup_interface() { - local device="$1" - ipv6_conf "$device" accept_ra 1 - ipv6_conf "$device" forwarding 1 -} - setup_interface () { local device="$1" 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 @@ -44,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 } @@ -55,12 +97,14 @@ teardown_interface() { } case "$2" in - informed|bound|updated|rebound) + bound) + teardown_interface "$1" + setup_interface "$1" + ;; + informed|updated|rebound|ra-updated) setup_interface "$1" - prepare_interface "$1" ;; started|stopped|unbound) - cleanup_interface "$1" teardown_interface "$1" ;; esac