diff --git a/qosmngr/Makefile b/qosmngr/Makefile index e56fff527..3c2414c7c 100644 --- a/qosmngr/Makefile +++ b/qosmngr/Makefile @@ -6,13 +6,13 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=qosmngr -PKG_VERSION:=1.0.20 +PKG_VERSION:=1.0.21 LOCAL_DEV:=0 ifneq ($(LOCAL_DEV),1) PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/qosmngr.git -PKG_SOURCE_VERSION:=cc1d993b853f360c0aa19f08bfbaf1e05667527a +PKG_SOURCE_VERSION:=f03c22f4bae8497bc9c88715ab094e7bef46b59e PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz PKG_MIRROR_HASH:=skip endif diff --git a/qosmngr/files/airoha/etc/uci-defaults/99-set-queue-shaper-status b/qosmngr/files/airoha/etc/uci-defaults/99-set-queue-shaper-status new file mode 100644 index 000000000..dd27370f7 --- /dev/null +++ b/qosmngr/files/airoha/etc/uci-defaults/99-set-queue-shaper-status @@ -0,0 +1,4 @@ +uci -q set qos.globals=globals +uci -q set qos.globals.per_queue_shaper=0 + +exit 0 diff --git a/qosmngr/files/airoha/lib/qos/qos_functions.sh b/qosmngr/files/airoha/lib/qos/qos_functions.sh new file mode 100644 index 000000000..af7b15186 --- /dev/null +++ b/qosmngr/files/airoha/lib/qos/qos_functions.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +get_max_linkspeed() { + local ifname="$1" + local modes="10000 5000 2500 1000 100 10" + local speed="" + local phycap="$(ethtool $ifname | sed -ne '/Supported link modes:/,/:/p' | sed -e 's/.*://' -e 's/^[[:space:]]*//' -e '$d')" + + for i in $modes; do + if echo "${phycap}" | grep -qe "$i\\D"; then + speed=$i + break + fi + done + + echo "$speed" +} + +get_shaper_rate() { + rate="$1" + + if [ -z "${rate}" ]; then + echo "-1" + return + fi + + if [ "${rate}" -eq -1 ]; then + #No shaping + echo "-1" + return + fi + + # Convert the rate from bps to kbps. + if [ "${rate}" -ge 0 -a "${rate}" -le 100 ];then + # set as per percentage + speed=$(get_max_linkspeed "$ifname") + if [ -z "${speed}" ]; then + echo "-1" + return + fi + + rate=$((speed * rate * 1000 / 100)) + else + rate=$(($rate / 1000)) + fi + + echo "$rate" +} diff --git a/qosmngr/files/airoha/lib/qos/queue.sh b/qosmngr/files/airoha/lib/qos/queue.sh index 9b15807bd..7a71ec7a0 100755 --- a/qosmngr/files/airoha/lib/qos/queue.sh +++ b/qosmngr/files/airoha/lib/qos/queue.sh @@ -1,6 +1,8 @@ #!/bin/sh # Handle queues and their order +. /lib/qos/qos_functions.sh + Q_COUNT=0 # Preliminary configuration of a queue @@ -21,7 +23,7 @@ handle_queue() { config_get is_enable "$qid" "enable" 1 # no need to configure disabled queues - if [ "${is_enable}" == "0" ]; then + if [ "${is_enable}" = "0" ]; then return fi @@ -38,7 +40,21 @@ handle_queue() { config_get qsize "$qid" "queue_size" 1024 config_get precedence "$qid" "precedence" - hw_queue_set "${ifname}" "${Q_COUNT}" "${precedence}" "$qsize" "$wgt" "$sc_alg" "$shapingrate" "$rate" "$bs" + rate=$(get_shaper_rate "$rate") + + if [ "$rate" -eq -1 ]; then + return + fi + + config_get bs "$qid" "burst_size" + + if [ "${bs}" -ge 1000 ] ; then + bs=$((bs / 1000)) + else + bs=0 + fi + + hw_queue_set "${ifname}" "${Q_COUNT}" "${precedence}" "$qsize" "$wgt" "$sc_alg" "$rate" "$bs" Q_COUNT=$((Q_COUNT + 1)) } diff --git a/qosmngr/files/airoha/lib/qos/shaper.sh b/qosmngr/files/airoha/lib/qos/shaper.sh index 185c42e0c..dfb1b01e4 100755 --- a/qosmngr/files/airoha/lib/qos/shaper.sh +++ b/qosmngr/files/airoha/lib/qos/shaper.sh @@ -1,21 +1,7 @@ #!/bin/sh # Common shaper library -get_max_linkspeed() { - local ifname="$1" - local modes="10000 5000 2500 1000 100 10" - local speed="" - local phycap="$(ethtool $ifname | sed -ne '/Supported link modes:/,/:/p' | sed -e 's/.*://' -e 's/^[[:space:]]*//' -e '$d')" - - for i in $modes; do - if echo "${phycap}" | grep -qe "$i\\D"; then - speed=$i - break - fi - done - - echo "$speed" -} +. /lib/qos/qos_functions.sh # UCI 'shaper' section handler. # It will verify shaper configuration sanity and then invoke @@ -36,26 +22,10 @@ handle_shaper() { fi config_get rate "$sid" "rate" - if [ -z "${rate}" ]; then - return - fi - - if [ "${rate}" -eq -1 ]; then - # No shaping - return - fi - - # Convert the rate from bps to kbps. - if [ "${rate}" -ge 0 -a "${rate}" -le 100 ] ; then - # Set as per percentage - speed=$(get_max_linkspeed "$ifname") - if [ -z "${speed}" ]; then - return - fi - - rate=$((speed * rate * 1000 / 100)) - else - rate=$((rate / 1000)) + rate=$(get_shaper_rate "$rate") + + if [ "$rate" -eq -1 ]; then + return fi config_get bs "$sid" "burst_size" diff --git a/qosmngr/files/broadcom/lib/qos/qos.sh b/qosmngr/files/broadcom/lib/qos/qos.sh index 2cac99ea3..8d589dc79 100755 --- a/qosmngr/files/broadcom/lib/qos/qos.sh +++ b/qosmngr/files/broadcom/lib/qos/qos.sh @@ -31,6 +31,37 @@ get_max_linkspeed() { echo "$speed" } +get_shaper_rate() { + rate="$1" + + if [ -z "${rate}" ]; then + echo "-1" + return + fi + + if [ "${rate}" -eq -1 ]; then + #No shaping + echo "-1" + return + fi + + # Convert the rate from bps to kbps. + if [ "${rate}" -ge 0 -a "${rate}" -le 100 ];then + # set as per percentage + speed=$(get_max_linkspeed "$ifname") + if [ -z "${speed}" ]; then + echo "-1" + return + fi + + rate=$((speed * rate * 1000 / 100)) + else + rate=$(($rate / 1000)) + fi + + echo "$rate" +} + get_port_number() { [ -z "$1" ] && return local ports="0 1 2 3 4 5 6 7 8" @@ -125,10 +156,17 @@ handle_queue_shapingrate() { fi config_get rate "$qid" "rate" + + rate=$(get_shaper_rate "$rate") + if [ "$rate" -eq -1 ]; then + return + fi + config_get bs "$qid" "burst_size" # Call tmctl which is a broadcomm command to configure queues shapingrate. tmctl setqcfg --devtype 0 --if $ifname --qid $Q_COUNT --shapingrate $rate --burstsize $bs &>/dev/null + Q_COUNT=$((Q_COUNT + 1)) } @@ -198,6 +236,13 @@ handle_queue() { order=0 fi + rate=$(get_shaper_rate "$rate") + if [ "$rate" -eq -1 ]; then + return + fi + + config_get bs "$qid" "burst_size" + # Call tmctl which is a broadcomm command to configure queues on a port. tmctl setqcfg --devtype 0 --if $ifname --qid $Q_COUNT --priority $order --qsize $qsize --weight $wgt --schedmode $salg --shapingrate $rate --burstsize $bs Q_COUNT=$((Q_COUNT + 1)) @@ -344,28 +389,12 @@ handle_shaper() { fi config_get rate "$sid" "rate" - if [ -z "${rate}" ]; then + + rate=$(get_shaper_rate "$rate") + if [ "$rate" -eq -1 ]; then return fi - if [ "${rate}" -eq -1 ]; then - #No shaping - return - fi - - # Convert the rate from bps to kbps. - if [ "${rate}" -ge 0 -a "${rate}" -le 100 ];then - # set as per percentage - speed=$(get_max_linkspeed "$ifname") - if [ -z "${speed}" ]; then - return - fi - - rate=$((speed * rate * 1000 / 100)) - else - rate=$(($rate / 1000)) - fi - config_get bs "$sid" "burst_size" tmctl setportshaper --devtype 0 --if $ifname --shapingrate $rate --burstsize $bs }