42 static inline uint16_t DecodeTCPGetU16(
const uint8_t *d)
44 return (uint16_t)(((uint16_t)d[0] << 8) | (uint16_t)d[1]);
47 static void DecodeTCPOptions(
Packet *p,
const uint8_t *pkt, uint16_t pktlen)
49 uint8_t tcp_opt_cnt = 0;
52 const TCPHdr *tcph = PacketGetTCP(p);
53 uint16_t plen = pktlen;
56 const uint8_t
type = *pkt;
71 const uint8_t olen = *(pkt+1);
76 if (
unlikely(olen > plen || olen < 2)) {
82 tcp_opts[tcp_opt_cnt].
len = olen;
83 tcp_opts[tcp_opt_cnt].
data = (olen > 2) ? (pkt+2) : NULL;
97 const uint8_t wscale = *(tcp_opts[tcp_opt_cnt].
data);
114 p->
l4.
vars.
tcp.
mss = DecodeTCPGetU16(tcp_opts[tcp_opt_cnt].data);
137 memcpy(&values, tcp_opts[tcp_opt_cnt].data,
sizeof(values));
149 !((olen - 2) % 8 == 0)) {
155 ptrdiff_t diff = tcp_opts[tcp_opt_cnt].
data - (uint8_t *)tcph;
166 !(((olen - 2) & 0x1) == 0))) {
180 if (olen == 4 || olen == 12) {
181 uint16_t magic = DecodeTCPGetU16(tcp_opts[tcp_opt_cnt].data);
182 if (magic == 0xf989) {
222 static int DecodeTCPPacket(
230 TCPHdr *tcph = PacketSetTCP(p, pkt);
244 if (
likely(tcp_opt_len > 0)) {
251 p->
proto = IPPROTO_TCP;
253 p->
payload = (uint8_t *)pkt + hlen;
270 SCLogDebug(
"TCP sp: %u -> dp: %u - HLEN: %" PRIu32
" LEN: %" PRIu32
" %s%s%s%s%s%s", p->
sp,
297 static int TCPCalculateValidChecksumtest01(
void)
301 uint8_t raw_ipshdr[] = {
302 0x40, 0x8e, 0x7e, 0xb2, 0xc0, 0xa8, 0x01, 0x03};
304 uint8_t raw_tcp[] = {
305 0x00, 0x50, 0x8e, 0x16, 0x0d, 0x59, 0xcd, 0x3c,
306 0xcf, 0x0d, 0x21, 0x80, 0xa0, 0x12, 0x16, 0xa0,
307 0xfa, 0x03, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
308 0x04, 0x02, 0x08, 0x0a, 0x6e, 0x18, 0x78, 0x73,
309 0x01, 0x71, 0x74, 0xde, 0x01, 0x03, 0x03, 02};
311 csum = *( ((uint16_t *)raw_tcp) + 8);
313 FAIL_IF(TCPChecksum((uint16_t *)raw_ipshdr,
314 (uint16_t *)raw_tcp,
sizeof(raw_tcp), csum) != 0);
318 static int TCPCalculateInvalidChecksumtest02(
void)
322 uint8_t raw_ipshdr[] = {
323 0x40, 0x8e, 0x7e, 0xb2, 0xc0, 0xa8, 0x01, 0x03};
325 uint8_t raw_tcp[] = {
326 0x00, 0x50, 0x8e, 0x16, 0x0d, 0x59, 0xcd, 0x3c,
327 0xcf, 0x0d, 0x21, 0x80, 0xa0, 0x12, 0x16, 0xa0,
328 0xfa, 0x03, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
329 0x04, 0x02, 0x08, 0x0a, 0x6e, 0x18, 0x78, 0x73,
330 0x01, 0x71, 0x74, 0xde, 0x01, 0x03, 0x03, 03};
332 csum = *( ((uint16_t *)raw_tcp) + 8);
334 FAIL_IF(TCPChecksum((uint16_t *) raw_ipshdr,
335 (uint16_t *)raw_tcp,
sizeof(raw_tcp), csum) == 0);
339 static int TCPV6CalculateValidChecksumtest03(
void)
343 static uint8_t raw_ipv6[] = {
344 0x00, 0x60, 0x97, 0x07, 0x69, 0xea, 0x00, 0x00,
345 0x86, 0x05, 0x80, 0xda, 0x86, 0xdd, 0x60, 0x00,
346 0x00, 0x00, 0x00, 0x20, 0x06, 0x40, 0x3f, 0xfe,
347 0x05, 0x07, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00,
348 0x86, 0xff, 0xfe, 0x05, 0x80, 0xda, 0x3f, 0xfe,
349 0x05, 0x01, 0x04, 0x10, 0x00, 0x00, 0x02, 0xc0,
350 0xdf, 0xff, 0xfe, 0x47, 0x03, 0x3e, 0x03, 0xfe,
351 0x00, 0x16, 0xd6, 0x76, 0xf5, 0x2d, 0x0c, 0x7a,
352 0x08, 0x77, 0x80, 0x10, 0x21, 0x5c, 0xc2, 0xf1,
353 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x00, 0x08,
354 0xca, 0x5a, 0x00, 0x01, 0x69, 0x27};
356 csum = *( ((uint16_t *)(raw_ipv6 + 70)));
358 FAIL_IF(TCPV6Checksum((uint16_t *)(raw_ipv6 + 14 + 8),
359 (uint16_t *)(raw_ipv6 + 54), 32, csum) != 0);
363 static int TCPV6CalculateInvalidChecksumtest04(
void)
367 static uint8_t raw_ipv6[] = {
368 0x00, 0x60, 0x97, 0x07, 0x69, 0xea, 0x00, 0x00,
369 0x86, 0x05, 0x80, 0xda, 0x86, 0xdd, 0x60, 0x00,
370 0x00, 0x00, 0x00, 0x20, 0x06, 0x40, 0x3f, 0xfe,
371 0x05, 0x07, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00,
372 0x86, 0xff, 0xfe, 0x05, 0x80, 0xda, 0x3f, 0xfe,
373 0x05, 0x01, 0x04, 0x10, 0x00, 0x00, 0x02, 0xc0,
374 0xdf, 0xff, 0xfe, 0x47, 0x03, 0x3e, 0x03, 0xfe,
375 0x00, 0x16, 0xd6, 0x76, 0xf5, 0x2d, 0x0c, 0x7a,
376 0x08, 0x77, 0x80, 0x10, 0x21, 0x5c, 0xc2, 0xf1,
377 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x00, 0x08,
378 0xca, 0x5a, 0x00, 0x01, 0x69, 0x28};
380 csum = *( ((uint16_t *)(raw_ipv6 + 70)));
382 FAIL_IF(TCPV6Checksum((uint16_t *)(raw_ipv6 + 14 + 8),
383 (uint16_t *)(raw_ipv6 + 54), 32, csum) == 0);
388 static int TCPGetWscaleTest01(
void)
390 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x58,
391 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x16, 0xd0,
392 0x8a, 0xaf, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
393 0x04, 0x02, 0x08, 0x0a, 0x00, 0x62, 0x88, 0x28,
394 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02};
402 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
421 static int TCPGetWscaleTest02(
void)
423 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x58,
424 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x16, 0xd0,
425 0x8a, 0xaf, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
426 0x04, 0x02, 0x08, 0x0a, 0x00, 0x62, 0x88, 0x28,
427 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x0f};
436 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
455 static int TCPGetWscaleTest03(
void)
457 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x59,
458 0xdd, 0xa3, 0x6f, 0xf8, 0x80, 0x10, 0x05, 0xb4,
459 0x7c, 0x70, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a,
460 0x00, 0x62, 0x88, 0x9e, 0x00, 0x00, 0x00, 0x00};
468 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
486 static int TCPGetSackTest01(
void)
488 static uint8_t raw_tcp[] = {
489 0x00, 0x50, 0x06, 0xa6, 0xfa, 0x87, 0x0b, 0xf5,
490 0xf1, 0x59, 0x02, 0xe0, 0xa0, 0x10, 0x3e, 0xbc,
491 0x1d, 0xe7, 0x00, 0x00, 0x01, 0x01, 0x05, 0x12,
492 0xf1, 0x59, 0x13, 0xfc, 0xf1, 0x59, 0x1f, 0x64,
493 0xf1, 0x59, 0x08, 0x94, 0xf1, 0x59, 0x0e, 0x48 };
494 static uint8_t raw_tcp_sack[] = {
495 0xf1, 0x59, 0x13, 0xfc, 0xf1, 0x59, 0x1f, 0x64,
496 0xf1, 0x59, 0x08, 0x94, 0xf1, 0x59, 0x0e, 0x48 };
505 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
521 const TCPHdr *tcph = PacketGetTCP(p);
525 FAIL_IF(memcmp(sackptr, raw_tcp_sack, 16) != 0);
537 TCPCalculateValidChecksumtest01);
539 TCPCalculateInvalidChecksumtest02);
541 TCPV6CalculateValidChecksumtest03);
543 TCPV6CalculateInvalidChecksumtest04);