summaryrefslogtreecommitdiff
path: root/netifd/files/etc
diff options
context:
space:
mode:
Diffstat (limited to 'netifd/files/etc')
-rw-r--r--netifd/files/etc/hotplug.d/iface/00-netstate6
-rw-r--r--netifd/files/etc/hotplug.d/net/20-smp-tune67
-rwxr-xr-xnetifd/files/etc/init.d/network149
3 files changed, 222 insertions, 0 deletions
diff --git a/netifd/files/etc/hotplug.d/iface/00-netstate b/netifd/files/etc/hotplug.d/iface/00-netstate
new file mode 100644
index 0000000..71ccb01
--- /dev/null
+++ b/netifd/files/etc/hotplug.d/iface/00-netstate
@@ -0,0 +1,6 @@
+[ ifup = "$ACTION" ] && {
+ uci_toggle_state network "$INTERFACE" up 1
+ [ -n "$DEVICE" ] && {
+ uci_toggle_state network "$INTERFACE" ifname "$DEVICE"
+ }
+}
diff --git a/netifd/files/etc/hotplug.d/net/20-smp-tune b/netifd/files/etc/hotplug.d/net/20-smp-tune
new file mode 100644
index 0000000..ab9a904
--- /dev/null
+++ b/netifd/files/etc/hotplug.d/net/20-smp-tune
@@ -0,0 +1,67 @@
+#!/bin/sh
+[ "$ACTION" = add ] || exit
+
+NPROCS="$(grep -c "^processor.*:" /proc/cpuinfo)"
+[ "$NPROCS" -gt 1 ] || exit
+
+PROC_MASK="$(( (1 << $NPROCS) - 1 ))"
+
+find_irq_cpu() {
+ local dev="$1"
+ local match="$(grep -m 1 "$dev\$" /proc/interrupts)"
+ local cpu=0
+
+ [ -n "$match" ] && {
+ set -- $match
+ shift
+ for cur in `seq 1 $NPROCS`; do
+ [ "$1" -gt 0 ] && {
+ cpu=$(($cur - 1))
+ break
+ }
+ shift
+ done
+ }
+
+ echo "$cpu"
+}
+
+set_hex_val() {
+ local file="$1"
+ local val="$2"
+ val="$(printf %x "$val")"
+ [ -n "$DEBUG" ] && echo "$file = $val"
+ echo "$val" > "$file"
+}
+
+default_ps="$(uci get "network.@globals[0].default_ps")"
+[ -n "$default_ps" -a "$default_ps" != 1 ] && exit 0
+
+exec 512>/var/lock/smp_tune.lock
+flock 512 || exit 1
+
+for dev in /sys/class/net/*; do
+ [ -d "$dev" ] || continue
+
+ # ignore virtual interfaces
+ [ -n "$(ls "${dev}/" | grep '^lower_')" ] && continue
+ [ -d "${dev}/device" ] || continue
+
+ device="$(readlink "${dev}/device")"
+ device="$(basename "$device")"
+ irq_cpu="$(find_irq_cpu "$device")"
+ irq_cpu_mask="$((1 << $irq_cpu))"
+
+ for q in ${dev}/queues/rx-*; do
+ set_hex_val "$q/rps_cpus" "$(($PROC_MASK & ~$irq_cpu_mask))"
+ done
+
+ ntxq="$(ls -d ${dev}/queues/tx-* | wc -l)"
+
+ idx=$(($irq_cpu + 1))
+ for q in ${dev}/queues/tx-*; do
+ set_hex_val "$q/xps_cpus" "$((1 << $idx))"
+ let "idx = idx + 1"
+ [ "$idx" -ge "$NPROCS" ] && idx=0
+ done
+done
diff --git a/netifd/files/etc/init.d/network b/netifd/files/etc/init.d/network
new file mode 100755
index 0000000..2321a30
--- /dev/null
+++ b/netifd/files/etc/init.d/network
@@ -0,0 +1,149 @@
+#!/bin/sh /etc/rc.common
+
+START=20
+STOP=90
+
+USE_PROCD=1
+
+init_switch() {
+ setup_switch() { return 0; }
+
+ include /lib/network
+ setup_switch
+}
+
+start_service() {
+ init_switch
+
+ procd_open_instance
+ procd_set_param command /sbin/netifd
+ procd_set_param respawn
+ procd_set_param watch network.interface
+ [ -e /proc/sys/kernel/core_pattern ] && {
+ procd_set_param limits core="unlimited"
+ }
+ procd_close_instance
+}
+
+reload_service() {
+ local rv=0
+
+ init_switch
+ ubus call network reload || rv=1
+ /sbin/wifi reload_legacy
+ return $rv
+}
+
+stop_service() {
+ /sbin/wifi down
+ ifdown -a
+ sleep 1
+}
+
+service_running() {
+ ubus -t 30 wait_for network.interface
+ /sbin/wifi reload_legacy
+}
+
+validate_atm_bridge_section()
+{
+ uci_validate_section network "atm-bridge" "${1}" \
+ 'unit:uinteger:0' \
+ 'vci:range(32, 65535):35' \
+ 'vpi:range(0, 255):8' \
+ 'atmdev:uinteger:0' \
+ 'encaps:or("llc", "vc"):llc' \
+ 'payload:or("bridged", "routed"):bridged'
+}
+
+validate_route_section()
+{
+ uci_validate_section network route "${1}" \
+ 'interface:string' \
+ 'target:cidr4' \
+ 'netmask:netmask4' \
+ 'gateway:ip4addr' \
+ 'metric:uinteger' \
+ 'mtu:uinteger' \
+ 'table:or(range(0,65535),string)'
+}
+
+validate_route6_section()
+{
+ uci_validate_section network route6 "${1}" \
+ 'interface:string' \
+ 'target:cidr6' \
+ 'gateway:ip6addr' \
+ 'metric:uinteger' \
+ 'mtu:uinteger' \
+ 'table:or(range(0,65535),string)'
+}
+
+validate_rule_section()
+{
+ uci_validate_section network rule "${1}" \
+ 'in:string' \
+ 'out:string' \
+ 'src:cidr4' \
+ 'dest:cidr4' \
+ 'tos:range(0,31)' \
+ 'mark:string' \
+ 'invert:bool' \
+ 'lookup:or(range(0,65535),string)' \
+ 'goto:range(0,65535)' \
+ 'action:or("prohibit", "unreachable", "blackhole", "throw")'
+}
+
+validate_rule6_section()
+{
+ uci_validate_section network rule6 "${1}" \
+ 'in:string' \
+ 'out:string' \
+ 'src:cidr6' \
+ 'dest:cidr6' \
+ 'tos:range(0,31)' \
+ 'mark:string' \
+ 'invert:bool' \
+ 'lookup:or(range(0,65535),string)' \
+ 'goto:range(0,65535)' \
+ 'action:or("prohibit", "unreachable", "blackhole", "throw")'
+}
+
+validate_switch_section()
+{
+ uci_validate_section network switch "${1}" \
+ 'name:string' \
+ 'enable:bool' \
+ 'enable_vlan:bool' \
+ 'reset:bool' \
+ 'ar8xxx_mib_poll_interval:uinteger' \
+ 'ar8xxx_mib_type:range(0,1)'
+}
+
+validate_switch_vlan()
+{
+ uci_validate_section network switch_vlan "${1}" \
+ 'device:string' \
+ 'vlan:uinteger' \
+ 'ports:list(ports)'
+}
+
+service_triggers()
+{
+ procd_add_reload_trigger network wireless
+
+ procd_open_validate
+ validate_atm_bridge_section
+ validate_route_section
+ [ -e /proc/sys/net/ipv6 ] && validate_route6_section
+ validate_rule_section
+ [ -e /proc/sys/net/ipv6 ] && validate_rule6_section
+ validate_switch_section
+ validate_switch_vlan
+ procd_close_validate
+}
+
+shutdown() {
+ ifdown -a
+ sleep 1
+}