| #!/bin/sh /etc/rc.common |
| # Copyright (c) 2011-2012 OpenWrt.org |
| |
| START=80 |
| |
| USE_PROCD=1 |
| PROG=/usr/sbin/relayd |
| |
| validate_proto_relayd() |
| { |
| uci_validate_section network "interface" "${1}" \ |
| 'network:list(string)' \ |
| 'expiry:uinteger:30' \ |
| 'retry:uinteger:5' \ |
| 'table:range(0, 65535):16800' \ |
| 'forward_bcast:bool:1' \ |
| 'forward_dhcp:bool:1' |
| } |
| |
| resolve_ifname() { |
| grep -qs "^ *$1:" /proc/net/dev && { |
| append resolved_ifnames "$1" |
| } |
| } |
| |
| resolve_network() { |
| local ifn |
| fixup_interface "$1" |
| config_get ifn "$1" ifname |
| [ -z "$ifn" ] && return 1 |
| resolve_ifname "$ifn" |
| } |
| |
| start_relay() { |
| local cfg="$1" |
| local proto disabled |
| |
| config_get proto "$cfg" proto |
| [ "$proto" = "relay" ] || return 0 |
| |
| config_get_bool disabled "$cfg" disabled 0 |
| [ "$disabled" -gt 0 ] && return 0 |
| |
| local resolved_ifnames |
| local net networks |
| config_get networks "$cfg" network |
| for net in $networks; do |
| resolve_network "$net" || { |
| return 1 |
| } |
| done |
| |
| local ifn ifnames |
| config_get ifnames "$cfg" ifname |
| for ifn in $ifnames; do |
| resolve_ifname "$ifn" || { |
| return 1 |
| } |
| done |
| |
| procd_open_instance |
| procd_set_param command "$PROG" |
| |
| for ifn in $resolved_ifnames; do |
| procd_append_param command -I "$ifn" |
| procd_append_param netdev "$ifn" |
| done |
| local ipaddr |
| config_get ipaddr "$cfg" ipaddr |
| [ -n "$ipaddr" ] && procd_append_param command -L "$ipaddr" |
| |
| local gateway |
| config_get gateway "$cfg" gateway |
| [ -n "$gateway" ] && procd_append_param command -G "$gateway" |
| |
| local expiry # = 30 |
| config_get expiry "$cfg" expiry |
| [ -n "$expiry" ] && procd_append_param command -t "$expiry" |
| |
| local retry # = 5 |
| config_get retry "$cfg" retry |
| [ -n "$retry" ] && procd_append_param command -p "$retry" |
| |
| local table # = 16800 |
| config_get table "$cfg" table |
| [ -n "$table" ] && procd_append_param command -T "$table" |
| |
| local fwd_bcast # = 1 |
| config_get_bool fwd_bcast "$cfg" forward_bcast 1 |
| [ $fwd_bcast -eq 1 ] && procd_append_param command "-B" |
| |
| local fwd_dhcp # = 1 |
| config_get_bool fwd_dhcp "$cfg" forward_dhcp 1 |
| [ $fwd_dhcp -eq 1 ] && procd_append_param command "-D" |
| |
| procd_close_instance |
| } |
| |
| service_triggers() |
| { |
| procd_add_reload_trigger "network" |
| procd_add_raw_trigger "interface.*" 2000 /etc/init.d/relayd reload |
| } |
| |
| start_service() { |
| include /lib/network |
| config_load network |
| config_foreach start_relay interface |
| } |