40 static inline uint16_t DecodeTCPGetU16(
const uint8_t *d)
42 return (uint16_t)(((uint16_t)d[0] << 8) | (uint16_t)d[1]);
45 static void DecodeTCPOptions(
Packet *
p,
const uint8_t *pkt, uint16_t pktlen)
47 uint8_t tcp_opt_cnt = 0;
50 const TCPHdr *tcph = PacketGetTCP(
p);
51 uint16_t plen = pktlen;
54 const uint8_t
type = *pkt;
69 const uint8_t olen = *(pkt+1);
74 if (
unlikely(olen > plen || olen < 2)) {
80 tcp_opts[tcp_opt_cnt].
len = olen;
90 tcp_opts[tcp_opt_cnt].
data = (pkt + 2);
95 const uint8_t wscale = *(tcp_opts[tcp_opt_cnt].
data);
108 tcp_opts[tcp_opt_cnt].
data = (pkt + 2);
113 p->
l4.
vars.
tcp.
mss = DecodeTCPGetU16(tcp_opts[tcp_opt_cnt].data);
121 tcp_opts[tcp_opt_cnt].
data = (pkt + 2);
133 tcp_opts[tcp_opt_cnt].
data = (pkt + 2);
138 memcpy(&values, tcp_opts[tcp_opt_cnt].data,
sizeof(values));
150 !((olen - 2) % 8 == 0)) {
153 tcp_opts[tcp_opt_cnt].
data = (pkt + 2);
157 ptrdiff_t diff = tcp_opts[tcp_opt_cnt].
data - (uint8_t *)tcph;
168 !(((olen - 2) & 0x1) == 0))) {
171 tcp_opts[tcp_opt_cnt].
data = (pkt + 2);
183 if (olen == 4 || olen == 12) {
184 tcp_opts[tcp_opt_cnt].
data = (pkt + 2);
185 uint16_t magic = DecodeTCPGetU16(tcp_opts[tcp_opt_cnt].data);
186 if (magic == 0xf989) {
203 tcp_opts[tcp_opt_cnt].
data = (pkt + 2);
214 tcp_opts[tcp_opt_cnt].
data = (pkt + 2);
221 tcp_opts[tcp_opt_cnt].
data = (pkt + 2);
224 tcp_opts[tcp_opt_cnt].
data = NULL;
235 static int DecodeTCPPacket(
243 TCPHdr *tcph = PacketSetTCP(
p, pkt);
257 if (
likely(tcp_opt_len > 0)) {
283 SCLogDebug(
"TCP sp: %u -> dp: %u - HLEN: %" PRIu32
" LEN: %" PRIu32
" %s%s%s%s%s%s",
p->
sp,
310 static int TCPCalculateValidChecksumtest01(
void)
314 uint8_t raw_ipshdr[] = {
315 0x40, 0x8e, 0x7e, 0xb2, 0xc0, 0xa8, 0x01, 0x03};
317 uint8_t raw_tcp[] = {
318 0x00, 0x50, 0x8e, 0x16, 0x0d, 0x59, 0xcd, 0x3c,
319 0xcf, 0x0d, 0x21, 0x80, 0xa0, 0x12, 0x16, 0xa0,
320 0xfa, 0x03, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
321 0x04, 0x02, 0x08, 0x0a, 0x6e, 0x18, 0x78, 0x73,
322 0x01, 0x71, 0x74, 0xde, 0x01, 0x03, 0x03, 02};
324 csum = *( ((uint16_t *)raw_tcp) + 8);
326 FAIL_IF(TCPChecksum((uint16_t *)raw_ipshdr,
327 (uint16_t *)raw_tcp,
sizeof(raw_tcp), csum) != 0);
331 static int TCPCalculateInvalidChecksumtest02(
void)
335 uint8_t raw_ipshdr[] = {
336 0x40, 0x8e, 0x7e, 0xb2, 0xc0, 0xa8, 0x01, 0x03};
338 uint8_t raw_tcp[] = {
339 0x00, 0x50, 0x8e, 0x16, 0x0d, 0x59, 0xcd, 0x3c,
340 0xcf, 0x0d, 0x21, 0x80, 0xa0, 0x12, 0x16, 0xa0,
341 0xfa, 0x03, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
342 0x04, 0x02, 0x08, 0x0a, 0x6e, 0x18, 0x78, 0x73,
343 0x01, 0x71, 0x74, 0xde, 0x01, 0x03, 0x03, 03};
345 csum = *( ((uint16_t *)raw_tcp) + 8);
347 FAIL_IF(TCPChecksum((uint16_t *) raw_ipshdr,
348 (uint16_t *)raw_tcp,
sizeof(raw_tcp), csum) == 0);
352 static int TCPV6CalculateValidChecksumtest03(
void)
356 static uint8_t raw_ipv6[] = {
357 0x00, 0x60, 0x97, 0x07, 0x69, 0xea, 0x00, 0x00,
358 0x86, 0x05, 0x80, 0xda, 0x86, 0xdd, 0x60, 0x00,
359 0x00, 0x00, 0x00, 0x20, 0x06, 0x40, 0x3f, 0xfe,
360 0x05, 0x07, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00,
361 0x86, 0xff, 0xfe, 0x05, 0x80, 0xda, 0x3f, 0xfe,
362 0x05, 0x01, 0x04, 0x10, 0x00, 0x00, 0x02, 0xc0,
363 0xdf, 0xff, 0xfe, 0x47, 0x03, 0x3e, 0x03, 0xfe,
364 0x00, 0x16, 0xd6, 0x76, 0xf5, 0x2d, 0x0c, 0x7a,
365 0x08, 0x77, 0x80, 0x10, 0x21, 0x5c, 0xc2, 0xf1,
366 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x00, 0x08,
367 0xca, 0x5a, 0x00, 0x01, 0x69, 0x27};
369 csum = *( ((uint16_t *)(raw_ipv6 + 70)));
371 FAIL_IF(TCPV6Checksum((uint16_t *)(raw_ipv6 + 14 + 8),
372 (uint16_t *)(raw_ipv6 + 54), 32, csum) != 0);
376 static int TCPV6CalculateInvalidChecksumtest04(
void)
380 static uint8_t raw_ipv6[] = {
381 0x00, 0x60, 0x97, 0x07, 0x69, 0xea, 0x00, 0x00,
382 0x86, 0x05, 0x80, 0xda, 0x86, 0xdd, 0x60, 0x00,
383 0x00, 0x00, 0x00, 0x20, 0x06, 0x40, 0x3f, 0xfe,
384 0x05, 0x07, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00,
385 0x86, 0xff, 0xfe, 0x05, 0x80, 0xda, 0x3f, 0xfe,
386 0x05, 0x01, 0x04, 0x10, 0x00, 0x00, 0x02, 0xc0,
387 0xdf, 0xff, 0xfe, 0x47, 0x03, 0x3e, 0x03, 0xfe,
388 0x00, 0x16, 0xd6, 0x76, 0xf5, 0x2d, 0x0c, 0x7a,
389 0x08, 0x77, 0x80, 0x10, 0x21, 0x5c, 0xc2, 0xf1,
390 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x00, 0x08,
391 0xca, 0x5a, 0x00, 0x01, 0x69, 0x28};
393 csum = *( ((uint16_t *)(raw_ipv6 + 70)));
395 FAIL_IF(TCPV6Checksum((uint16_t *)(raw_ipv6 + 14 + 8),
396 (uint16_t *)(raw_ipv6 + 54), 32, csum) == 0);
401 static int TCPGetWscaleTest01(
void)
403 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x58,
404 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x16, 0xd0,
405 0x8a, 0xaf, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
406 0x04, 0x02, 0x08, 0x0a, 0x00, 0x62, 0x88, 0x28,
407 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02};
415 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
434 static int TCPGetWscaleTest02(
void)
436 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x58,
437 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x16, 0xd0,
438 0x8a, 0xaf, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
439 0x04, 0x02, 0x08, 0x0a, 0x00, 0x62, 0x88, 0x28,
440 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x0f};
449 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
468 static int TCPGetWscaleTest03(
void)
470 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x59,
471 0xdd, 0xa3, 0x6f, 0xf8, 0x80, 0x10, 0x05, 0xb4,
472 0x7c, 0x70, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a,
473 0x00, 0x62, 0x88, 0x9e, 0x00, 0x00, 0x00, 0x00};
481 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
499 static int TCPGetSackTest01(
void)
501 static uint8_t raw_tcp[] = {
502 0x00, 0x50, 0x06, 0xa6, 0xfa, 0x87, 0x0b, 0xf5,
503 0xf1, 0x59, 0x02, 0xe0, 0xa0, 0x10, 0x3e, 0xbc,
504 0x1d, 0xe7, 0x00, 0x00, 0x01, 0x01, 0x05, 0x12,
505 0xf1, 0x59, 0x13, 0xfc, 0xf1, 0x59, 0x1f, 0x64,
506 0xf1, 0x59, 0x08, 0x94, 0xf1, 0x59, 0x0e, 0x48 };
507 static uint8_t raw_tcp_sack[] = {
508 0xf1, 0x59, 0x13, 0xfc, 0xf1, 0x59, 0x1f, 0x64,
509 0xf1, 0x59, 0x08, 0x94, 0xf1, 0x59, 0x0e, 0x48 };
518 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
534 const TCPHdr *tcph = PacketGetTCP(
p);
538 FAIL_IF(memcmp(sackptr, raw_tcp_sack, 16) != 0);
550 TCPCalculateValidChecksumtest01);
552 TCPCalculateInvalidChecksumtest02);
554 TCPV6CalculateValidChecksumtest03);
556 TCPV6CalculateInvalidChecksumtest04);