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));
416 static int TCPGetWscaleTest02(
void)
418 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x58,
419 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x16, 0xd0,
420 0x8a, 0xaf, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
421 0x04, 0x02, 0x08, 0x0a, 0x00, 0x62, 0x88, 0x28,
422 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x0f};
431 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
450 static int TCPGetWscaleTest03(
void)
452 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x59,
453 0xdd, 0xa3, 0x6f, 0xf8, 0x80, 0x10, 0x05, 0xb4,
454 0x7c, 0x70, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a,
455 0x00, 0x62, 0x88, 0x9e, 0x00, 0x00, 0x00, 0x00};
463 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
481 static int TCPGetSackTest01(
void)
483 static uint8_t raw_tcp[] = {
484 0x00, 0x50, 0x06, 0xa6, 0xfa, 0x87, 0x0b, 0xf5,
485 0xf1, 0x59, 0x02, 0xe0, 0xa0, 0x10, 0x3e, 0xbc,
486 0x1d, 0xe7, 0x00, 0x00, 0x01, 0x01, 0x05, 0x12,
487 0xf1, 0x59, 0x13, 0xfc, 0xf1, 0x59, 0x1f, 0x64,
488 0xf1, 0x59, 0x08, 0x94, 0xf1, 0x59, 0x0e, 0x48 };
489 static uint8_t raw_tcp_sack[] = {
490 0xf1, 0x59, 0x13, 0xfc, 0xf1, 0x59, 0x1f, 0x64,
491 0xf1, 0x59, 0x08, 0x94, 0xf1, 0x59, 0x0e, 0x48 };
500 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
516 const TCPHdr *tcph = PacketGetTCP(p);
520 FAIL_IF(memcmp(sackptr, raw_tcp_sack, 16) != 0);
532 TCPCalculateValidChecksumtest01);
534 TCPCalculateInvalidChecksumtest02);
536 TCPV6CalculateValidChecksumtest03);
538 TCPV6CalculateInvalidChecksumtest04);