-
Notifications
You must be signed in to change notification settings - Fork 0
/
data.c
executable file
·114 lines (81 loc) · 2.35 KB
/
data.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
#include "data.h"
int make_datagram(struct datagram* gram, int flag, int seq, int ack, int ts, char* buf, ssize_t buflen) {
if (!gram || buflen > (BUFFER_SIZE-HEADER_SIZE))
return 0;
memset(gram, 0, sizeof(struct datagram));
*(int*)gram->buf = flag;
*(((int*)gram->buf)+1) = seq;
*(((int*)gram->buf)+2) = ack;
*(((int*)gram->buf)+3) = ts;
if (buf && buflen)
memcpy(gram->buf+HEADER_SIZE, buf, buflen);
return 1;
}
int get_header(struct datagram* gram, int* pflag, int* pseq, int* pack, int* pts) {
if (!gram)
return 0;
if (pflag)
*pflag = *(int*)gram->buf;
if (pseq)
*pseq = *(((int*)gram->buf)+1);
if (pack)
*pack = *(((int*)gram->buf)+2);
if (pts)
*pts = *(((int*)gram->buf)+3);
return 1;
}
int get_payload(struct datagram* gram, char* buf, ssize_t buflen) {
if (!gram || !buf || buflen > (BUFFER_SIZE-HEADER_SIZE))
return 0;
if (buf && buflen)
memcpy(buf, gram->buf+HEADER_SIZE, buflen);
return 1;
}
char* get_payload_ptr(struct datagram* gram) {
if (!gram)
return NULL;
return gram->buf + HEADER_SIZE;
}
int get_flag(struct datagram* gram) {
if (!gram)
return 0;
return *(int*)gram->buf;
}
void set_flag(struct datagram* gram, int flag) {
if (!gram)
return;
*(int*)gram->buf = flag;
}
void set_retry_flag(struct datagram* gram) {
if (!gram)
return;
*(int*)gram->buf |= RETRY;
}
void set_fin_flag(struct datagram* gram) {
if (!gram)
return;
*(int*)gram->buf |= FIN;
}
void set_ts(struct datagram* gram, int ts) {
if (!gram)
return;
*(((int*)gram->buf)+3) = ts;
}
void get_str(struct datagram* ptr_gram, char* buf, ssize_t buflen) {
int flag;
int seq;
int ack;
get_header(ptr_gram, &flag, &seq, &ack, 0);
bzero(buf, buflen);
if (flag & SYN)
sprintf(buf+strlen(buf), "SYN ");
if (flag & ACK)
sprintf(buf+strlen(buf), "ACK ");
if (flag & DAT)
sprintf(buf+strlen(buf), "DAT ");
if (flag & FIN)
sprintf(buf+strlen(buf), "FIN ");
sprintf(buf+strlen(buf), "seq: %d ", seq);
if (flag & ACK)
sprintf(buf+strlen(buf), "ack: %d", ack);
}