From 24d48c921bf28acc66b9395bdeaafebed718f6d2 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 8 Feb 2024 09:35:10 +0000 Subject: add codel temp code --- shaping/include/shaper.h | 13 +------------ shaping/include/shaper_aqm.h | 27 +++++++++++++++++++++++++++ shaping/src/shaper_aqm.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 12 deletions(-) diff --git a/shaping/include/shaper.h b/shaping/include/shaper.h index 83f93f1..0e7f455 100644 --- a/shaping/include/shaper.h +++ b/shaping/include/shaper.h @@ -7,6 +7,7 @@ #include "utils.h" #include "shaper_stat.h" #include "shaper_global_stat.h" +#include "shaper_aqm.h" extern "C" { #include "timeout.h" } @@ -97,18 +98,6 @@ enum shaping_profile_type { PROFILE_TYPE_SPLIT_BY_LOCAL_HOST }; -enum shaper_aqm_type { - AQM_TYPE_NONE = 0, - AQM_TYPE_BLUE, - AQM_TYPE_CODEL, - AQM_TYPE_MAX -}; - -struct shaper_aqm_blue_para { - time_t update_time; - int probability; -}; - struct shaper_token_multiple { int token_get_multiple; unsigned char has_drop_by_queue_full; diff --git a/shaping/include/shaper_aqm.h b/shaping/include/shaper_aqm.h index 794c74d..48fd970 100644 --- a/shaping/include/shaper_aqm.h +++ b/shaping/include/shaper_aqm.h @@ -1,2 +1,29 @@ +#pragma once +#include + +enum shaper_aqm_type { + AQM_TYPE_NONE = 0, + AQM_TYPE_BLUE, + AQM_TYPE_CODEL, + AQM_TYPE_MAX +}; + +struct shaper_aqm_blue_para { + time_t update_time; + int probability; +}; + +enum CoDel_state { + CODEL_STATE_NORMAL = 0, + CODEL_STATE_DROPPING_TIMER, + CODEL_STATE_DROPPING_PHASE, +}; + +struct shaper_aqm_codel_para { + unsigned long long start_drop_time_ms; + unsigned long long next_drop_time_ms; + enum CoDel_state state; + unsigned int drop_count; +}; int shaper_aqm_need_drop(struct shaping_profile_info *profile, struct shaping_packet_wrapper *pkt_wrapper); \ No newline at end of file diff --git a/shaping/src/shaper_aqm.cpp b/shaping/src/shaper_aqm.cpp index 20c4190..857c8bd 100644 --- a/shaping/src/shaper_aqm.cpp +++ b/shaping/src/shaper_aqm.cpp @@ -1,3 +1,4 @@ +#include #include #include "shaper.h" #include "shaper_aqm.h" @@ -27,6 +28,45 @@ static int shaper_aqm_blue_need_drop(struct shaping_packet_wrapper *pkt_wrapper, return 0; } + +#define CODEL_MAX_LATENCY 5 //unit:ms +#define CODEL_DROP_INTERVAL 100 //unit:ms +static int shaper_aqm_codel_need_drop(struct shaping_packet_wrapper *pkt_wrapper, struct shaper_aqm_codel_para *para, unsigned long long curr_time_ms, unsigned long long latency) +{ + if (latency < CODEL_MAX_LATENCY) { + para->state = CODEL_STATE_NORMAL; + return 0; + } + + int ret = 0; + switch (para->state) { + case CODEL_STATE_NORMAL: + para->start_drop_time_ms = curr_time_ms + CODEL_DROP_INTERVAL; + para->state = CODEL_STATE_DROPPING_TIMER; + break; + case CODEL_STATE_DROPPING_TIMER: + if (curr_time_ms >= para->next_drop_time_ms) { + para->state = CODEL_STATE_DROPPING_PHASE; + para->drop_count = 1; + para->next_drop_time_ms = curr_time_ms + CODEL_DROP_INTERVAL / sqrt(para->drop_count); + ret = 1; + } + break; + case CODEL_STATE_DROPPING_PHASE: + if (curr_time_ms >= para->next_drop_time_ms) { + para->drop_count++; + para->next_drop_time_ms = curr_time_ms + CODEL_DROP_INTERVAL / sqrt(para->drop_count); + ret = 1; + } + break; + default: + break; + } + + return ret; +} + + static int shaper_aqm_have_processed(struct shaping_packet_wrapper *pkt_wrapper, int profile_id) { int i = 0; -- cgit v1.2.3