diff options
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 |
