42 static 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) {
217 static 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,
292 static 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);
313 static 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);
334 static 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);
358 static 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);
383 static 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));
417 static 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));
452 static 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));
484 static 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);