42 #define SET_OPTS(dst, src) \
43 (dst).type = (src).type; \
44 (dst).len = (src).len; \
45 (dst).data = (src).data
47 static void DecodeTCPOptions(
Packet *p,
const uint8_t *pkt, uint16_t pktlen)
49 uint8_t tcp_opt_cnt = 0;
52 uint16_t plen = pktlen;
55 const uint8_t
type = *pkt;
70 const uint8_t olen = *(pkt+1);
75 if (
unlikely(olen > plen || olen < 2)) {
81 tcp_opts[tcp_opt_cnt].
len = olen;
82 tcp_opts[tcp_opt_cnt].
data = (olen > 2) ? (pkt+2) : NULL;
129 memcpy(&values, tcp_opts[tcp_opt_cnt].data,
sizeof(values));
141 !((olen - 2) % 8 == 0)))
155 !(((olen - 2) & 0x1) == 0))) {
169 if (olen == 4 || olen == 12) {
170 uint16_t magic =
SCNtohs(*(uint16_t *)tcp_opts[tcp_opt_cnt].data);
171 if (magic == 0xf989) {
219 p->
tcph = (TCPHdr *)pkt;
233 if (
likely(tcp_opt_len > 0)) {
240 p->
proto = IPPROTO_TCP;
242 p->
payload = (uint8_t *)pkt + hlen;
249 const uint8_t *pkt, uint16_t
len)
260 SCLogDebug(
"TCP sp: %" PRIu32
" -> dp: %" PRIu32
" - HLEN: %" PRIu32
" LEN: %" PRIu32
" %s%s%s%s%s%s",
276 static int TCPCalculateValidChecksumtest01(
void)
280 uint8_t raw_ipshdr[] = {
281 0x40, 0x8e, 0x7e, 0xb2, 0xc0, 0xa8, 0x01, 0x03};
283 uint8_t raw_tcp[] = {
284 0x00, 0x50, 0x8e, 0x16, 0x0d, 0x59, 0xcd, 0x3c,
285 0xcf, 0x0d, 0x21, 0x80, 0xa0, 0x12, 0x16, 0xa0,
286 0xfa, 0x03, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
287 0x04, 0x02, 0x08, 0x0a, 0x6e, 0x18, 0x78, 0x73,
288 0x01, 0x71, 0x74, 0xde, 0x01, 0x03, 0x03, 02};
290 csum = *( ((uint16_t *)raw_tcp) + 8);
292 FAIL_IF(TCPChecksum((uint16_t *)raw_ipshdr,
293 (uint16_t *)raw_tcp,
sizeof(raw_tcp), csum) != 0);
297 static int TCPCalculateInvalidChecksumtest02(
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, 03};
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 TCPV6CalculateValidChecksumtest03(
void)
322 static uint8_t raw_ipv6[] = {
323 0x00, 0x60, 0x97, 0x07, 0x69, 0xea, 0x00, 0x00,
324 0x86, 0x05, 0x80, 0xda, 0x86, 0xdd, 0x60, 0x00,
325 0x00, 0x00, 0x00, 0x20, 0x06, 0x40, 0x3f, 0xfe,
326 0x05, 0x07, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00,
327 0x86, 0xff, 0xfe, 0x05, 0x80, 0xda, 0x3f, 0xfe,
328 0x05, 0x01, 0x04, 0x10, 0x00, 0x00, 0x02, 0xc0,
329 0xdf, 0xff, 0xfe, 0x47, 0x03, 0x3e, 0x03, 0xfe,
330 0x00, 0x16, 0xd6, 0x76, 0xf5, 0x2d, 0x0c, 0x7a,
331 0x08, 0x77, 0x80, 0x10, 0x21, 0x5c, 0xc2, 0xf1,
332 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x00, 0x08,
333 0xca, 0x5a, 0x00, 0x01, 0x69, 0x27};
335 csum = *( ((uint16_t *)(raw_ipv6 + 70)));
337 FAIL_IF(TCPV6Checksum((uint16_t *)(raw_ipv6 + 14 + 8),
338 (uint16_t *)(raw_ipv6 + 54), 32, csum) != 0);
342 static int TCPV6CalculateInvalidChecksumtest04(
void)
346 static uint8_t raw_ipv6[] = {
347 0x00, 0x60, 0x97, 0x07, 0x69, 0xea, 0x00, 0x00,
348 0x86, 0x05, 0x80, 0xda, 0x86, 0xdd, 0x60, 0x00,
349 0x00, 0x00, 0x00, 0x20, 0x06, 0x40, 0x3f, 0xfe,
350 0x05, 0x07, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00,
351 0x86, 0xff, 0xfe, 0x05, 0x80, 0xda, 0x3f, 0xfe,
352 0x05, 0x01, 0x04, 0x10, 0x00, 0x00, 0x02, 0xc0,
353 0xdf, 0xff, 0xfe, 0x47, 0x03, 0x3e, 0x03, 0xfe,
354 0x00, 0x16, 0xd6, 0x76, 0xf5, 0x2d, 0x0c, 0x7a,
355 0x08, 0x77, 0x80, 0x10, 0x21, 0x5c, 0xc2, 0xf1,
356 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x00, 0x08,
357 0xca, 0x5a, 0x00, 0x01, 0x69, 0x28};
359 csum = *( ((uint16_t *)(raw_ipv6 + 70)));
361 FAIL_IF(TCPV6Checksum((uint16_t *)(raw_ipv6 + 14 + 8),
362 (uint16_t *)(raw_ipv6 + 54), 32, csum) == 0);
367 static int TCPGetWscaleTest01(
void)
370 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x58,
371 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x16, 0xd0,
372 0x8a, 0xaf, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
373 0x04, 0x02, 0x08, 0x0a, 0x00, 0x62, 0x88, 0x28,
374 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x02};
384 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
394 if (p->
tcph == NULL) {
395 printf(
"tcp packet decode failed: ");
401 printf(
"wscale %"PRIu8
", expected 2: ", wscale);
414 static int TCPGetWscaleTest02(
void)
417 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x58,
418 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0x16, 0xd0,
419 0x8a, 0xaf, 0x00, 0x00, 0x02, 0x04, 0x05, 0xb4,
420 0x04, 0x02, 0x08, 0x0a, 0x00, 0x62, 0x88, 0x28,
421 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x0f};
431 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
440 if (p->
tcph == NULL) {
441 printf(
"tcp packet decode failed: ");
447 printf(
"wscale %"PRIu8
", expected 0: ", wscale);
460 static int TCPGetWscaleTest03(
void)
463 static uint8_t raw_tcp[] = {0xda, 0xc1, 0x00, 0x50, 0xb6, 0x21, 0x7f, 0x59,
464 0xdd, 0xa3, 0x6f, 0xf8, 0x80, 0x10, 0x05, 0xb4,
465 0x7c, 0x70, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a,
466 0x00, 0x62, 0x88, 0x9e, 0x00, 0x00, 0x00, 0x00};
476 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
485 if (p->
tcph == NULL) {
486 printf(
"tcp packet decode failed: ");
492 printf(
"wscale %"PRIu8
", expected 0: ", wscale);
504 static int TCPGetSackTest01(
void)
507 static uint8_t raw_tcp[] = {
508 0x00, 0x50, 0x06, 0xa6, 0xfa, 0x87, 0x0b, 0xf5,
509 0xf1, 0x59, 0x02, 0xe0, 0xa0, 0x10, 0x3e, 0xbc,
510 0x1d, 0xe7, 0x00, 0x00, 0x01, 0x01, 0x05, 0x12,
511 0xf1, 0x59, 0x13, 0xfc, 0xf1, 0x59, 0x1f, 0x64,
512 0xf1, 0x59, 0x08, 0x94, 0xf1, 0x59, 0x0e, 0x48 };
513 static uint8_t raw_tcp_sack[] = {
514 0xf1, 0x59, 0x13, 0xfc, 0xf1, 0x59, 0x1f, 0x64,
515 0xf1, 0x59, 0x08, 0x94, 0xf1, 0x59, 0x0e, 0x48 };
525 memset(&ip4h, 0,
sizeof(
IPV4Hdr));
534 if (p->
tcph == NULL) {
535 printf(
"tcp packet decode failed: ");
540 printf(
"tcp packet sack not decoded: ");
551 if (sackptr == NULL) {
552 printf(
"no sack data: ");
556 if (memcmp(sackptr, raw_tcp_sack, 16) != 0) {
557 printf(
"malformed sack data: ");
574 TCPCalculateValidChecksumtest01);
576 TCPCalculateInvalidChecksumtest02);
578 TCPV6CalculateValidChecksumtest03);
580 TCPV6CalculateInvalidChecksumtest04);