NETIFD_MAIN_DIR="${NETIFD_MAIN_DIR:-/lib/netifd}"
+PROTO_DEFAULT_OPTIONS="defaultroute peerdns metric"
. /usr/share/libubox/jshn.sh
. $NETIFD_MAIN_DIR/utils.sh
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
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"
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() {
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() {
valid="${str%%/*}"
str="${str#*/}"
offlink="${str%%/*}"
+ str="${str#*/}"
+ class="${str%%/*}"
json_add_object ""
json_add_string ipaddr "$address"
[ -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
}
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%%/*}"
str="${str#*/}"
local valid="${str%%/*}"
str="${str#*/}"
+ local table="${str%%/*}"
+ str="${str#*/}"
local source="${str}"
json_add_object ""
[ -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
}
_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"
}
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"
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
case "$cmd" in
setup) _proto_do_setup "$1";;
teardown) _proto_do_teardown "$1" ;;
+ renew) _proto_do_renew "$1" ;;
*) return 1 ;;
esac
}