-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtcp_range_list.c
120 lines (108 loc) · 2.73 KB
/
tcp_range_list.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "tcp_range_list.h"
#include "tcp_base.h"
#include "malloc.h"
#include <stdlib.h>
// void append_to_range_list(struct list_head *list, struct range_t *range)
// {
// struct range_t *r = (struct range_t *)MALLOC(sizeof(struct range_t));
// memcpy(r, range, sizeof(struct range_t));
// list_add_tail(&r->list, list);
// }
void append_to_range_list(struct list_head *list, uint32_t begin, uint32_t end)
{
struct range_t *range = MALLOC(struct range_t);
range->begin = begin;
range->end = end;
list_add_tail(&range->list, list);
}
uint32_t list_size(struct list_head *list)
{
struct list_head *p;
uint32_t size = 0;
list_for_each(p, list) {
struct range_t *node = list_entry(p, struct range_t, list);
size += (node->end - node->begin);
}
return size;
}
uint32_t list_range_size(struct list_head *list, uint32_t b, uint32_t e)
{
struct list_head *p;
uint32_t size = 0;
list_for_each(p, list) {
struct range_t *node = list_entry(p, struct range_t, list);
if (!before(node->begin, e) || !before(b, node->end))
continue;
else
size += (MIN_SEQ(node->end, e) - MAX_SEQ(node->begin, b));
}
return size;
}
int in_range_list(uint32_t n, struct list_head *list)
{
struct list_head *pos;
list_for_each_prev(pos, list) {
struct range_t *r = list_entry(pos, struct range_t, list);
if (between(n, r->begin, r->end))
return 1;
else if (before(n, r->begin))
return 0;
}
return 0;
}
void delete_range_list(struct list_head *list)
{
delete_list(list, struct range_t, list);
}
//get item number in the list
int get_list_item_num(struct list_head *list)
{
int cnt = 0;
struct list_head *pos;
list_for_each(pos, list) {
cnt++;
}
return cnt;
}
/*
void insert_to_range_list(struct list_head *list, uint32_t begin, uint32_t end)
{
struct range_t *range = MALLOC(struct range_t);
range->begin = begin;
range->end = end;
struct list_head *temp_node = list;
while(temp_node->next != list){
struct range_t *node = list_entry(temp_node, struct range_t, list);
if(node->begin == end)
break;
temp_node = temp_node->next;
}
if (temp_node ->next == list)
temp_node = temp_node->next;
list_insert(&range->list, temp_node->prev, temp_node);
}
*/
struct list_head *find_node_by_seq(struct list_head *list, uint32_t seq)
{
struct list_head * pos;
list_for_each_prev (pos, list) {
struct range_t *node = list_entry(pos, struct range_t, list);
if(node->begin == seq)
return pos;
}
return NULL;
}
//delete node with end smaller than seq
void delete_node_before_seq(struct list_head *list, uint32_t seq)
{
struct list_head *pos;
list_for_each(pos, list) {
struct range_t *range = list_entry(pos, struct range_t, list);
if(range->end <= seq){
FREE(range);
list_delete_entry(pos);
}
if(range->begin >= seq)
break;
}
}