123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- #include <stdio.h>
- #include "../estimator/inter_arrival.h"
- #include "../common/cf_platform.h"
- #include "../cc/razor_log.h"
- #define BURST_THRESHOLD_MS 5
- static inline void reset_group_ts(inter_arrival_t* arr)
- {
- arr->cur_ts_group.size = 0;
- arr->cur_ts_group.first_timestamp = 0;
- arr->cur_ts_group.timestamp = 0;
- arr->cur_ts_group.complete_ts = -1;
- arr->cur_ts_group.last_sys_ts = 0;
- arr->prev_ts_group.size = 0;
- arr->prev_ts_group.first_timestamp = 0;
- arr->prev_ts_group.timestamp = 0;
- arr->prev_ts_group.complete_ts = -1;
- arr->prev_ts_group.last_sys_ts = 0;
- }
- /*判断包是否是乱序,如果报文是前一个group的序列,不进行处理*/
- static inline int inter_arrival_in_order(inter_arrival_t* arr, uint32_t ts)
- {
- razor_debug("inter_arrival_in_order. complete_ts: %I64d first_timestamp: %u timestamp: %u ts: %u. \n",
- arr->cur_ts_group.complete_ts, arr->cur_ts_group.first_timestamp, arr->cur_ts_group.timestamp, ts);
- if (arr->cur_ts_group.complete_ts == -1)
- return 0;
- //huchen modify,send last need in order, because cur - pre we use last ts.
- //if (arr->cur_ts_group.first_timestamp <= ts)
- if (arr->cur_ts_group.timestamp <= ts)
- return 0;
- return -1;
- }
- /*判断报文突发发送*/
- static inline int belongs_to_burst(inter_arrival_t* arr, uint32_t ts, int64_t arrival_ts)
- {
- int64_t arrival_ts_delta;
- uint32_t ts_delta;
- int pro_delta;
- if (arr->burst == -1)
- return -1;
- arrival_ts_delta = arrival_ts - arr->cur_ts_group.complete_ts;
- ts_delta = ts - arr->cur_ts_group.timestamp;
- if (ts_delta == 0)
- return 0;
- pro_delta = (int)(arrival_ts_delta - ts_delta);
- if (pro_delta < 0 && arrival_ts_delta <= BURST_THRESHOLD_MS)
- return 0;
- return -1;
- }
- static int inter_arrival_new_group(inter_arrival_t* arr, uint32_t ts, int64_t arrival_ts)
- {
- uint32_t diff;
- if (arr->cur_ts_group.complete_ts == -1)
- return -1;
- else if (belongs_to_burst(arr, ts, arrival_ts) == 0)
- return -1;
- else{
- diff = ts - arr->cur_ts_group.first_timestamp;
- return (diff > arr->time_group_len_ticks) ? 0 : -1;
- }
- }
- inter_arrival_t* create_inter_arrival(int burst, uint32_t group_ticks)
- {
- inter_arrival_t* arr = calloc(1, sizeof(inter_arrival_t));
- arr->burst = burst;
- arr->time_group_len_ticks = group_ticks;
- reset_group_ts(arr);
- razor_debug("create_inter_arrival. \n");
- return arr;
- }
- void destroy_inter_arrival(inter_arrival_t* arr)
- {
- if (arr != NULL)
- free((void *)arr);
- razor_debug("destroy_inter_arrival. \n");
- }
- #define OFFSET_THRESHOLD_MS 3000
- int inter_arrival_compute_deltas(inter_arrival_t* arr, uint32_t timestamp, int64_t arrival_ts, int64_t system_ts, size_t size,
- uint32_t* timestamp_delta, int64_t* arrival_delta, int* size_delta)
- {
- int ret = -1;
- int64_t arr_delta, sys_delta;
- uint32_t ts_delta;
- razor_debug("1start inter_arrival_compute_deltas. input timestamp: %u arrival_ts: %I64d system_ts: %I64d size: %d. \n",
- timestamp, arrival_ts, system_ts, size, arr->cur_ts_group.timestamp);
- razor_debug("2start inter_arrival_compute_deltas. cur_timestamp: %u prev_timestamp: %u cur_complete: %I64d prev_complete: %I64d. \n",
- arr->cur_ts_group.timestamp, arr->prev_ts_group.timestamp,
- arr->cur_ts_group.complete_ts, arr->prev_ts_group.complete_ts);
- if (arr->cur_ts_group.complete_ts == -1){
- arr->cur_ts_group.timestamp = timestamp;
- arr->cur_ts_group.first_timestamp = timestamp;
-
- razor_debug("3arr->cur_ts_group.complete_ts == -1. cur_timestamp: %u prev_timestamp: %u cur_complete: %I64d prev_complete: %I64d. \n",
- arr->cur_ts_group.timestamp, arr->prev_ts_group.timestamp,
- arr->cur_ts_group.complete_ts, arr->prev_ts_group.complete_ts);
- }
- else if (inter_arrival_in_order(arr, timestamp) == -1) {
- razor_debug("4end inter_arrival_compute_deltas. inter_arrival not in_order timestamp: %u. \n", timestamp);
- return ret;
- }
- else if (inter_arrival_new_group(arr, timestamp, arrival_ts) == 0){
- razor_debug("5inter_arrival_compute_deltas. inter_arrival_new_group timestamp: %u arrival_ts: %I64d. \n",
- timestamp, arrival_ts);
-
- if (arr->prev_ts_group.complete_ts >= 0){
- ts_delta = arr->cur_ts_group.timestamp - arr->prev_ts_group.timestamp;
- arr_delta = arr->cur_ts_group.complete_ts - arr->prev_ts_group.complete_ts;
- sys_delta = arr->cur_ts_group.last_sys_ts - arr->prev_ts_group.last_sys_ts;
- if (arr_delta > sys_delta + OFFSET_THRESHOLD_MS){
- reset_group_ts(arr);
- return ret;
- }
- if (arr_delta < 0){
- arr->num_consecutive++;
- if (arr->num_consecutive > 3)
- reset_group_ts(arr);
- return ret;
- }
- else
- arr->num_consecutive = 0;
- *size_delta = arr->cur_ts_group.size - arr->prev_ts_group.size;
- *timestamp_delta = ts_delta;
- *arrival_delta = arr_delta;
- ret = 0;
- razor_debug("6inter_arrival_compute_deltas. inter_arrival_new_group size_delta: %d timestamp_delta: %u arrival_delta: %I64d. \n",
- *size_delta, *timestamp_delta, *arrival_delta);
- }
- arr->prev_ts_group = arr->cur_ts_group;
- arr->cur_ts_group.first_timestamp = timestamp;
- arr->cur_ts_group.timestamp = timestamp;
- arr->cur_ts_group.size = 0;
- }
- else{
- arr->cur_ts_group.timestamp = SU_MAX(arr->cur_ts_group.timestamp, timestamp);
-
- razor_debug("7else. cur_timestamp: %u prev_timestamp: %u cur_complete: %I64d prev_complete: %I64d. \n",
- arr->cur_ts_group.timestamp, arr->prev_ts_group.timestamp,
- arr->cur_ts_group.complete_ts, arr->prev_ts_group.complete_ts);
- }
- arr->cur_ts_group.size += size;
- arr->cur_ts_group.complete_ts = arrival_ts;
- arr->cur_ts_group.last_sys_ts = system_ts;
- return ret;
- }
|