1 NETIFD_MAIN_DIR="${NETIFD_MAIN_DIR:-/lib/netifd}" 2 PROTO_DEFAULT_OPTIONS="defaultroute peerdns metric" 3 if [ -f /usr/share/libubox/jshn.sh ]; then 4 . /usr/share/libubox/jshn.sh 5 else 6 . /usr/local/share/libubox/jshn.sh 7 fi 8 . $NETIFD_MAIN_DIR/utils.sh 9 10 proto_config_add_int() { 11 config_add_int "$@" 12 } 13 14 proto_config_add_string() { 15 config_add_string "$@" 16 } 17 18 proto_config_add_boolean() { 19 config_add_boolean "$@" 20 } 21 22 proto_config_add_array() { 23 config_add_array "$@" 24 } 25 26 proto_config_add_defaults() { 27 proto_config_add_boolean "defaultroute" 28 proto_config_add_boolean "peerdns" 29 proto_config_add_boolean "renew" 30 proto_config_add_int "metric" 31 } 32 33 proto_add_dynamic_defaults() { 34 [ -n "$defaultroute" ] && json_add_boolean defaultroute "$defaultroute" 35 [ -n "$peerdns" ] && json_add_boolean peerdns "$peerdns" 36 [ -n "$metric" ] && json_add_int metric "$metric" 37 } 38 39 _proto_do_teardown() { 40 json_load "$data" 41 eval "proto_$1_teardown \"$interface\" \"$ifname\"" 42 } 43 44 _proto_do_renew() { 45 json_load "$data" 46 eval "proto_$1_renew \"$interface\" \"$ifname\"" 47 } 48 49 _proto_do_restart() { 50 json_load "$data" 51 eval "proto_$1_restart \"$interface\" \"$ifname\"" 52 } 53 54 _proto_do_setup() { 55 json_load "$data" 56 _EXPORT_VAR=0 57 _EXPORT_VARS= 58 eval "proto_$1_setup \"$interface\" \"$ifname\"" 59 } 60 61 proto_init_update() { 62 local ifname="$1" 63 local up="$2" 64 local external="$3" 65 66 PROTO_KEEP=0 67 PROTO_INIT=1 68 PROTO_TUNNEL_OPEN= 69 PROTO_IPADDR= 70 PROTO_IP6ADDR= 71 PROTO_ROUTE= 72 PROTO_ROUTE6= 73 PROTO_PREFIX6= 74 PROTO_DNS= 75 PROTO_DNS_SEARCH= 76 PROTO_NEIGHBOR= 77 PROTO_NEIGHBOR6= 78 json_init 79 json_add_int action 0 80 [ -n "$ifname" -a "*" != "$ifname" ] && json_add_string "ifname" "$ifname" 81 json_add_boolean "link-up" "$up" 82 [ -n "$3" ] && json_add_boolean "address-external" "$external" 83 } 84 85 proto_set_keep() { 86 PROTO_KEEP="$1" 87 } 88 89 proto_close_nested() { 90 [ -n "$PROTO_NESTED_OPEN" ] && json_close_object 91 PROTO_NESTED_OPEN= 92 } 93 94 proto_add_nested() { 95 PROTO_NESTED_OPEN=1 96 json_add_object "$1" 97 } 98 99 proto_add_tunnel() { 100 proto_add_nested "tunnel" 101 } 102 103 proto_close_tunnel() { 104 proto_close_nested 105 } 106 107 proto_add_data() { 108 proto_add_nested "data" 109 } 110 111 proto_close_data() { 112 proto_close_nested 113 } 114 115 proto_add_dns_server() { 116 local address="$1" 117 118 append PROTO_DNS "$address" 119 } 120 121 proto_add_dns_search() { 122 local address="$1" 123 124 append PROTO_DNS_SEARCH "$address" 125 } 126 127 proto_add_ipv4_address() { 128 local address="$1" 129 local mask="$2" 130 local broadcast="$3" 131 local ptp="$4" 132 133 append PROTO_IPADDR "$address/$mask/$broadcast/$ptp" 134 } 135 136 proto_add_ipv6_address() { 137 local address="$1" 138 local mask="$2" 139 local preferred="$3" 140 local valid="$4" 141 local offlink="$5" 142 local class="$6" 143 144 append PROTO_IP6ADDR "$address/$mask/$preferred/$valid/$offlink/$class" 145 } 146 147 proto_add_ipv4_neighbor(){ 148 local address="$1" 149 local mac="$2" 150 local proxy="$3" 151 152 append PROTO_NEIGHBOR "$address/$mac/$proxy" 153 } 154 155 proto_add_ipv6_neighbor(){ 156 local address="$1" 157 local mac="$2" 158 local proxy="$3" 159 local router="$4" 160 161 append PROTO_NEIGHBOR6 "$address/$mac/$proxy/$router" 162 } 163 164 proto_add_ipv4_route() { 165 local target="$1" 166 local mask="$2" 167 local gw="$3" 168 local source="$4" 169 local metric="$5" 170 171 append PROTO_ROUTE "$target/$mask/$gw/$metric///$source" 172 } 173 174 proto_add_ipv6_route() { 175 local target="$1" 176 local mask="$2" 177 local gw="$3" 178 local metric="$4" 179 local valid="$5" 180 local source="$6" 181 local table="$7" 182 183 append PROTO_ROUTE6 "$target/$mask/$gw/$metric/$valid/$table/$source" 184 } 185 186 proto_add_ipv6_prefix() { 187 local prefix="$1" 188 local valid="$2" 189 local preferred="$3" 190 191 if [ -z "$valid" ]; then 192 append PROTO_PREFIX6 "$prefix" 193 else 194 [ -z "$preferred" ] && preferred="$valid" 195 append PROTO_PREFIX6 "$prefix,$valid,$preferred" 196 fi 197 } 198 199 _proto_push_ipv4_addr() { 200 local str="$1" 201 local address mask broadcast ptp 202 203 address="${str%%/*}" 204 str="${str#*/}" 205 mask="${str%%/*}" 206 str="${str#*/}" 207 broadcast="${str%%/*}" 208 str="${str#*/}" 209 ptp="$str" 210 211 json_add_object "" 212 json_add_string ipaddr "$address" 213 [ -n "$mask" ] && json_add_string mask "$mask" 214 [ -n "$broadcast" ] && json_add_string broadcast "$broadcast" 215 [ -n "$ptp" ] && json_add_string ptp "$ptp" 216 json_close_object 217 } 218 219 _proto_push_ipv6_addr() { 220 local str="$1" 221 local address mask preferred valid offlink 222 223 address="${str%%/*}" 224 str="${str#*/}" 225 mask="${str%%/*}" 226 str="${str#*/}" 227 preferred="${str%%/*}" 228 str="${str#*/}" 229 valid="${str%%/*}" 230 str="${str#*/}" 231 offlink="${str%%/*}" 232 str="${str#*/}" 233 class="${str%%/*}" 234 235 json_add_object "" 236 json_add_string ipaddr "$address" 237 [ -n "$mask" ] && json_add_string mask "$mask" 238 [ -n "$preferred" ] && json_add_int preferred "$preferred" 239 [ -n "$valid" ] && json_add_int valid "$valid" 240 [ -n "$offlink" ] && json_add_boolean offlink "$offlink" 241 [ -n "$class" ] && json_add_string class "$class" 242 json_close_object 243 } 244 245 _proto_push_string() { 246 json_add_string "" "$1" 247 } 248 249 _proto_push_ipv4_neighbor(){ 250 local str="$1" 251 local address mac proxy 252 253 address="${str%%/*}" 254 str="${str#*/}" 255 mac="${str%%/*}" 256 str="${str#*/}" 257 proxy="${str%%/*}" 258 259 json_add_object "" 260 json_add_string ipaddr "$address" 261 [ -n "$mac" ] && json_add_string mac "$mac" 262 [ -n "$proxy" ] && json_add_boolean proxy "$proxy" 263 json_close_object 264 } 265 266 _proto_push_ipv6_neighbor(){ 267 local str="$1" 268 local address mac proxy router 269 270 address="${str%%/*}" 271 str="${str#*/}" 272 mac="${str%%/*}" 273 str="${str#*/}" 274 proxy="${str%%/*}" 275 str="${str#*/}" 276 router="${str%%/*}" 277 278 json_add_object "" 279 json_add_string ipaddr "$address" 280 [ -n "$mac" ] && json_add_string mac "$mac" 281 [ -n "$proxy" ] && json_add_boolean proxy "$proxy" 282 [ -n "$router" ] && json_add_boolean router "$router" 283 json_close_object 284 } 285 286 _proto_push_route() { 287 local str="$1"; 288 local target="${str%%/*}" 289 str="${str#*/}" 290 local mask="${str%%/*}" 291 str="${str#*/}" 292 local gw="${str%%/*}" 293 str="${str#*/}" 294 local metric="${str%%/*}" 295 str="${str#*/}" 296 local valid="${str%%/*}" 297 str="${str#*/}" 298 local table="${str%%/*}" 299 str="${str#*/}" 300 local source="${str}" 301 302 json_add_object "" 303 json_add_string target "$target" 304 json_add_string netmask "$mask" 305 [ -n "$gw" ] && json_add_string gateway "$gw" 306 [ -n "$metric" ] && json_add_int metric "$metric" 307 [ -n "$valid" ] && json_add_int valid "$valid" 308 [ -n "$source" ] && json_add_string source "$source" 309 [ -n "$table" ] && json_add_string table "$table" 310 json_close_object 311 } 312 313 _proto_push_array() { 314 local name="$1" 315 local val="$2" 316 local cb="$3" 317 318 [ -n "$val" ] || return 0 319 json_add_array "$name" 320 for item in $val; do 321 eval "$cb \"\$item\"" 322 done 323 json_close_array 324 } 325 326 _proto_notify() { 327 local interface="$1" 328 local options="$2" 329 json_add_string "interface" "$interface" 330 ubus $options call network.interface notify_proto "$(json_dump)" 331 } 332 333 proto_send_update() { 334 local interface="$1" 335 336 proto_close_nested 337 json_add_boolean keep "$PROTO_KEEP" 338 _proto_push_array "ipaddr" "$PROTO_IPADDR" _proto_push_ipv4_addr 339 _proto_push_array "ip6addr" "$PROTO_IP6ADDR" _proto_push_ipv6_addr 340 _proto_push_array "routes" "$PROTO_ROUTE" _proto_push_route 341 _proto_push_array "routes6" "$PROTO_ROUTE6" _proto_push_route 342 _proto_push_array "ip6prefix" "$PROTO_PREFIX6" _proto_push_string 343 _proto_push_array "dns" "$PROTO_DNS" _proto_push_string 344 _proto_push_array "dns_search" "$PROTO_DNS_SEARCH" _proto_push_string 345 _proto_push_array "neighbor" "$PROTO_NEIGHBOR" _proto_push_ipv4_neighbor 346 _proto_push_array "neighbor6" "$PROTO_NEIGHBOR6" _proto_push_ipv6_neighbor 347 _proto_notify "$interface" 348 } 349 350 proto_export() { 351 local var="VAR${_EXPORT_VAR}" 352 _EXPORT_VAR="$(($_EXPORT_VAR + 1))" 353 export -- "$var=$1" 354 append _EXPORT_VARS "$var" 355 } 356 357 proto_run_command() { 358 local interface="$1"; shift 359 360 json_init 361 json_add_int action 1 362 json_add_array command 363 while [ $# -gt 0 ]; do 364 json_add_string "" "$1" 365 shift 366 done 367 json_close_array 368 [ -n "$_EXPORT_VARS" ] && { 369 json_add_array env 370 for var in $_EXPORT_VARS; do 371 eval "json_add_string \"\" \"\${$var}\"" 372 done 373 json_close_array 374 } 375 _proto_notify "$interface" 376 } 377 378 proto_kill_command() { 379 local interface="$1"; shift 380 381 json_init 382 json_add_int action 2 383 [ -n "$1" ] && json_add_int signal "$1" 384 _proto_notify "$interface" 385 } 386 387 proto_notify_error() { 388 local interface="$1"; shift 389 390 json_init 391 json_add_int action 3 392 json_add_array error 393 while [ $# -gt 0 ]; do 394 json_add_string "" "$1" 395 shift 396 done 397 json_close_array 398 _proto_notify "$interface" 399 } 400 401 proto_block_restart() { 402 local interface="$1"; shift 403 404 json_init 405 json_add_int action 4 406 _proto_notify "$interface" 407 } 408 409 proto_set_available() { 410 local interface="$1" 411 local state="$2" 412 json_init 413 json_add_int action 5 414 json_add_boolean available "$state" 415 _proto_notify "$interface" 416 } 417 418 proto_add_host_dependency() { 419 local interface="$1" 420 local host="$2" 421 local ifname="$3" 422 423 # execute in subshell to not taint callers env 424 # see tickets #11046, #11545, #11570 425 ( 426 json_init 427 json_add_int action 6 428 json_add_string host "$host" 429 [ -n "$ifname" ] && json_add_string ifname "$ifname" 430 _proto_notify "$interface" -S 431 ) 432 } 433 434 proto_setup_failed() { 435 local interface="$1" 436 json_init 437 json_add_int action 7 438 _proto_notify "$interface" 439 } 440 441 init_proto() { 442 proto="$1"; shift 443 cmd="$1"; shift 444 445 case "$cmd" in 446 dump) 447 add_protocol() { 448 no_device=0 449 no_device_config=0 450 no_proto_task=0 451 available=0 452 renew_handler=0 453 restart_handler=0 454 type "proto_$1_restart" >/dev/null 2>&1 && restart_handler=1 455 teardown_on_l3_link_down=0 456 457 add_default_handler "proto_$1_init_config" 458 459 json_init 460 json_add_string "name" "$1" 461 json_add_array "config" 462 eval "proto_$1_init_config" 463 json_close_array 464 json_add_boolean no-device "$no_device" 465 json_add_boolean no-device-config "$no_device_config" 466 json_add_boolean no-proto-task "$no_proto_task" 467 json_add_boolean available "$available" 468 json_add_boolean renew-handler "$renew_handler" 469 json_add_boolean restart-handler "$restart_handler" 470 json_add_boolean lasterror "$lasterror" 471 json_add_boolean teardown-on-l3-link-down "$teardown_on_l3_link_down" 472 json_dump 473 } 474 ;; 475 setup|teardown|renew|restart) 476 interface="$1"; shift 477 data="$1"; shift 478 ifname="$1"; shift 479 480 add_protocol() { 481 [[ "$proto" == "$1" ]] || return 0 482 483 case "$cmd" in 484 setup) _proto_do_setup "$1";; 485 teardown) _proto_do_teardown "$1" ;; 486 renew) _proto_do_renew "$1" ;; 487 restart) _proto_do_restart "$1" ;; 488 *) return 1 ;; 489 esac 490 } 491 ;; 492 esac 493 }
This page was automatically generated by LXR 0.3.1. • OpenWrt