diff options
| author | root <[email protected]> | 2024-02-08 09:35:10 +0000 |
|---|---|---|
| committer | root <[email protected]> | 2024-02-08 09:35:10 +0000 |
| commit | 24d48c921bf28acc66b9395bdeaafebed718f6d2 (patch) | |
| tree | df57dcf161ac10de68f5b71b0e5e4022deb84c10 | |
| parent | bad1c91e472c30e348eb0eb8c0cdb504bc6f928e (diff) | |
add codel temp code
| -rw-r--r-- | shaping/include/shaper.h | 13 | ||||
| -rw-r--r-- | shaping/include/shaper_aqm.h | 27 | ||||
| -rw-r--r-- | 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 <time.h> + +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 <math.h> #include <time.h> #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; |
