diff --git a/qosmngr/files/airoha/lib/qos/qos.sh b/qosmngr/files/airoha/lib/qos/qos.sh index 60ed60088c99744e26782140851ce7304885a0d1..4a62aca8d805219e2e9bac045778cb87a6e4226d 100755 --- a/qosmngr/files/airoha/lib/qos/qos.sh +++ b/qosmngr/files/airoha/lib/qos/qos.sh @@ -49,3 +49,7 @@ reload_qos() { esac hw_commit_all } + +reload_qos_service() { + reload_qos +} diff --git a/qosmngr/files/broadcom/lib/qos/qos.sh b/qosmngr/files/broadcom/lib/qos/qos.sh index a990df6303f216abe69e65c7f4b5ea6a626f229c..811b05daf13b5cbe8cb717c7535dc2225570698c 100755 --- a/qosmngr/files/broadcom/lib/qos/qos.sh +++ b/qosmngr/files/broadcom/lib/qos/qos.sh @@ -15,10 +15,6 @@ temp_order=1 cfg_name="" cfg_type="" -q_cfg_restart="false" -policer_cfg_modf="false" -classify_cfg_modf="false" -shaper_cfg_modf="false" # Function to handle a queue order and # update total number of queues @@ -1220,7 +1216,7 @@ configure_qos() { configure_classify } -reload_qos_service() { +reload_qos() { local service_name="$1" local cpu_model="$(cat /proc/socinfo | grep 'SoC Name' | cut -d':' -f2)" @@ -1242,13 +1238,16 @@ reload_qos_service() { fi } -is_queue_cfg_added_deleted() +get_cfg_added_deleted() { # return true if there is difference in number of queue configuration # in /etc/config/qos and /tmp/qos/qos, false is returned if both file # has same count of queue configuration. - q_cfg_count=0 - local new_q_cfg_count=0 + local queue=0 + local classify=0 + local shaper=0 + local policer=0 + local old_cfg="false" config_cb() { # invoked on the just previous config_load, get the count of @@ -1258,42 +1257,63 @@ is_queue_cfg_added_deleted() if [ -z $cfg_name ] || [ -z $cfg_type ]; then return fi - if [ "$cfg_type" == "queue" ]; then - q_cfg_count=$(($q_cfg_count + 1)) - option_cb() { - local option="$1" - local value="$2" - if [ -z $option ] || [ -z $value ]; then - return - fi - q_cfg_count=$(($q_cfg_count + 1)) - } + + if [ "$old_cfg" == "false" ]; then + eval $cfg_type=$(($cfg_type + 1)) else - option_cb() { - return - } + eval $cfg_type=$(($cfg_type - 1)) fi + option_cb() { + local option="$1" + local value="$2" + if [ -z "$option" ] || [ -z "$value" ]; then + return + fi + if [ "$old_cfg" == "false" ]; then + eval $cfg_type=$(($cfg_type + 1)) + else + eval $cfg_type=$(($cfg_type - 1)) + fi + } } # config_load will trigger call for config_cb that is getting count - # of qos configuration, q_cfg_count will have the count. + # of qos configuration, respective config counts will come. config_load qos - new_q_cfg_count=$q_cfg_count - q_cfg_count=0 - # config_load will trigger call for config_cb that is getting count + # config_load will trigger call for config_cb that is decreasing count # of qos configuration. - config_load "/tmp/qos/qos" + old_cfg="true" + UCI_CONFIG_DIR="/tmp/qos" + config_load qos + UCI_CONFIG_DIR="/etc/config" reset_cb - if [ $new_q_cfg_count -eq $q_cfg_count ]; then - echo "false" + + if [ $classify -ne 0 ]; then + modified_config="classify" + fi + if [ $shaper -ne 0 ]; then + modified_config="$modified_config shaper" + fi + if [ $policer -ne 0 ]; then + modified_config="$modified_config policer" + fi + if [ $queue -eq 0 ]; then + echo "$modified_config" return else - echo "true" + echo "queue" return fi } -# reload_qos is invoked on qos service reload. -reload_qos() { +# reload_qos_service is invoked on qos service reload. +reload_qos_service() { + q_cfg_restart="false" + policer="false" + classify="false" + shaper="false" + + setup_qos + if ! [[ -f "/etc/config/qos" && -f "/tmp/qos/qos" ]]; then configure_qos cp /etc/config/qos /tmp/qos/qos @@ -1311,36 +1331,30 @@ reload_qos() { # comparsion is done between /etc/config/qos and /tmp/qos/qos local option="$1" local value="$2" - if [ -z $option ] || [ -z $value ]; then + local old_value="" + if [ -z "$option" ] || [ -z "$value" ]; then return fi old_value=$(uci -q -c "/tmp/qos" get qos.$cfg_name.$option) - if ! [ $old_value = $value ]; then + if ! [ "$old_value" == "$value" ]; then if [ "$cfg_type" == "queue" ]; then q_cfg_restart="true" - elif [ "$cfg_type" == "shaper" ]; then - shaper_cfg_modf="true" - elif [ "$cfg_type" == "classify" ]; then - classify_cfg_modf="true" - elif [ "$cfg_type" == "policer" ]; then - policer_cfg_modf="true" + else + eval $cfg_type="true" fi fi } } - # if there is new addition/deletion of queue configuration or modification - # of value of queue configuration parameters then return false to - # trigger restart of qos. Otehrwise shaper, policer and classification - # related operation config is invoked that does not change queue statistics - q_cfg_added_deleted=$(is_queue_cfg_added_deleted) - if [ "$q_cfg_added_deleted" == "true" ]; then + # if there is new addition/deletion of queue configuration + # then return is queue to trigger restart of qos. + # Otehrwise shaper policer classify + # respective operation config is invoked that does not change queue statistics + cfg_added_deleted=$(get_cfg_added_deleted) + if [ "$cfg_added_deleted" == "queue" ]; then configure_qos else q_cfg_restart="false" - policer_cfg_modf="false" - classify_cfg_modf="false" - shaper_cfg_modf="false" - # config_load will trigger call for config_cb that is checking + # config_load will trigger call for config_cb that is checking # for modification in config value of queue config. # if change of value of queue config is there then q_cfg_restart # is set as true, else other qos config flag is set as true. @@ -1349,17 +1363,21 @@ reload_qos() { if [ "$q_cfg_restart" == "true" ]; then configure_qos else - if [ "$shaper_cfg_modf" == "true" ]; then - reload_qos_service "shaper" + for config in $cfg_added_deleted + do + eval $config="true" + done + if [ "$shaper" == "true" ]; then + reload_qos "shaper" fi - if [ "$policer_cfg_modf" == "true" ]; then - reload_qos_service "policer" + if [ "$policer" == "true" ]; then + reload_qos "policer" # change in policer config may need reconfiguration # of classifier - reload_qos_service "classify" + reload_qos "classify" fi - if [ "$classify_cfg_modf" == "true" ]; then - reload_qos_service "classify" + if [ "$classify" == "true" ]; then + reload_qos "classify" fi fi fi diff --git a/qosmngr/files/common/etc/init.d/qos b/qosmngr/files/common/etc/init.d/qos index 1c24b30ff7ad99859f5d2fa6d392fef4fdbff3dd..96028b66e37d2fc8ff3e68969485b408590e0fe5 100755 --- a/qosmngr/files/common/etc/init.d/qos +++ b/qosmngr/files/common/etc/init.d/qos @@ -16,7 +16,7 @@ PROG=/usr/sbin/qosmngr start_service() { if [ -f "/etc/config/qos" ]; then - reload_qos_service + reload_qos procd_open_instance qosmngr procd_set_param command ${PROG} procd_set_param respawn @@ -41,5 +41,5 @@ restart() { reload_service() { - reload_qos + reload_qos_service }