diff options
| author | 卢文朋 <[email protected]> | 2021-09-13 02:12:29 +0000 |
|---|---|---|
| committer | luwenpeng <[email protected]> | 2021-09-15 16:58:01 +0800 |
| commit | ba21a53bb7c8bc5e70eae278b2fd238c2bcd1337 (patch) | |
| tree | f15571a0b8c096532be99e8a6858370c047a4b86 /common/src/decode_tcp.c | |
| parent | aa887fd382a4eb1b981280183a780649230d71e9 (diff) | |
TSG-7784 PacketAdapter支持CI自动构建RPM; 修改代码结构
Diffstat (limited to 'common/src/decode_tcp.c')
| -rw-r--r-- | common/src/decode_tcp.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/common/src/decode_tcp.c b/common/src/decode_tcp.c new file mode 100644 index 0000000..75a1ab8 --- /dev/null +++ b/common/src/decode_tcp.c @@ -0,0 +1,52 @@ +#include "decode_tcp.h" + +#define TCP_OPTLENMAX 40 + +#define TCP_GET_HLEN(tcp_hdr) ((((tcp_hdr)->th_offx2 & 0xf0) >> 4) << 2) +#define TCP_GET_SRC_PORT(tcp_hdr) ((uint16_t)ntohs((tcp_hdr)->th_sport)) +#define TCP_GET_DST_PORT(tcp_hdr) ((uint16_t)ntohs((tcp_hdr)->th_dport)) + +int decode_tcp(tcp_info_t *packet, const uint8_t *data, uint32_t len) +{ + if (len < TCP_HEADER_LEN) + { + LOG_ERROR("Parser TCP Header: packet length too small %d", len); + return -1; + } + + packet->hdr = (tcp_header_t *)data; + uint8_t hlen = TCP_GET_HLEN(packet->hdr); + if (len < hlen) + { + LOG_ERROR("Parser TCP Header: TCP packet too small %d", len); + return -1; + } + + uint8_t tcp_opt_len = hlen - TCP_HEADER_LEN; + if (tcp_opt_len > TCP_OPTLENMAX) + { + LOG_ERROR("Parser TCP Header: invalid opt length %d", tcp_opt_len); + return -1; + } + + packet->opt_len = tcp_opt_len; + packet->src_port = TCP_GET_SRC_PORT(packet->hdr); + packet->dst_port = TCP_GET_DST_PORT(packet->hdr); + + packet->hdr_len = hlen; + packet->payload = (uint8_t *)data + packet->hdr_len; + packet->payload_len = len - packet->hdr_len; + + return 0; +} + +void dump_tcp_info(uint32_t pkt_id, tcp_info_t *packet) +{ + LOG_DEBUG("id: %u, tcp_info: {src_port: %u, dst_port: %u, hdr_len: %u, opt_len: %u, data_len:%u}", + pkt_id, + packet->src_port, + packet->dst_port, + packet->hdr_len, + packet->opt_len, + packet->payload_len); +}
\ No newline at end of file |
