5 #ifndef HAKA_PROTO_TCP_H 6 #define HAKA_PROTO_TCP_H 10 #include <haka/lua/object.h> 13 #define SWAP_TO_TCP(type, x) SWAP_TO_BE(type, x) 14 #define SWAP_FROM_TCP(type, x) SWAP_FROM_BE(type, x) 15 #define TCP_GET_BIT(type, v, i) GET_BIT(SWAP_FROM_BE(type, v), i) 16 #define TCP_SET_BIT(type, v, i, x) SWAP_TO_BE(type, SET_BIT(SWAP_FROM_BE(type, v), i, x)) 17 #define TCP_GET_BITS(type, v, r) GET_BITS(SWAP_FROM_BE(type, v), r) 18 #define TCP_SET_BITS(type, v, r, x) SWAP_TO_BE(type, SET_BITS(SWAP_FROM_BE(type, v), r, x)) 20 #define TCP_CHECK(tcp, ...) if (!(tcp) || !(tcp)->packet) { error("invalid tcp packet"); return __VA_ARGS__; } 22 #define TCP_FLAGS_BITS 0, 8 23 #define TCP_FLAGS_START 13 33 #ifdef HAKA_LITTLEENDIAN 67 struct lua_object lua_object;
71 bool invalid_checksum:1;
76 struct tcp *tcp_create(
struct ipv4 *packet);
77 struct ipv4 *tcp_forge(
struct tcp *packet);
78 struct tcp_header *tcp_header(
struct tcp *packet,
bool write);
79 void tcp_release(
struct tcp *packet);
80 void tcp_compute_checksum(
struct tcp *packet);
81 bool tcp_verify_checksum(
struct tcp *packet);
82 size_t tcp_get_payload_length(
struct tcp *packet);
83 void tcp_action_drop(
struct tcp *packet);
86 #define TCP_GETSET_FIELD(type, field) \ 87 INLINE type tcp_get_##field(struct tcp *tcp) { TCP_CHECK(tcp, 0); return SWAP_FROM_TCP(type, tcp_header(tcp, false)->field); } \ 88 INLINE void tcp_set_##field(struct tcp *tcp, type v) { TCP_CHECK(tcp); \ 89 struct tcp_header *header = tcp_header(tcp, true); if (header) { header->field = SWAP_TO_TCP(type, v); } } 91 TCP_GETSET_FIELD(
uint16, srcport);
92 TCP_GETSET_FIELD(
uint16, dstport);
93 TCP_GETSET_FIELD(
uint32, seq);
94 TCP_GETSET_FIELD(
uint32, ack_seq);
95 TCP_GETSET_FIELD(
uint8, res);
96 TCP_GETSET_FIELD(
uint16, window_size);
97 TCP_GETSET_FIELD(
uint16, urgent_pointer);
98 TCP_GETSET_FIELD(
uint16, checksum);
103 return tcp_header(tcp,
false)->hdr_len << TCP_HDR_LEN;
106 INLINE
void tcp_set_hdr_len(
struct tcp *tcp,
uint8 v)
109 struct tcp_header *header = tcp_header(tcp,
true);
111 header->hdr_len = v >> TCP_HDR_LEN;
114 INLINE
uint16 tcp_get_flags(
struct tcp *tcp)
117 struct tcp_header *header = tcp_header(tcp,
false);
118 return TCP_GET_BITS(
uint8, *(((
uint8 *)header) + TCP_FLAGS_START), TCP_FLAGS_BITS);
121 INLINE
void tcp_set_flags(
struct tcp *tcp,
uint8 v)
124 struct tcp_header *header = tcp_header(tcp,
true);
126 *(((
uint8 *)header) + TCP_FLAGS_START) = TCP_SET_BITS(
uint8, *(((
uint8 *)header) + TCP_FLAGS_START), TCP_FLAGS_BITS, v);
130 #define TCP_GETSET_FLAG(name) \ 131 INLINE bool tcp_get_flags_##name(struct tcp *tcp) { TCP_CHECK(tcp, 0); return tcp_header(tcp, false)->name; } \ 132 INLINE void tcp_set_flags_##name(struct tcp *tcp, bool v) { TCP_CHECK(tcp); \ 133 struct tcp_header *header = tcp_header(tcp, true); if (header) { tcp_header(tcp, true)->name = v; } } 135 TCP_GETSET_FLAG(fin);
136 TCP_GETSET_FLAG(syn);
137 TCP_GETSET_FLAG(rst);
138 TCP_GETSET_FLAG(psh);
139 TCP_GETSET_FLAG(ack);
140 TCP_GETSET_FLAG(urg);
141 TCP_GETSET_FLAG(ecn);
142 TCP_GETSET_FLAG(cwr);
unsigned HAKA_16BIT_TYPE uint16
Definition: types.h:28
unsigned HAKA_32BIT_TYPE uint32
Definition: types.h:29
unsigned char uint8
Definition: types.h:27