From 74c76481b946f5c226b784909664e1c5096412f5 Mon Sep 17 00:00:00 2001 From: Ycarus Date: Sat, 24 Feb 2018 14:30:42 +0100 Subject: [PATCH] Fix mptcp script --- .circleci/config.yml | 7 ++ .../net/00-macvlan => init.d/macvlan} | 23 ++-- .../root/etc/uci-defaults/51_macvlan | 8 ++ mptcp/files/etc/hotplug.d/iface/30-mptcp | 10 ++ mptcp/files/etc/hotplug.d/net/03-mptcp | 36 ------- mptcp/files/etc/hotplug.d/net/30-mptcp | 69 ------------ mptcp/files/etc/init.d/mptcp | 102 +++++++++++++++++- 7 files changed, 141 insertions(+), 114 deletions(-) rename luci-mod-admin-full/root/etc/{hotplug.d/net/00-macvlan => init.d/macvlan} (79%) mode change 100644 => 100755 create mode 100755 luci-mod-admin-full/root/etc/uci-defaults/51_macvlan create mode 100644 mptcp/files/etc/hotplug.d/iface/30-mptcp delete mode 100644 mptcp/files/etc/hotplug.d/net/03-mptcp delete mode 100644 mptcp/files/etc/hotplug.d/net/30-mptcp diff --git a/.circleci/config.yml b/.circleci/config.yml index d15049719..57f6f561a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -133,6 +133,13 @@ workflows: - build_x86: requires: - prepare + filters: + branches: + only: /v[0-9]+(\.[0-9]+)*/ + - build_rpi3: requires: - prepare + filters: + branches: + only: /v[0-9]+(\.[0-9]+)*/ diff --git a/luci-mod-admin-full/root/etc/hotplug.d/net/00-macvlan b/luci-mod-admin-full/root/etc/init.d/macvlan old mode 100644 new mode 100755 similarity index 79% rename from luci-mod-admin-full/root/etc/hotplug.d/net/00-macvlan rename to luci-mod-admin-full/root/etc/init.d/macvlan index a471534c5..ef7a1277d --- a/luci-mod-admin-full/root/etc/hotplug.d/net/00-macvlan +++ b/luci-mod-admin-full/root/etc/init.d/macvlan @@ -1,9 +1,7 @@ -#!/bin/sh -# vim: set noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 : +#!/bin/sh /etc/rc.common -. /lib/functions.sh - -config_load network +START=15 +USE_PROCD=1 _setup_macaddr() { uci -q get "network.$1_dev.macaddr" >/dev/null && return @@ -48,4 +46,17 @@ _setup_interface() { uci -q set "network.$1.type=macvlan" # legacy uci -q commit network } -config_foreach _setup_interface interface + +start_service() { + . /lib/functions.sh + config_load network + config_foreach _setup_interface interface +} + +reload_service() { + start +} + +service_triggers() { + procd_add_reload_trigger network +} diff --git a/luci-mod-admin-full/root/etc/uci-defaults/51_macvlan b/luci-mod-admin-full/root/etc/uci-defaults/51_macvlan new file mode 100755 index 000000000..e3fdf5b9a --- /dev/null +++ b/luci-mod-admin-full/root/etc/uci-defaults/51_macvlan @@ -0,0 +1,8 @@ +#!/bin/sh +uci -q batch <<-EOF + delete ucitrack.@macvlan[-1] + add ucitrack macvlan + set ucitrack.@macvlan[-1].init=macvlan + add_list ucitrack.@network[-1].affects=macvlan + commit ucitrack +EOF \ No newline at end of file diff --git a/mptcp/files/etc/hotplug.d/iface/30-mptcp b/mptcp/files/etc/hotplug.d/iface/30-mptcp new file mode 100644 index 000000000..bcabd1567 --- /dev/null +++ b/mptcp/files/etc/hotplug.d/iface/30-mptcp @@ -0,0 +1,10 @@ +#!/bin/sh + +[ "$ACTION" = ifup -o "$ACTION" = ifupdate ] || exit 0 +[ "$ACTION" = ifupdate -a -z "$IFUPDATE_ADDRESSES" -a -z "$IFUPDATE_DATA" ] && exit 0 + +/etc/init.d/mptcp enabled || exit 0 + +logger -t mptcp "Reloading mptcp config due to $ACTION of $INTERFACE ($DEVICE)" +/etc/init.d/mptcp reload "$INTERFACE" >/dev/null || exit 0 + diff --git a/mptcp/files/etc/hotplug.d/net/03-mptcp b/mptcp/files/etc/hotplug.d/net/03-mptcp deleted file mode 100644 index dd6c71954..000000000 --- a/mptcp/files/etc/hotplug.d/net/03-mptcp +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh -# vim: set noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 : - -. /lib/functions.sh - -multipath= -mptcp_path_manager= -mptcp_schdeduler= -congestion= -multipath_status=0 -config_load network -config_get multipath globals multipath -config_get mptcp_path_manager globals mptcp_path_manager -config_get mptcp_scheduler globals mptcp_scheduler -config_get congestion globals congestion -[ "$multipath" = "enable" ] && multipath_status=1 - -# Global MPTCP configuration -sysctl -qw net.mptcp.mptcp_enabled="$multipath_status" -[ "$multipath_status" = "0" ] && exit 0 -[ -z "$mptcp_path_manager" ] || sysctl -qw net.mptcp.mptcp_path_manager="$mptcp_path_manager" -[ -z "$mptcp_scheduler" ] || sysctl -qw net.mptcp.mptcp_scheduler="$mptcp_scheduler" -[ -z "$congestion" ] || sysctl -qw net.ipv4.tcp_congestion_control="$congestion" - -# Configuration by interface -_setup_interface() { - device= - config_get device "$1" ifname - [ -z "$device" ] && return 0 - [ -n "$(config | grep $device)" ] || return 0 - if_multipath= - config_get if_multipath "$1" multipath "off" - [ "$if_multipath" = "master" ] && if_multipath="on" - multipath "$device" "$if_multipath" -} -config_foreach _setup_interface interface diff --git a/mptcp/files/etc/hotplug.d/net/30-mptcp b/mptcp/files/etc/hotplug.d/net/30-mptcp deleted file mode 100644 index acf8c4af9..000000000 --- a/mptcp/files/etc/hotplug.d/net/30-mptcp +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh -# -# Load the multipath config -# -# Author: Mario Krueger -# Released under GPL 3 or later - -enable=`uci -q get network.globals.multipath` || exit 0 -[ "$enable" = "enable" ] || exit 0 - -. /lib/functions.sh -. /lib/functions/network.sh - -id=0 -count=1 - -set_default() { - local mode - local config="$1" - count=$(($count+1)) - local iface - config_get iface "$config" ifname - id=$count - config_get mode "$config" multipath - - mode=`uci -q get network.$config.multipath` || mode='off' - [ -n "$(ifconfig | grep $iface)" ] || return 1 - case "$mode" in - "off") - multipath $iface off - return 1;; - "master") - mode="on";; - "on");; - "backup");; - "handover");; - *) - logger -t multipath Wrong multipath value for device $iface - return 1;; - esac - # Update kernel flags - multipath $iface $mode - # IPv4 Updates: - local ipaddr - local gateway - local network - local netmask - config_get ipaddr $config ipaddr - config_get gateway $config gateway - network_get_subnet network $config - config_get netmask $config netmask - network=`ipcalc.sh $network | sed -n '/NETWORK=/{;s/.*=//;s/ .*//;p;}'` - - [ -n "$gateway" ] || return 1 - - ip rule del table $id - ip route flush $id - ip rule add from $ipaddr table $id - ip route replace $network/$netmask dev $iface scope link table $id - ip route replace default via $gateway dev $iface table $id - ip route flush $id - - [ "$mode" = "master" ] && { - ip route replace default via $gateway dev $iface - } -} - -config_load network -config_foreach set_default interface diff --git a/mptcp/files/etc/init.d/mptcp b/mptcp/files/etc/init.d/mptcp index e825dedc1..a3f3e8088 100755 --- a/mptcp/files/etc/init.d/mptcp +++ b/mptcp/files/etc/init.d/mptcp @@ -4,14 +4,110 @@ START=18 USE_PROCD=1 +global_multipath_settings() { + local multipath mptcp_path_manager mptcp_schdeduler congestion + local multipath_status=0 + config_load network + config_get multipath globals multipath + config_get mptcp_path_manager globals mptcp_path_manager + config_get mptcp_scheduler globals mptcp_scheduler + config_get congestion globals congestion + [ "$multipath" = "enable" ] && multipath_status=1 + + # Global MPTCP configuration + sysctl -qw net.mptcp.mptcp_enabled="$multipath_status" + [ -z "$mptcp_path_manager" ] || sysctl -qw net.mptcp.mptcp_path_manager="$mptcp_path_manager" + [ -z "$mptcp_scheduler" ] || sysctl -qw net.mptcp.mptcp_scheduler="$mptcp_scheduler" + [ -z "$congestion" ] || sysctl -qw net.ipv4.tcp_congestion_control="$congestion" +} + +interface_multipath_settings() { + local mode iface + local config="$1" + local intf="$2" + + config_get iface "$config" ifname + count=$(($count+1)) + id=$count + echo $iface + [ -n "$intf" ] && [ "$iface" != "$intf" ] && return 0 + echo "ok" + [ -z "$iface" ] && return 0 + [ -n "$(ifconfig | grep $iface)" ] || return 0 + config_get mode "$config" multipath "off" + echo "mode $mode" + [ "$mode" = "off" ] && { + ip rule del table $id > /dev/null 2>&1 + ip route flush $id > /dev/null 2>&1 + return 1 + } + + [ "$mode" = "master" ] && mode="on" + multipath "$iface" "$mode" + + # IPv4 Updates: + local ipaddr + local gateway + local network + local netmask + local proto + config_get proto $config proto + if [ "$proto" = "static" ]; then + config_get ipaddr $config ipaddr + config_get gateway $config gateway + config_get netmask $config netmask + network=`ipcalc.sh $ipaddr $netmask | sed -n '/NETWORK=/{;s/.*=//;s/ .*//;p;}'` + else + network_get_ipaddr $config ipaddr + ipaddr=$(/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}') + gateway=$(ip r list dev $config | grep -v default | awk '/proto static/ {print $1}' | tr -d "\n") + netmask=$(/sbin/ifconfig eth0 | grep 'Mask' | cut -d: -f2 | awk '{print $1}') + __network_ifstatus netmask $config "['ipv4-address'][0]['mask']" + network=`ipcalc.sh $ipaddr $netmask | sed -n '/NETWORK=/{;s/.*=//;s/ .*//;p;}'` + fi + ip rule del table $id > /dev/null 2>&1 + ip route flush $id > /dev/null 2>&1 + [ -n "$gateway" ] || return 1 + ip rule add from $ipaddr table $id + ip route replace $network/$netmask dev $iface scope link table $id + ip route replace default via $gateway dev $iface table $id + ip route flush $id + + [ "$mode" = "master" ] && { + ip route replace default via $gateway dev $iface + } +} + +load_interfaces() { + config_get ifname "$1" ifname + config_get multipath "$1" multipath "off" + [ "$multipath" != "off" ] && interface=" ${ifname} ${interfaces}" +} + start_service() { - /sbin/hotplug-call net + local intf=$1 + local id count + . /lib/functions.sh + . /lib/functions/network.sh + global_multipath_settings + config_load network + config_foreach interface_multipath_settings interface $intf } reload_service() { - start + rc_procd start_service "$@" + return 0 } service_triggers() { - procd_add_reload_trigger network + local interfaces + procd_add_reload_trigger network + config_load network + config_foreach load_interfaces interface + + [ -n "${interfaces}" ] && { + for n in $interfaces ; do + procd_add_interface_trigger "interface.*" $n /etc/init.d/mptcp reload $n + done + } }