add a default route in the dummy ppp.sh implementation to debug default route handlin...
[project/netifd.git] / dummy / netifd-proto.sh
1 . /usr/share/libubox/jshn.sh
2
3 proto_config_add_generic() {
4         json_add_array ""
5         json_add_string "" "$1"
6         json_add_int "" "$2"
7         json_close_array
8 }
9
10 proto_config_add_int() {
11         proto_config_add_generic "$1" 5
12 }
13
14 proto_config_add_string() {
15         proto_config_add_generic "$1" 3
16 }
17
18 proto_config_add_boolean() {
19         proto_config_add_generic "$1" 7
20 }
21
22 add_default_handler() {
23         case "$(type $1 2>/dev/null)" in
24                 *function*) return;;
25                 *) eval "$1() { return; }"
26         esac
27 }
28
29 _proto_do_teardown() {
30         json_load "$data"
31         eval "proto_$1_teardown \"$interface\" \"$ifname\""
32 }
33
34 _proto_do_setup() {
35         json_load "$data"
36         _EXPORT_VAR=0
37         _EXPORT_VARS=
38         eval "proto_$1_setup \"$interface\" \"$ifname\""
39 }
40
41 proto_init_update() {
42         local ifname="$1"
43         local up="$2"
44         local external="$3"
45
46         PROTO_INIT=1
47         PROTO_TUNNEL_OPEN=
48         PROTO_IPADDR=
49         PROTO_IP6ADDR=
50         PROTO_ROUTE=
51         PROTO_ROUTE6=
52         PROTO_DNS=
53         PROTO_DNS_SEARCH=
54         json_init
55         json_add_int action 0
56         [ -n "$ifname" -a "*" != "$ifname" ] && json_add_string "ifname" "$ifname"
57         json_add_boolean "link-up" "$up"
58         [ -n "$3" ] && json_add_boolean "address-external" "$external"
59 }
60
61 proto_close_nested() {
62         [ -n "$PROTO_NESTED_OPEN" ] && json_close_object
63         PROTO_NESTED_OPEN=
64 }
65
66 proto_add_nested() {
67         PROTO_NESTED_OPEN=1
68         json_add_object "$1"
69 }
70
71 proto_add_tunnel() {
72         proto_add_nested "tunnel"
73 }
74
75 proto_close_tunnel() {
76         proto_close_nested
77 }
78
79 proto_add_data() {
80         proto_add_nested "data"
81 }
82
83 proto_close_data() {
84         proto_close_nested
85 }
86
87 proto_add_dns_server() {
88         local address="$1"
89
90         jshn_append PROTO_DNS "$address"
91 }
92
93 proto_add_dns_search() {
94         local address="$1"
95
96         jshn_append PROTO_DNS_SEARCH "$address"
97 }
98
99 proto_add_ipv4_address() {
100         local address="$1"
101         local mask="$2"
102
103         jshn_append PROTO_IPADDR "$address/$mask"
104 }
105
106 proto_add_ipv6_address() {
107         local address="$1"
108         local mask="$2"
109
110         jshn_append PROTO_IP6ADDR "$address/$mask"
111 }
112
113 proto_add_ipv4_route() {
114         local target="$1"
115         local mask="$2"
116         local gw="$3"
117
118         jshn_append PROTO_ROUTE "$target/$mask/$gw"
119 }
120
121 proto_add_ipv6_route() {
122         local target="$1"
123         local mask="$2"
124         local gw="$3"
125
126         jshn_append PROTO_ROUTE6 "$target/$mask/$gw"
127 }
128
129 _proto_push_ip() {
130         json_add_string "" "$1"
131 }
132
133 _proto_push_route() {
134         local str="$1";
135         local target="${str%%/*}"
136         str="${str#*/}"
137         local mask="${str%%/*}"
138         local gw="${str#*/}"
139
140         json_add_object ""
141         json_add_string target "$target"
142         json_add_string netmask "$mask"
143         [ -n "$gw" ] && json_add_string gateway "$gw"
144         json_close_object
145 }
146
147 _proto_push_array() {
148         local name="$1"
149         local val="$2"
150         local cb="$3"
151
152         [ -n "$val" ] || return 0
153         json_add_array "$name"
154         for item in $val; do
155                 eval "$cb \"\$item\""
156         done
157         json_close_array
158 }
159
160 _proto_notify() {
161         local interface="$1"
162         ubus call network.interface."$interface" notify_proto "$(json_dump)"
163 }
164
165 proto_send_update() {
166         local interface="$1"
167
168         proto_close_nested
169         _proto_push_array "ipaddr" "$PROTO_IPADDR" _proto_push_ip
170         _proto_push_array "ip6addr" "$PROTO_IP6ADDR" _proto_push_ip
171         _proto_push_array "routes" "$PROTO_ROUTE" _proto_push_route
172         _proto_push_array "routes6" "$PROTO_ROUTE6" _proto_push_route
173         _proto_push_array "dns" "$PROTO_DNS" _proto_push_ip
174         _proto_push_array "dns_search" "$PROTO_DNS_SEARCH" _proto_push_ip
175         _proto_notify "$interface"
176 }
177
178 proto_export() {
179         local var="VAR${_EXPORT_VAR}"
180         _EXPORT_VAR="$(($_EXPORT_VAR + 1))"
181         export -- "$var=$1"
182         jshn_append _EXPORT_VARS "$var"
183 }
184
185 proto_run_command() {
186         local interface="$1"; shift
187
188         json_init
189         json_add_int action 1
190         json_add_array command
191         while [ $# -gt 0 ]; do
192                 json_add_string "" "$1"
193                 shift
194         done
195         json_close_array
196         [ -n "$_EXPORT_VARS" ] && {
197                 json_add_array env
198                 for var in $_EXPORT_VARS; do
199                         eval "json_add_string \"\" \"\${$var}\""
200                 done
201                 json_close_array
202         }
203         _proto_notify "$interface"
204 }
205
206 proto_kill_command() {
207         local interface="$1"; shift
208
209         json_init
210         json_add_int action 2
211         [ -n "$1" ] && json_add_int signal "$1"
212         _proto_notify "$interface"
213 }
214
215 proto_notify_error() {
216         local interface="$1"; shift
217
218         json_init
219         json_add_int action 3
220         json_add_array error
221         while [ $# -gt 0 ]; do
222                 json_add_string "" "$1"
223                 shift
224         done
225         json_close_array
226         _proto_notify "$interface"
227 }
228
229 proto_block_restart() {
230         local interface="$1"; shift
231
232         json_init
233         json_add_int action 4
234         _proto_notify "$interface"
235 }
236
237 proto_set_available() {
238         local interface="$1"
239         local state="$2"
240         json_init
241         json_add_int action 5
242         json_add_boolean available "$state"
243         _proto_notify "$interface"
244 }
245
246 init_proto() {
247         proto="$1"; shift
248         cmd="$1"; shift
249
250         case "$cmd" in
251                 dump)
252                         add_protocol() {
253                                 no_device=0
254                                 available=0
255
256                                 add_default_handler "proto_$1_init_config"
257
258                                 json_init
259                                 json_add_string "name" "$1"
260                                 json_add_array "config"
261                                 eval "proto_$1_init_config"
262                                 json_close_array
263                                 json_add_boolean no-device "$no_device"
264                                 json_add_boolean available "$available"
265                                 json_dump
266                         }
267                 ;;
268                 setup|teardown)
269                         interface="$1"; shift
270                         data="$1"; shift
271                         ifname="$1"; shift
272
273                         add_protocol() {
274                                 [[ "$proto" == "$1" ]] || return 0
275
276                                 case "$cmd" in
277                                         setup) _proto_do_setup "$1";;
278                                         teardown) _proto_do_teardown "$1" ;;
279                                         *) return 1 ;;
280                                 esac
281                         }
282                 ;;
283         esac
284 }