summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroot <[email protected]>2024-02-08 09:35:10 +0000
committerroot <[email protected]>2024-02-08 09:35:10 +0000
commit24d48c921bf28acc66b9395bdeaafebed718f6d2 (patch)
treedf57dcf161ac10de68f5b71b0e5e4022deb84c10
parentbad1c91e472c30e348eb0eb8c0cdb504bc6f928e (diff)
add codel temp code
-rw-r--r--shaping/include/shaper.h13
-rw-r--r--shaping/include/shaper_aqm.h27
-rw-r--r--shaping/src/shaper_aqm.cpp40
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;