system-linux: fix PATH_MAX undeclared compilation error
[oweals/netifd.git] / scripts / netifd-proto.sh
index 9f062d8a0c4495667e2c996b0e597bd52ba1bd5d..87d337df07e9aa94b80ea53d050eadde791739d9 100644 (file)
@@ -1,4 +1,5 @@
 NETIFD_MAIN_DIR="${NETIFD_MAIN_DIR:-/lib/netifd}"
+PROTO_DEFAULT_OPTIONS="defaultroute peerdns metric"
 
 . /usr/share/libubox/jshn.sh
 . $NETIFD_MAIN_DIR/utils.sh
@@ -15,11 +16,32 @@ proto_config_add_boolean() {
        config_add_boolean "$@"
 }
 
+proto_config_add_array() {
+       config_add_array "$@"
+}
+
+proto_config_add_defaults() {
+       proto_config_add_boolean "defaultroute"
+       proto_config_add_boolean "peerdns"
+       proto_config_add_int "metric"
+}
+
+proto_add_dynamic_defaults() {
+       [ -n "$defaultroute" ] && json_add_boolean defaultroute "$defaultroute"
+       [ -n "$peerdns" ] && json_add_boolean peerdns "$peerdns"
+       [ -n "$metric" ] && json_add_int metric "$metric"
+}
+
 _proto_do_teardown() {
        json_load "$data"
        eval "proto_$1_teardown \"$interface\" \"$ifname\""
 }
 
+_proto_do_renew() {
+       json_load "$data"
+       eval "proto_$1_renew \"$interface\" \"$ifname\""
+}
+
 _proto_do_setup() {
        json_load "$data"
        _EXPORT_VAR=0
@@ -42,6 +64,8 @@ proto_init_update() {
        PROTO_PREFIX6=
        PROTO_DNS=
        PROTO_DNS_SEARCH=
+       PROTO_NEIGHBOR=
+       PROTO_NEIGHBOR6=
        json_init
        json_add_int action 0
        [ -n "$ifname" -a "*" != "$ifname" ] && json_add_string "ifname" "$ifname"
@@ -106,16 +130,36 @@ proto_add_ipv6_address() {
        local preferred="$3"
        local valid="$4"
        local offlink="$5"
+       local class="$6"
+
+       append PROTO_IP6ADDR "$address/$mask/$preferred/$valid/$offlink/$class"
+}
+
+proto_add_ipv4_neighbor(){
+       local address="$1"
+       local mac="$2"
+       local proxy="$3"
 
-       append PROTO_IP6ADDR "$address/$mask/$preferred/$valid/$offlink"
+       append PROTO_NEIGHBOR "$address/$mac/$proxy"
+}
+
+proto_add_ipv6_neighbor(){
+       local address="$1"
+       local mac="$2"
+       local proxy="$3"
+       local router="$4"
+
+       append PROTO_NEIGHBOR6 "$address/$mac/$proxy/$router"
 }
 
 proto_add_ipv4_route() {
        local target="$1"
        local mask="$2"
        local gw="$3"
+       local source="$4"
+       local metric="$5"
 
-       append PROTO_ROUTE "$target/$mask/$gw//"
+       append PROTO_ROUTE "$target/$mask/$gw/$metric///$source"
 }
 
 proto_add_ipv6_route() {
@@ -125,8 +169,9 @@ proto_add_ipv6_route() {
        local metric="$4"
        local valid="$5"
        local source="$6"
+       local table="$7"
 
-       append PROTO_ROUTE6 "$target/$mask/$gw/$metric/$valid/$source"
+       append PROTO_ROUTE6 "$target/$mask/$gw/$metric/$valid/$table/$source"
 }
 
 proto_add_ipv6_prefix() {
@@ -175,6 +220,8 @@ _proto_push_ipv6_addr() {
        valid="${str%%/*}"
        str="${str#*/}"
        offlink="${str%%/*}"
+       str="${str#*/}"
+       class="${str%%/*}"
 
        json_add_object ""
        json_add_string ipaddr "$address"
@@ -182,6 +229,7 @@ _proto_push_ipv6_addr() {
        [ -n "$preferred" ] && json_add_int preferred "$preferred"
        [ -n "$valid" ] && json_add_int valid "$valid"
        [ -n "$offlink" ] && json_add_boolean offlink "$offlink"
+       [ -n "$class" ] && json_add_string class "$class"
        json_close_object
 }
 
@@ -189,6 +237,43 @@ _proto_push_string() {
        json_add_string "" "$1"
 }
 
+_proto_push_ipv4_neighbor(){
+       local str="$1"
+       local address mac proxy
+
+       address="${str%%/*}"
+       str="${str#*/}"
+       mac="${str%%/*}"
+       str="${str#*/}"
+       proxy="${str%%/*}"
+
+       json_add_object ""
+       json_add_string ipaddr "$address"
+       [ -n "$mac" ] && json_add_string mac "$mac"
+       [ -n "$proxy" ] && json_add_boolean proxy "$proxy"
+       json_close_object
+}
+
+_proto_push_ipv6_neighbor(){
+       local str="$1"
+       local address mac proxy router
+
+       address="${str%%/*}"
+       str="${str#*/}"
+       mac="${str%%/*}"
+       str="${str#*/}"
+       proxy="${str%%/*}"
+       str="${str#*/}"
+       router="${str%%/*}"
+
+       json_add_object ""
+       json_add_string ipaddr "$address"
+       [ -n "$mac" ] && json_add_string mac "$mac"
+       [ -n "$proxy" ] && json_add_boolean proxy "$proxy"
+       [ -n "$router" ] && json_add_boolean router "$router"
+       json_close_object
+}
+
 _proto_push_route() {
        local str="$1";
        local target="${str%%/*}"
@@ -201,6 +286,8 @@ _proto_push_route() {
        str="${str#*/}"
        local valid="${str%%/*}"
        str="${str#*/}"
+       local table="${str%%/*}"
+       str="${str#*/}"
        local source="${str}"
 
        json_add_object ""
@@ -210,6 +297,7 @@ _proto_push_route() {
        [ -n "$metric" ] && json_add_int metric "$metric"
        [ -n "$valid" ] && json_add_int valid "$valid"
        [ -n "$source" ] && json_add_string source "$source"
+       [ -n "$table" ] && json_add_string table "$table"
        json_close_object
 }
 
@@ -245,6 +333,8 @@ proto_send_update() {
        _proto_push_array "ip6prefix" "$PROTO_PREFIX6" _proto_push_string
        _proto_push_array "dns" "$PROTO_DNS" _proto_push_string
        _proto_push_array "dns_search" "$PROTO_DNS_SEARCH" _proto_push_string
+       _proto_push_array "neighbor" "$PROTO_NEIGHBOR" _proto_push_ipv4_neighbor
+       _proto_push_array "neighbor6" "$PROTO_NEIGHBOR6" _proto_push_ipv6_neighbor
        _proto_notify "$interface"
 }
 
@@ -347,7 +437,10 @@ init_proto() {
                dump)
                        add_protocol() {
                                no_device=0
+                               no_proto_task=0
                                available=0
+                               renew_handler=0
+                               teardown_on_l3_link_down=0
 
                                add_default_handler "proto_$1_init_config"
 
@@ -357,11 +450,15 @@ init_proto() {
                                eval "proto_$1_init_config"
                                json_close_array
                                json_add_boolean no-device "$no_device"
+                               json_add_boolean no-proto-task "$no_proto_task"
                                json_add_boolean available "$available"
+                               json_add_boolean renew-handler "$renew_handler"
+                               json_add_boolean lasterror "$lasterror"
+                               json_add_boolean teardown-on-l3-link-down "$teardown_on_l3_link_down"
                                json_dump
                        }
                ;;
-               setup|teardown)
+               setup|teardown|renew)
                        interface="$1"; shift
                        data="$1"; shift
                        ifname="$1"; shift
@@ -372,6 +469,7 @@ init_proto() {
                                case "$cmd" in
                                        setup) _proto_do_setup "$1";;
                                        teardown) _proto_do_teardown "$1" ;;
+                                       renew) _proto_do_renew "$1" ;;
                                        *) return 1 ;;
                                esac
                        }