From 61b8055a14f61851b9f70c76849bbb4f8f28ed55 Mon Sep 17 00:00:00 2001 From: Steven Webster Date: Mon, 17 Dec 2018 12:22:48 -0500 Subject: [PATCH] Fix remote logging traffic control filter priority Previous commit 01f5fdd made a required change to filter infrastructure traffic on the management interface with an 802.1q protocol in the case of a consolidated interface. However, this has caused the remote logging tc script to have a failure. The script tries to install 'ip' protocol filters at the same priority as the 802.1q filters, which is rejected by the kernel. This commit detects a consolidated interface situation and bumps the priority of the remote logging tc filter priority on the management interface, similarly to what is done in the main cgcs_tc_setup script. The file has also been cleaned up to pass bashate. Related-Bug: #1807055 Change-Id: Id11625c0f9bcbf109f574563ff284d4a36bc6377 Signed-off-by: Steven Webster --- .../scripts/remotelogging_tc_setup.sh | 115 ++++++++++++++---- 1 file changed, 88 insertions(+), 27 deletions(-) diff --git a/utilities/platform-util/scripts/remotelogging_tc_setup.sh b/utilities/platform-util/scripts/remotelogging_tc_setup.sh index f70da1ec0..7b7cf903a 100755 --- a/utilities/platform-util/scripts/remotelogging_tc_setup.sh +++ b/utilities/platform-util/scripts/remotelogging_tc_setup.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2017 Wind River Systems, Inc. +# Copyright (c) 2017-2018 Wind River Systems, Inc. # # SPDX-License-Identifier: Apache-2.0 # @@ -9,9 +9,12 @@ # $1 - listening port of remote log server PORT=$1 +DEFAULT_PRIORITY=1 + function is_loopback { # (from include/uapi/linux/if.h) - IFF_LOOPBACK=$((1<<3)) + # IFF_LOOPBACK = 1<<3 = 8. Using a left shifted syntax can confuse bashate. + IFF_LOOPBACK=8 # get the interface flags FLAGS=`cat /sys/class/net/$DEV/flags` @@ -26,7 +29,8 @@ function is_loopback { function log { # It seems that syslog isn't yet running, so append directly to the syslog file - echo `date +%FT%T.%3N` `hostname` CGCS_TC_SETUP: $@ >> /var/log/platform.log + local FILE=/var/log/platform.log + echo `date +%FT%T.%3N` `hostname` CGCS_TC_SETUP: $@ >> $FILE } function test_valid_speed { @@ -44,14 +48,10 @@ function test_valid_speed { function get_dev_speed { # If the link doesn't come up we won't go enabled, so here we can # afford to wait forever for the link. - while true - do - if [ -e /sys/class/net/$1/bonding ] - then - for VAL in `cat /sys/class/net/$1/lower_*/speed` - do - if test_valid_speed $VAL - then + while true; do + if [ -e /sys/class/net/$1/bonding ]; then + for VAL in `cat /sys/class/net/$1/lower_*/speed`; do + if test_valid_speed $VAL; then log slave for bond link $1 reported speed $VAL echo $VAL return 0 @@ -59,24 +59,24 @@ function get_dev_speed { log slave for bond link $1 reported invalid speed $VAL fi done - log all slaves for bond link $1 reported invalid speeds, will sleep 30 sec and try again + log all slaves for bond link $1 reported invalid speeds, \ + will sleep 30 sec and try again else VAL=`cat /sys/class/net/$1/speed` - if test_valid_speed $VAL - then + if test_valid_speed $VAL; then log link $1 reported speed $VAL echo $VAL return 0 else - log link $1 returned invalid speed $VAL, will sleep 30 sec and try again + log link $1 returned invalid speed $VAL, \ + will sleep 30 sec and try again fi fi sleep 30 done } -if [ -f /etc/platform/platform.conf ] -then +if [ -f /etc/platform/platform.conf ]; then source /etc/platform/platform.conf else exit 0 @@ -94,8 +94,7 @@ LOG_CBW=20 # 1:40 = default class from cgcs_tc_setup.sh # 1:60 = LOG class -if [ $nodetype == "controller" ] -then +if [ $nodetype == "controller" ]; then # Add class and filters to the oam interface DEV=$oam_interface SPEED=$(get_dev_speed $DEV) @@ -105,17 +104,22 @@ then # create new qdiscs, classes and LOG filters tc qdisc add dev $DEV root handle 1: htb default 40 - tc class add dev $DEV parent 1: classid 1:1 htb rate ${SPEED}mbit burst 15k quantum 60000 + tc class add dev $DEV parent 1: classid 1:1 htb rate ${SPEED}mbit \ + burst 15k quantum 60000 AC="tc class add dev $DEV parent 1:1 classid" - $AC 1:40 htb rate $((${DEFAULT_BW}*${SPEED}/100))mbit burst 15k ceil $((${DEFAULT_CBW}*${SPEED}/100))mbit quantum 60000 - $AC 1:60 htb rate $((${LOG_BW}*${SPEED}/100))mbit burst 15k ceil $((${LOG_CBW}*${SPEED}/100))mbit quantum 60000 + $AC 1:40 htb rate $((${DEFAULT_BW}*${SPEED}/100))mbit burst 15k \ + ceil $((${DEFAULT_CBW}*${SPEED}/100))mbit quantum 60000 + $AC 1:60 htb rate $((${LOG_BW}*${SPEED}/100))mbit burst 15k \ + ceil $((${LOG_CBW}*${SPEED}/100))mbit quantum 60000 tc qdisc add dev $DEV parent 1:40 handle 40: sfq perturb 10 tc qdisc add dev $DEV parent 1:60 handle 60: sfq perturb 10 - tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip dport ${PORT} 0xffff flowid 1:60 - tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip sport ${PORT} 0xffff flowid 1:60 + tc filter add dev $DEV protocol ip parent 1:0 prio $DEFAULT_PRIORITY \ + u32 match ip dport ${PORT} 0xffff flowid 1:60 + tc filter add dev $DEV protocol ip parent 1:0 prio $DEFAULT_PRIORITY \ + u32 match ip sport ${PORT} 0xffff flowid 1:60 fi @@ -128,12 +132,69 @@ then exit 0 fi +function infra_exists { + if [ -z "$infrastructure_interface" ]; then + return 1 + else + return 0 + fi +} + +function is_consolidated { + if ! infra_exists; then + return 1 + else + + local INFRA=$infrastructure_interface + local MGMT=$management_interface + + # determine whether the management interface is a parent of the + # infrastructure interface based on name. + # eg. this matches enp0s8 to enp0s8.10 but not enp0s88 + if [[ $INFRA =~ $MGMT[\.][0-9]+$ ]]; then + return 0 + fi + return 1 + fi +} + +function is_vlan { + if [ -f /proc/net/vlan/$DEV ]; then + return 0 + else + return 1 + fi +} + +function get_mgmt_tc_filter_priority { + local PRIORITY=$DEFAULT_PRIORITY + + if is_consolidated + then + if ! is_vlan + then + # If we have a consolidated VLAN interface, we must set the + # priority to $DEFAULT_PRIORITY + 1 for the underlying + # ethernet interface, as it will already have + # $DEFAULT_PRIORITY filters to catch high priority + # infra traffic + PRIORITY=$(($DEFAULT_PRIORITY + 1)) + fi + fi + echo $PRIORITY + return 0 +} + SPEED=$(get_dev_speed $DEV) +PRIORITY=$(get_mgmt_tc_filter_priority) AC="tc class add dev $DEV parent 1:1 classid" -$AC 1:60 htb rate $((${LOG_BW}*${SPEED}/100))mbit burst 15k ceil $((${LOG_CBW}*${SPEED}/100))mbit quantum 60000 +$AC 1:60 htb rate $((${LOG_BW}*${SPEED}/100))mbit burst 15k \ + ceil $((${LOG_CBW}*${SPEED}/100))mbit quantum 60000 tc qdisc add dev $DEV parent 1:60 handle 60: sfq perturb 10 -tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip dport ${PORT} 0xffff flowid 1:60 -tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip sport ${PORT} 0xffff flowid 1:60 +tc filter add dev $DEV protocol ip parent 1:0 prio $PRIORITY \ + u32 match ip dport ${PORT} 0xffff flowid 1:60 +tc filter add dev $DEV protocol ip parent 1:0 prio $PRIORITY \ + u32 match ip sport ${PORT} 0xffff flowid 1:60