summaryrefslogtreecommitdiff
path: root/common/src/decode_tcp.c
diff options
context:
space:
mode:
author卢文朋 <[email protected]>2021-09-13 02:12:29 +0000
committerluwenpeng <[email protected]>2021-09-15 16:58:01 +0800
commitba21a53bb7c8bc5e70eae278b2fd238c2bcd1337 (patch)
treef15571a0b8c096532be99e8a6858370c047a4b86 /common/src/decode_tcp.c
parentaa887fd382a4eb1b981280183a780649230d71e9 (diff)
TSG-7784 PacketAdapter支持CI自动构建RPM; 修改代码结构
Diffstat (limited to 'common/src/decode_tcp.c')
-rw-r--r--common/src/decode_tcp.c52
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