42static void DecodeTCPOptions(
Packet *p,
const uint8_t *pkt, uint16_t pktlen)
44 uint8_t tcp_opt_cnt = 0;
47 const TCPHdr *tcph = PacketGetTCP(p);
48 uint16_t plen = pktlen;
51 const uint8_t
type = *pkt;
66 const uint8_t olen = *(pkt+1);
71 if (
unlikely(olen > plen || olen < 2)) {
77 tcp_opts[tcp_opt_cnt].
len = olen;
78 tcp_opts[tcp_opt_cnt].
data = (olen > 2) ? (pkt+2) : NULL;
92 const uint8_t wscale = *(tcp_opts[tcp_opt_cnt].
data);
132 memcpy(&values, tcp_opts[tcp_opt_cnt].data,
sizeof(values));
144 !((olen - 2) % 8 == 0)) {
150 ptrdiff_t diff = tcp_opts[tcp_opt_cnt].
data - (uint8_t *)tcph;
161 !(((olen - 2) & 0x1) == 0))) {
175 if (olen == 4 || olen == 12) {
176 uint16_t magic =
SCNtohs(*(uint16_t *)tcp_opts[tcp_opt_cnt].data);
177 if (magic == 0xf989) {
217static int DecodeTCPPacket(
225 TCPHdr *tcph = PacketSetTCP(p, pkt);
239 if (
likely(tcp_opt_len > 0)) {
246 p->
proto = IPPROTO_TCP;
248 p->
payload = (uint8_t *)pkt + hlen;
265 SCLogDebug(
"TCP sp: %u -> dp: %u - HLEN: %" PRIu32
" LEN: %" PRIu32
" %s%s%s%s%s%s", p->
sp,
292static int TCPCalculateValidChecksumtest01(
void)
296 uint8_t raw_ipshdr[] = {
297 0x40, 0x8e, 0x7e, 0xb2, 0xc0, 0xa8, 0x01, 0x03};
299 uint8_t raw_tcp[] = {
300 0x00, 0x50, 0x8e, 0x16, 0x0d, 0x59, 0xcd, 0x3c,
301 0xcf, 0x0d, 0x21, 0x80, 0xa0, 0x12, 0x16, 0xa0,
302 0xfa, 0x03, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
303 0x04, 0x02, 0x08, 0x0a, 0x6e, 0x18, 0x78, 0x73,
304 0x01, 0x71, 0x74, 0xde, 0x01, 0x03, 0x03, 02};
306 csum = *( ((uint16_t *)raw_tcp) + 8);
308 FAIL_IF(TCPChecksum((uint16_t *)raw_ipshdr,
309 (uint16_t *)raw_tcp,
sizeof(raw_tcp), csum) != 0);
313static int TCPCalculateInvalidChecksumtest02(
void)
317 uint8_t raw_ipshdr[] = {
318 0x40, 0x8e, 0x7e, 0xb2, 0xc0, 0xa8, 0x01, 0x03};
320 uint8_t raw_tcp[] = {
321 0x00, 0x50, 0x8e, 0x16, 0x0d, 0x59, 0xcd, 0x3c,
322 0xcf, 0x0d, 0x21, 0x80, 0xa0, 0x12, 0x16, 0xa0,
323 0xfa, 0x03, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
324 0x04, 0x02, 0x08, 0x0a, 0x6e, 0x18, 0x78, 0x73,
325 0x01, 0x71, 0x74, 0xde, 0x01, 0x03, 0x03, 03};
327 csum = *( ((uint16_t *)raw_tcp) + 8);
329 FAIL_IF(TCPChecksum((uint16_t *) raw_ipshdr,
330 (uint16_t *)raw_tcp,
sizeof(raw_tcp), csum) == 0);
334static int TCPV6CalculateValidChecksumtest03(
void)
338 static uint8_t raw_ipv6[] = {
339 0x00, 0x60, 0x97, 0x07, 0x69, 0xea, 0x00, 0x00,
340 0x86, 0x05, 0x80, 0xda, 0x86, 0xdd, 0x60, 0x00,
341 0x00, 0x00, 0x00, 0x20, 0x06, 0x40, 0x3f, 0xfe,
342 0x05, 0x07, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00,
343 0x86, 0xff, 0xfe, 0x05, 0x80, 0xda, 0x3f, 0xfe,
344 0x05, 0x01, 0x04, 0x10, 0x00, 0x00, 0x02, 0xc0,
345 0xdf, 0xff, 0xfe, 0x47, 0x03, 0x3e, 0x03, 0xfe,
346 0x00, 0x16, 0xd6, 0x76, 0xf5, 0x2d, 0x0c, 0x7a,
347 0x08, 0x77, 0x80, 0x10, 0x21, 0x5c, 0xc2, 0xf1,
348 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x00, 0x08,
349 0xca, 0x5a, 0x00, 0x01, 0x69, 0x27};
351 csum = *( ((uint16_t *)(raw_ipv6 + 70)));
353 FAIL_IF(TCPV6Checksum((uint16_t *)(raw_ipv6 + 14 + 8),
354 (uint16_t *)(raw_ipv6 + 54), 32, csum) != 0);
358static int TCPV6CalculateInvalidChecksumtest04(
void)
362 static uint8_t raw_ipv6[] = {
363 0x00, 0x60, 0x97, 0x07, 0x69, 0xea, 0x00, 0x00,
364 0x86, 0x05, 0x80, 0xda, 0x86, 0xdd, 0x60, 0x00,
365 0x00, 0x00, 0x00, 0x20, 0x06, 0x40, 0x3f, 0xfe,
366 0x05, 0x07, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00,
367 0x86, 0xff, 0xfe, 0x05, 0x80, 0xda, 0x3f, 0xfe,
368 0x05, 0x01, 0x04, 0x10, 0x00, 0x00, 0x02, 0xc0,
369 0xdf, 0xff, 0xfe, 0x47, 0x03, 0x3e, 0x03, 0xfe,
370 0x00, 0x16, 0xd6, 0x76, 0xf5, 0x2d, 0x0c, 0x7a,
371 0x08, 0x77, 0x80, 0x10, 0x21, 0x5c, 0xc2, 0xf1,
372 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x00, 0x08,
373 0xca, 0x5a, 0x00, 0x01, 0x69, 0x28};
375 csum = *( ((uint16_t *)(raw_ipv6 + 70)));
377 FAIL_IF(TCPV6Checksum((uint16_t *)(raw_ipv6 + 14 + 8),
378 (uint16_t *)(raw_ipv6 + 54), 32, csum) == 0);
383static int TCPGetWscaleTest01(
void)
385 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x58,
386 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x16, 0xd0,
387 0x8a, 0xaf, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
388 0x04, 0x02, 0x08, 0x0a, 0x00, 0x62, 0x88, 0x28,
389 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02};
397 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
417static int TCPGetWscaleTest02(
void)
419 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x58,
420 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x16, 0xd0,
421 0x8a, 0xaf, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
422 0x04, 0x02, 0x08, 0x0a, 0x00, 0x62, 0x88, 0x28,
423 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x0f};
432 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
452static int TCPGetWscaleTest03(
void)
454 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x59,
455 0xdd, 0xa3, 0x6f, 0xf8, 0x80, 0x10, 0x05, 0xb4,
456 0x7c, 0x70, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a,
457 0x00, 0x62, 0x88, 0x9e, 0x00, 0x00, 0x00, 0x00};
465 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
484static int TCPGetSackTest01(
void)
486 static uint8_t raw_tcp[] = {
487 0x00, 0x50, 0x06, 0xa6, 0xfa, 0x87, 0x0b, 0xf5,
488 0xf1, 0x59, 0x02, 0xe0, 0xa0, 0x10, 0x3e, 0xbc,
489 0x1d, 0xe7, 0x00, 0x00, 0x01, 0x01, 0x05, 0x12,
490 0xf1, 0x59, 0x13, 0xfc, 0xf1, 0x59, 0x1f, 0x64,
491 0xf1, 0x59, 0x08, 0x94, 0xf1, 0x59, 0x0e, 0x48 };
492 static uint8_t raw_tcp_sack[] = {
493 0xf1, 0x59, 0x13, 0xfc, 0xf1, 0x59, 0x1f, 0x64,
494 0xf1, 0x59, 0x08, 0x94, 0xf1, 0x59, 0x0e, 0x48 };
503 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
519 const TCPHdr *tcph = PacketGetTCP(p);
523 FAIL_IF(memcmp(sackptr, raw_tcp_sack, 16) != 0);
536 TCPCalculateValidChecksumtest01);
538 TCPCalculateInvalidChecksumtest02);
540 TCPV6CalculateValidChecksumtest03);
542 TCPV6CalculateInvalidChecksumtest04);
void StatsIncr(ThreadVars *tv, uint16_t id)
Increments the local counter.
int DecodeTCP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint16_t len)
void DecodeTCPRegisterTests(void)
#define TCP_OPT_SACKOK_LEN
#define TCP_GET_RAW_DST_PORT(tcph)
#define TCP_GET_SACK_PTR(p, tcph)
#define TCP_OPT_TFO_MAX_LEN
#define TCP_GET_SACK_CNT(p)
#define TCP_GET_RAW_SRC_PORT(tcph)
#define TCP_GET_SACKOK(p)
#define TCP_OPT_SACK_MAX_LEN
#define TCP_GET_WSCALE(p)
#define TCP_HAS_WSCALE(p)
#define TCP_GET_RAW_HLEN(tcph)
#define ENGINE_SET_INVALID_EVENT(p, e)
#define ENGINE_SET_EVENT(p, e)
void FlowSetupPacket(Packet *p)
prepare packet for a life with flow Set PKT_WANTS_FLOW flag to indicate workers should do a flow look...
void FlowInitConfig(bool quiet)
initialize the configuration
void FlowShutdown(void)
shutdown the flow engine
#define FAIL_IF_NULL(expr)
Fail a test if expression evaluates to NULL.
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
#define FAIL_IF_NOT(expr)
Fail a test if expression evaluates to false.
#define PASS
Pass the test.
#define FAIL_IF(expr)
Fail a test if expression evaluates to true.
Packet * PacketGetFromAlloc(void)
Get a malloced packet.
void PacketRecycle(Packet *p)
Structure to hold thread specific data for all decode modules.
uint16_t counter_tcp_synack
union PacketL4::L4Vars vars
uint8_t md5_option_present
uint8_t ao_option_present
Per thread variable structure.
void UTHSetIPV4Hdr(Packet *p, IPV4Hdr *ip4h)
#define DEBUG_VALIDATE_BUG_ON(exp)