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