net/mwan3: registrate SIGUSR1 trap on interface down event
authorFlorian Eckert <fe@dev.tdt.de>
Thu, 6 Apr 2017 13:41:05 +0000 (15:41 +0200)
committerFlorian Eckert <fe@dev.tdt.de>
Tue, 11 Apr 2017 07:46:20 +0000 (09:46 +0200)
If interface is getting down by netifd (unplug ethernet cable)
mwan3track will not recognize this change. It will also generate an
additional down event when he notice does his tracking interface is offline.

Mwan3track will now be informed by a signal (trap) USR1 during down event
that the interface is already down. An additional down event will not be
generated.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
net/mwan3/files/etc/hotplug.d/iface/15-mwan3
net/mwan3/files/lib/mwan3/mwan3.sh
net/mwan3/files/usr/sbin/mwan3track

index 7638dadbcd7b0daf9aca3cc8b1fc8cf0f88a0a8c..32bfa82a3df646e2f5fddb49d4746bb6588e5bdc 100644 (file)
@@ -64,6 +64,7 @@ case "$ACTION" in
                mwan3_delete_iface_iptables $INTERFACE
                mwan3_delete_iface_route $INTERFACE
                mwan3_delete_iface_ipset_entries $INTERFACE
+               mwan3_track_signal $INTERFACE $DEVICE
                mwan3_set_policies_iptables
                mwan3_set_user_rules
                mwan3_flush_conntrack $INTERFACE $DEVICE "ifdown"
index ed51b222392e8371375ff887b444eab4b8014976..f0ebcc42e1bfed194c765c017fcbc9aa378152a0 100644 (file)
@@ -399,6 +399,23 @@ mwan3_track()
        fi
 }
 
+mwan3_track_signal()
+{
+       local pid status
+
+       if [ -f "/var/run/mwan3track-${1}.pid" ]; then
+               pid="$(cat "/var/run/mwan3track-${1}.pid")"
+               status="$(pgrep -f mwan3track | grep "${pid}")"
+               if [ "${status}" != "" ]; then
+                       kill -USR1 "${pid}"
+               else
+                       $LOG warn "Unable to send signal USR1 to mwan3track on interface $1 with pid ${pid}"
+               fi
+       else
+               $LOG warn "Unable to find \"/var/run/mwan3track-${1}.pid\" file for mwan3track on interface $1"
+       fi
+}
+
 mwan3_set_policy()
 {
        local iface_count id iface family metric probability weight
index 4cf0409bc32df045b45715078bb94ca660238b45..a5c3a4272ee0292b682698abf6831c30223a9457 100755 (executable)
@@ -4,6 +4,9 @@
 
 LOG="/usr/bin/logger -t $(basename "$0")[$$] -p"
 INTERFACE=""
+DEVICE=""
+
+IFDOWN_EVENT=0
 
 clean_up() {
        $LOG notice "Stopping mwan3track for interface \"${INTERFACE}\""
@@ -15,6 +18,11 @@ clean_up() {
        exit 0
 }
 
+if_down() {
+       $LOG info "Detect ifdown event on interface ${INTERFACE} (${DEVICE})"
+       IFDOWN_EVENT=1
+}
+
 main() {
        local reliability count timeout interval failure_interval
        local recovery_interval down up size
@@ -22,9 +30,11 @@ main() {
        [ -z "$3" ] && echo "Error: should not be started manually" && exit 0
 
        INTERFACE=$1
+       DEVICE=$2
        echo "$$" > /var/run/mwan3track-$1.pid
        mkdir -p /var/run/mwan3track/$1
        trap clean_up SIGINT SIGTERM
+       trap if_down SIGUSR1
 
        config_load mwan3
        config_get reliability $1 reliability 1
@@ -106,6 +116,12 @@ main() {
 
                host_up_count=0
                sleep $sleep_time
+
+               if [ "${IFDOWN_EVENT}" -eq 1 ]; then
+                       score=0
+                       echo "offline" > /var/run/mwan3track/$1/STATUS
+                       IFDOWN_EVENT=0
+               fi
        done
 }