This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
stellar-stellar/tools/monitor/stellar-dump.patch

11401 lines
348 KiB
Diff
Raw Normal View History

2024-10-18 16:47:51 +08:00
diff -uNr tcpdump-tcpdump-4.99.4/addrtoname.c tcpdump-for-stellar/addrtoname.c
--- tcpdump-tcpdump-4.99.4/addrtoname.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/addrtoname.c 2024-10-30 17:34:05.502498703 +0800
@@ -1323,8 +1323,8 @@
{
static char buf[128];
snprintf(buf, sizeof(buf), "vlan %u, p %u%s",
- tci & 0xfff,
- tci >> 13,
+ (uint16_t)(tci & 0xfff),
+ (uint16_t)(tci >> 13),
(tci & 0x1000) ? ", DEI" : "");
return buf;
}
diff -uNr tcpdump-tcpdump-4.99.4/addrtostr.c tcpdump-for-stellar/addrtostr.c
--- tcpdump-tcpdump-4.99.4/addrtostr.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/addrtostr.c 2024-10-30 17:34:05.502498703 +0800
@@ -51,52 +51,62 @@
*/
#ifndef IN6ADDRSZ
-#define IN6ADDRSZ 16 /* IPv6 T_AAAA */
+#define IN6ADDRSZ 16 /* IPv6 T_AAAA */
#endif
#ifndef INT16SZ
-#define INT16SZ 2 /* word size */
+#define INT16SZ 2 /* word size */
#endif
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wall"
const char *
-addrtostr (const void *src, char *dst, size_t size)
+addrtostr(const void *src, char *dst, size_t size)
{
- const u_char *srcaddr = (const u_char *)src;
- const char digits[] = "0123456789";
- int i;
- const char *orig_dst = dst;
-
- if (size < INET_ADDRSTRLEN) {
- errno = ENOSPC;
- return NULL;
- }
- for (i = 0; i < 4; ++i) {
- int n = *srcaddr++;
- int non_zerop = 0;
-
- if (non_zerop || n / 100 > 0) {
- *dst++ = digits[n / 100];
- n %= 100;
- non_zerop = 1;
- }
- if (non_zerop || n / 10 > 0) {
- *dst++ = digits[n / 10];
- n %= 10;
- non_zerop = 1;
- }
- *dst++ = digits[n];
- if (i != 3)
- *dst++ = '.';
+ const u_char *srcaddr = (const u_char *)src;
+ const char digits[] = "0123456789";
+ int i;
+ const char *orig_dst = dst;
+
+ if (size < INET_ADDRSTRLEN)
+ {
+ errno = ENOSPC;
+ return NULL;
+ }
+ for (i = 0; i < 4; ++i)
+ {
+ int n = *srcaddr++;
+ int non_zerop = 0;
+#if 0
+ if (non_zerop || n / 100 > 0)
+#else
+ if (n / 100 > 0) //for cppcheck
+#endif
+ {
+ *dst++ = digits[n / 100];
+ n %= 100;
+ non_zerop = 1;
}
- *dst++ = '\0';
- return orig_dst;
+ if (non_zerop || n / 10 > 0)
+ {
+ *dst++ = digits[n / 10];
+ n %= 10;
+ non_zerop = 1;
+ }
+ *dst++ = digits[n];
+ if (i != 3)
+ *dst++ = '.';
+ }
+ *dst++ = '\0';
+ return orig_dst;
}
+#pragma GCC diagnostic pop
/*
* Convert IPv6 binary address into presentation (printable) format.
*/
const char *
-addrtostr6 (const void *src, char *dst, size_t size)
+addrtostr6(const void *src, char *dst, size_t size)
{
/*
* Note that int32_t and int16_t need only be "at least" large enough
@@ -109,57 +119,60 @@
char *dp;
size_t space_left, added_space;
int snprintfed;
- struct {
+ struct
+ {
int base;
int len;
} best, cur;
- uint16_t words [IN6ADDRSZ / INT16SZ];
- int i;
+ uint16_t words[IN6ADDRSZ / INT16SZ];
+ int i;
/* Preprocess:
* Copy the input (bytewise) array into a wordwise array.
* Find the longest run of 0x00's in src[] for :: shorthanding.
*/
for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++)
- words[i] = (srcaddr[2*i] << 8) | srcaddr[2*i + 1];
+ words[i] = (srcaddr[2 * i] << 8) | srcaddr[2 * i + 1];
best.len = 0;
best.base = -1;
cur.len = 0;
- cur.base = -1;
+ cur.base = -1;
for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++)
{
if (words[i] == 0)
{
if (cur.base == -1)
- cur.base = i, cur.len = 1;
- else cur.len++;
+ cur.base = i, cur.len = 1;
+ else
+ cur.len++;
}
else if (cur.base != -1)
{
if (best.base == -1 || cur.len > best.len)
- best = cur;
+ best = cur;
cur.base = -1;
}
}
if ((cur.base != -1) && (best.base == -1 || cur.len > best.len))
- best = cur;
+ best = cur;
if (best.base != -1 && best.len < 2)
- best.base = -1;
+ best.base = -1;
/* Format the result.
*/
dp = dst;
space_left = size;
-#define APPEND_CHAR(c) \
- { \
- if (space_left == 0) { \
- errno = ENOSPC; \
- return (NULL); \
- } \
- *dp++ = c; \
- space_left--; \
- }
+#define APPEND_CHAR(c) \
+ { \
+ if (space_left == 0) \
+ { \
+ errno = ENOSPC; \
+ return (NULL); \
+ } \
+ *dp++ = c; \
+ space_left--; \
+ }
for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++)
{
/* Are we inside the best run of 0x00's?
@@ -167,21 +180,21 @@
if (best.base != -1 && i >= best.base && i < (best.base + best.len))
{
if (i == best.base)
- APPEND_CHAR(':');
+ APPEND_CHAR(':');
continue;
}
/* Are we following an initial run of 0x00s or any real hex?
*/
if (i != 0)
- APPEND_CHAR(':');
+ APPEND_CHAR(':');
/* Is this address an encapsulated IPv4?
*/
if (i == 6 && best.base == 0 &&
(best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
{
- if (!addrtostr(srcaddr+12, dp, space_left))
+ if (!addrtostr(srcaddr + 12, dp, space_left))
{
errno = ENOSPC;
return (NULL);
@@ -191,13 +204,13 @@
space_left -= added_space;
break;
}
- snprintfed = snprintf (dp, space_left, "%x", words[i]);
+ snprintfed = snprintf(dp, space_left, "%x", words[i]);
if (snprintfed < 0)
- return (NULL);
- if ((size_t) snprintfed >= space_left)
+ return (NULL);
+ if ((size_t)snprintfed >= space_left)
{
- errno = ENOSPC;
- return (NULL);
+ errno = ENOSPC;
+ return (NULL);
}
dp += snprintfed;
space_left -= snprintfed;
@@ -206,7 +219,7 @@
/* Was it a trailing run of 0x00's?
*/
if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ))
- APPEND_CHAR(':');
+ APPEND_CHAR(':');
APPEND_CHAR('\0');
return (dst);
diff -uNr tcpdump-tcpdump-4.99.4/checksum.c tcpdump-for-stellar/checksum.c
--- tcpdump-tcpdump-4.99.4/checksum.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/checksum.c 2024-10-30 17:34:05.522498702 +0800
@@ -37,75 +37,73 @@
crc_table = []
for i in range(256):
- accum = i << 2
- for j in range(8):
- accum <<= 1
- if accum & 0x400:
- accum ^= 0x633
- crc_table.append(accum)
+ accum = i << 2
+ for j in range(8):
+ accum <<= 1
+ if accum & 0x400:
+ accum ^= 0x633
+ crc_table.append(accum)
for i in range(len(crc_table)/8):
- for j in range(8):
- sys.stdout.write("0x%04x, " % crc_table[i*8+j])
- sys.stdout.write("\n")
+ for j in range(8):
+ sys.stdout.write("0x%04x, " % crc_table[i*8+j])
+ sys.stdout.write("\n")
*/
static const uint16_t crc10_table[256] =
-{
- 0x0000, 0x0233, 0x0255, 0x0066, 0x0299, 0x00aa, 0x00cc, 0x02ff,
- 0x0301, 0x0132, 0x0154, 0x0367, 0x0198, 0x03ab, 0x03cd, 0x01fe,
- 0x0031, 0x0202, 0x0264, 0x0057, 0x02a8, 0x009b, 0x00fd, 0x02ce,
- 0x0330, 0x0103, 0x0165, 0x0356, 0x01a9, 0x039a, 0x03fc, 0x01cf,
- 0x0062, 0x0251, 0x0237, 0x0004, 0x02fb, 0x00c8, 0x00ae, 0x029d,
- 0x0363, 0x0150, 0x0136, 0x0305, 0x01fa, 0x03c9, 0x03af, 0x019c,
- 0x0053, 0x0260, 0x0206, 0x0035, 0x02ca, 0x00f9, 0x009f, 0x02ac,
- 0x0352, 0x0161, 0x0107, 0x0334, 0x01cb, 0x03f8, 0x039e, 0x01ad,
- 0x00c4, 0x02f7, 0x0291, 0x00a2, 0x025d, 0x006e, 0x0008, 0x023b,
- 0x03c5, 0x01f6, 0x0190, 0x03a3, 0x015c, 0x036f, 0x0309, 0x013a,
- 0x00f5, 0x02c6, 0x02a0, 0x0093, 0x026c, 0x005f, 0x0039, 0x020a,
- 0x03f4, 0x01c7, 0x01a1, 0x0392, 0x016d, 0x035e, 0x0338, 0x010b,
- 0x00a6, 0x0295, 0x02f3, 0x00c0, 0x023f, 0x000c, 0x006a, 0x0259,
- 0x03a7, 0x0194, 0x01f2, 0x03c1, 0x013e, 0x030d, 0x036b, 0x0158,
- 0x0097, 0x02a4, 0x02c2, 0x00f1, 0x020e, 0x003d, 0x005b, 0x0268,
- 0x0396, 0x01a5, 0x01c3, 0x03f0, 0x010f, 0x033c, 0x035a, 0x0169,
- 0x0188, 0x03bb, 0x03dd, 0x01ee, 0x0311, 0x0122, 0x0144, 0x0377,
- 0x0289, 0x00ba, 0x00dc, 0x02ef, 0x0010, 0x0223, 0x0245, 0x0076,
- 0x01b9, 0x038a, 0x03ec, 0x01df, 0x0320, 0x0113, 0x0175, 0x0346,
- 0x02b8, 0x008b, 0x00ed, 0x02de, 0x0021, 0x0212, 0x0274, 0x0047,
- 0x01ea, 0x03d9, 0x03bf, 0x018c, 0x0373, 0x0140, 0x0126, 0x0315,
- 0x02eb, 0x00d8, 0x00be, 0x028d, 0x0072, 0x0241, 0x0227, 0x0014,
- 0x01db, 0x03e8, 0x038e, 0x01bd, 0x0342, 0x0171, 0x0117, 0x0324,
- 0x02da, 0x00e9, 0x008f, 0x02bc, 0x0043, 0x0270, 0x0216, 0x0025,
- 0x014c, 0x037f, 0x0319, 0x012a, 0x03d5, 0x01e6, 0x0180, 0x03b3,
- 0x024d, 0x007e, 0x0018, 0x022b, 0x00d4, 0x02e7, 0x0281, 0x00b2,
- 0x017d, 0x034e, 0x0328, 0x011b, 0x03e4, 0x01d7, 0x01b1, 0x0382,
- 0x027c, 0x004f, 0x0029, 0x021a, 0x00e5, 0x02d6, 0x02b0, 0x0083,
- 0x012e, 0x031d, 0x037b, 0x0148, 0x03b7, 0x0184, 0x01e2, 0x03d1,
- 0x022f, 0x001c, 0x007a, 0x0249, 0x00b6, 0x0285, 0x02e3, 0x00d0,
- 0x011f, 0x032c, 0x034a, 0x0179, 0x0386, 0x01b5, 0x01d3, 0x03e0,
- 0x021e, 0x002d, 0x004b, 0x0278, 0x0087, 0x02b4, 0x02d2, 0x00e1
-};
+ {
+ 0x0000, 0x0233, 0x0255, 0x0066, 0x0299, 0x00aa, 0x00cc, 0x02ff,
+ 0x0301, 0x0132, 0x0154, 0x0367, 0x0198, 0x03ab, 0x03cd, 0x01fe,
+ 0x0031, 0x0202, 0x0264, 0x0057, 0x02a8, 0x009b, 0x00fd, 0x02ce,
+ 0x0330, 0x0103, 0x0165, 0x0356, 0x01a9, 0x039a, 0x03fc, 0x01cf,
+ 0x0062, 0x0251, 0x0237, 0x0004, 0x02fb, 0x00c8, 0x00ae, 0x029d,
+ 0x0363, 0x0150, 0x0136, 0x0305, 0x01fa, 0x03c9, 0x03af, 0x019c,
+ 0x0053, 0x0260, 0x0206, 0x0035, 0x02ca, 0x00f9, 0x009f, 0x02ac,
+ 0x0352, 0x0161, 0x0107, 0x0334, 0x01cb, 0x03f8, 0x039e, 0x01ad,
+ 0x00c4, 0x02f7, 0x0291, 0x00a2, 0x025d, 0x006e, 0x0008, 0x023b,
+ 0x03c5, 0x01f6, 0x0190, 0x03a3, 0x015c, 0x036f, 0x0309, 0x013a,
+ 0x00f5, 0x02c6, 0x02a0, 0x0093, 0x026c, 0x005f, 0x0039, 0x020a,
+ 0x03f4, 0x01c7, 0x01a1, 0x0392, 0x016d, 0x035e, 0x0338, 0x010b,
+ 0x00a6, 0x0295, 0x02f3, 0x00c0, 0x023f, 0x000c, 0x006a, 0x0259,
+ 0x03a7, 0x0194, 0x01f2, 0x03c1, 0x013e, 0x030d, 0x036b, 0x0158,
+ 0x0097, 0x02a4, 0x02c2, 0x00f1, 0x020e, 0x003d, 0x005b, 0x0268,
+ 0x0396, 0x01a5, 0x01c3, 0x03f0, 0x010f, 0x033c, 0x035a, 0x0169,
+ 0x0188, 0x03bb, 0x03dd, 0x01ee, 0x0311, 0x0122, 0x0144, 0x0377,
+ 0x0289, 0x00ba, 0x00dc, 0x02ef, 0x0010, 0x0223, 0x0245, 0x0076,
+ 0x01b9, 0x038a, 0x03ec, 0x01df, 0x0320, 0x0113, 0x0175, 0x0346,
+ 0x02b8, 0x008b, 0x00ed, 0x02de, 0x0021, 0x0212, 0x0274, 0x0047,
+ 0x01ea, 0x03d9, 0x03bf, 0x018c, 0x0373, 0x0140, 0x0126, 0x0315,
+ 0x02eb, 0x00d8, 0x00be, 0x028d, 0x0072, 0x0241, 0x0227, 0x0014,
+ 0x01db, 0x03e8, 0x038e, 0x01bd, 0x0342, 0x0171, 0x0117, 0x0324,
+ 0x02da, 0x00e9, 0x008f, 0x02bc, 0x0043, 0x0270, 0x0216, 0x0025,
+ 0x014c, 0x037f, 0x0319, 0x012a, 0x03d5, 0x01e6, 0x0180, 0x03b3,
+ 0x024d, 0x007e, 0x0018, 0x022b, 0x00d4, 0x02e7, 0x0281, 0x00b2,
+ 0x017d, 0x034e, 0x0328, 0x011b, 0x03e4, 0x01d7, 0x01b1, 0x0382,
+ 0x027c, 0x004f, 0x0029, 0x021a, 0x00e5, 0x02d6, 0x02b0, 0x0083,
+ 0x012e, 0x031d, 0x037b, 0x0148, 0x03b7, 0x0184, 0x01e2, 0x03d1,
+ 0x022f, 0x001c, 0x007a, 0x0249, 0x00b6, 0x0285, 0x02e3, 0x00d0,
+ 0x011f, 0x032c, 0x034a, 0x0179, 0x0386, 0x01b5, 0x01d3, 0x03e0,
+ 0x021e, 0x002d, 0x004b, 0x0278, 0x0087, 0x02b4, 0x02d2, 0x00e1};
-static void
-init_crc10_table(void)
+static int init_crc10_table(void)
{
#define CRC10_POLYNOMIAL 0x633
int i, j;
uint16_t accum;
uint16_t verify_crc10_table[256];
- for ( i = 0; i < 256; i++ )
+ for (i = 0; i < 256; i++)
{
- accum = ((unsigned short) i << 2);
- for ( j = 0; j < 8; j++ )
+ accum = ((unsigned short)i << 2);
+ for (j = 0; j < 8; j++)
{
- if ((accum <<= 1) & 0x400) accum ^= CRC10_POLYNOMIAL;
+ if ((accum <<= 1) & 0x400)
+ accum ^= CRC10_POLYNOMIAL;
}
verify_crc10_table[i] = accum;
}
- assert(memcmp(verify_crc10_table,
- crc10_table,
- sizeof(verify_crc10_table)) == 0);
+ assert(memcmp(verify_crc10_table, crc10_table, sizeof(verify_crc10_table)) == 0);
+ return memcmp(verify_crc10_table, crc10_table, sizeof(verify_crc10_table));
#undef CRC10_POLYNOMIAL
}
@@ -114,21 +112,18 @@
{
int i;
- for ( i = 0; i < length; i++ )
+ for (i = 0; i < length; i++)
{
- accum = ((accum << 8) & 0x3ff)
- ^ crc10_table[( accum >> 2) & 0xff]
- ^ *p++;
+ accum = ((accum << 8) & 0x3ff) ^ crc10_table[(accum >> 2) & 0xff] ^ *p++;
}
return accum;
}
/* precompute checksum tables */
-void
-init_checksum(void) {
+void init_checksum(void)
+{
init_crc10_table();
-
}
/*
@@ -136,7 +131,7 @@
* The checksum field of the passed PDU does not need to be reset to zero.
*/
uint16_t
-create_osi_cksum (const uint8_t *pptr, int checksum_offset, int length)
+create_osi_cksum(const uint8_t *pptr, int checksum_offset, int length)
{
int x;
@@ -150,15 +145,19 @@
c0 = 0;
c1 = 0;
- for (idx = 0; idx < length; idx++) {
+ for (idx = 0; idx < length; idx++)
+ {
/*
* Ignore the contents of the checksum field.
*/
if (idx == checksum_offset ||
- idx == checksum_offset+1) {
+ idx == checksum_offset + 1)
+ {
c1 += c0;
pptr++;
- } else {
+ }
+ else
+ {
c0 = c0 + *(pptr++);
c1 += c0;
}
@@ -167,20 +166,23 @@
c0 = c0 % 255;
c1 = c1 % 255;
- mul = (length - checksum_offset)*(c0);
+ mul = (length - checksum_offset) * (c0);
x = mul - c0 - c1;
y = c1 - mul - 1;
- if ( y >= 0 ) y++;
- if ( x < 0 ) x--;
+ if (y >= 0)
+ y++;
+ if (x < 0)
+ x--;
x %= 255;
y %= 255;
-
- if (x == 0) x = 255;
- if (y == 0) y = 255;
+ if (x == 0)
+ x = 255;
+ if (y == 0)
+ y = 255;
y &= 0x00FF;
checksum = ((x << 8) | y);
diff -uNr tcpdump-tcpdump-4.99.4/CMakeLists.txt tcpdump-for-stellar/CMakeLists.txt
--- tcpdump-tcpdump-4.99.4/CMakeLists.txt 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/CMakeLists.txt 2024-10-30 17:34:05.478498703 +0800
@@ -82,7 +82,7 @@
#
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
-set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
+set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules)
#
# OK, this is a royal pain.
@@ -206,11 +206,26 @@
# Parameters
###################################################################
-option(WITH_SMI "Build with libsmi, if available" ON)
-option(WITH_CRYPTO "Build with OpenSSL/libressl libcrypto, if available" ON)
+option(WITH_SMI "Build with libsmi, if available" OFF)
+option(WITH_CRYPTO "Build with OpenSSL/libressl libcrypto, if available" OFF)
option(WITH_CAPSICUM "Build with Capsicum security functions, if available" ON)
option(WITH_CAP_NG "Use libcap-ng, if available" ON)
option(ENABLE_SMB "Build with the SMB dissector" OFF)
+option(STELLAR_SOURCE_DIR"stellar src root dir" "")
+option(STELLAR_BINARY_DIR "stellar build root dir" "")
+option(ASAN_OPTION "asan" OFF)
+
+if(ASAN_OPTION MATCHES "ADDRESS")
+ set(CMAKE_C_FLAGS "${CMAKADDRESS} -g -DCMAKE_BUILD_TYPE=Debug -fsanitize=address -fno-omit-frame-pointer")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -DCMAKE_BUILD_TYPE=Debug -fsanitize=address -fno-omit-frame-pointer")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan")
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan")
+elseif(ASAN_OPTION MATCHES "THREAD")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -DCMAKE_BUILD_TYPE=Debug -fsanitize=thread -fno-omit-frame-pointer")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -DCMAKE_BUILD_TYPE=Debug -fsanitize=thread -fno-omit-frame-pointer")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan")
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan")
+endif()
#
# String parameters. Neither of them are set, initially; only if the
@@ -1235,6 +1250,15 @@
set(TCPDUMP_SOURCE_LIST_C ${TCPDUMP_SOURCE_LIST_C} missing/dlnames.c)
endif((NOT HAVE_PCAP_DATALINK_NAME_TO_VAL) OR (NOT HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION))
+set(TCPDUMP_SOURCE_LIST_C ${TCPDUMP_SOURCE_LIST_C} stellar_dump_ctrl_link.c)
+set(TCPDUMP_SOURCE_LIST_C ${TCPDUMP_SOURCE_LIST_C} stellar_dump_data_link.c)
+include_directories(${STELLAR_SOURCE_DIR}/include/)
+include_directories(${STELLAR_SOURCE_DIR}/infra/)
+include_directories(${STELLAR_BINARY_DIR}/vendors/libevent/include/)
+
+link_directories(${STELLAR_BINARY_DIR}/vendors/libevent/lib/)
+link_directories(${STELLAR_BINARY_DIR}/infra/packet_manager/)
+
set(PROJECT_SOURCE_LIST_C ${NETDISSECT_SOURCE_LIST_C} ${TCPDUMP_SOURCE_LIST_C})
file(GLOB PROJECT_SOURCE_LIST_H
@@ -1297,11 +1321,17 @@
# Register targets
######################################
-add_executable(tcpdump ${TCPDUMP_SOURCE_LIST_C})
+# add_executable(tcpdump ${TCPDUMP_SOURCE_LIST_C})
+add_library(tcpdump_stellar ${TCPDUMP_SOURCE_LIST_C})
if(NOT C_ADDITIONAL_FLAGS STREQUAL "")
- set_target_properties(tcpdump PROPERTIES COMPILE_FLAGS ${C_ADDITIONAL_FLAGS})
+ set_target_properties(tcpdump_stellar PROPERTIES COMPILE_FLAGS ${C_ADDITIONAL_FLAGS})
endif()
-target_link_libraries(tcpdump netdissect ${TCPDUMP_LINK_LIBRARIES})
+target_link_libraries(tcpdump_stellar netdissect ${TCPDUMP_LINK_LIBRARIES})
+
+##like redis-cli, use hyphen('-') not underscore('_') to separate words
+add_executable(stellar-dump main.c)
+target_link_libraries(stellar-dump tcpdump_stellar pthread packet_manager)
+target_link_libraries(stellar-dump ${STELLAR_BINARY_DIR}/vendors/libevent/lib/libevent.a)
######################################
# Write out the config.h file
@@ -1325,7 +1355,7 @@
if(WIN32)
# XXX TODO where to install on Windows?
else(WIN32)
- install(TARGETS tcpdump DESTINATION bin)
+ install(TARGETS tcpdump_stellar DESTINATION bin)
endif(WIN32)
# On UN*X, and on Windows when not using MSVC, process man pages and
@@ -1340,7 +1370,7 @@
set(MAN1 "")
foreach(TEMPLATE_MANPAGE ${MAN1_EXPAND})
string(REPLACE ".in" "" MANPAGE ${TEMPLATE_MANPAGE})
- configure_file(${CMAKE_SOURCE_DIR}/${TEMPLATE_MANPAGE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE} @ONLY)
+ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${TEMPLATE_MANPAGE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE} @ONLY)
set(MAN1 ${MAN1} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE})
endforeach(TEMPLATE_MANPAGE)
install(FILES ${MAN1} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
@@ -1361,11 +1391,11 @@
# rule run tests/TESTrun with it, because just trying to run the TESTrun
# script as a command won't work on Windows.
#
-find_program(PERL perl)
-if(PERL)
- message(STATUS "Found perl at ${PERL}")
- add_custom_target(check
- COMMAND ${PERL} ${CMAKE_SOURCE_DIR}/tests/TESTrun)
-else()
- message(STATUS "Didn't find perl")
-endif()
+# find_program(PERL perl)
+# if(PERL)
+# message(STATUS "Found perl at ${PERL}")
+# add_custom_target(check
+# COMMAND ${PERL} ${CMAKE_SOURCE_DIR}/tests/TESTrun)
+# else()
+# message(STATUS "Didn't find perl")
+# endif()
diff -uNr tcpdump-tcpdump-4.99.4/ftmacros.h tcpdump-for-stellar/ftmacros.h
--- tcpdump-tcpdump-4.99.4/ftmacros.h 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/ftmacros.h 2024-10-30 17:34:05.573498702 +0800
@@ -101,7 +101,9 @@
* this might, for example, be GNU/HURD or one of Debian's kFreeBSD
* OSes ("GNU/FreeBSD").
*/
+ #ifndef _GNU_SOURCE
#define _GNU_SOURCE
+ #endif
/*
* We turn on both _DEFAULT_SOURCE and _BSD_SOURCE to try to get
diff -uNr tcpdump-tcpdump-4.99.4/.gitattributes tcpdump-for-stellar/.gitattributes
--- tcpdump-tcpdump-4.99.4/.gitattributes 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/.gitattributes 1970-01-01 08:00:00.000000000 +0800
@@ -1,9 +0,0 @@
-# Auto detect text files and perform LF normalization
-* text=auto
-
-# Normalize line endings to LF on checkin and
-# prevents conversion to CRLF when the file is checked out
-tests/*.out text eol=lf
-
-# things that only make sense on github.com
-.github export-ignore
diff -uNr tcpdump-tcpdump-4.99.4/.gitignore tcpdump-for-stellar/.gitignore
--- tcpdump-tcpdump-4.99.4/.gitignore 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/.gitignore 1970-01-01 08:00:00.000000000 +0800
@@ -1,41 +0,0 @@
-*.orig
-*.rej
-Makefile
-*~
-*.o
-libnetdissect.a
-config.h
-config.log
-config.cache
-config.status
-.devel
-os-proto.h
-stamp-h
-stamp-h.in
-tcpdump
-tcpdump.1
-tcpdump-*.tar.gz
-failure-outputs.txt
-autom4te.cache/
-*.VC.db
-*.VC.opendb
-ALL_BUILD.vcxproj*
-ZERO_CHECK.vcxproj*
-check.vcxproj*
-netdissect.vcxproj*
-tcpdump.vcxproj*
-uninstall.vcxproj*
-CMakeCache.txt
-CMakeFiles/
-Debug/
-Release/
-MinSizeRel/
-RelWithDebInfo/
-cmake_install.cmake
-cmake_uninstall.cmake
-netdissect.dir/
-tcpdump.dir/
-tcpdump.sln
-.vs/
-.passed
-.failed
diff -uNr tcpdump-tcpdump-4.99.4/main.c tcpdump-for-stellar/main.c
--- tcpdump-tcpdump-4.99.4/main.c 1970-01-01 08:00:00.000000000 +0800
+++ tcpdump-for-stellar/main.c 2024-10-30 17:34:06.260498697 +0800
@@ -0,0 +1,10 @@
+#include <stdio.h>
+#include <pcap/pcap.h>
+#include "netdissect.h"
+
+extern int stellar_dump(int argc, char **argv);
+
+int main(int argc, char const *argv[])
+{
+ return stellar_dump(argc, (char **)argv);
+}
diff -uNr tcpdump-tcpdump-4.99.4/netdissect.h tcpdump-for-stellar/netdissect.h
--- tcpdump-tcpdump-4.99.4/netdissect.h 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/netdissect.h 2024-10-30 17:34:05.601498702 +0800
@@ -21,17 +21,17 @@
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-
#ifndef netdissect_h
#define netdissect_h
#ifdef HAVE_OS_PROTO_H
#include "os-proto.h"
#endif
+#include <time.h>
#include <sys/types.h>
#include <setjmp.h>
#include "status-exit-codes.h"
-#include "funcattrs.h" /* for PRINTFLIKE_FUNCPTR() */
+#include "funcattrs.h" /* for PRINTFLIKE_FUNCPTR() */
#include "diag-control.h" /* for ND_UNREACHABLE */
/*
@@ -63,7 +63,7 @@
typedef unsigned char nd_int32_t[4];
typedef unsigned char nd_int64_t[8];
-#define FMAXINT (4294967296.0) /* floating point rep. of MAXINT */
+#define FMAXINT (4294967296.0) /* floating point rep. of MAXINT */
/*
* Use this for IPv4 addresses and netmasks.
@@ -101,7 +101,7 @@
/*
* Use this for MAC addresses.
*/
-#define MAC_ADDR_LEN 6U /* length of MAC addresses */
+#define MAC_ADDR_LEN 6U /* length of MAC addresses */
typedef unsigned char nd_mac_addr[MAC_ADDR_LEN];
/*
@@ -113,33 +113,34 @@
* Round up x to a multiple of y; y must be a power of 2.
*/
#ifndef roundup2
-#define roundup2(x, y) (((x)+((u_int)((y)-1)))&(~((u_int)((y)-1))))
+#define roundup2(x, y) (((x) + ((u_int)((y) - 1))) & (~((u_int)((y) - 1))))
#endif
#include <stdarg.h>
#include <pcap.h>
-#include "ip.h" /* struct ip for nextproto4_cksum() */
-#include "ip6.h" /* struct ip6 for nextproto6_cksum() */
+#include "tcpdump_ip.h" /* struct ip for nextproto4_cksum() */
+#include "tcpdump_ip6.h" /* struct ip6 for nextproto6_cksum() */
#ifndef HAVE_STRLCAT
-extern size_t strlcat (char *, const char *, size_t);
+extern size_t strlcat(char *, const char *, size_t);
#endif
#ifndef HAVE_STRLCPY
-extern size_t strlcpy (char *, const char *, size_t);
+extern size_t strlcpy(char *, const char *, size_t);
#endif
#ifndef HAVE_STRDUP
-extern char *strdup (const char *str);
+extern char *strdup(const char *str);
#endif
#ifndef HAVE_STRSEP
extern char *strsep(char **, const char *);
#endif
-struct tok {
- u_int v; /* value */
- const char *s; /* string */
+struct tok
+{
+ u_int v; /* value */
+ const char *s; /* string */
};
/* tok2str is deprecated */
@@ -165,7 +166,7 @@
#define IF_PRINTER_ARGS (netdissect_options *, const struct pcap_pkthdr *, const u_char *)
-typedef void (*if_printer) IF_PRINTER_ARGS;
+typedef void(*if_printer) IF_PRINTER_ARGS;
/*
* In case the data in a buffer needs to be processed by being decrypted,
@@ -186,52 +187,54 @@
* on the stack with null buffer pointer, meaning there's nothing to
* free.
*/
-struct netdissect_saved_packet_info {
- u_char *ndspi_buffer; /* pointer to allocated buffer data */
- const u_char *ndspi_packetp; /* saved beginning of data */
- const u_char *ndspi_snapend; /* saved end of data */
- struct netdissect_saved_packet_info *ndspi_prev; /* previous buffer on the stack */
+struct netdissect_saved_packet_info
+{
+ u_char *ndspi_buffer; /* pointer to allocated buffer data */
+ const u_char *ndspi_packetp; /* saved beginning of data */
+ const u_char *ndspi_snapend; /* saved end of data */
+ struct netdissect_saved_packet_info *ndspi_prev; /* previous buffer on the stack */
};
/* 'val' value(s) for longjmp */
#define ND_TRUNCATED 1
-struct netdissect_options {
- int ndo_bflag; /* print 4 byte ASes in ASDOT notation */
- int ndo_eflag; /* print ethernet header */
- int ndo_fflag; /* don't translate "foreign" IP address */
- int ndo_Kflag; /* don't check IP, TCP or UDP checksums */
- int ndo_nflag; /* leave addresses as numbers */
- int ndo_Nflag; /* remove domains from printed host names */
- int ndo_qflag; /* quick (shorter) output */
- int ndo_Sflag; /* print raw TCP sequence numbers */
- int ndo_tflag; /* print packet arrival time */
- int ndo_uflag; /* Print undecoded NFS handles */
- int ndo_vflag; /* verbosity level */
- int ndo_xflag; /* print packet in hex */
- int ndo_Xflag; /* print packet in hex/ASCII */
- int ndo_Aflag; /* print packet only in ASCII observing TAB,
- * LF, CR and SPACE as graphical chars
- */
- int ndo_Hflag; /* dissect 802.11s draft mesh standard */
- const char *ndo_protocol; /* protocol */
- jmp_buf ndo_early_end; /* jmp_buf for setjmp()/longjmp() */
- void *ndo_last_mem_p; /* pointer to the last allocated memory chunk */
- int ndo_packet_number; /* print a packet number in the beginning of line */
+struct netdissect_options
+{
+ int ndo_bflag; /* print 4 byte ASes in ASDOT notation */
+ int ndo_eflag; /* print ethernet header */
+ int ndo_fflag; /* don't translate "foreign" IP address */
+ int ndo_Kflag; /* don't check IP, TCP or UDP checksums */
+ int ndo_nflag; /* leave addresses as numbers */
+ int ndo_Nflag; /* remove domains from printed host names */
+ int ndo_qflag; /* quick (shorter) output */
+ int ndo_Sflag; /* print raw TCP sequence numbers */
+ int ndo_tflag; /* print packet arrival time */
+ int ndo_uflag; /* Print undecoded NFS handles */
+ int ndo_vflag; /* verbosity level */
+ int ndo_xflag; /* print packet in hex */
+ int ndo_Xflag; /* print packet in hex/ASCII */
+ int ndo_Aflag; /* print packet only in ASCII observing TAB,
+ * LF, CR and SPACE as graphical chars
+ */
+ int ndo_Hflag; /* dissect 802.11s draft mesh standard */
+ const char *ndo_protocol; /* protocol */
+ jmp_buf ndo_early_end; /* jmp_buf for setjmp()/longjmp() */
+ void *ndo_last_mem_p; /* pointer to the last allocated memory chunk */
+ int ndo_packet_number; /* print a packet number in the beginning of line */
int ndo_suppress_default_print; /* don't use default_print() for unknown packet types */
- int ndo_tstamp_precision; /* requested time stamp precision */
- const char *program_name; /* Name of the program using the library */
+ int ndo_tstamp_precision; /* requested time stamp precision */
+ const char *program_name; /* Name of the program using the library */
char *ndo_espsecret;
- struct sa_list *ndo_sa_list_head; /* used by print-esp.c */
+ struct sa_list *ndo_sa_list_head; /* used by print-esp.c */
struct sa_list *ndo_sa_default;
- char *ndo_sigsecret; /* Signature verification secret key */
+ char *ndo_sigsecret; /* Signature verification secret key */
- int ndo_packettype; /* as specified by -T */
+ int ndo_packettype; /* as specified by -T */
- int ndo_snaplen;
- int ndo_ll_hdr_len; /* link-layer header length */
+ int ndo_snaplen;
+ int ndo_ll_hdr_len; /* link-layer header length */
/*global pointers to beginning and end of current packet (during printing) */
const u_char *ndo_packetp;
@@ -245,21 +248,21 @@
/* pointer to void function to output stuff */
void (*ndo_default_print)(netdissect_options *,
- const u_char *bp, u_int length);
+ const u_char *bp, u_int length);
/* pointer to function to do regular output */
- int (*ndo_printf)(netdissect_options *,
- const char *fmt, ...)
- PRINTFLIKE_FUNCPTR(2, 3);
+ int (*ndo_printf)(netdissect_options *,
+ const char *fmt, ...)
+ PRINTFLIKE_FUNCPTR(2, 3);
/* pointer to function to output errors */
void NORETURN_FUNCPTR (*ndo_error)(netdissect_options *,
- status_exit_codes_t status,
- const char *fmt, ...)
- PRINTFLIKE_FUNCPTR(3, 4);
+ status_exit_codes_t status,
+ const char *fmt, ...)
+ PRINTFLIKE_FUNCPTR(3, 4);
/* pointer to function to output warnings */
void (*ndo_warning)(netdissect_options *,
- const char *fmt, ...)
- PRINTFLIKE_FUNCPTR(2, 3);
+ const char *fmt, ...)
+ PRINTFLIKE_FUNCPTR(2, 3);
};
extern WARN_UNUSED_RESULT int nd_push_buffer(netdissect_options *, u_char *, const u_char *, const u_int);
@@ -271,43 +274,40 @@
static inline NORETURN void
nd_trunc_longjmp(netdissect_options *ndo)
{
- longjmp(ndo->ndo_early_end, ND_TRUNCATED);
+ longjmp(ndo->ndo_early_end, ND_TRUNCATED);
#ifdef _AIX
- /*
- * In AIX <setjmp.h> decorates longjmp() with "#pragma leaves", which tells
- * XL C that the function is noreturn, but GCC remains unaware of that and
- * yields a "'noreturn' function does return" warning.
- */
- ND_UNREACHABLE
+ /*
+ * In AIX <setjmp.h> decorates longjmp() with "#pragma leaves", which tells
+ * XL C that the function is noreturn, but GCC remains unaware of that and
+ * yields a "'noreturn' function does return" warning.
+ */
+ ND_UNREACHABLE
#endif /* _AIX */
}
-#define PT_VAT 1 /* Visual Audio Tool */
-#define PT_WB 2 /* distributed White Board */
-#define PT_RPC 3 /* Remote Procedure Call */
-#define PT_RTP 4 /* Real-Time Applications protocol */
-#define PT_RTCP 5 /* Real-Time Applications control protocol */
-#define PT_SNMP 6 /* Simple Network Management Protocol */
-#define PT_CNFP 7 /* Cisco NetFlow protocol */
-#define PT_TFTP 8 /* trivial file transfer protocol */
-#define PT_AODV 9 /* Ad-hoc On-demand Distance Vector Protocol */
-#define PT_CARP 10 /* Common Address Redundancy Protocol */
-#define PT_RADIUS 11 /* RADIUS authentication Protocol */
-#define PT_ZMTP1 12 /* ZeroMQ Message Transport Protocol 1.0 */
-#define PT_VXLAN 13 /* Virtual eXtensible Local Area Network */
-#define PT_PGM 14 /* [UDP-encapsulated] Pragmatic General Multicast */
-#define PT_PGM_ZMTP1 15 /* ZMTP/1.0 inside PGM (native or UDP-encapsulated) */
-#define PT_LMP 16 /* Link Management Protocol */
-#define PT_RESP 17 /* RESP */
-#define PT_PTP 18 /* PTP */
-#define PT_SOMEIP 19 /* Autosar SOME/IP Protocol */
-#define PT_DOMAIN 20 /* Domain Name System (DNS) */
-
-#define ND_MIN(a,b) ((a)>(b)?(b):(a))
-#define ND_MAX(a,b) ((b)>(a)?(b):(a))
+#define PT_VAT 1 /* Visual Audio Tool */
+#define PT_WB 2 /* distributed White Board */
+#define PT_RPC 3 /* Remote Procedure Call */
+#define PT_RTP 4 /* Real-Time Applications protocol */
+#define PT_RTCP 5 /* Real-Time Applications control protocol */
+#define PT_SNMP 6 /* Simple Network Management Protocol */
+#define PT_CNFP 7 /* Cisco NetFlow protocol */
+#define PT_TFTP 8 /* trivial file transfer protocol */
+#define PT_AODV 9 /* Ad-hoc On-demand Distance Vector Protocol */
+#define PT_CARP 10 /* Common Address Redundancy Protocol */
+#define PT_RADIUS 11 /* RADIUS authentication Protocol */
+#define PT_ZMTP1 12 /* ZeroMQ Message Transport Protocol 1.0 */
+#define PT_VXLAN 13 /* Virtual eXtensible Local Area Network */
+#define PT_PGM 14 /* [UDP-encapsulated] Pragmatic General Multicast */
+#define PT_PGM_ZMTP1 15 /* ZMTP/1.0 inside PGM (native or UDP-encapsulated) */
+#define PT_LMP 16 /* Link Management Protocol */
+#define PT_RESP 17 /* RESP */
+#define PT_PTP 18 /* PTP */
+#define PT_SOMEIP 19 /* Autosar SOME/IP Protocol */
+#define PT_DOMAIN 20 /* Domain Name System (DNS) */
-/* For source or destination ports tests (UDP, TCP, ...) */
-#define IS_SRC_OR_DST_PORT(p) (sport == (p) || dport == (p))
+#define ND_MIN(a, b) ((a) > (b) ? (b) : (a))
+#define ND_MAX(a, b) ((b) > (a) ? (b) : (a))
/*
* Maximum snapshot length. This should be enough to capture the full
@@ -336,7 +336,7 @@
* let libpcap choose a snapshot length; newer versions may choose a bigger
* value than 262144 for D-Bus, for example.
*/
-#define MAXIMUM_SNAPLEN 262144
+#define MAXIMUM_SNAPLEN 262144
/*
* True if "l" bytes from "p" were captured.
@@ -365,19 +365,23 @@
*/
#define IS_NOT_NEGATIVE(x) (((x) > 0) || ((x) == 0))
-#define ND_TTEST_LEN(p, l) \
- (IS_NOT_NEGATIVE(l) && \
- ((uintptr_t)ndo->ndo_snapend - (l) <= (uintptr_t)ndo->ndo_snapend && \
- (uintptr_t)(p) <= (uintptr_t)ndo->ndo_snapend - (l)))
+#define ND_TTEST_LEN(p, l) \
+ (IS_NOT_NEGATIVE(l) && \
+ ((uintptr_t)ndo->ndo_snapend - (l) <= (uintptr_t)ndo->ndo_snapend && \
+ (uintptr_t)(p) <= (uintptr_t)ndo->ndo_snapend - (l)))
/* True if "*(p)" was captured */
#define ND_TTEST_SIZE(p) ND_TTEST_LEN(p, sizeof(*(p)))
/* Bail out if "l" bytes from "p" were not captured */
#ifdef ND_LONGJMP_FROM_TCHECK
-#define ND_TCHECK_LEN(p, l) if (!ND_TTEST_LEN(p, l)) nd_trunc_longjmp(ndo)
+#define ND_TCHECK_LEN(p, l) \
+ if (!ND_TTEST_LEN(p, l)) \
+ nd_trunc_longjmp(ndo)
#else
-#define ND_TCHECK_LEN(p, l) if (!ND_TTEST_LEN(p, l)) goto trunc
+#define ND_TCHECK_LEN(p, l) \
+ if (!ND_TTEST_LEN(p, l)) \
+ goto trunc
#endif
/* Bail out if "*(p)" was not captured */
@@ -395,26 +399,28 @@
#define ND_BYTES_AVAILABLE_AFTER(p) ND_BYTES_BETWEEN(ndo->ndo_snapend, (p))
/* Check length < minimum for invalid packet with a custom message, format %u */
-#define ND_LCHECKMSG_U(length, minimum, what) \
-if ((length) < (minimum)) { \
-ND_PRINT(" [%s %u < %u]", (what), (length), (minimum)); \
-goto invalid; \
-}
+#define ND_LCHECKMSG_U(length, minimum, what) \
+ if ((length) < (minimum)) \
+ { \
+ ND_PRINT(" [%s %u < %u]", (what), (length), (minimum)); \
+ goto invalid; \
+ }
/* Check length < minimum for invalid packet with #length message, format %u */
#define ND_LCHECK_U(length, minimum) \
-ND_LCHECKMSG_U((length), (minimum), (#length))
+ ND_LCHECKMSG_U((length), (minimum), (#length))
/* Check length < minimum for invalid packet with a custom message, format %zu */
-#define ND_LCHECKMSG_ZU(length, minimum, what) \
-if ((length) < (minimum)) { \
-ND_PRINT(" [%s %u < %zu]", (what), (length), (minimum)); \
-goto invalid; \
-}
+#define ND_LCHECKMSG_ZU(length, minimum, what) \
+ if ((length) < (minimum)) \
+ { \
+ ND_PRINT(" [%s %u < %zu]", (what), (length), (minimum)); \
+ goto invalid; \
+ }
/* Check length < minimum for invalid packet with #length message, format %zu */
#define ND_LCHECK_ZU(length, minimum) \
-ND_LCHECKMSG_ZU((length), (minimum), (#length))
+ ND_LCHECKMSG_ZU((length), (minimum), (#length))
#define ND_PRINT(...) (ndo->ndo_printf)(ndo, __VA_ARGS__)
#define ND_DEFAULTPRINT(ap, length) (*ndo->ndo_default_print)(ndo, ap, length)
@@ -424,7 +430,7 @@
extern void unsigned_relts_print(netdissect_options *, uint32_t);
extern const char *nd_format_time(char *buf, size_t bufsize,
- const char *format, const struct tm *timeptr);
+ const char *format, const struct tm *timeptr);
extern void fn_print_char(netdissect_options *, u_char);
extern void fn_print_str(netdissect_options *, const u_char *);
@@ -435,16 +441,16 @@
/*
* Flags for txtproto_print().
*/
-#define RESP_CODE_SECOND_TOKEN 0x00000001 /* response code is second token in response line */
+#define RESP_CODE_SECOND_TOKEN 0x00000001 /* response code is second token in response line */
extern void txtproto_print(netdissect_options *, const u_char *, u_int,
- const char **, u_int);
+ const char **, u_int);
-#if (defined(__i386__) || defined(_M_IX86) || defined(__X86__) || defined(__x86_64__) || defined(_M_X64)) || \
- (defined(__arm__) || defined(_M_ARM) || defined(__aarch64__)) || \
- (defined(__m68k__) && (!defined(__mc68000__) && !defined(__mc68010__))) || \
+#if (defined(__i386__) || defined(_M_IX86) || defined(__X86__) || defined(__x86_64__) || defined(_M_X64)) || \
+ (defined(__arm__) || defined(_M_ARM) || defined(__aarch64__)) || \
+ (defined(__m68k__) && (!defined(__mc68000__) && !defined(__mc68010__))) || \
(defined(__ppc__) || defined(__ppc64__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PPC64)) || \
- (defined(__s390__) || defined(__s390x__) || defined(__zarch__)) || \
+ (defined(__s390__) || defined(__s390x__) || defined(__zarch__)) || \
defined(__vax__)
/*
* The processor natively handles unaligned loads, so just use memcpy()
@@ -461,8 +467,8 @@
* XXX - do we need to test for both 32-bit and 64-bit versions of those
* architectures in all cases?
*/
-#define UNALIGNED_MEMCPY(p, q, l) memcpy((p), (q), (l))
-#define UNALIGNED_MEMCMP(p, q, l) memcmp((p), (q), (l))
+#define UNALIGNED_MEMCPY(p, q, l) memcpy((p), (q), (l))
+#define UNALIGNED_MEMCMP(p, q, l) memcmp((p), (q), (l))
#else
/*
* The processor doesn't natively handle unaligned loads,
@@ -477,28 +483,32 @@
*/
extern void unaligned_memcpy(void *, const void *, size_t);
extern int unaligned_memcmp(const void *, const void *, size_t);
-#define UNALIGNED_MEMCPY(p, q, l) unaligned_memcpy((p), (q), (l))
-#define UNALIGNED_MEMCMP(p, q, l) unaligned_memcmp((p), (q), (l))
+#define UNALIGNED_MEMCPY(p, q, l) unaligned_memcpy((p), (q), (l))
+#define UNALIGNED_MEMCMP(p, q, l) unaligned_memcmp((p), (q), (l))
#endif
#define PLURAL_SUFFIX(n) \
- (((n) != 1) ? "s" : "")
+ (((n) != 1) ? "s" : "")
extern const char *tok2strary_internal(const char **, int, const char *, int);
-#define tok2strary(a,f,i) tok2strary_internal(a, sizeof(a)/sizeof(a[0]),f,i)
+#define tok2strary(a, f, i) tok2strary_internal(a, sizeof(a) / sizeof(a[0]), f, i)
struct uint_tokary
{
- u_int uintval;
- const struct tok *tokary;
+ u_int uintval;
+ const struct tok *tokary;
};
extern const struct tok *uint2tokary_internal(const struct uint_tokary[], const size_t, const u_int);
-#define uint2tokary(a, i) uint2tokary_internal(a, sizeof(a)/sizeof(a[0]), i)
+#define uint2tokary(a, i) uint2tokary_internal(a, sizeof(a) / sizeof(a[0]), i)
extern if_printer lookup_printer(int);
-#define ND_DEBUG {printf(" [%s:%d %s] ", __FILE__, __LINE__, __func__); fflush(stdout);}
+#define ND_DEBUG \
+ { \
+ printf(" [%s:%d %s] ", __FILE__, __LINE__, __func__); \
+ fflush(stdout); \
+ }
/* The DLT printer routines */
@@ -577,9 +587,10 @@
* This contains a pointer to an address and a pointer to a routine
* to which we pass that pointer in order to get a string.
*/
-struct lladdr_info {
- const char *(*addr_string)(netdissect_options *, const u_char *);
- const u_char *addr;
+struct lladdr_info
+{
+ const char *(*addr_string)(netdissect_options *, const u_char *);
+ const u_char *addr;
};
/* The printer routines. */
@@ -589,7 +600,7 @@
extern void ahcp_print(netdissect_options *, const u_char *, u_int);
extern void aodv_print(netdissect_options *, const u_char *, u_int, int);
extern void aoe_print(netdissect_options *, const u_char *, const u_int);
-extern int arista_ethertype_print(netdissect_options *,const u_char *, u_int);
+extern int arista_ethertype_print(netdissect_options *, const u_char *, u_int);
extern void arp_print(netdissect_options *, const u_char *, u_int, u_int);
extern void ascii_print(netdissect_options *, const u_char *, u_int);
extern void atalk_print(netdissect_options *, const u_char *, u_int);
@@ -668,8 +679,8 @@
extern void lwres_print(netdissect_options *, const u_char *, u_int);
extern void m3ua_print(netdissect_options *, const u_char *, const u_int);
extern int macsec_print(netdissect_options *, const u_char **,
- u_int *, u_int *, u_int *, const struct lladdr_info *,
- const struct lladdr_info *);
+ u_int *, u_int *, u_int *, const struct lladdr_info *,
+ const struct lladdr_info *);
extern u_int mfr_print(netdissect_options *, const u_char *, u_int);
extern void mobile_print(netdissect_options *, const u_char *, u_int);
extern int mobility_print(netdissect_options *, const u_char *, const u_char *);
@@ -756,9 +767,10 @@
extern uint16_t verify_crc10_cksum(uint16_t, const u_char *, int);
extern uint16_t create_osi_cksum(const uint8_t *, int, int);
-struct cksum_vec {
- const uint8_t *ptr;
- int len;
+struct cksum_vec
+{
+ const uint8_t *ptr;
+ int len;
};
extern uint16_t in_cksum(const struct cksum_vec *, int);
extern uint16_t in_cksum_shouldbe(uint16_t, uint16_t);
@@ -766,10 +778,10 @@
/* IP protocol demuxing routines */
extern void ip_demux_print(netdissect_options *, const u_char *, u_int, u_int, int, u_int, uint8_t, const u_char *);
-extern uint16_t nextproto4_cksum(netdissect_options *, const struct ip *, const uint8_t *, u_int, u_int, uint8_t);
+extern uint16_t nextproto4_cksum(netdissect_options *, const struct tcpdump_ip *, const uint8_t *, u_int, u_int, uint8_t);
/* in print-ip6.c */
-extern uint16_t nextproto6_cksum(netdissect_options *, const struct ip6_hdr *, const uint8_t *, u_int, u_int, uint8_t);
+extern uint16_t nextproto6_cksum(netdissect_options *, const struct tcpdump_ip6_hdr *, const uint8_t *, u_int, u_int, uint8_t);
/* Utilities */
extern void nd_print_trunc(netdissect_options *);
@@ -787,8 +799,8 @@
extern void esp_decodesecret_print(netdissect_options *);
extern int esp_decrypt_buffer_by_ikev2_print(netdissect_options *, int,
- const u_char spii[8],
- const u_char spir[8],
- const u_char *, const u_char *);
+ const u_char spii[8],
+ const u_char spir[8],
+ const u_char *, const u_char *);
#endif /* netdissect_h */
diff -uNr tcpdump-tcpdump-4.99.4/netdissect-stdinc.h tcpdump-for-stellar/netdissect-stdinc.h
--- tcpdump-tcpdump-4.99.4/netdissect-stdinc.h 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/netdissect-stdinc.h 2024-10-30 17:34:05.601498702 +0800
@@ -35,9 +35,9 @@
* various items as needed, to isolate most of netdissect's platform
* differences to this one file.
*/
-
-#ifndef netdissect_stdinc_h
-#define netdissect_stdinc_h
+#pragma once
+// #ifndef netdissect_stdinc_h
+// #define netdissect_stdinc_h
#include "ftmacros.h"
@@ -379,4 +379,4 @@
# define ND_FALL_THROUGH
#endif /* __has_attribute(fallthrough) */
-#endif /* netdissect_stdinc_h */
+// #endif /* netdissect_stdinc_h */
diff -uNr tcpdump-tcpdump-4.99.4/packet_parser.c tcpdump-for-stellar/packet_parser.c
--- tcpdump-tcpdump-4.99.4/packet_parser.c 1970-01-01 08:00:00.000000000 +0800
+++ tcpdump-for-stellar/packet_parser.c 2024-10-30 17:34:06.264498697 +0800
@@ -0,0 +1,980 @@
+#include <string.h>
+#include <stdlib.h>
+#include <netinet/icmp6.h>
+#include <netinet/ip_icmp.h>
+#include <linux/ppp_defs.h>
+
+#include "log_internal.h"
+#include "packet_helper.h"
+#include "packet_internal.h"
+#include "packet_parser.h"
+
+#define PACKET_PARSE_LOG_DEBUG(format, ...) // STELLAR_LOG_DEBUG(__thread_local_logger, "packet parse", format, ##__VA_ARGS__)
+#define PACKET_PARSE_LOG_ERROR(format, ...) STELLAR_LOG_ERROR(__thread_local_logger, "packet parse", format, ##__VA_ARGS__)
+#define PACKET_PARSE_LOG_WARN(format, ...) STELLAR_LOG_WARN(__thread_local_logger, "packet parse", format, ##__VA_ARGS__)
+
+#define PACKET_LOG_DATA_INSUFFICIENCY(pkt, layer) \
+ { \
+ PACKET_PARSE_LOG_WARN("pkt: %p, layer: %s, data insufficiency", \
+ (pkt), layer_proto_to_str(layer)); \
+ }
+
+#define PACKET_LOG_UNSUPPORT_PROTO(pkt, layer, next_proto) \
+ { \
+ PACKET_PARSE_LOG_WARN("pkt: %p, layer: %s, unsupport next proto: %d", \
+ (pkt), layer_proto_to_str(layer), (next_proto)); \
+ }
+
+#define PACKET_LOG_UNSUPPORT_ETHPROTO(pkt, next_proto) \
+ { \
+ PACKET_PARSE_LOG_WARN("pkt: %p, layer: L3, unsupport next proto: %d %s", \
+ (pkt), (next_proto), eth_proto_to_str(next_proto)); \
+ }
+
+#define PACKET_LOG_UNSUPPORT_IPPROTO(pkt, next_proto) \
+ { \
+ PACKET_PARSE_LOG_WARN("pkt: %p, layer: L4, unsupport next proto: %d %s", \
+ (pkt), (next_proto), ip_proto_to_str(next_proto)); \
+ }
+
+/******************************************************************************
+ * Static API
+ ******************************************************************************/
+
+static inline struct layer_private *get_free_layer(struct packet *pkt);
+
+// 数据链路层
+static inline const char *parse_ether(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_pweth(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_ppp(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_l2tpv2_over_udp(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_l2tpv3_over_udp(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_l2tpv3_over_ip(struct packet *pkt, const char *data, uint16_t len);
+
+// 数据链路层 -- 隧道
+static inline const char *parse_vlan(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_pppoe_ses(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_mpls(struct packet *pkt, const char *data, uint16_t len);
+// 网络层
+static inline const char *parse_ipv4(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_ipv6(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_auth(struct packet *pkt, const char *data, uint16_t len);
+// 网络层 -- 隧道
+static inline const char *parse_gre(struct packet *pkt, const char *data, uint16_t len);
+// 传输层
+static inline const char *parse_udp(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_tcp(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_icmp(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_icmp6(struct packet *pkt, const char *data, uint16_t len);
+// 传输层 -- 隧道
+static inline const char *parse_vxlan(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_gtp_u(struct packet *pkt, const char *data, uint16_t len);
+static inline const char *parse_gtp_c(struct packet *pkt, const char *data, uint16_t len);
+// L3/L4
+static inline const char *parse_l3(struct packet *pkt, uint16_t next_proto, const char *data, uint16_t len);
+static inline const char *parse_l4(struct packet *pkt, uint8_t next_proto, const char *data, uint16_t len);
+
+/******************************************************************************
+ * Private API -- Utils
+ ******************************************************************************/
+
+static inline struct layer_private *get_free_layer(struct packet *pkt)
+{
+ if (pkt->layers_used >= pkt->layers_size)
+ {
+ return NULL;
+ }
+
+ return &pkt->layers[pkt->layers_used];
+}
+
+#define SET_LAYER(_pkt, _layer, _proto, _hdr_len, _data, _len, _trim) \
+ { \
+ (_layer)->proto = (_proto); \
+ (_layer)->hdr_offset = (_pkt)->data_len - (_pkt)->trim_len - (_len); \
+ (_layer)->hdr_ptr = (_data); \
+ (_layer)->hdr_len = (_hdr_len); \
+ (_layer)->pld_ptr = (_data) + (_hdr_len); \
+ (_layer)->pld_len = (_len) - (_hdr_len) - (_trim); \
+ (_pkt)->trim_len += (_trim); \
+ (_pkt)->layers_used++; \
+ PACKET_PARSE_LOG_DEBUG("layer[%d/%d]: %s, header: {offset: %d, ptr: %p, len: %d}, payload: {ptr: %p, len: %d}", \
+ (_pkt)->layers_used - 1, (_pkt)->layers_size, layer_proto_to_str((_proto)), \
+ (_layer)->hdr_offset, (_layer)->hdr_ptr, (_layer)->hdr_len, (_layer)->pld_ptr, (_layer)->pld_len); \
+ }
+
+/******************************************************************************
+ * Private API -- Parses
+ ******************************************************************************/
+
+static inline const char *parse_ether(struct packet *pkt, const char *data, uint16_t len)
+{
+ if (unlikely(len < sizeof(struct ethhdr)))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_ETHER);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ uint16_t next_proto = eth_hdr_get_proto((const struct ethhdr *)data);
+ SET_LAYER(pkt, layer, LAYER_PROTO_ETHER, sizeof(struct ethhdr), data, len, 0);
+
+ return parse_l3(pkt, next_proto, layer->pld_ptr, layer->pld_len);
+}
+
+static inline const char *parse_pweth(struct packet *pkt, const char *data, uint16_t len)
+{
+ /*
+ * PW Ethernet Control Word
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |0 0 0 0| Reserved | Sequence Number |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * Reference: https://tools.ietf.org/html/rfc4448
+ */
+ if (unlikely(len < 4))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_PWETH);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_PWETH, 4, data, len, 0);
+
+ return parse_ether(pkt, layer->pld_ptr, layer->pld_len);
+}
+
+static inline int is_ppp_proto(uint16_t proto)
+{
+ // /usr/include/linux/ppp_defs.h.html
+ switch (proto)
+ {
+ case PPP_IP: /* Internet Protocol */
+ case PPP_AT: /* AppleTalk Protocol */
+ case PPP_IPX: /* IPX protocol */
+ case PPP_VJC_COMP: /* VJ compressed TCP */
+ case PPP_VJC_UNCOMP: /* VJ uncompressed TCP */
+ case PPP_MP: /* Multilink protocol */
+ case PPP_IPV6: /* Internet Protocol Version 6 */
+ case PPP_COMPFRAG: /* fragment compressed below bundle */
+ case PPP_COMP: /* compressed packet */
+ case PPP_MPLS_UC: /* Multi Protocol Label Switching - Unicast */
+ case PPP_MPLS_MC: /* Multi Protocol Label Switching - Multicast */
+ case PPP_IPCP: /* IP Control Protocol */
+ case PPP_ATCP: /* AppleTalk Control Protocol */
+ case PPP_IPXCP: /* IPX Control Protocol */
+ case PPP_IPV6CP: /* IPv6 Control Protocol */
+ case PPP_CCPFRAG: /* CCP at link level (below MP bundle) */
+ // case PPP_CCP: /* Compression Control Protocol */ (same as PPP_CCPFRAG)
+ case PPP_MPLSCP: /* MPLS Control Protocol */
+ case PPP_LCP: /* Link Control Protocol */
+ case PPP_PAP: /* Password Authentication Protocol */
+ case PPP_LQR: /* Link Quality Report protocol */
+ case PPP_CHAP: /* Cryptographic Handshake Auth. Protocol */
+ case PPP_CBCP: /* Callback Control Protocol */
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+static inline const char *parse_ppp(struct packet *pkt, const char *data, uint16_t len)
+{
+ /*
+ * https://datatracker.ietf.org/doc/html/rfc1661#section-2
+ * +----------+-------------+---------+
+ * | Protocol | Information | Padding |
+ * | 8/16 bits| * | * |
+ * +----------+-------------+---------+
+ *
+ * https://datatracker.ietf.org/doc/html/rfc1331#section-3.1
+ * +----------+----------+----------+----------+------------
+ * | Flag | Address | Control | Protocol | Information
+ * | 01111110 | 11111111 | 00000011 | 16 bits | *
+ * +----------+----------+----------+----------+------------
+ * ---+----------+----------+-----------------
+ * | FCS | Flag | Inter-frame Fill
+ * | 16 bits | 01111110 | or next Address
+ * ---+----------+----------+-----------------
+ */
+ if (unlikely(len < 4))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_PPP);
+ return data;
+ }
+
+ uint16_t hdr_len = 0;
+ uint16_t next_proto = 0;
+ struct layer_private *layer = NULL;
+
+ // ppp header 1 byte
+ next_proto = *((uint8_t *)data);
+ if (is_ppp_proto(next_proto))
+ {
+ hdr_len = 1;
+ goto success;
+ }
+
+ // ppp header 2 bytes
+ next_proto = ntohs(*((uint16_t *)data));
+ if (is_ppp_proto(next_proto))
+ {
+ hdr_len = 2;
+ goto success;
+ }
+
+ // ppp header 4 bytes
+ next_proto = ntohs(*((uint16_t *)data + 1));
+ hdr_len = 4;
+
+success:
+ layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_PPP, hdr_len, data, len, 0);
+ switch (next_proto)
+ {
+ case PPP_IP:
+ return parse_ipv4(pkt, layer->pld_ptr, layer->pld_len);
+ case PPP_IPV6:
+ return parse_ipv6(pkt, layer->pld_ptr, layer->pld_len);
+ default:
+ PACKET_LOG_UNSUPPORT_PROTO(pkt, LAYER_PROTO_PPP, next_proto);
+ return layer->pld_ptr;
+ }
+}
+
+static inline const char *parse_l2tpv2_over_udp(struct packet *pkt, const char *data, uint16_t len)
+{
+ uint16_t hdr_len = calc_udp_l2tpv2_hdr_len(data, len);
+ if (unlikely(hdr_len == 0 || hdr_len > len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_L2TP);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_L2TP, hdr_len, data, len, 0);
+
+ // control message
+ if (l2tp_hdr_get_type((const struct l2tp_hdr *)data))
+ {
+ return layer->pld_ptr;
+ }
+ // data message
+ else
+ {
+ return parse_ppp(pkt, layer->pld_ptr, layer->pld_len);
+ }
+}
+
+static inline const char *parse_l2tpv3_over_udp(struct packet *pkt, const char *data, uint16_t len)
+{
+ uint16_t hdr_len = calc_udp_l2tpv3_hdr_len(data, len);
+ if (unlikely(hdr_len == 0 || hdr_len > len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_L2TP);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_L2TP, hdr_len, data, len, 0);
+
+ // control message
+ if (l2tp_hdr_get_type((const struct l2tp_hdr *)data))
+ {
+ return layer->pld_ptr;
+ }
+ // data message
+ else
+ {
+ // TOOD
+ return layer->pld_ptr;
+ }
+}
+
+static inline const char *parse_l2tpv3_over_ip(struct packet *pkt, const char *data, uint16_t len)
+{
+ uint16_t hdr_len = calc_ip_l2tpv3_hdr_len(data, len);
+ if (unlikely(hdr_len == 0 || hdr_len > len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_L2TP);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_L2TP, hdr_len, data, len, 0);
+
+ // data message
+ if (ntohl(*((uint32_t *)data)))
+ {
+ // TOOD
+ return layer->pld_ptr;
+ }
+ // control message
+ else
+ {
+ return layer->pld_ptr;
+ }
+}
+
+static inline const char *parse_vlan(struct packet *pkt, const char *data, uint16_t len)
+{
+ if (unlikely(len < sizeof(struct vlan_hdr)))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_VLAN);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ uint16_t next_proto = vlan_hdr_get_ethertype((const struct vlan_hdr *)data);
+ SET_LAYER(pkt, layer, LAYER_PROTO_VLAN, sizeof(struct vlan_hdr), data, len, 0);
+
+ return parse_l3(pkt, next_proto, layer->pld_ptr, layer->pld_len);
+}
+
+static inline const char *parse_pppoe_ses(struct packet *pkt, const char *data, uint16_t len)
+{
+ if (unlikely(len < 6))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_PPPOE);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_PPPOE, 6, data, len, 0);
+
+ return parse_ppp(pkt, layer->pld_ptr, layer->pld_len);
+}
+
+static inline const char *parse_mpls(struct packet *pkt, const char *data, uint16_t len)
+{
+ if (unlikely(len < 4))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_MPLS);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+
+ if (mpls_label_get_bos((const struct mpls_label *)data))
+ {
+ SET_LAYER(pkt, layer, LAYER_PROTO_MPLS, 4, data, len, 0);
+ if (layer->pld_len == 0)
+ {
+ return layer->pld_ptr;
+ }
+ uint8_t next_proto = layer->pld_ptr[0] >> 4;
+ switch (next_proto)
+ {
+ case 0:
+ // the first four digits of the PW Ethernet control word must be "00000", but the first four digits of Ethernet may also be "0000"
+ if (layer->pld_len >= sizeof(struct ethhdr) && is_eth_proto(eth_hdr_get_proto((const struct ethhdr *)layer->pld_ptr)))
+ {
+ return parse_ether(pkt, layer->pld_ptr, layer->pld_len);
+ }
+ else
+ {
+ return parse_pweth(pkt, layer->pld_ptr, layer->pld_len);
+ }
+ case 4:
+ return parse_ipv4(pkt, layer->pld_ptr, layer->pld_len);
+ case 6:
+ return parse_ipv6(pkt, layer->pld_ptr, layer->pld_len);
+ default:
+ return parse_ether(pkt, layer->pld_ptr, layer->pld_len);
+ }
+ }
+ else
+ {
+ SET_LAYER(pkt, layer, LAYER_PROTO_MPLS, 4, data, len, 0);
+ return parse_mpls(pkt, layer->pld_ptr, layer->pld_len);
+ }
+}
+
+static inline const char *parse_ipv4(struct packet *pkt, const char *data, uint16_t len)
+{
+ if (unlikely(len < sizeof(struct ip)))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_IPV4);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+
+ const struct ip *hdr = (const struct ip *)data;
+ uint8_t version = ip4_hdr_get_version(hdr);
+ if (unlikely(version != 4))
+ {
+ PACKET_PARSE_LOG_ERROR("packet %p ipv4 version %d != 4", pkt, version);
+ return data;
+ }
+
+ uint16_t hdr_len = ip4_hdr_get_hdr_len(hdr);
+ if (unlikely(hdr_len > len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_IPV4);
+ return data;
+ }
+
+ uint16_t total_len = ip4_hdr_get_total_len(hdr);
+ if (unlikely(total_len > len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_IPV4);
+ return data;
+ }
+ if (unlikely(total_len < hdr_len))
+ {
+ PACKET_PARSE_LOG_ERROR("packet %p ip total_len %d < hdr_len %d", pkt, total_len, hdr_len);
+ return data;
+ }
+ uint16_t trim_len = len - total_len;
+ SET_LAYER(pkt, layer, LAYER_PROTO_IPV4, hdr_len, data, len, trim_len);
+
+ // ip fragmented
+ if (ip4_hdr_get_mf_flag(hdr) || ip4_hdr_get_frag_offset(hdr))
+ {
+ PACKET_PARSE_LOG_DEBUG("packet %p ip layer %p is fragmented", pkt, layer);
+ pkt->frag_layer = layer;
+ return layer->pld_ptr;
+ }
+
+ uint8_t next_proto = ip4_hdr_get_proto(hdr);
+ return parse_l4(pkt, next_proto, layer->pld_ptr, layer->pld_len);
+}
+
+static inline const char *parse_ipv6(struct packet *pkt, const char *data, uint16_t len)
+{
+ /*
+ * IP6 Extension Headers
+ *
+ * Internet Protocol, Version 6 (IPv6) : https://datatracker.ietf.org/doc/html/rfc2460
+ * IP Encapsulating Security Payload (ESP) : https://datatracker.ietf.org/doc/html/rfc2406
+ * IP Authentication Header : https://datatracker.ietf.org/doc/html/rfc4302
+ *
+ * skip next header
+ * #define IPPROTO_HOPOPTS 0 // IP6 hop-by-hop options
+ * #define IPPROTO_ROUTING 43 // IP6 routing header
+ * #define IPPROTO_AH 51 // IP6 Auth Header
+ * #define IPPROTO_DSTOPTS 60 // IP6 destination option
+ *
+ * not skip next header
+ * #define IPPROTO_FRAGMENT 44 // IP6 fragmentation header
+ * #define IPPROTO_ESP 50 // IP6 Encap Sec. Payload
+ * #define IPPROTO_NONE 59 // IP6 no next header
+ */
+
+ if (unlikely(len < sizeof(struct ip6_hdr)))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_IPV6);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ const struct ip6_hdr *hdr = (const struct ip6_hdr *)data;
+ uint8_t version = ip6_hdr_get_version(hdr);
+ if (unlikely(version != 6))
+ {
+ PACKET_PARSE_LOG_ERROR("packet %p ipv6 version %d != 6", pkt, version);
+ return data;
+ }
+
+ uint16_t pld_len = ip6_hdr_get_payload_len(hdr);
+ if (unlikely(pld_len + sizeof(struct ip6_hdr) > len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_IPV6);
+ return data;
+ }
+ uint8_t next_proto = ip6_hdr_get_next_header(hdr);
+ uint16_t hdr_len = sizeof(struct ip6_hdr);
+ uint16_t trim_len = len - pld_len - sizeof(struct ip6_hdr);
+ const char *next_hdr_ptr = data + hdr_len;
+ while (next_proto == IPPROTO_HOPOPTS || next_proto == IPPROTO_ROUTING || next_proto == IPPROTO_AH || next_proto == IPPROTO_DSTOPTS)
+ {
+ if (unlikely(pld_len < 2))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_IPV6);
+ return data;
+ }
+ struct ip6_ext *ext = (struct ip6_ext *)next_hdr_ptr;
+ uint16_t skip_len = 0;
+ if (next_proto == IPPROTO_AH)
+ {
+ /*
+ * https://datatracker.ietf.org/doc/html/rfc4302#section-2
+ * For IPv6, the total length of the header must be a multiple of 8-octet units.
+ * (Note that although IPv6 [DH98] characterizes AH as an extension header,
+ * its length is measured in 32-bit words, not the 64-bit words used by other IPv6 extension headers.)
+ */
+ skip_len = ext->ip6e_len * 4 + 8;
+ }
+ else
+ {
+ skip_len = ext->ip6e_len * 8 + 8;
+ }
+ if (unlikely(skip_len > pld_len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_IPV6);
+ return data;
+ }
+ hdr_len += skip_len;
+ pld_len -= skip_len;
+ next_hdr_ptr += skip_len;
+ next_proto = ext->ip6e_nxt;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_IPV6, hdr_len, data, len, trim_len);
+
+ // ipv6 fragment
+ if (next_proto == IPPROTO_FRAGMENT)
+ {
+ PACKET_PARSE_LOG_DEBUG("packet %p ipv6 layer %p is fragmented", pkt, layer);
+ pkt->frag_layer = layer;
+ return layer->pld_ptr;
+ }
+
+ return parse_l4(pkt, next_proto, layer->pld_ptr, layer->pld_len);
+}
+
+static inline const char *parse_auth(struct packet *pkt, const char *data, uint16_t len)
+{
+ /*
+ * https://datatracker.ietf.org/doc/html/rfc4302#section-2
+ * For IPv4: AH not IPv4 option, as an single layer
+ * For IPv6: AH as IPv6 extension header
+ *
+ * AH Format
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Next Header | Payload Len | RESERVED |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Security Parameters Index (SPI) |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Sequence Number Field |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | |
+ * + Integrity Check Value-ICV (variable) |
+ * | |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+ if (unlikely(len < 12))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_IPAH);
+ return data;
+ }
+ /*
+ * https://datatracker.ietf.org/doc/html/rfc4302#section-2
+ * For IPv4, This 8-bit field specifies the length of AH in 32-bit words (4-byte units), minus "2".
+ * Thus, for example, if an integrity algorithm yields a 96-bit authentication value,
+ * this length field will be "4" (3 32-bit word fixed fields plus 3 32-bit words for the ICV, minus 2).
+ */
+ uint8_t next_proto = ((const uint8_t *)data)[0];
+ uint16_t hdr_len = ((const uint8_t *)data)[1] * 4 + 8;
+ if (unlikely(len < hdr_len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_IPAH);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_IPAH, hdr_len, data, len, 0);
+
+ return parse_l4(pkt, next_proto, layer->pld_ptr, layer->pld_len);
+}
+
+static inline const char *parse_gre(struct packet *pkt, const char *data, uint16_t len)
+{
+ uint16_t hdr_len = calc_gre_hdr_len(data, len);
+ if (unlikely(hdr_len == 0 || hdr_len > len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_GRE);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ uint16_t next_proto = peek_gre_proto(data, len);
+ SET_LAYER(pkt, layer, LAYER_PROTO_GRE, hdr_len, data, len, 0);
+
+ return parse_l3(pkt, next_proto, layer->pld_ptr, layer->pld_len);
+}
+
+static inline const char *parse_udp(struct packet *pkt, const char *data, uint16_t len)
+{
+ if (unlikely(len < sizeof(struct udphdr)))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_UDP);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ const struct udphdr *udp_hdr = (struct udphdr *)data;
+ SET_LAYER(pkt, layer, LAYER_PROTO_UDP, sizeof(struct udphdr), data, len, 0);
+
+ uint16_t src_port = udp_hdr_get_src_port(udp_hdr);
+ uint16_t dst_port = udp_hdr_get_dst_port(udp_hdr);
+
+ if (dst_port == 4789)
+ {
+ // VXLAN_DPORT 4789
+ return parse_vxlan(pkt, layer->pld_ptr, layer->pld_len);
+ }
+
+ if (dst_port == 2152 || src_port == 2152)
+ {
+ // only GTPv1-U, no GTPv2-U
+ return parse_gtp_u(pkt, layer->pld_ptr, layer->pld_len);
+ }
+
+ if (dst_port == 2123 || src_port == 2123)
+ {
+ // GTPv1-C or GTPv2-C
+ return parse_gtp_c(pkt, layer->pld_ptr, layer->pld_len);
+ }
+
+ if (dst_port == 1701 || src_port == 1701)
+ {
+ // L2TP_DPORT 1701
+ if (unlikely(layer->pld_len < 8))
+ {
+ return layer->pld_ptr;
+ }
+
+ switch (l2tp_hdr_get_ver((const struct l2tp_hdr *)layer->pld_ptr))
+ {
+ case 2:
+ return parse_l2tpv2_over_udp(pkt, layer->pld_ptr, layer->pld_len);
+ case 3:
+ return parse_l2tpv3_over_udp(pkt, layer->pld_ptr, layer->pld_len);
+ default:
+ return layer->pld_ptr;
+ }
+ }
+
+ if (dst_port == 3544 || src_port == 3544)
+ {
+ // Teredo IPv6 tunneling 3544
+ if (unlikely(layer->pld_len < sizeof(struct ip6_hdr)))
+ {
+ return layer->pld_ptr;
+ }
+ const struct ip6_hdr *ipv6_hdr = (const struct ip6_hdr *)layer->pld_ptr;
+ if (ip6_hdr_get_version(ipv6_hdr) != 6)
+ {
+ return layer->pld_ptr;
+ }
+ return parse_ipv6(pkt, layer->pld_ptr, layer->pld_len);
+ }
+
+ return layer->pld_ptr;
+}
+
+static inline const char *parse_tcp(struct packet *pkt, const char *data, uint16_t len)
+{
+ if (unlikely(len < sizeof(struct tcphdr)))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_TCP);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ uint16_t hdr_len = tcp_hdr_get_hdr_len((const struct tcphdr *)data);
+ if (unlikely(hdr_len > len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_TCP);
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_TCP, hdr_len, data, len, 0);
+
+ return layer->pld_ptr;
+}
+
+static inline const char *parse_icmp(struct packet *pkt, const char *data, uint16_t len)
+{
+ if (unlikely(len < sizeof(struct icmphdr)))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_ICMP);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_ICMP, sizeof(struct icmphdr), data, len, 0);
+
+ return layer->pld_ptr;
+}
+
+static inline const char *parse_icmp6(struct packet *pkt, const char *data, uint16_t len)
+{
+ if (unlikely(len < sizeof(struct icmp6_hdr)))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_ICMP6);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_ICMP6, sizeof(struct icmp6_hdr), data, len, 0);
+
+ return layer->pld_ptr;
+}
+
+static inline const char *parse_vxlan(struct packet *pkt, const char *data, uint16_t len)
+{
+ if (unlikely(len < sizeof(struct vxlan_hdr)))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_VXLAN);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_VXLAN, sizeof(struct vxlan_hdr), data, len, 0);
+
+ return parse_ether(pkt, layer->pld_ptr, layer->pld_len);
+}
+
+static inline const char *parse_gtp_u(struct packet *pkt, const char *data, uint16_t len)
+{
+ // only GTPv1-U, no GTPv2-U
+ uint8_t version = peek_gtp_version(data, len);
+ if (unlikely(version != 1))
+ {
+ return data;
+ }
+
+ uint16_t hdr_len = calc_gtp_hdr_len(data, len);
+ if (unlikely(hdr_len == 0 || hdr_len > len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_GTP_U);
+ return data;
+ }
+
+ uint8_t next_proto = (((const uint8_t *)(data + hdr_len))[0]) >> 4;
+ if (next_proto != 4 && next_proto != 6)
+ {
+ // next_proto is not IPv4 or IPv6, this is not a normal GTP-U packet, fallback to UDP
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_GTP_U, hdr_len, data, len, 0);
+
+ switch (next_proto)
+ {
+ case 4:
+ return parse_ipv4(pkt, layer->pld_ptr, layer->pld_len);
+ case 6:
+ return parse_ipv6(pkt, layer->pld_ptr, layer->pld_len);
+ default:
+ PACKET_LOG_UNSUPPORT_PROTO(pkt, LAYER_PROTO_GTP_U, next_proto);
+ return layer->pld_ptr;
+ }
+}
+
+static inline const char *parse_gtp_c(struct packet *pkt, const char *data, uint16_t len)
+{
+ // GTPv1-C or GTPv2-C
+ uint16_t hdr_len = calc_gtp_hdr_len(data, len);
+ if (unlikely(hdr_len == 0 || hdr_len > len))
+ {
+ PACKET_LOG_DATA_INSUFFICIENCY(pkt, LAYER_PROTO_GTP_C);
+ return data;
+ }
+
+ struct layer_private *layer = get_free_layer(pkt);
+ if (unlikely(layer == NULL))
+ {
+ return data;
+ }
+ SET_LAYER(pkt, layer, LAYER_PROTO_GTP_C, hdr_len, data, len, 0);
+
+ return layer->pld_ptr;
+}
+
+static inline const char *parse_l3(struct packet *pkt, uint16_t next_proto, const char *data, uint16_t len)
+{
+ switch (next_proto)
+ {
+ case ETH_P_8021Q:
+ case ETH_P_8021AD:
+ return parse_vlan(pkt, data, len);
+ case ETH_P_IP:
+ return parse_ipv4(pkt, data, len);
+ case ETH_P_IPV6:
+ return parse_ipv6(pkt, data, len);
+ case ETH_P_PPP_SES:
+ return parse_pppoe_ses(pkt, data, len);
+ case ETH_P_MPLS_UC:
+ return parse_mpls(pkt, data, len);
+ case 0x880b:
+ return parse_ppp(pkt, data, len);
+ default:
+ PACKET_LOG_UNSUPPORT_ETHPROTO(pkt, next_proto);
+ return data;
+ }
+}
+
+static inline const char *parse_l4(struct packet *pkt, uint8_t next_proto, const char *data, uint16_t len)
+{
+ switch (next_proto)
+ {
+ case IPPROTO_AH:
+ return parse_auth(pkt, data, len);
+ case IPPROTO_TCP:
+ return parse_tcp(pkt, data, len);
+ case IPPROTO_UDP:
+ return parse_udp(pkt, data, len);
+ case IPPROTO_IPIP:
+ return parse_ipv4(pkt, data, len);
+ case IPPROTO_IPV6:
+ return parse_ipv6(pkt, data, len);
+ case IPPROTO_GRE:
+ return parse_gre(pkt, data, len);
+ case IPPROTO_ICMP:
+ return parse_icmp(pkt, data, len);
+ case IPPROTO_ICMPV6:
+ return parse_icmp6(pkt, data, len);
+ case 115:
+ // L2TP
+ return parse_l2tpv3_over_ip(pkt, data, len);
+ default:
+ PACKET_LOG_UNSUPPORT_IPPROTO(pkt, next_proto);
+ return data;
+ }
+}
+
+/******************************************************************************
+ * Public API
+ ******************************************************************************/
+
+// return innermost payload
+const char *packet_parse(struct packet *pkt, const char *data, uint16_t len)
+{
+ pkt->frag_layer = NULL;
+ pkt->layers_used = 0;
+ pkt->layers_size = PACKET_MAX_LAYERS;
+ pkt->data_ptr = data;
+ pkt->data_len = len;
+ pkt->trim_len = 0;
+
+ return parse_ether(pkt, data, len);
+}
+
+const char *layer_proto_to_str(enum layer_proto proto)
+{
+ switch (proto)
+ {
+ case LAYER_PROTO_ETHER:
+ return "ETH";
+ case LAYER_PROTO_PWETH:
+ return "PWETH";
+ case LAYER_PROTO_PPP:
+ return "PPP";
+ case LAYER_PROTO_L2TP:
+ return "L2TP";
+ case LAYER_PROTO_VLAN:
+ return "VLAN";
+ case LAYER_PROTO_PPPOE:
+ return "PPPOE";
+ case LAYER_PROTO_MPLS:
+ return "MPLS";
+ case LAYER_PROTO_IPV4:
+ return "IPV4";
+ case LAYER_PROTO_IPV6:
+ return "IPV6";
+ case LAYER_PROTO_IPAH:
+ return "IPAH";
+ case LAYER_PROTO_GRE:
+ return "GRE";
+ case LAYER_PROTO_UDP:
+ return "UDP";
+ case LAYER_PROTO_TCP:
+ return "TCP";
+ case LAYER_PROTO_ICMP:
+ return "ICMP";
+ case LAYER_PROTO_ICMP6:
+ return "ICMP6";
+ case LAYER_PROTO_VXLAN:
+ return "VXLAN";
+ case LAYER_PROTO_GTP_C:
+ return "GTP-C";
+ case LAYER_PROTO_GTP_U:
+ return "GTP-U";
+ default:
+ return "UNKNOWN";
+ }
+}
\ No newline at end of file
diff -uNr tcpdump-tcpdump-4.99.4/packet_utils.c tcpdump-for-stellar/packet_utils.c
--- tcpdump-tcpdump-4.99.4/packet_utils.c 1970-01-01 08:00:00.000000000 +0800
+++ tcpdump-for-stellar/packet_utils.c 2024-10-30 17:34:06.265498697 +0800
@@ -0,0 +1,966 @@
+#include <assert.h>
+
+#include "tuple.h"
+#include "uthash.h"
+#include "log_internal.h"
+#include "packet_helper.h"
+#include "packet_internal.h"
+#include "stellar/exdata.h"
+
+#define PACKET_LOG_ERROR(format, ...) STELLAR_LOG_ERROR(__thread_local_logger, "packet", format, ##__VA_ARGS__)
+
+/******************************************************************************
+ * metadata utils
+ ******************************************************************************/
+
+void packet_set_route_ctx(struct packet *pkt, const struct route_ctx *ctx)
+{
+ pkt->meta.route_ctx = *ctx;
+}
+
+const struct route_ctx *packet_get_route_ctx(const struct packet *pkt)
+{
+ return &pkt->meta.route_ctx;
+}
+
+void packet_set_origin_ctx(struct packet *pkt, void *ctx)
+{
+ pkt->meta.origin_ctx = ctx;
+}
+
+const void *packet_get_origin_ctx(const struct packet *pkt)
+{
+ return pkt->meta.origin_ctx;
+}
+
+void packet_set_sids(struct packet *pkt, const struct sids *sids)
+{
+ pkt->meta.sids = *sids;
+}
+
+const struct sids *packet_get_sids(const struct packet *pkt)
+{
+ return &pkt->meta.sids;
+}
+
+void packet_prepend_sids(struct packet *pkt, const struct sids *sids)
+{
+ if (pkt->meta.sids.used + sids->used > MAX_SIDS)
+ {
+ PACKET_LOG_ERROR("sids overflow");
+ return;
+ }
+ else
+ {
+ for (int i = pkt->meta.sids.used - 1; i >= 0; i--)
+ {
+ pkt->meta.sids.sid[i + sids->used] = pkt->meta.sids.sid[i];
+ }
+ for (int i = 0; i < sids->used; i++)
+ {
+ pkt->meta.sids.sid[i] = sids->sid[i];
+ }
+ pkt->meta.sids.used += sids->used;
+ }
+}
+
+void packet_set_session_id(struct packet *pkt, uint64_t id)
+{
+ pkt->meta.session_id = id;
+}
+
+uint64_t packet_get_session_id(const struct packet *pkt)
+{
+ return pkt->meta.session_id;
+}
+
+void packet_set_domain(struct packet *pkt, uint64_t domain)
+{
+ pkt->meta.domain = domain;
+}
+
+uint64_t packet_get_domain(const struct packet *pkt)
+{
+ return pkt->meta.domain;
+}
+
+void packet_set_link_id(struct packet *pkt, uint16_t id)
+{
+ pkt->meta.link_id = id;
+}
+
+uint16_t packet_get_link_id(const struct packet *pkt)
+{
+ return pkt->meta.link_id;
+}
+
+void packet_set_ctrl(struct packet *pkt, bool ctrl)
+{
+ pkt->meta.is_ctrl = ctrl;
+}
+
+bool packet_is_ctrl(const struct packet *pkt)
+{
+ return pkt->meta.is_ctrl;
+}
+
+void packet_set_claim(struct packet *pkt, bool claim)
+{
+ pkt->meta.is_claim = claim;
+}
+
+bool packet_is_claim(const struct packet *pkt)
+{
+ return pkt->meta.is_claim;
+}
+
+void packet_set_direction(struct packet *pkt, enum packet_direction dir)
+{
+ pkt->meta.direction = dir;
+}
+
+enum packet_direction packet_get_direction(const struct packet *pkt)
+{
+ return pkt->meta.direction;
+}
+
+void packet_set_action(struct packet *pkt, enum packet_action action)
+{
+ pkt->meta.action = action;
+}
+
+enum packet_action packet_get_action(const struct packet *pkt)
+{
+ return pkt->meta.action;
+}
+
+void packet_set_timeval(struct packet *pkt, const struct timeval *tv)
+{
+ pkt->meta.tv = *tv;
+}
+
+const struct timeval *packet_get_timeval(const struct packet *pkt)
+{
+ return &pkt->meta.tv;
+}
+
+void packet_set_user_data(struct packet *pkt, void *data)
+{
+ pkt->user_data = data;
+}
+
+void *packet_get_user_data(struct packet *pkt)
+{
+ return pkt->user_data;
+}
+
+/******************************************************************************
+ * tuple uitls
+ ******************************************************************************/
+
+// return 0 : found
+// return -1 : not found
+int packet_get_innermost_tuple2(const struct packet *pkt, struct tuple2 *tuple)
+{
+ memset(tuple, 0, sizeof(struct tuple2));
+ const struct layer_private *layer = NULL;
+
+ for (int8_t i = pkt->layers_used - 1; i >= 0; i--)
+ {
+ layer = &pkt->layers[i];
+
+ if (layer->proto == LAYER_PROTO_IPV4)
+ {
+ const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET;
+ tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
+ tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
+ return 0;
+ }
+ if (layer->proto == LAYER_PROTO_IPV6)
+ {
+ const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET6;
+ tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
+ tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+// return 0 : found
+// return -1 : not found
+int packet_get_outermost_tuple2(const struct packet *pkt, struct tuple2 *tuple)
+{
+ memset(tuple, 0, sizeof(struct tuple2));
+ const struct layer_private *layer = NULL;
+
+ for (int8_t i = 0; i < pkt->layers_used; i++)
+ {
+ layer = &pkt->layers[i];
+
+ if (layer->proto == LAYER_PROTO_IPV4)
+ {
+ const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET;
+ tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
+ tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
+ return 0;
+ }
+ if (layer->proto == LAYER_PROTO_IPV6)
+ {
+ const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET6;
+ tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
+ tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+// return 0 : found
+// return -1 : not found
+int packet_get_innermost_tuple4(const struct packet *pkt, struct tuple4 *tuple)
+{
+ memset(tuple, 0, sizeof(struct tuple4));
+ const struct layer_private *layer_l3 = NULL;
+ const struct layer_private *layer_l4 = NULL;
+ const struct layer_private *layer = NULL;
+
+ for (int8_t i = pkt->layers_used - 1; i >= 0; i--)
+ {
+ layer = &pkt->layers[i];
+
+ // first get L4 layer
+ if (layer->proto == LAYER_PROTO_UDP)
+ {
+ const struct udphdr *udp_hdr = (const struct udphdr *)layer->hdr_ptr;
+ tuple->src_port = udp_hdr->uh_sport;
+ tuple->dst_port = udp_hdr->uh_dport;
+ layer_l4 = layer;
+ continue;
+ }
+ if (layer->proto == LAYER_PROTO_TCP)
+ {
+ const struct tcphdr *tcp_hdr = (const struct tcphdr *)layer->hdr_ptr;
+ tuple->src_port = tcp_hdr->th_sport;
+ tuple->dst_port = tcp_hdr->th_dport;
+ layer_l4 = layer;
+ continue;
+ }
+
+ // second get L3 layer
+ if (layer->proto == LAYER_PROTO_IPV4)
+ {
+ const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET;
+ tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
+ tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
+ layer_l3 = layer;
+ break;
+ }
+ if (layer->proto == LAYER_PROTO_IPV6)
+ {
+ const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET6;
+ tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
+ tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
+ layer_l3 = layer;
+ break;
+ }
+ }
+
+ if (layer_l3 && layer_l4 && layer_l4 - layer_l3 == 1)
+ {
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+// return 0 : found
+// return -1 : not found
+int packet_get_outermost_tuple4(const struct packet *pkt, struct tuple4 *tuple)
+{
+ memset(tuple, 0, sizeof(struct tuple4));
+ const struct layer_private *layer_l3 = NULL;
+ const struct layer_private *layer_l4 = NULL;
+ const struct layer_private *layer = NULL;
+
+ for (int8_t i = 0; i < pkt->layers_used; i++)
+ {
+ layer = &pkt->layers[i];
+
+ // first get L3 layer
+ if (layer->proto == LAYER_PROTO_IPV4)
+ {
+ const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET;
+ tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
+ tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
+ layer_l3 = layer;
+ continue;
+ }
+ if (layer->proto == LAYER_PROTO_IPV6)
+ {
+ const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET6;
+ tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
+ tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
+ layer_l3 = layer;
+ continue;
+ }
+
+ // second get L4 layer
+ if (layer->proto == LAYER_PROTO_UDP)
+ {
+ const struct udphdr *udp_hdr = (const struct udphdr *)layer->hdr_ptr;
+ tuple->src_port = udp_hdr->uh_sport;
+ tuple->dst_port = udp_hdr->uh_dport;
+ layer_l4 = layer;
+ break;
+ }
+ if (layer->proto == LAYER_PROTO_TCP)
+ {
+ const struct tcphdr *tcp_hdr = (const struct tcphdr *)layer->hdr_ptr;
+ tuple->src_port = tcp_hdr->th_sport;
+ tuple->dst_port = tcp_hdr->th_dport;
+ layer_l4 = layer;
+ break;
+ }
+ }
+
+ if (layer_l3 && layer_l4 && layer_l4 - layer_l3 == 1)
+ {
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+// return 0 : found
+// return -1 : not found
+int packet_get_innermost_tuple6(const struct packet *pkt, struct tuple6 *tuple)
+{
+ memset(tuple, 0, sizeof(struct tuple6));
+ const struct layer_private *layer_l3 = NULL;
+ const struct layer_private *layer_l4 = NULL;
+ const struct layer_private *layer = NULL;
+
+ for (int8_t i = pkt->layers_used - 1; i >= 0; i--)
+ {
+ layer = &pkt->layers[i];
+
+ // first get L4 layer
+ if (layer->proto == LAYER_PROTO_UDP)
+ {
+ const struct udphdr *udp_hdr = (const struct udphdr *)layer->hdr_ptr;
+ tuple->ip_proto = IPPROTO_UDP;
+ tuple->src_port = udp_hdr->uh_sport;
+ tuple->dst_port = udp_hdr->uh_dport;
+ layer_l4 = layer;
+ continue;
+ }
+ if (layer->proto == LAYER_PROTO_TCP)
+ {
+ const struct tcphdr *tcp_hdr = (const struct tcphdr *)layer->hdr_ptr;
+ tuple->ip_proto = IPPROTO_TCP;
+ tuple->src_port = tcp_hdr->th_sport;
+ tuple->dst_port = tcp_hdr->th_dport;
+ layer_l4 = layer;
+ continue;
+ }
+
+ // second get L3 layer
+ if (layer->proto == LAYER_PROTO_IPV4)
+ {
+ const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET;
+ tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
+ tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
+ layer_l3 = layer;
+ break;
+ }
+ if (layer->proto == LAYER_PROTO_IPV6)
+ {
+ const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET6;
+ tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
+ tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
+ layer_l3 = layer;
+ break;
+ }
+ }
+
+ if (layer_l3 && layer_l4 && layer_l4 - layer_l3 == 1)
+ {
+ tuple->domain = packet_get_domain(pkt);
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+// return 0 : found
+// return -1 : not found
+int packet_get_outermost_tuple6(const struct packet *pkt, struct tuple6 *tuple)
+{
+ memset(tuple, 0, sizeof(struct tuple6));
+ const struct layer_private *layer_l3 = NULL;
+ const struct layer_private *layer_l4 = NULL;
+ const struct layer_private *layer = NULL;
+
+ for (int8_t i = 0; i < pkt->layers_used; i++)
+ {
+ layer = &pkt->layers[i];
+
+ // first get L3 layer
+ if (layer->proto == LAYER_PROTO_IPV4)
+ {
+ const struct ip *ip4_hdr = (const struct ip *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET;
+ tuple->src_addr.v4 = ip4_hdr_get_src_in_addr(ip4_hdr);
+ tuple->dst_addr.v4 = ip4_hdr_get_dst_in_addr(ip4_hdr);
+ layer_l3 = layer;
+ continue;
+ }
+ if (layer->proto == LAYER_PROTO_IPV6)
+ {
+ const struct ip6_hdr *ip6_hdr = (const struct ip6_hdr *)layer->hdr_ptr;
+ tuple->addr_family = AF_INET6;
+ tuple->src_addr.v6 = ip6_hdr_get_src_in6_addr(ip6_hdr);
+ tuple->dst_addr.v6 = ip6_hdr_get_dst_in6_addr(ip6_hdr);
+ layer_l3 = layer;
+ continue;
+ }
+
+ // second get L4 layer
+ if (layer->proto == LAYER_PROTO_UDP)
+ {
+ const struct udphdr *udp_hdr = (const struct udphdr *)layer->hdr_ptr;
+ tuple->ip_proto = IPPROTO_UDP;
+ tuple->src_port = udp_hdr->uh_sport;
+ tuple->dst_port = udp_hdr->uh_dport;
+ layer_l4 = layer;
+ break;
+ }
+ if (layer->proto == LAYER_PROTO_TCP)
+ {
+ const struct tcphdr *tcp_hdr = (const struct tcphdr *)layer->hdr_ptr;
+ tuple->ip_proto = IPPROTO_TCP;
+ tuple->src_port = tcp_hdr->th_sport;
+ tuple->dst_port = tcp_hdr->th_dport;
+ layer_l4 = layer;
+ break;
+ }
+ }
+
+ if (layer_l3 && layer_l4 && layer_l4 - layer_l3 == 1)
+ {
+ tuple->domain = packet_get_domain(pkt);
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+/******************************************************************************
+ * layer uitls
+ ******************************************************************************/
+
+int packet_get_layer_count(const struct packet *pkt)
+{
+ return pkt->layers_used;
+}
+
+const struct layer *packet_get_layer_by_idx(const struct packet *pkt, int idx)
+{
+ const struct layer_private *layer = packet_get_layer(pkt, idx);
+ if (layer == NULL)
+ {
+ return NULL;
+ }
+ else
+ {
+ return (const struct layer *)layer;
+ }
+}
+
+const struct layer_private *packet_get_layer(const struct packet *pkt, int idx)
+{
+ if (idx < 0 || idx >= pkt->layers_used)
+ {
+ return NULL;
+ }
+ return &pkt->layers[idx];
+}
+
+const struct layer_private *packet_get_innermost_layer(const struct packet *pkt, enum layer_proto proto)
+{
+ const struct layer_private *layer = NULL;
+
+ for (int8_t i = pkt->layers_used - 1; i >= 0; i--)
+ {
+ layer = &pkt->layers[i];
+ if (layer->proto == proto)
+ {
+ return layer;
+ }
+ }
+
+ return NULL;
+}
+
+const struct layer_private *packet_get_outermost_layer(const struct packet *pkt, enum layer_proto proto)
+{
+ const struct layer_private *layer = NULL;
+
+ for (int8_t i = 0; i < pkt->layers_used; i++)
+ {
+ layer = &pkt->layers[i];
+ if (layer->proto == proto)
+ {
+ return layer;
+ }
+ }
+
+ return NULL;
+}
+
+/******************************************************************************
+ * tunnel uitls
+ ******************************************************************************/
+
+struct tunnel_detector
+{
+ enum tunnel_type type;
+ int contain_layers;
+ int (*identify_func)(const struct layer_private *curr, const struct layer_private *next1, const struct layer_private *next2);
+};
+
+static int is_ipv4_tunnel(const struct layer_private *curr, const struct layer_private *next1, const struct layer_private *next2 __attribute__((unused)))
+{
+ if (curr && curr->proto == LAYER_PROTO_IPV4 &&
+ next1 && (next1->proto == LAYER_PROTO_IPV4 || next1->proto == LAYER_PROTO_IPV6))
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+static int is_ipv6_tunnel(const struct layer_private *curr, const struct layer_private *next1, const struct layer_private *next2 __attribute__((unused)))
+{
+ if (curr && curr->proto == LAYER_PROTO_IPV6 &&
+ next1 && (next1->proto == LAYER_PROTO_IPV4 || next1->proto == LAYER_PROTO_IPV6))
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+static int is_gre_tunnel(const struct layer_private *curr, const struct layer_private *next1, const struct layer_private *next2 __attribute__((unused)))
+{
+ if (curr && (curr->proto == LAYER_PROTO_IPV4 || curr->proto == LAYER_PROTO_IPV6) &&
+ next1 && next1->proto == LAYER_PROTO_GRE)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+static int is_gtp_tunnel(const struct layer_private *curr, const struct layer_private *next1, const struct layer_private *next2)
+{
+ if (curr && (curr->proto == LAYER_PROTO_IPV4 || curr->proto == LAYER_PROTO_IPV6) &&
+ next1 && next1->proto == LAYER_PROTO_UDP &&
+ next2 && next2->proto == LAYER_PROTO_GTP_U)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+static int is_vxlan_tunnel(const struct layer_private *curr, const struct layer_private *next1, const struct layer_private *next2)
+{
+ if (curr && (curr->proto == LAYER_PROTO_IPV4 || curr->proto == LAYER_PROTO_IPV6) &&
+ next1 && next1->proto == LAYER_PROTO_UDP &&
+ next2 && next2->proto == LAYER_PROTO_VXLAN)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+static int is_l2tp_tunnel(const struct layer_private *curr, const struct layer_private *next1, const struct layer_private *next2)
+{
+ if (curr && (curr->proto == LAYER_PROTO_IPV4 || curr->proto == LAYER_PROTO_IPV6) &&
+ next1 && next1->proto == LAYER_PROTO_UDP &&
+ next2 && next2->proto == LAYER_PROTO_L2TP)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+static int is_teredo_tunnel(const struct layer_private *curr, const struct layer_private *next1, const struct layer_private *next2)
+{
+ if (curr && curr->proto == LAYER_PROTO_IPV4 &&
+ next1 && next1->proto == LAYER_PROTO_UDP &&
+ next2 && next2->proto == LAYER_PROTO_IPV6)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+static struct tunnel_detector detectors[] = {
+ {TUNNEL_IPV4, 1, is_ipv4_tunnel},
+ {TUNNEL_IPV6, 1, is_ipv6_tunnel},
+ {TUNNEL_GRE, 2, is_gre_tunnel},
+ {TUNNEL_GTP, 3, is_gtp_tunnel},
+ {TUNNEL_VXLAN, 3, is_vxlan_tunnel},
+ {TUNNEL_L2TP, 3, is_l2tp_tunnel},
+ {TUNNEL_TEREDO, 2, is_teredo_tunnel},
+};
+
+// return index of detectors
+static int detect_tunnel(const struct layer_private *curr, const struct layer_private *next1, const struct layer_private *next2)
+{
+ for (int i = 0; i < (int)(sizeof(detectors) / sizeof(detectors[0])); i++)
+ {
+ if (detectors[i].identify_func(curr, next1, next2))
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+int packet_get_tunnel_count(const struct packet *pkt)
+{
+ int count = 0;
+ int used = packet_get_layer_count(pkt);
+ const struct layer_private *curr = NULL;
+ const struct layer_private *next1 = NULL;
+ const struct layer_private *next2 = NULL;
+
+ for (int i = 0; i < used; i++)
+ {
+ curr = packet_get_layer(pkt, i);
+ next1 = packet_get_layer(pkt, i + 1);
+ next2 = packet_get_layer(pkt, i + 2);
+ if (detect_tunnel(curr, next1, next2) >= 0)
+ {
+ count++;
+ }
+ }
+
+ return count;
+}
+
+// return 0: success 
+// return -1: failed
+int packet_get_tunnel_by_idx(const struct packet *pkt, int idx, struct tunnel *out)
+{
+ int ret = -1;
+ int count = 0;
+ int used = packet_get_layer_count(pkt);
+ const struct layer_private *curr = NULL;
+ const struct layer_private *next1 = NULL;
+ const struct layer_private *next2 = NULL;
+ memset(out, 0, sizeof(struct tunnel));
+
+ for (int i = 0; i < used; i++)
+ {
+ curr = packet_get_layer(pkt, i);
+ next1 = packet_get_layer(pkt, i + 1);
+ next2 = packet_get_layer(pkt, i + 2);
+ ret = detect_tunnel(curr, next1, next2);
+ if (ret >= 0 && count++ == idx)
+ {
+ struct tunnel_detector *hit = &detectors[ret];
+ out->type = hit->type;
+ out->layer_count = hit->contain_layers;
+ if (out->layer_count >= 1)
+ out->layers[0] = (const struct layer *)curr;
+ if (out->layer_count >= 2)
+ out->layers[1] = (const struct layer *)next1;
+ if (out->layer_count >= 3)
+ out->layers[2] = (const struct layer *)next2;
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+/******************************************************************************
+ * load balance uitls
+ ******************************************************************************/
+
+uint64_t packet_ldbc_hash(const struct packet *pkt, enum packet_load_balance_method method, enum packet_direction direction)
+{
+ uint64_t temp = 0;
+ uint64_t hash_value = 1;
+
+ int inner_addr_len = 0;
+ int outer_addr_len = 0;
+ const char *inner_src_addr = NULL;
+ const char *inner_dst_addr = NULL;
+ const char *outer_src_addr = NULL;
+ const char *outer_dst_addr = NULL;
+
+ struct tuple2 inner_addr;
+ struct tuple2 outer_addr;
+
+ if (pkt == NULL)
+ {
+ return hash_value;
+ }
+
+ if (packet_get_innermost_tuple2(pkt, &inner_addr) == -1)
+ {
+ return hash_value;
+ }
+
+ if (packet_get_outermost_tuple2(pkt, &outer_addr) == -1)
+ {
+ return hash_value;
+ }
+
+ if (inner_addr.addr_family == AF_INET)
+ {
+ inner_src_addr = (const char *)&inner_addr.src_addr.v4;
+ inner_dst_addr = (const char *)&inner_addr.dst_addr.v4;
+ inner_addr_len = sizeof(struct in_addr);
+ }
+ else
+ {
+ inner_src_addr = (const char *)&inner_addr.src_addr.v6;
+ inner_dst_addr = (const char *)&inner_addr.dst_addr.v6;
+ inner_addr_len = sizeof(struct in6_addr);
+ }
+
+ if (outer_addr.addr_family == AF_INET)
+ {
+ outer_src_addr = (const char *)&outer_addr.src_addr.v4;
+ outer_dst_addr = (const char *)&outer_addr.dst_addr.v4;
+ outer_addr_len = sizeof(struct in_addr);
+ }
+ else
+ {
+ outer_src_addr = (const char *)&outer_addr.src_addr.v6;
+ outer_dst_addr = (const char *)&outer_addr.dst_addr.v6;
+ outer_addr_len = sizeof(struct in6_addr);
+ }
+
+ switch (method)
+ {
+ case PKT_LDBC_METH_OUTERMOST_INT_IP:
+ if (direction == PACKET_DIRECTION_INCOMING)
+ {
+ // direction 1: E2I
+ HASH_VALUE(outer_dst_addr, outer_addr_len, hash_value);
+ }
+ else
+ {
+ // direction 0: I2E
+ HASH_VALUE(outer_src_addr, outer_addr_len, hash_value);
+ }
+ break;
+ case PKT_LDBC_METH_OUTERMOST_EXT_IP:
+ if (direction == PACKET_DIRECTION_INCOMING)
+ {
+ // direction 1: E2I
+ HASH_VALUE(outer_src_addr, outer_addr_len, hash_value);
+ }
+ else
+ {
+ // direction 0: I2E
+ HASH_VALUE(outer_dst_addr, outer_addr_len, hash_value);
+ }
+ break;
+ case PKT_LDBC_METH_OUTERMOST_INT_EXT_IP:
+ HASH_VALUE(outer_src_addr, outer_addr_len, hash_value);
+ HASH_VALUE(outer_dst_addr, outer_addr_len, temp);
+ hash_value = hash_value ^ temp;
+ break;
+ case PKT_LDBC_METH_INNERMOST_INT_IP:
+ if (direction == PACKET_DIRECTION_INCOMING)
+ {
+ // direction 1: E2I
+ HASH_VALUE(inner_dst_addr, inner_addr_len, hash_value);
+ }
+ else
+ {
+ // direction 0: I2E
+ HASH_VALUE(inner_src_addr, inner_addr_len, hash_value);
+ }
+ break;
+ case PKT_LDBC_METH_INNERMOST_EXT_IP:
+ if (direction == PACKET_DIRECTION_INCOMING)
+ {
+ // direction 1: E2I
+ HASH_VALUE(inner_src_addr, inner_addr_len, hash_value);
+ }
+ else
+ {
+ // direction 0: I2E
+ HASH_VALUE(inner_dst_addr, inner_addr_len, hash_value);
+ }
+ break;
+ default:
+ return hash_value;
+ }
+
+ return hash_value;
+}
+
+/******************************************************************************
+ * other uitls
+ ******************************************************************************/
+
+const char *packet_get_raw_data(const struct packet *pkt)
+{
+ return pkt->data_ptr;
+}
+
+uint16_t packet_get_raw_len(const struct packet *pkt)
+{
+ return pkt->data_len;
+}
+
+const char *packet_get_payload(const struct packet *pkt)
+{
+ if (pkt == NULL || pkt->layers_used == 0)
+ {
+ return NULL;
+ }
+
+ if (pkt->layers[pkt->layers_used - 1].pld_len)
+ {
+ return pkt->layers[pkt->layers_used - 1].pld_ptr;
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+uint16_t packet_get_payload_len(const struct packet *pkt)
+{
+ if (pkt == NULL || pkt->layers_used == 0)
+ {
+ return 0;
+ }
+ return pkt->layers[pkt->layers_used - 1].pld_len;
+}
+
+struct packet *packet_new(uint16_t pkt_len)
+{
+ struct packet *pkt = (struct packet *)calloc(1, sizeof(struct packet) + pkt_len);
+ if (pkt == NULL)
+ {
+ return NULL;
+ }
+ pkt->data_len = pkt_len;
+ pkt->data_ptr = (const char *)pkt + sizeof(struct packet);
+ pkt->need_free = 1;
+
+ return pkt;
+}
+
+struct packet *packet_dup(const struct packet *pkt)
+{
+ if (pkt == NULL)
+ {
+ return NULL;
+ }
+
+ struct packet *dup_pkt = packet_new(pkt->data_len);
+ if (dup_pkt == NULL)
+ {
+ return NULL;
+ }
+
+ dup_pkt->layers_used = pkt->layers_used;
+ dup_pkt->layers_size = pkt->layers_size;
+
+ memcpy((char *)dup_pkt->data_ptr, pkt->data_ptr, pkt->data_len);
+ dup_pkt->data_len = pkt->data_len;
+ packet_set_action(dup_pkt, PACKET_ACTION_DROP);
+
+ for (int8_t i = 0; i < pkt->layers_used; i++)
+ {
+ dup_pkt->layers[i].proto = pkt->layers[i].proto;
+ dup_pkt->layers[i].hdr_ptr = dup_pkt->data_ptr + pkt->layers[i].hdr_offset;
+ dup_pkt->layers[i].pld_ptr = dup_pkt->data_ptr + pkt->layers[i].hdr_offset + pkt->layers[i].hdr_len;
+ dup_pkt->layers[i].hdr_offset = pkt->layers[i].hdr_offset;
+ dup_pkt->layers[i].hdr_len = pkt->layers[i].hdr_len;
+ dup_pkt->layers[i].pld_len = pkt->layers[i].pld_len;
+ }
+
+ // update frag_layer
+ if (pkt->frag_layer)
+ {
+ dup_pkt->frag_layer = &dup_pkt->layers[pkt->frag_layer - pkt->layers];
+ }
+ memcpy(&dup_pkt->meta, &pkt->meta, sizeof(struct metadata));
+ packet_set_origin_ctx(dup_pkt, (void *)NULL);
+
+ return dup_pkt;
+}
+
+void packet_free(struct packet *pkt)
+{
+ if (pkt)
+ {
+ if (packet_is_claim(pkt))
+ {
+ PACKET_LOG_ERROR("packet has been claimed and cannot be released, please check the module arrangement order");
+ assert(0);
+ return;
+ }
+
+ if (pkt->need_free)
+ {
+ free((void *)pkt);
+ }
+ }
+}
+
+int packet_is_fragment(const struct packet *pkt)
+{
+ return (pkt->frag_layer) ? 1 : 0;
+}
+
+void packet_set_exdata(struct packet *pkt, int idx, void *ex_ptr)
+{
+ struct exdata_runtime *exdata_rt = (struct exdata_runtime *)packet_get_user_data(pkt);
+ exdata_set(exdata_rt, idx, ex_ptr);
+}
+
+void *packet_get_exdata(struct packet *pkt, int idx)
+{
+ struct exdata_runtime *exdata_rt = (struct exdata_runtime *)packet_get_user_data(pkt);
+ return exdata_get(exdata_rt, idx);
+}
diff -uNr tcpdump-tcpdump-4.99.4/print-bfd.c tcpdump-for-stellar/print-bfd.c
--- tcpdump-tcpdump-4.99.4/print-bfd.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-bfd.c 2024-10-30 17:34:05.612498702 +0800
@@ -30,7 +30,7 @@
#include "netdissect.h"
#include "extract.h"
-#include "udp.h"
+#include "print-udp.h"
/*
* Control packet, BFDv0, draft-ietf-bfd-base-01
@@ -144,9 +144,9 @@
};
static const struct tok bfd_port_values[] = {
- { BFD_CONTROL_PORT, "Control" },
- { BFD_MULTIHOP_PORT, "Multihop" },
- { BFD_LAG_PORT, "Lag" },
+ { TCPDUMP_BFD_CONTROL_PORT, "Control" },
+ { TCPDUMP_BFD_MULTIHOP_PORT, "Multihop" },
+ { TCPDUMP_BFD_LAG_PORT, "Lag" },
{ 0, NULL }
};
@@ -292,9 +292,9 @@
u_int len, u_int port)
{
ndo->ndo_protocol = "bfd";
- if (port == BFD_CONTROL_PORT ||
- port == BFD_MULTIHOP_PORT ||
- port == BFD_LAG_PORT) {
+ if (port == TCPDUMP_BFD_CONTROL_PORT ||
+ port == TCPDUMP_BFD_MULTIHOP_PORT ||
+ port == TCPDUMP_BFD_LAG_PORT) {
/*
* Control packet.
*/
@@ -401,7 +401,7 @@
}
break;
}
- } else if (port == BFD_ECHO_PORT) {
+ } else if (port == TCPDUMP_BFD_ECHO_PORT) {
/*
* Echo packet.
*/
diff -uNr tcpdump-tcpdump-4.99.4/print-cnfp.c tcpdump-for-stellar/print-cnfp.c
--- tcpdump-tcpdump-4.99.4/print-cnfp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-cnfp.c 2024-10-30 17:34:05.613498702 +0800
@@ -52,7 +52,7 @@
#include "addrtoname.h"
#include "extract.h"
-#include "tcp.h"
+#include "print-tcp.h"
#include "ipproto.h"
struct nfhdr_v1 {
diff -uNr tcpdump-tcpdump-4.99.4/print-dccp.c tcpdump-for-stellar/print-dccp.c
--- tcpdump-tcpdump-4.99.4/print-dccp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-dccp.c 2024-10-30 17:34:05.614498702 +0800
@@ -20,8 +20,8 @@
#include "netdissect.h"
#include "addrtoname.h"
#include "extract.h"
-#include "ip.h"
-#include "ip6.h"
+#include "tcpdump_ip.h"
+#include "tcpdump_ip6.h"
#include "ipproto.h"
/* RFC4340: Datagram Congestion Control Protocol (DCCP) */
@@ -199,14 +199,14 @@
return (cov > len)? len : cov;
}
-static uint16_t dccp_cksum(netdissect_options *ndo, const struct ip *ip,
+static uint16_t dccp_cksum(netdissect_options *ndo, const struct tcpdump_ip *ip,
const struct dccp_hdr *dh, u_int len)
{
return nextproto4_cksum(ndo, ip, (const uint8_t *)(const void *)dh, len,
dccp_csum_coverage(ndo, dh, len), IPPROTO_DCCP);
}
-static uint16_t dccp6_cksum(netdissect_options *ndo, const struct ip6_hdr *ip6,
+static uint16_t dccp6_cksum(netdissect_options *ndo, const struct tcpdump_ip6_hdr *ip6,
const struct dccp_hdr *dh, u_int len)
{
return nextproto6_cksum(ndo, ip6, (const uint8_t *)(const void *)dh, len,
@@ -270,8 +270,8 @@
u_int len)
{
const struct dccp_hdr *dh;
- const struct ip *ip;
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip *ip;
+ const struct tcpdump_ip6_hdr *ip6;
const u_char *cp;
u_short sport, dport;
u_int hlen;
@@ -281,9 +281,9 @@
ndo->ndo_protocol = "dccp";
dh = (const struct dccp_hdr *)bp;
- ip = (const struct ip *)data2;
+ ip = (const struct tcpdump_ip *)data2;
if (IP_V(ip) == 6)
- ip6 = (const struct ip6_hdr *)data2;
+ ip6 = (const struct tcpdump_ip6_hdr *)data2;
else
ip6 = NULL;
diff -uNr tcpdump-tcpdump-4.99.4/print-esp.c tcpdump-for-stellar/print-esp.c
--- tcpdump-tcpdump-4.99.4/print-esp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-esp.c 2024-10-30 17:34:05.615498702 +0800
@@ -54,8 +54,8 @@
#include "ascii_strcasecmp.h"
#endif
-#include "ip.h"
-#include "ip6.h"
+#include "tcpdump_ip.h"
+#include "tcpdump_ip6.h"
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -737,7 +737,7 @@
#ifdef HAVE_LIBCRYPTO
const struct ip *ip;
struct sa_list *sa = NULL;
- const struct ip6_hdr *ip6 = NULL;
+ const struct tcpdump_ip6_hdr *ip6 = NULL;
const u_char *iv;
u_int ivlen;
u_int payloadlen;
@@ -776,7 +776,7 @@
ip = (const struct ip *)bp2;
switch (ver) {
case 6:
- ip6 = (const struct ip6_hdr *)bp2;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp2;
/* we do not attempt to decrypt jumbograms */
if (!GET_BE_U_2(ip6->ip6_plen))
return;
diff -uNr tcpdump-tcpdump-4.99.4/print-frag6.c tcpdump-for-stellar/print-frag6.c
--- tcpdump-tcpdump-4.99.4/print-frag6.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-frag6.c 2024-10-30 17:34:05.616498702 +0800
@@ -30,29 +30,29 @@
#include "netdissect.h"
#include "extract.h"
-#include "ip6.h"
+#include "tcpdump_ip6.h"
int
frag6_print(netdissect_options *ndo, const u_char *bp, const u_char *bp2)
{
- const struct ip6_frag *dp;
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip6_frag *dp;
+ const struct tcpdump_ip6_hdr *ip6;
ndo->ndo_protocol = "frag6";
- dp = (const struct ip6_frag *)bp;
- ip6 = (const struct ip6_hdr *)bp2;
+ dp = (const struct tcpdump_ip6_frag *)bp;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp2;
if (ndo->ndo_vflag) {
ND_PRINT("frag (0x%08x:%u|%zu)",
GET_BE_U_4(dp->ip6f_ident),
GET_BE_U_2(dp->ip6f_offlg) & IP6F_OFF_MASK,
- sizeof(struct ip6_hdr) + GET_BE_U_2(ip6->ip6_plen) -
- (bp - bp2) - sizeof(struct ip6_frag));
+ sizeof(struct tcpdump_ip6_hdr) + GET_BE_U_2(ip6->ip6_plen) -
+ (bp - bp2) - sizeof(struct tcpdump_ip6_frag));
} else {
ND_PRINT("frag (%u|%zu)",
GET_BE_U_2(dp->ip6f_offlg) & IP6F_OFF_MASK,
- sizeof(struct ip6_hdr) + GET_BE_U_2(ip6->ip6_plen) -
- (bp - bp2) - sizeof(struct ip6_frag));
+ sizeof(struct tcpdump_ip6_hdr) + GET_BE_U_2(ip6->ip6_plen) -
+ (bp - bp2) - sizeof(struct tcpdump_ip6_frag));
}
/* it is meaningless to decode non-first fragment */
@@ -61,6 +61,6 @@
else
{
ND_PRINT(" ");
- return sizeof(struct ip6_frag);
+ return sizeof(struct tcpdump_ip6_frag);
}
}
diff -uNr tcpdump-tcpdump-4.99.4/print-icmp6.c tcpdump-for-stellar/print-icmp6.c
--- tcpdump-tcpdump-4.99.4/print-icmp6.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-icmp6.c 2024-10-30 17:34:05.617498702 +0800
@@ -35,10 +35,10 @@
#include "addrtostr.h"
#include "extract.h"
-#include "ip6.h"
+#include "tcpdump_ip6.h"
#include "ipproto.h"
-#include "udp.h"
+#include "print-udp.h"
#include "ah.h"
/* NetBSD: icmp6.h,v 1.13 2000/08/03 16:30:37 itojun Exp */
@@ -769,7 +769,7 @@
}
}
-static uint16_t icmp6_cksum(netdissect_options *ndo, const struct ip6_hdr *ip6,
+static uint16_t icmp6_cksum(netdissect_options *ndo, const struct tcpdump_ip6_hdr *ip6,
const struct icmp6_hdr *icp, u_int len)
{
return nextproto6_cksum(ndo, ip6, (const uint8_t *)(const void *)icp, len, len,
@@ -1011,8 +1011,8 @@
{
const struct icmp6_hdr *dp;
uint8_t icmp6_type, icmp6_code;
- const struct ip6_hdr *ip;
- const struct ip6_hdr *oip;
+ const struct tcpdump_ip6_hdr *ip;
+ const struct tcpdump_ip6_hdr *oip;
const struct udphdr *ouh;
uint16_t dport;
const u_char *ep;
@@ -1020,8 +1020,8 @@
ndo->ndo_protocol = "icmp6";
dp = (const struct icmp6_hdr *)bp;
- ip = (const struct ip6_hdr *)bp2;
- oip = (const struct ip6_hdr *)(dp + 1);
+ ip = (const struct tcpdump_ip6_hdr *)bp2;
+ oip = (const struct tcpdump_ip6_hdr *)(dp + 1);
/* 'ep' points to the end of available data. */
ep = ndo->ndo_snapend;
if (length == 0) {
@@ -1319,10 +1319,10 @@
get_upperlayer(netdissect_options *ndo, const u_char *bp, u_int *prot)
{
const u_char *ep;
- const struct ip6_hdr *ip6 = (const struct ip6_hdr *)bp;
+ const struct tcpdump_ip6_hdr *ip6 = (const struct tcpdump_ip6_hdr *)bp;
const struct udphdr *uh;
- const struct ip6_hbh *hbh;
- const struct ip6_frag *fragh;
+ const struct tcpdump_ip6_hbh *hbh;
+ const struct tcpdump_ip6_frag *fragh;
const struct ah *ah;
u_int nh;
int hlen;
@@ -1334,7 +1334,7 @@
return NULL;
nh = GET_U_1(ip6->ip6_nxt);
- hlen = sizeof(struct ip6_hdr);
+ hlen = sizeof(struct tcpdump_ip6_hdr);
while (bp < ep) {
bp += hlen;
@@ -1354,7 +1354,7 @@
case IPPROTO_HOPOPTS:
case IPPROTO_DSTOPTS:
case IPPROTO_ROUTING:
- hbh = (const struct ip6_hbh *)bp;
+ hbh = (const struct tcpdump_ip6_hbh *)bp;
if (!ND_TTEST_1(hbh->ip6h_len))
return(NULL);
nh = GET_U_1(hbh->ip6h_nxt);
@@ -1362,14 +1362,14 @@
break;
case IPPROTO_FRAGMENT: /* this should be odd, but try anyway */
- fragh = (const struct ip6_frag *)bp;
+ fragh = (const struct tcpdump_ip6_frag *)bp;
if (!ND_TTEST_2(fragh->ip6f_offlg))
return(NULL);
/* fragments with non-zero offset are meaningless */
if ((GET_BE_U_2(fragh->ip6f_offlg) & IP6F_OFF_MASK) != 0)
return(NULL);
nh = GET_U_1(fragh->ip6f_nxt);
- hlen = sizeof(struct ip6_frag);
+ hlen = sizeof(struct tcpdump_ip6_frag);
break;
case IPPROTO_AH:
diff -uNr tcpdump-tcpdump-4.99.4/print-icmp.c tcpdump-for-stellar/print-icmp.c
--- tcpdump-tcpdump-4.99.4/print-icmp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-icmp.c 2024-10-30 17:34:05.617498702 +0800
@@ -34,8 +34,8 @@
#include "addrtoname.h"
#include "extract.h"
-#include "ip.h"
-#include "udp.h"
+#include "tcpdump_ip.h"
+#include "print-udp.h"
#include "ipproto.h"
#include "mpls.h"
@@ -72,7 +72,7 @@
nd_uint32_t its_ttime;
} id_ts;
struct id_ip {
- struct ip idi_ip;
+ struct tcpdump_ip idi_ip;
/* options and then 64 bits of data */
} id_ip;
nd_uint32_t id_mask;
@@ -95,10 +95,10 @@
* ip header length.
*/
#define ICMP_MINLEN 8 /* abs minimum */
-#define ICMP_EXTD_MINLEN (156 - sizeof (struct ip)) /* draft-bonica-internet-icmp-08 */
+#define ICMP_EXTD_MINLEN (156 - sizeof (struct tcpdump_ip)) /* draft-bonica-internet-icmp-08 */
#define ICMP_TSLEN (8 + 3 * sizeof (uint32_t)) /* timestamp */
#define ICMP_MASKLEN 12 /* address mask */
-#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */
+#define ICMP_ADVLENMIN (8 + sizeof (struct tcpdump_ip) + 8) /* min */
#define ICMP_ADVLEN(p) (8 + (IP_HL(&(p)->icmp_ip) << 2) + 8)
/* N.B.: must separately check that ip_hl >= 5 */
@@ -318,9 +318,9 @@
const struct icmp *dp;
uint8_t icmp_type, icmp_code;
const struct icmp_ext_t *ext_dp;
- const struct ip *ip;
+ const struct tcpdump_ip *ip;
const char *str;
- const struct ip *oip;
+ const struct tcpdump_ip *oip;
uint8_t ip_proto;
const struct udphdr *ouh;
const uint8_t *obj_tptr;
@@ -334,7 +334,7 @@
ndo->ndo_protocol = "icmp";
dp = (const struct icmp *)bp;
ext_dp = (const struct icmp_ext_t *)bp;
- ip = (const struct ip *)bp2;
+ ip = (const struct tcpdump_ip *)bp2;
str = buf;
icmp_type = GET_U_1(dp->icmp_type);
@@ -674,7 +674,7 @@
bp += 8;
ND_PRINT("\n\t");
- ip = (const struct ip *)bp;
+ ip = (const struct tcpdump_ip *)bp;
snapend_save = ndo->ndo_snapend;
/*
* Update the snapend because extensions (MPLS, ...) may be
diff -uNr tcpdump-tcpdump-4.99.4/print-ip6.c tcpdump-for-stellar/print-ip6.c
--- tcpdump-tcpdump-4.99.4/print-ip6.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-ip6.c 2024-10-30 17:34:05.618498702 +0800
@@ -33,7 +33,7 @@
#include "addrtoname.h"
#include "extract.h"
-#include "ip6.h"
+#include "tcpdump_ip6.h"
#include "ipproto.h"
/*
@@ -45,20 +45,20 @@
*/
static void
ip6_finddst(netdissect_options *ndo, nd_ipv6 *dst,
- const struct ip6_hdr *ip6)
+ const struct tcpdump_ip6_hdr *ip6)
{
const u_char *cp;
u_int advance;
u_int nh;
const void *dst_addr;
- const struct ip6_rthdr *dp;
- const struct ip6_rthdr0 *dp0;
- const struct ip6_srh *srh;
+ const struct tcpdump_ip6_rthdr *dp;
+ const struct tcpdump_ip6_rthdr0 *dp0;
+ const struct tcpdump_ip6_srh *srh;
const u_char *p;
int i, len;
cp = (const u_char *)ip6;
- advance = sizeof(struct ip6_hdr);
+ advance = sizeof(struct tcpdump_ip6_hdr);
nh = GET_U_1(ip6->ip6_nxt);
dst_addr = (const void *)ip6->ip6_dst;
@@ -87,7 +87,7 @@
* marked as reserved, and the header is always
* the same size.
*/
- advance = sizeof(struct ip6_frag);
+ advance = sizeof(struct tcpdump_ip6_frag);
nh = GET_U_1(cp);
break;
@@ -95,14 +95,14 @@
/*
* OK, we found it.
*/
- dp = (const struct ip6_rthdr *)cp;
+ dp = (const struct tcpdump_ip6_rthdr *)cp;
ND_TCHECK_SIZE(dp);
len = GET_U_1(dp->ip6r_len);
switch (GET_U_1(dp->ip6r_type)) {
case IPV6_RTHDR_TYPE_0:
case IPV6_RTHDR_TYPE_2: /* Mobile IPv6 ID-20 */
- dp0 = (const struct ip6_rthdr0 *)dp;
+ dp0 = (const struct tcpdump_ip6_rthdr0 *)dp;
if (len % 2 == 1)
goto trunc;
len >>= 1;
@@ -115,7 +115,7 @@
break;
case IPV6_RTHDR_TYPE_4:
/* IPv6 Segment Routing Header (SRH) */
- srh = (const struct ip6_srh *)dp;
+ srh = (const struct tcpdump_ip6_srh *)dp;
if (len % 2 == 1)
goto trunc;
p = (const u_char *) srh->srh_segments;
@@ -171,7 +171,7 @@
*/
uint16_t
nextproto6_cksum(netdissect_options *ndo,
- const struct ip6_hdr *ip6, const uint8_t *data,
+ const struct tcpdump_ip6_hdr *ip6, const uint8_t *data,
u_int len, u_int covlen, uint8_t next_proto)
{
struct {
@@ -225,7 +225,7 @@
void
ip6_print(netdissect_options *ndo, const u_char *bp, u_int length)
{
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip6_hdr *ip6;
int advance;
u_int len;
u_int total_advance;
@@ -239,10 +239,10 @@
int found_hbh;
ndo->ndo_protocol = "ip6";
- ip6 = (const struct ip6_hdr *)bp;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp;
ND_TCHECK_SIZE(ip6);
- if (length < sizeof (struct ip6_hdr)) {
+ if (length < sizeof (struct tcpdump_ip6_hdr)) {
ND_PRINT("truncated-ip6 %u", length);
return;
}
@@ -279,12 +279,12 @@
* a Jumbo Payload option, and fail if we haven't.
*/
if (payload_len != 0) {
- len = payload_len + sizeof(struct ip6_hdr);
+ len = payload_len + sizeof(struct tcpdump_ip6_hdr);
if (length < len)
ND_PRINT("truncated-ip6 - %u bytes missing!",
len - length);
} else
- len = length + sizeof(struct ip6_hdr);
+ len = length + sizeof(struct tcpdump_ip6_hdr);
ph = 255;
nh = GET_U_1(ip6->ip6_nxt);
@@ -313,7 +313,7 @@
}
cp = (const u_char *)ip6;
- advance = sizeof(struct ip6_hdr);
+ advance = sizeof(struct tcpdump_ip6_hdr);
total_advance = 0;
/* Process extension headers */
found_extension_header = 0;
@@ -433,7 +433,7 @@
* the total number of bytes we've
* processed so far.
*/
- len = payload_len + sizeof(struct ip6_hdr);
+ len = payload_len + sizeof(struct tcpdump_ip6_hdr);
if (len < total_advance)
goto trunc;
if (length < len)
@@ -471,7 +471,7 @@
* and change the snapshot length
* accordingly.
*/
- len = sizeof(struct ip6_hdr);
+ len = sizeof(struct tcpdump_ip6_hdr);
nd_change_snaplen(ndo, bp, len);
/*
diff -uNr tcpdump-tcpdump-4.99.4/print-ip6opts.c tcpdump-for-stellar/print-ip6opts.c
--- tcpdump-tcpdump-4.99.4/print-ip6opts.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-ip6opts.c 2024-10-30 17:34:05.618498702 +0800
@@ -39,7 +39,7 @@
#include "addrtoname.h"
#include "extract.h"
-#include "ip6.h"
+#include "tcpdump_ip6.h"
static int
ip6_sopt_print(netdissect_options *ndo, const u_char *bp, int len)
@@ -219,7 +219,7 @@
hbhopt_process(netdissect_options *ndo, const u_char *bp, int *found_jumbo,
uint32_t *jumbolen)
{
- const struct ip6_hbh *dp = (const struct ip6_hbh *)bp;
+ const struct tcpdump_ip6_hbh *dp = (const struct tcpdump_ip6_hbh *)bp;
u_int hbhlen = 0;
ndo->ndo_protocol = "hbhopt";
@@ -239,7 +239,7 @@
int
dstopt_process(netdissect_options *ndo, const u_char *bp)
{
- const struct ip6_dest *dp = (const struct ip6_dest *)bp;
+ const struct tcpdump_ip6_dest *dp = (const struct tcpdump_ip6_dest *)bp;
u_int dstoptlen = 0;
ndo->ndo_protocol = "dstopt";
diff -uNr tcpdump-tcpdump-4.99.4/print-ip.c tcpdump-for-stellar/print-ip.c
--- tcpdump-tcpdump-4.99.4/print-ip.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-ip.c 2024-10-30 17:34:05.618498702 +0800
@@ -31,7 +31,7 @@
#include "addrtoname.h"
#include "extract.h"
-#include "ip.h"
+#include "tcpdump_ip.h"
#include "ipproto.h"
@@ -89,7 +89,7 @@
*/
static uint32_t
ip_finddst(netdissect_options *ndo,
- const struct ip *ip)
+ const struct tcpdump_ip *ip)
{
u_int length;
u_int len;
@@ -97,9 +97,9 @@
cp = (const u_char *)(ip + 1);
length = IP_HL(ip) * 4;
- if (length < sizeof(struct ip))
+ if (length < sizeof(struct tcpdump_ip))
goto trunc;
- length -= sizeof(struct ip);
+ length -= sizeof(struct tcpdump_ip);
for (; length != 0; cp += len, length -= len) {
int tt;
@@ -135,7 +135,7 @@
*/
uint16_t
nextproto4_cksum(netdissect_options *ndo,
- const struct ip *ip, const uint8_t *data,
+ const struct tcpdump_ip *ip, const uint8_t *data,
u_int len, u_int covlen, uint8_t next_proto)
{
struct phdr {
@@ -320,7 +320,7 @@
const u_char *bp,
u_int length)
{
- const struct ip *ip;
+ const struct tcpdump_ip *ip;
u_int off;
u_int hlen;
u_int len;
@@ -331,7 +331,7 @@
int truncated = 0;
ndo->ndo_protocol = "ip";
- ip = (const struct ip *)bp;
+ ip = (const struct tcpdump_ip *)bp;
if (IP_V(ip) != 4) { /* print version and fail if != 4 */
if (IP_V(ip) == 6)
ND_PRINT("IP6, wrong link-layer encapsulation");
@@ -344,12 +344,12 @@
ND_PRINT("IP ");
ND_TCHECK_SIZE(ip);
- if (length < sizeof (struct ip)) {
+ if (length < sizeof (struct tcpdump_ip)) {
ND_PRINT("truncated-ip %u", length);
return;
}
hlen = IP_HL(ip) * 4;
- if (hlen < sizeof (struct ip)) {
+ if (hlen < sizeof (struct tcpdump_ip)) {
ND_PRINT("bad-hlen %u", hlen);
return;
}
@@ -428,10 +428,10 @@
ND_PRINT(", length %u", GET_BE_U_2(ip->ip_len));
- if ((hlen - sizeof(struct ip)) > 0) {
+ if ((hlen - sizeof(struct tcpdump_ip)) > 0) {
ND_PRINT(", options (");
if (ip_optprint(ndo, (const u_char *)(ip + 1),
- hlen - sizeof(struct ip)) == -1) {
+ hlen - sizeof(struct tcpdump_ip)) == -1) {
ND_PRINT(" [truncated-option]");
truncated = 1;
}
diff -uNr tcpdump-tcpdump-4.99.4/print-ip-demux.c tcpdump-for-stellar/print-ip-demux.c
--- tcpdump-tcpdump-4.99.4/print-ip-demux.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-ip-demux.c 2024-10-30 17:34:05.618498702 +0800
@@ -31,7 +31,7 @@
#include "addrtoname.h"
#include "extract.h"
-#include "ip.h"
+#include "tcpdump_ip.h"
#include "ipproto.h"
void
diff -uNr tcpdump-tcpdump-4.99.4/print-isakmp.c tcpdump-for-stellar/print-isakmp.c
--- tcpdump-tcpdump-4.99.4/print-isakmp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-isakmp.c 2024-10-30 17:34:05.619498702 +0800
@@ -53,8 +53,8 @@
#include "addrtoname.h"
#include "extract.h"
-#include "ip.h"
-#include "ip6.h"
+#include "tcpdump_ip.h"
+#include "tcpdump_ip6.h"
#include "ipproto.h"
typedef nd_byte cookie_t[8];
@@ -771,8 +771,8 @@
cookie_record(netdissect_options *ndo, const cookie_t *in, const u_char *bp2)
{
int i;
- const struct ip *ip;
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip *ip;
+ const struct tcpdump_ip6_hdr *ip6;
i = cookie_find(in);
if (0 <= i) {
@@ -780,7 +780,7 @@
return;
}
- ip = (const struct ip *)bp2;
+ ip = (const struct tcpdump_ip *)bp2;
switch (IP_V(ip)) {
case 4:
cookiecache[ninitiator].version = 4;
@@ -790,7 +790,7 @@
ip->ip_dst, sizeof(nd_ipv4));
break;
case 6:
- ip6 = (const struct ip6_hdr *)bp2;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp2;
cookiecache[ninitiator].version = 6;
UNALIGNED_MEMCPY(&cookiecache[ninitiator].iaddr.in6,
ip6->ip6_src, sizeof(nd_ipv6));
@@ -809,10 +809,10 @@
static int
cookie_sidecheck(netdissect_options *ndo, int i, const u_char *bp2, int initiator)
{
- const struct ip *ip;
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip *ip;
+ const struct tcpdump_ip6_hdr *ip6;
- ip = (const struct ip *)bp2;
+ ip = (const struct tcpdump_ip *)bp2;
switch (IP_V(ip)) {
case 4:
if (cookiecache[i].version != 4)
@@ -828,7 +828,7 @@
case 6:
if (cookiecache[i].version != 6)
return 0;
- ip6 = (const struct ip6_hdr *)bp2;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp2;
if (initiator) {
if (UNALIGNED_MEMCMP(ip6->ip6_src, &cookiecache[i].iaddr.in6, sizeof(nd_ipv6)) == 0)
return 1;
diff -uNr tcpdump-tcpdump-4.99.4/print-lisp.c tcpdump-for-stellar/print-lisp.c
--- tcpdump-tcpdump-4.99.4/print-lisp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-lisp.c 2024-10-30 17:34:05.620498702 +0800
@@ -101,8 +101,8 @@
#include "netdissect-stdinc.h"
#include "netdissect.h"
-#include "ip.h"
-#include "ip6.h"
+#include "tcpdump_ip.h"
+#include "tcpdump_ip6.h"
#include "extract.h"
#include "addrtoname.h"
diff -uNr tcpdump-tcpdump-4.99.4/print-lldp.c tcpdump-for-stellar/print-lldp.c
--- tcpdump-tcpdump-4.99.4/print-lldp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-lldp.c 2024-10-30 17:34:05.620498702 +0800
@@ -41,9 +41,9 @@
*/
#define LLDP_END_TLV 0
#define LLDP_CHASSIS_ID_TLV 1
-#define LLDP_PORT_ID_TLV 2
+#define LTCPDUMP_LDP_PORT_ID_TLV 2
#define LLDP_TTL_TLV 3
-#define LLDP_PORT_DESCR_TLV 4
+#define LTCPDUMP_LDP_PORT_DESCR_TLV 4
#define LLDP_SYSTEM_NAME_TLV 5
#define LLDP_SYSTEM_DESCR_TLV 6
#define LLDP_SYSTEM_CAP_TLV 7
@@ -53,9 +53,9 @@
static const struct tok lldp_tlv_values[] = {
{ LLDP_END_TLV, "End" },
{ LLDP_CHASSIS_ID_TLV, "Chassis ID" },
- { LLDP_PORT_ID_TLV, "Port ID" },
+ { LTCPDUMP_LDP_PORT_ID_TLV, "Port ID" },
{ LLDP_TTL_TLV, "Time to Live" },
- { LLDP_PORT_DESCR_TLV, "Port Description" },
+ { LTCPDUMP_LDP_PORT_DESCR_TLV, "Port Description" },
{ LLDP_SYSTEM_NAME_TLV, "System Name" },
{ LLDP_SYSTEM_DESCR_TLV, "System Description" },
{ LLDP_SYSTEM_CAP_TLV, "System Capabilities" },
@@ -89,22 +89,22 @@
/*
* Port ID subtypes
*/
-#define LLDP_PORT_INTF_ALIAS_SUBTYPE 1
-#define LLDP_PORT_PORT_COMP_SUBTYPE 2
-#define LLDP_PORT_MAC_ADDR_SUBTYPE 3
-#define LLDP_PORT_NETWORK_ADDR_SUBTYPE 4
-#define LLDP_PORT_INTF_NAME_SUBTYPE 5
-#define LLDP_PORT_AGENT_CIRC_ID_SUBTYPE 6
-#define LLDP_PORT_LOCAL_SUBTYPE 7
+#define LTCPDUMP_LDP_PORT_INTF_ALIAS_SUBTYPE 1
+#define LTCPDUMP_LDP_PORT_PORT_COMP_SUBTYPE 2
+#define LTCPDUMP_LDP_PORT_MAC_ADDR_SUBTYPE 3
+#define LTCPDUMP_LDP_PORT_NETWORK_ADDR_SUBTYPE 4
+#define LTCPDUMP_LDP_PORT_INTF_NAME_SUBTYPE 5
+#define LTCPDUMP_LDP_PORT_AGENT_CIRC_ID_SUBTYPE 6
+#define LTCPDUMP_LDP_PORT_LOCAL_SUBTYPE 7
static const struct tok lldp_port_subtype_values[] = {
- { LLDP_PORT_INTF_ALIAS_SUBTYPE, "Interface alias"},
- { LLDP_PORT_PORT_COMP_SUBTYPE, "Port component"},
- { LLDP_PORT_MAC_ADDR_SUBTYPE, "MAC address"},
- { LLDP_PORT_NETWORK_ADDR_SUBTYPE, "Network Address"},
- { LLDP_PORT_INTF_NAME_SUBTYPE, "Interface Name"},
- { LLDP_PORT_AGENT_CIRC_ID_SUBTYPE, "Agent circuit ID"},
- { LLDP_PORT_LOCAL_SUBTYPE, "Local"},
+ { LTCPDUMP_LDP_PORT_INTF_ALIAS_SUBTYPE, "Interface alias"},
+ { LTCPDUMP_LDP_PORT_PORT_COMP_SUBTYPE, "Port component"},
+ { LTCPDUMP_LDP_PORT_MAC_ADDR_SUBTYPE, "MAC address"},
+ { LTCPDUMP_LDP_PORT_NETWORK_ADDR_SUBTYPE, "Network Address"},
+ { LTCPDUMP_LDP_PORT_INTF_NAME_SUBTYPE, "Interface Name"},
+ { LTCPDUMP_LDP_PORT_AGENT_CIRC_ID_SUBTYPE, "Agent circuit ID"},
+ { LTCPDUMP_LDP_PORT_LOCAL_SUBTYPE, "Local"},
{ 0, NULL}
};
@@ -1531,7 +1531,7 @@
}
break;
- case LLDP_PORT_ID_TLV:
+ case LTCPDUMP_LDP_PORT_ID_TLV:
if (ndo->ndo_vflag) {
if (tlv_len < 2) {
goto trunc;
@@ -1542,22 +1542,22 @@
subtype);
switch (subtype) {
- case LLDP_PORT_MAC_ADDR_SUBTYPE:
+ case LTCPDUMP_LDP_PORT_MAC_ADDR_SUBTYPE:
if (tlv_len < 1+6) {
goto trunc;
}
ND_PRINT("%s", GET_ETHERADDR_STRING(tptr + 1));
break;
- case LLDP_PORT_INTF_NAME_SUBTYPE: /* fall through */
- case LLDP_PORT_LOCAL_SUBTYPE:
- case LLDP_PORT_AGENT_CIRC_ID_SUBTYPE:
- case LLDP_PORT_INTF_ALIAS_SUBTYPE:
- case LLDP_PORT_PORT_COMP_SUBTYPE:
+ case LTCPDUMP_LDP_PORT_INTF_NAME_SUBTYPE: /* fall through */
+ case LTCPDUMP_LDP_PORT_LOCAL_SUBTYPE:
+ case LTCPDUMP_LDP_PORT_AGENT_CIRC_ID_SUBTYPE:
+ case LTCPDUMP_LDP_PORT_INTF_ALIAS_SUBTYPE:
+ case LTCPDUMP_LDP_PORT_PORT_COMP_SUBTYPE:
nd_printjnp(ndo, tptr + 1, tlv_len - 1);
break;
- case LLDP_PORT_NETWORK_ADDR_SUBTYPE:
+ case LTCPDUMP_LDP_PORT_NETWORK_ADDR_SUBTYPE:
network_addr = lldp_network_addr_print(ndo, tptr+1, tlv_len-1);
if (network_addr == NULL) {
goto trunc;
@@ -1581,7 +1581,7 @@
}
break;
- case LLDP_PORT_DESCR_TLV:
+ case LTCPDUMP_LDP_PORT_DESCR_TLV:
if (ndo->ndo_vflag) {
ND_PRINT(": ");
nd_printjnp(ndo, tptr, tlv_len);
diff -uNr tcpdump-tcpdump-4.99.4/print-mobility.c tcpdump-for-stellar/print-mobility.c
--- tcpdump-tcpdump-4.99.4/print-mobility.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-mobility.c 2024-10-30 17:34:05.622498702 +0800
@@ -40,7 +40,7 @@
#include "addrtoname.h"
#include "extract.h"
-#include "ip6.h"
+#include "tcpdump_ip6.h"
/* Mobility header */
diff -uNr tcpdump-tcpdump-4.99.4/print-mptcp.c tcpdump-for-stellar/print-mptcp.c
--- tcpdump-tcpdump-4.99.4/print-mptcp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-mptcp.c 2024-10-30 17:34:05.622498702 +0800
@@ -46,7 +46,7 @@
#include "extract.h"
#include "addrtoname.h"
-#include "tcp.h"
+#include "print-tcp.h"
#define MPTCP_SUB_CAPABLE 0x0
#define MPTCP_SUB_JOIN 0x1
diff -uNr tcpdump-tcpdump-4.99.4/print-nfs.c tcpdump-for-stellar/print-nfs.c
--- tcpdump-tcpdump-4.99.4/print-nfs.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-nfs.c 2024-10-30 17:34:05.623498702 +0800
@@ -38,8 +38,8 @@
#include "nfs.h"
#include "nfsfh.h"
-#include "ip.h"
-#include "ip6.h"
+#include "tcpdump_ip.h"
+#include "tcpdump_ip6.h"
#include "rpc_auth.h"
#include "rpc_msg.h"
@@ -201,19 +201,19 @@
print_nfsaddr(netdissect_options *ndo,
const u_char *bp, const char *s, const char *d)
{
- const struct ip *ip;
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip *ip;
+ const struct tcpdump_ip6_hdr *ip6;
char srcaddr[INET6_ADDRSTRLEN], dstaddr[INET6_ADDRSTRLEN];
srcaddr[0] = dstaddr[0] = '\0';
- switch (IP_V((const struct ip *)bp)) {
+ switch (IP_V((const struct tcpdump_ip *)bp)) {
case 4:
- ip = (const struct ip *)bp;
+ ip = (const struct tcpdump_ip *)bp;
strlcpy(srcaddr, GET_IPADDR_STRING(ip->ip_src), sizeof(srcaddr));
strlcpy(dstaddr, GET_IPADDR_STRING(ip->ip_dst), sizeof(dstaddr));
break;
case 6:
- ip6 = (const struct ip6_hdr *)bp;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp;
strlcpy(srcaddr, GET_IP6ADDR_STRING(ip6->ip6_src),
sizeof(srcaddr));
strlcpy(dstaddr, GET_IP6ADDR_STRING(ip6->ip6_dst),
@@ -941,18 +941,18 @@
xid_map_enter(netdissect_options *ndo,
const struct sunrpc_msg *rp, const u_char *bp)
{
- const struct ip *ip = NULL;
- const struct ip6_hdr *ip6 = NULL;
+ const struct tcpdump_ip *ip = NULL;
+ const struct tcpdump_ip6_hdr *ip6 = NULL;
struct xid_map_entry *xmep;
if (!ND_TTEST_4(rp->rm_call.cb_proc))
return (0);
- switch (IP_V((const struct ip *)bp)) {
+ switch (IP_V((const struct tcpdump_ip *)bp)) {
case 4:
- ip = (const struct ip *)bp;
+ ip = (const struct tcpdump_ip *)bp;
break;
case 6:
- ip6 = (const struct ip6_hdr *)bp;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp;
break;
default:
return (1);
@@ -994,8 +994,8 @@
int i;
struct xid_map_entry *xmep;
uint32_t xid;
- const struct ip *ip = (const struct ip *)bp;
- const struct ip6_hdr *ip6 = (const struct ip6_hdr *)bp;
+ const struct tcpdump_ip *ip = (const struct tcpdump_ip *)bp;
+ const struct tcpdump_ip6_hdr *ip6 = (const struct tcpdump_ip6_hdr *)bp;
int cmp;
UNALIGNED_MEMCPY(&xid, &rp->rm_xid, sizeof(xmep->xid));
diff -uNr tcpdump-tcpdump-4.99.4/print-pgm.c tcpdump-for-stellar/print-pgm.c
--- tcpdump-tcpdump-4.99.4/print-pgm.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-pgm.c 2024-10-30 17:34:05.625498702 +0800
@@ -26,8 +26,8 @@
#include "addrtoname.h"
#include "addrtostr.h"
-#include "ip.h"
-#include "ip6.h"
+#include "tcpdump_ip.h"
+#include "tcpdump_ip6.h"
#include "ipproto.h"
#include "af.h"
@@ -148,20 +148,20 @@
const u_char *bp2)
{
const struct pgm_header *pgm;
- const struct ip *ip;
+ const struct tcpdump_ip *ip;
uint8_t pgm_type_val;
uint16_t sport, dport;
u_int nla_afnum;
char nla_buf[INET6_ADDRSTRLEN];
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip6_hdr *ip6;
uint8_t opt_type, opt_len;
uint32_t seq, opts_len, len, offset;
ndo->ndo_protocol = "pgm";
pgm = (const struct pgm_header *)bp;
- ip = (const struct ip *)bp2;
+ ip = (const struct tcpdump_ip *)bp2;
if (IP_V(ip) == 6)
- ip6 = (const struct ip6_hdr *)bp2;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp2;
else
ip6 = NULL;
if (!ND_TTEST_2(pgm->pgm_dport)) {
diff -uNr tcpdump-tcpdump-4.99.4/print-pim.c tcpdump-for-stellar/print-pim.c
--- tcpdump-tcpdump-4.99.4/print-pim.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-pim.c 2024-10-30 17:34:05.625498702 +0800
@@ -31,8 +31,8 @@
#include "addrtoname.h"
#include "extract.h"
-#include "ip.h"
-#include "ip6.h"
+#include "tcpdump_ip.h"
+#include "tcpdump_ip6.h"
#include "ipproto.h"
#define PIMV1_TYPE_QUERY 0
@@ -657,14 +657,14 @@
pimv2_check_checksum(netdissect_options *ndo, const u_char *bp,
const u_char *bp2, u_int len)
{
- const struct ip *ip;
+ const struct tcpdump_ip *ip;
u_int cksum;
if (!ND_TTEST_LEN(bp, len)) {
/* We don't have all the data. */
return (UNVERIFIED);
}
- ip = (const struct ip *)bp2;
+ ip = (const struct tcpdump_ip *)bp2;
if (IP_V(ip) == 4) {
struct cksum_vec vec[1];
@@ -673,9 +673,9 @@
cksum = in_cksum(vec, 1);
return (cksum ? INCORRECT : CORRECT);
} else if (IP_V(ip) == 6) {
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip6_hdr *ip6;
- ip6 = (const struct ip6_hdr *)bp2;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp2;
cksum = nextproto6_cksum(ndo, ip6, bp, len, len, IPPROTO_PIM);
return (cksum ? INCORRECT : CORRECT);
} else {
@@ -882,7 +882,7 @@
case PIMV2_TYPE_REGISTER:
{
- const struct ip *ip;
+ const struct tcpdump_ip *ip;
if (len < 4)
goto trunc;
@@ -897,7 +897,7 @@
/* encapsulated multicast packet */
if (len == 0)
goto trunc;
- ip = (const struct ip *)bp;
+ ip = (const struct tcpdump_ip *)bp;
switch (IP_V(ip)) {
case 0: /* Null header */
ND_PRINT("IP-Null-header %s > %s",
diff -uNr tcpdump-tcpdump-4.99.4/print-rt6.c tcpdump-for-stellar/print-rt6.c
--- tcpdump-tcpdump-4.99.4/print-rt6.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-rt6.c 2024-10-30 17:34:05.627498702 +0800
@@ -31,21 +31,21 @@
#include "addrtoname.h"
#include "extract.h"
-#include "ip6.h"
+#include "tcpdump_ip6.h"
int
rt6_print(netdissect_options *ndo, const u_char *bp, const u_char *bp2 _U_)
{
- const struct ip6_rthdr *dp;
- const struct ip6_rthdr0 *dp0;
- const struct ip6_srh *srh;
+ const struct tcpdump_ip6_rthdr *dp;
+ const struct tcpdump_ip6_rthdr0 *dp0;
+ const struct tcpdump_ip6_srh *srh;
u_int i, len, type;
const u_char *p;
ndo->ndo_protocol = "rt6";
nd_print_protocol_caps(ndo);
- dp = (const struct ip6_rthdr *)bp;
+ dp = (const struct tcpdump_ip6_rthdr *)bp;
len = GET_U_1(dp->ip6r_len);
ND_PRINT(" (len=%u", len); /*)*/
@@ -58,7 +58,7 @@
switch (type) {
case IPV6_RTHDR_TYPE_0:
case IPV6_RTHDR_TYPE_2: /* Mobile IPv6 ID-20 */
- dp0 = (const struct ip6_rthdr0 *)dp;
+ dp0 = (const struct tcpdump_ip6_rthdr0 *)dp;
if (GET_BE_U_4(dp0->ip6r0_reserved) || ndo->ndo_vflag) {
ND_PRINT(", rsv=0x%0x",
@@ -80,7 +80,7 @@
return((GET_U_1(dp0->ip6r0_len) + 1) << 3);
break;
case IPV6_RTHDR_TYPE_4:
- srh = (const struct ip6_srh *)dp;
+ srh = (const struct tcpdump_ip6_srh *)dp;
ND_PRINT(", last-entry=%u", GET_U_1(srh->srh_last_ent));
if (GET_U_1(srh->srh_flags) || ndo->ndo_vflag) {
diff -uNr tcpdump-tcpdump-4.99.4/print-rx.c tcpdump-for-stellar/print-rx.c
--- tcpdump-tcpdump-4.99.4/print-rx.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-rx.c 2024-10-30 17:34:05.628498702 +0800
@@ -47,7 +47,7 @@
#include "addrtoname.h"
#include "extract.h"
-#include "ip.h"
+#include "tcpdump_ip.h"
#define FS_RX_PORT 7000
#define CB_RX_PORT 7001
@@ -493,9 +493,9 @@
static uint32_t rx_cache_next = 0;
static uint32_t rx_cache_hint = 0;
-static void rx_cache_insert(netdissect_options *, const u_char *, const struct ip *, uint16_t);
+static void rx_cache_insert(netdissect_options *, const u_char *, const struct tcpdump_ip *, uint16_t);
static int rx_cache_find(netdissect_options *, const struct rx_header *,
- const struct ip *, uint16_t, uint32_t *);
+ const struct tcpdump_ip *, uint16_t, uint32_t *);
static void fs_print(netdissect_options *, const u_char *, u_int);
static void fs_reply_print(netdissect_options *, const u_char *, u_int, uint32_t);
@@ -597,7 +597,7 @@
* have a chance to print out replies
*/
- rx_cache_insert(ndo, bp, (const struct ip *) bp2, dport);
+ rx_cache_insert(ndo, bp, (const struct tcpdump_ip *) bp2, dport);
switch (dport) {
case FS_RX_PORT: /* AFS file service */
@@ -636,7 +636,7 @@
GET_BE_U_4(rxh->seq) == 1) ||
type == RX_PACKET_TYPE_ABORT) &&
(flags & RX_CLIENT_INITIATED) == 0 &&
- rx_cache_find(ndo, rxh, (const struct ip *) bp2,
+ rx_cache_find(ndo, rxh, (const struct tcpdump_ip *) bp2,
sport, &opcode)) {
switch (sport) {
@@ -684,7 +684,7 @@
static void
rx_cache_insert(netdissect_options *ndo,
- const u_char *bp, const struct ip *ip, uint16_t dport)
+ const u_char *bp, const struct tcpdump_ip *ip, uint16_t dport)
{
struct rx_cache_entry *rxent;
const struct rx_header *rxh = (const struct rx_header *) bp;
@@ -714,7 +714,7 @@
static int
rx_cache_find(netdissect_options *ndo, const struct rx_header *rxh,
- const struct ip *ip, uint16_t sport, uint32_t *opcode)
+ const struct tcpdump_ip *ip, uint16_t sport, uint32_t *opcode)
{
uint32_t i;
struct rx_cache_entry *rxent;
diff -uNr tcpdump-tcpdump-4.99.4/print-sctp.c tcpdump-for-stellar/print-sctp.c
--- tcpdump-tcpdump-4.99.4/print-sctp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-sctp.c 2024-10-30 17:34:05.628498702 +0800
@@ -44,8 +44,8 @@
#include "netdissect.h"
#include "addrtoname.h"
#include "extract.h"
-#include "ip.h"
-#include "ip6.h"
+#include "tcpdump_ip.h"
+#include "tcpdump_ip6.h"
/* Definitions from:
*
@@ -455,8 +455,8 @@
{
u_int sctpPacketLengthRemaining;
const struct sctpHeader *sctpPktHdr;
- const struct ip *ip;
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip *ip;
+ const struct tcpdump_ip6_hdr *ip6;
uint8_t chunkID;
u_short sourcePort, destPort;
u_int chunkCount;
@@ -478,9 +478,9 @@
sourcePort = GET_BE_U_2(sctpPktHdr->source);
destPort = GET_BE_U_2(sctpPktHdr->destination);
- ip = (const struct ip *)bp2;
+ ip = (const struct tcpdump_ip *)bp2;
if (IP_V(ip) == 6)
- ip6 = (const struct ip6_hdr *)bp2;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp2;
else
ip6 = NULL;
diff -uNr tcpdump-tcpdump-4.99.4/print-sl.c tcpdump-for-stellar/print-sl.c
--- tcpdump-tcpdump-4.99.4/print-sl.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-sl.c 2024-10-30 17:34:05.628498702 +0800
@@ -31,8 +31,8 @@
#include "netdissect.h"
#include "extract.h"
-#include "ip.h"
-#include "tcp.h"
+#include "tcpdump_ip.h"
+#include "print-tcp.h"
#include "slcompress.h"
/*
@@ -51,15 +51,15 @@
static u_int lastlen[2][256];
static u_int lastconn = 255;
-static void sliplink_print(netdissect_options *, const u_char *, const struct ip *, u_int);
-static void compressed_sl_print(netdissect_options *, const u_char *, const struct ip *, u_int, int);
+static void sliplink_print(netdissect_options *, const u_char *, const struct tcpdump_ip *, u_int);
+static void compressed_sl_print(netdissect_options *, const u_char *, const struct tcpdump_ip *, u_int, int);
void
sl_if_print(netdissect_options *ndo,
const struct pcap_pkthdr *h, const u_char *p)
{
u_int length = h->len;
- const struct ip *ip;
+ const struct tcpdump_ip *ip;
ndo->ndo_protocol = "slip";
ND_TCHECK_LEN(p, SLIP_HDRLEN);
@@ -67,7 +67,7 @@
length -= SLIP_HDRLEN;
- ip = (const struct ip *)(p + SLIP_HDRLEN);
+ ip = (const struct tcpdump_ip *)(p + SLIP_HDRLEN);
if (ndo->ndo_eflag)
sliplink_print(ndo, p, ip, length);
@@ -89,7 +89,7 @@
const struct pcap_pkthdr *h, const u_char *p)
{
u_int length = h->len;
- const struct ip *ip;
+ const struct tcpdump_ip *ip;
ndo->ndo_protocol = "slip_bsdos";
ND_TCHECK_LEN(p, SLIP_HDRLEN);
@@ -97,7 +97,7 @@
length -= SLIP_HDRLEN;
- ip = (const struct ip *)(p + SLIP_HDRLEN);
+ ip = (const struct tcpdump_ip *)(p + SLIP_HDRLEN);
#ifdef notdef
if (ndo->ndo_eflag)
@@ -109,7 +109,7 @@
static void
sliplink_print(netdissect_options *ndo,
- const u_char *p, const struct ip *ip,
+ const u_char *p, const struct tcpdump_ip *ip,
u_int length)
{
int dir;
@@ -143,7 +143,7 @@
* Get it from the link layer since sl_uncompress_tcp()
* has restored the IP header copy to IPPROTO_TCP.
*/
- lastconn = GET_U_1(((const struct ip *)(p + SLX_CHDR))->ip_p);
+ lastconn = GET_U_1(((const struct tcpdump_ip *)(p + SLX_CHDR))->ip_p);
ND_PRINT("utcp %u: ", lastconn);
if (dir == -1) {
/* Direction is bogus, don't use it */
@@ -204,7 +204,7 @@
static void
compressed_sl_print(netdissect_options *ndo,
- const u_char *chdr, const struct ip *ip,
+ const u_char *chdr, const struct tcpdump_ip *ip,
u_int length, int dir)
{
const u_char *cp = chdr;
diff -uNr tcpdump-tcpdump-4.99.4/print-someip.c tcpdump-for-stellar/print-someip.c
--- tcpdump-tcpdump-4.99.4/print-someip.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-someip.c 2024-10-30 17:34:05.631498702 +0800
@@ -22,7 +22,7 @@
#include "netdissect-stdinc.h"
#include "netdissect.h"
#include "extract.h"
-#include "udp.h"
+#include "print-udp.h"
/*
* SOMEIP Header (R19-11)
diff -uNr tcpdump-tcpdump-4.99.4/print-sunrpc.c tcpdump-for-stellar/print-sunrpc.c
--- tcpdump-tcpdump-4.99.4/print-sunrpc.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-sunrpc.c 2024-10-30 17:34:05.631498702 +0800
@@ -57,8 +57,8 @@
#include "addrtoname.h"
#include "extract.h"
-#include "ip.h"
-#include "ip6.h"
+#include "tcpdump_ip.h"
+#include "tcpdump_ip6.h"
#include "rpc_auth.h"
#include "rpc_msg.h"
@@ -159,8 +159,8 @@
u_int length, const u_char *bp2)
{
const struct sunrpc_msg *rp;
- const struct ip *ip;
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip *ip;
+ const struct tcpdump_ip6_hdr *ip6;
uint32_t x;
char srcid[20], dstid[20]; /*fits 32bit*/
@@ -178,15 +178,15 @@
snprintf(dstid, sizeof(dstid), "0x%x", SUNRPC_PMAPPORT);
}
- switch (IP_V((const struct ip *)bp2)) {
+ switch (IP_V((const struct tcpdump_ip *)bp2)) {
case 4:
- ip = (const struct ip *)bp2;
+ ip = (const struct tcpdump_ip *)bp2;
ND_PRINT("%s.%s > %s.%s: %u",
GET_IPADDR_STRING(ip->ip_src), srcid,
GET_IPADDR_STRING(ip->ip_dst), dstid, length);
break;
case 6:
- ip6 = (const struct ip6_hdr *)bp2;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp2;
ND_PRINT("%s.%s > %s.%s: %u",
GET_IP6ADDR_STRING(ip6->ip6_src), srcid,
GET_IP6ADDR_STRING(ip6->ip6_dst), dstid, length);
diff -uNr tcpdump-tcpdump-4.99.4/print-tcp.c tcpdump-for-stellar/print-tcp.c
--- tcpdump-tcpdump-4.99.4/print-tcp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-tcp.c 2024-10-30 17:34:05.631498702 +0800
@@ -25,6 +25,12 @@
/* \summary: TCP printer */
+#if defined(__clang__)
+#pragma clang diagnostic ignored "-Wall"
+#elif defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wall"
+#endif
+
#ifndef lint
#else
__RCSID("$NetBSD: print-tcp.c,v 1.8 2007/07/24 11:53:48 drochner Exp $");
@@ -45,10 +51,10 @@
#include "diag-control.h"
-#include "tcp.h"
+#include "print-tcp.h"
-#include "ip.h"
-#include "ip6.h"
+#include "tcpdump_ip.h"
+#include "tcpdump_ip6.h"
#include "ipproto.h"
#include "rpc_auth.h"
#include "rpc_msg.h"
@@ -56,9 +62,8 @@
#ifdef HAVE_LIBCRYPTO
#include <openssl/md5.h>
#include "signature.h"
-
static int tcp_verify_signature(netdissect_options *ndo,
- const struct ip *ip, const struct tcphdr *tp,
+ const struct tcpdump_ip *ip, const struct tcphdr *tp,
const u_char *data, u_int length, const u_char *rcvsig);
#endif
@@ -66,29 +71,35 @@
static void print_tcp_fastopen_option(netdissect_options *ndo, const u_char *cp,
u_int datalen, int exp);
-#define MAX_RST_DATA_LEN 30
+#define MAX_RST_DATA_LEN 30
+/* For source or destination ports tests (UDP, TCP, ...) */
+#define IS_SRC_OR_DST_TCPPORT(p) (sport == (p) || dport == (p))
-struct tha {
+struct tha
+{
nd_ipv4 src;
nd_ipv4 dst;
u_int port;
};
-struct tcp_seq_hash {
+struct tcp_seq_hash
+{
struct tcp_seq_hash *nxt;
struct tha addr;
uint32_t seq;
uint32_t ack;
};
-struct tha6 {
+struct tha6
+{
nd_ipv6 src;
nd_ipv6 dst;
u_int port;
};
-struct tcp_seq_hash6 {
+struct tcp_seq_hash6
+{
struct tcp_seq_hash6 *nxt;
struct tha6 addr;
uint32_t seq;
@@ -104,43 +115,41 @@
static struct tcp_seq_hash6 tcp_seq_hash6[TSEQ_HASHSIZE];
static const struct tok tcp_flag_values[] = {
- { TH_FIN, "F" },
- { TH_SYN, "S" },
- { TH_RST, "R" },
- { TH_PUSH, "P" },
- { TH_ACK, "." },
- { TH_URG, "U" },
- { TH_ECNECHO, "E" },
- { TH_CWR, "W" },
- { 0, NULL }
-};
+ {TH_FIN, "F"},
+ {TH_SYN, "S"},
+ {TH_RST, "R"},
+ {TH_PUSH, "P"},
+ {TH_ACK, "."},
+ {TH_URG, "U"},
+ {TH_ECNECHO, "E"},
+ {TH_CWR, "W"},
+ {0, NULL}};
static const struct tok tcp_option_values[] = {
- { TCPOPT_EOL, "eol" },
- { TCPOPT_NOP, "nop" },
- { TCPOPT_MAXSEG, "mss" },
- { TCPOPT_WSCALE, "wscale" },
- { TCPOPT_SACKOK, "sackOK" },
- { TCPOPT_SACK, "sack" },
- { TCPOPT_ECHO, "echo" },
- { TCPOPT_ECHOREPLY, "echoreply" },
- { TCPOPT_TIMESTAMP, "TS" },
- { TCPOPT_CC, "cc" },
- { TCPOPT_CCNEW, "ccnew" },
- { TCPOPT_CCECHO, "" },
- { TCPOPT_SIGNATURE, "md5" },
- { TCPOPT_SCPS, "scps" },
- { TCPOPT_UTO, "uto" },
- { TCPOPT_TCPAO, "tcp-ao" },
- { TCPOPT_MPTCP, "mptcp" },
- { TCPOPT_FASTOPEN, "tfo" },
- { TCPOPT_EXPERIMENT2, "exp" },
- { 0, NULL }
-};
+ {TCPOPT_EOL, "eol"},
+ {TCPOPT_NOP, "nop"},
+ {TCPOPT_MAXSEG, "mss"},
+ {TCPOPT_WSCALE, "wscale"},
+ {TCPOPT_SACKOK, "sackOK"},
+ {TCPOPT_SACK, "sack"},
+ {TCPOPT_ECHO, "echo"},
+ {TCPOPT_ECHOREPLY, "echoreply"},
+ {TCPOPT_TIMESTAMP, "TS"},
+ {TCPOPT_CC, "cc"},
+ {TCPOPT_CCNEW, "ccnew"},
+ {TCPOPT_CCECHO, ""},
+ {TCPOPT_SIGNATURE, "md5"},
+ {TCPOPT_SCPS, "scps"},
+ {TCPOPT_UTO, "uto"},
+ {TCPOPT_TCPAO, "tcp-ao"},
+ {TCPOPT_MPTCP, "mptcp"},
+ {TCPOPT_FASTOPEN, "tfo"},
+ {TCPOPT_EXPERIMENT2, "exp"},
+ {0, NULL}};
static uint16_t
tcp_cksum(netdissect_options *ndo,
- const struct ip *ip,
+ const struct tcpdump_ip *ip,
const struct tcphdr *tp,
u_int len)
{
@@ -150,7 +159,7 @@
static uint16_t
tcp6_cksum(netdissect_options *ndo,
- const struct ip6_hdr *ip6,
+ const struct tcpdump_ip6_hdr *ip6,
const struct tcphdr *tp,
u_int len)
{
@@ -158,13 +167,12 @@
IPPROTO_TCP);
}
-void
-tcp_print(netdissect_options *ndo,
- const u_char *bp, u_int length,
- const u_char *bp2, int fragmented)
+void tcp_print(netdissect_options *ndo,
+ const u_char *bp, u_int length,
+ const u_char *bp2, int fragmented)
{
const struct tcphdr *tp;
- const struct ip *ip;
+ const struct tcpdump_ip *ip;
u_char flags;
u_int hlen;
char ch;
@@ -173,23 +181,27 @@
u_int utoval;
uint16_t magic;
int rev;
- const struct ip6_hdr *ip6;
- u_int header_len; /* Header length in bytes */
+ const struct tcpdump_ip6_hdr *ip6;
+ u_int header_len; /* Header length in bytes */
ndo->ndo_protocol = "tcp";
tp = (const struct tcphdr *)bp;
- ip = (const struct ip *)bp2;
+ ip = (const struct tcpdump_ip *)bp2;
if (IP_V(ip) == 6)
- ip6 = (const struct ip6_hdr *)bp2;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp2;
else
ip6 = NULL;
ch = '\0';
- if (!ND_TTEST_2(tp->th_dport)) {
- if (ip6) {
+ if (!ND_TTEST_2(tp->th_dport))
+ {
+ if (ip6)
+ {
ND_PRINT("%s > %s:",
GET_IP6ADDR_STRING(ip6->ip6_src),
GET_IP6ADDR_STRING(ip6->ip6_dst));
- } else {
+ }
+ else
+ {
ND_PRINT("%s > %s:",
GET_IPADDR_STRING(ip->ip_src),
GET_IPADDR_STRING(ip->ip_dst));
@@ -201,25 +213,34 @@
sport = GET_BE_U_2(tp->th_sport);
dport = GET_BE_U_2(tp->th_dport);
- if (ip6) {
- if (GET_U_1(ip6->ip6_nxt) == IPPROTO_TCP) {
+ if (ip6)
+ {
+ if (GET_U_1(ip6->ip6_nxt) == IPPROTO_TCP)
+ {
ND_PRINT("%s.%s > %s.%s: ",
GET_IP6ADDR_STRING(ip6->ip6_src),
tcpport_string(ndo, sport),
GET_IP6ADDR_STRING(ip6->ip6_dst),
tcpport_string(ndo, dport));
- } else {
+ }
+ else
+ {
ND_PRINT("%s > %s: ",
tcpport_string(ndo, sport), tcpport_string(ndo, dport));
}
- } else {
- if (GET_U_1(ip->ip_p) == IPPROTO_TCP) {
+ }
+ else
+ {
+ if (GET_U_1(ip->ip_p) == IPPROTO_TCP)
+ {
ND_PRINT("%s.%s > %s.%s: ",
GET_IPADDR_STRING(ip->ip_src),
tcpport_string(ndo, sport),
GET_IPADDR_STRING(ip->ip_dst),
tcpport_string(ndo, dport));
- } else {
+ }
+ else
+ {
ND_PRINT("%s > %s: ",
tcpport_string(ndo, sport), tcpport_string(ndo, dport));
}
@@ -229,7 +250,8 @@
hlen = TH_OFF(tp) * 4;
- if (hlen < sizeof(*tp)) {
+ if (hlen < sizeof(*tp))
+ {
ND_PRINT(" tcp %u [bad hdr length %u - too short, < %zu]",
length - hlen, hlen, sizeof(*tp));
return;
@@ -240,9 +262,11 @@
win = GET_BE_U_2(tp->th_win);
urp = GET_BE_U_2(tp->th_urp);
- if (ndo->ndo_qflag) {
+ if (ndo->ndo_qflag)
+ {
ND_PRINT("tcp %u", length - hlen);
- if (hlen > length) {
+ if (hlen > length)
+ {
ND_PRINT(" [bad hdr length %u - too long, > %u]",
hlen, length);
}
@@ -252,7 +276,8 @@
flags = GET_U_1(tp->th_flags);
ND_PRINT("Flags [%s]", bittok2str_nosep(tcp_flag_values, "none", flags));
- if (!ndo->ndo_Sflag && (flags & TH_ACK)) {
+ if (!ndo->ndo_Sflag && (flags & TH_ACK))
+ {
/*
* Find (or record) the initial sequence numbers for
* this conversation. (we pick an arbitrary
@@ -260,7 +285,8 @@
* both directions).
*/
rev = 0;
- if (ip6) {
+ if (ip6)
+ {
struct tcp_seq_hash6 *th;
struct tcp_seq_hash6 *tcp_seq_hash;
const void *src, *dst;
@@ -271,15 +297,19 @@
dst = (const void *)ip6->ip6_dst;
if (sport > dport)
rev = 1;
- else if (sport == dport) {
+ else if (sport == dport)
+ {
if (UNALIGNED_MEMCMP(src, dst, sizeof(ip6->ip6_dst)) > 0)
rev = 1;
}
- if (rev) {
+ if (rev)
+ {
UNALIGNED_MEMCPY(&tha.src, dst, sizeof(ip6->ip6_dst));
UNALIGNED_MEMCPY(&tha.dst, src, sizeof(ip6->ip6_src));
tha.port = ((u_int)dport) << 16 | sport;
- } else {
+ }
+ else
+ {
UNALIGNED_MEMCPY(&tha.dst, dst, sizeof(ip6->ip6_dst));
UNALIGNED_MEMCPY(&tha.src, src, sizeof(ip6->ip6_src));
tha.port = ((u_int)sport) << 16 | dport;
@@ -291,24 +321,28 @@
sizeof(th->addr)) == 0)
break;
- if (!th->nxt || (flags & TH_SYN)) {
+ if (!th->nxt || (flags & TH_SYN))
+ {
/* didn't find it or new conversation */
/* calloc() return used by the 'tcp_seq_hash6'
hash table: do not free() */
- if (th->nxt == NULL) {
+ if (th->nxt == NULL)
+ {
th->nxt = (struct tcp_seq_hash6 *)
- calloc(1, sizeof(*th));
+ calloc(1, sizeof(*th));
if (th->nxt == NULL)
(*ndo->ndo_error)(ndo,
- S_ERR_ND_MEM_ALLOC,
- "%s: calloc", __func__);
+ S_ERR_ND_MEM_ALLOC,
+ "%s: calloc", __func__);
}
th->addr = tha;
if (rev)
th->ack = seq, th->seq = ack - 1;
else
th->seq = seq, th->ack = ack - 1;
- } else {
+ }
+ else
+ {
if (rev)
seq -= th->ack, ack -= th->seq;
else
@@ -317,7 +351,9 @@
thseq = th->seq;
thack = th->ack;
- } else {
+ }
+ else
+ {
struct tcp_seq_hash *th;
struct tcp_seq_hash *tcp_seq_hash;
struct tha tha;
@@ -325,17 +361,21 @@
tcp_seq_hash = tcp_seq_hash4;
if (sport > dport)
rev = 1;
- else if (sport == dport) {
+ else if (sport == dport)
+ {
if (UNALIGNED_MEMCMP(ip->ip_src, ip->ip_dst, sizeof(ip->ip_dst)) > 0)
rev = 1;
}
- if (rev) {
+ if (rev)
+ {
UNALIGNED_MEMCPY(&tha.src, ip->ip_dst,
sizeof(ip->ip_dst));
UNALIGNED_MEMCPY(&tha.dst, ip->ip_src,
sizeof(ip->ip_src));
tha.port = ((u_int)dport) << 16 | sport;
- } else {
+ }
+ else
+ {
UNALIGNED_MEMCPY(&tha.dst, ip->ip_dst,
sizeof(ip->ip_dst));
UNALIGNED_MEMCPY(&tha.src, ip->ip_src,
@@ -349,24 +389,28 @@
sizeof(th->addr)) == 0)
break;
- if (!th->nxt || (flags & TH_SYN)) {
+ if (!th->nxt || (flags & TH_SYN))
+ {
/* didn't find it or new conversation */
/* calloc() return used by the 'tcp_seq_hash4'
hash table: do not free() */
- if (th->nxt == NULL) {
+ if (th->nxt == NULL)
+ {
th->nxt = (struct tcp_seq_hash *)
- calloc(1, sizeof(*th));
+ calloc(1, sizeof(*th));
if (th->nxt == NULL)
(*ndo->ndo_error)(ndo,
- S_ERR_ND_MEM_ALLOC,
- "%s: calloc", __func__);
+ S_ERR_ND_MEM_ALLOC,
+ "%s: calloc", __func__);
}
th->addr = tha;
if (rev)
th->ack = seq, th->seq = ack - 1;
else
th->seq = seq, th->ack = ack - 1;
- } else {
+ }
+ else
+ {
if (rev)
seq -= th->ack, ack -= th->seq;
else
@@ -376,58 +420,69 @@
thseq = th->seq;
thack = th->ack;
}
- } else {
+ }
+ else
+ {
/*fool gcc*/
thseq = thack = rev = 0;
}
- if (hlen > length) {
+ if (hlen > length)
+ {
ND_PRINT(" [bad hdr length %u - too long, > %u]",
hlen, length);
return;
}
- if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented) {
+ if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented)
+ {
/* Check the checksum, if possible. */
uint16_t sum, tcp_sum;
- if (IP_V(ip) == 4) {
- if (ND_TTEST_LEN(tp->th_sport, length)) {
+ if (IP_V(ip) == 4)
+ {
+ if (ND_TTEST_LEN(tp->th_sport, length))
+ {
sum = tcp_cksum(ndo, ip, tp, length);
tcp_sum = GET_BE_U_2(tp->th_sum);
ND_PRINT(", cksum 0x%04x", tcp_sum);
if (sum != 0)
ND_PRINT(" (incorrect -> 0x%04x)",
- in_cksum_shouldbe(tcp_sum, sum));
+ in_cksum_shouldbe(tcp_sum, sum));
else
ND_PRINT(" (correct)");
}
- } else if (IP_V(ip) == 6) {
- if (ND_TTEST_LEN(tp->th_sport, length)) {
+ }
+ else if (IP_V(ip) == 6)
+ {
+ if (ND_TTEST_LEN(tp->th_sport, length))
+ {
sum = tcp6_cksum(ndo, ip6, tp, length);
tcp_sum = GET_BE_U_2(tp->th_sum);
ND_PRINT(", cksum 0x%04x", tcp_sum);
if (sum != 0)
ND_PRINT(" (incorrect -> 0x%04x)",
- in_cksum_shouldbe(tcp_sum, sum));
+ in_cksum_shouldbe(tcp_sum, sum));
else
ND_PRINT(" (correct)");
-
}
}
}
length -= hlen;
- if (ndo->ndo_vflag > 1 || length > 0 || flags & (TH_SYN | TH_FIN | TH_RST)) {
+ if (ndo->ndo_vflag > 1 || length > 0 || flags & (TH_SYN | TH_FIN | TH_RST))
+ {
ND_PRINT(", seq %u", seq);
- if (length > 0) {
+ if (length > 0)
+ {
ND_PRINT(":%u", seq + length);
}
}
- if (flags & TH_ACK) {
+ if (flags & TH_ACK)
+ {
ND_PRINT(", ack %u", ack);
}
@@ -438,7 +493,8 @@
/*
* Handle any options.
*/
- if (hlen > sizeof(*tp)) {
+ if (hlen > sizeof(*tp))
+ {
const u_char *cp;
u_int i, opt, datalen;
u_int len;
@@ -446,30 +502,37 @@
hlen -= sizeof(*tp);
cp = (const u_char *)tp + sizeof(*tp);
ND_PRINT(", options [");
- while (hlen > 0) {
+ while (hlen > 0)
+ {
if (ch != '\0')
ND_PRINT("%c", ch);
opt = GET_U_1(cp);
cp++;
if (ZEROLENOPT(opt))
len = 1;
- else {
+ else
+ {
len = GET_U_1(cp);
- cp++; /* total including type, len */
+ cp++; /* total including type, len */
if (len < 2 || len > hlen)
goto bad;
- --hlen; /* account for length byte */
+ --hlen; /* account for length byte */
}
- --hlen; /* account for type byte */
+ --hlen; /* account for type byte */
datalen = 0;
/* Bail if "l" bytes of data are not left or were not captured */
-#define LENCHECK(l) { if ((l) > hlen) goto bad; ND_TCHECK_LEN(cp, l); }
-
+#define LENCHECK(l) \
+ { \
+ if ((l) > hlen) \
+ goto bad; \
+ ND_TCHECK_LEN(cp, l); \
+ }
ND_PRINT("%s", tok2str(tcp_option_values, "unknown-%u", opt));
- switch (opt) {
+ switch (opt)
+ {
case TCPOPT_MAXSEG:
datalen = 2;
@@ -485,21 +548,28 @@
case TCPOPT_SACK:
datalen = len - 2;
- if (datalen % 8 != 0) {
+ if (datalen % 8 != 0)
+ {
ND_PRINT(" invalid sack");
- } else {
+ }
+ else
+ {
uint32_t s, e;
ND_PRINT(" %u ", datalen / 8);
- for (i = 0; i < datalen; i += 8) {
+ for (i = 0; i < datalen; i += 8)
+ {
LENCHECK(i + 4);
s = GET_BE_U_4(cp + i);
LENCHECK(i + 8);
e = GET_BE_U_4(cp + i + 4);
- if (rev) {
+ if (rev)
+ {
s -= thseq;
e -= thseq;
- } else {
+ }
+ else
+ {
s -= thack;
e -= thack;
}
@@ -527,8 +597,8 @@
datalen = 8;
LENCHECK(datalen);
ND_PRINT(" val %u ecr %u",
- GET_BE_U_4(cp),
- GET_BE_U_4(cp + 4));
+ GET_BE_U_4(cp),
+ GET_BE_U_4(cp + 4));
break;
case TCPOPT_SIGNATURE:
@@ -537,7 +607,8 @@
ND_PRINT(" ");
#ifdef HAVE_LIBCRYPTO
switch (tcp_verify_signature(ndo, ip, tp,
- bp + TH_OFF(tp) * 4, length, cp)) {
+ bp + TH_OFF(tp) * 4, length, cp))
+ {
case SIGNATURE_VALID:
ND_PRINT("valid");
@@ -574,17 +645,22 @@
* (This includes the Kind and Length fields already processed
* at this point.)
*/
- if (datalen < 2) {
+ if (datalen < 2)
+ {
nd_print_invalid(ndo);
- } else {
+ }
+ else
+ {
LENCHECK(1);
ND_PRINT(" keyid %u", GET_U_1(cp));
LENCHECK(2);
ND_PRINT(" rnextkeyid %u",
GET_U_1(cp + 1));
- if (datalen > 2) {
+ if (datalen > 2)
+ {
ND_PRINT(" mac 0x");
- for (i = 2; i < datalen; i++) {
+ for (i = 2; i < datalen; i++)
+ {
LENCHECK(i + 1);
ND_PRINT("%02x",
GET_U_1(cp + i));
@@ -615,7 +691,7 @@
break;
case TCPOPT_MPTCP:
- {
+ {
const u_char *snapend_save;
int ret;
@@ -636,7 +712,7 @@
if (!ret)
goto bad;
break;
- }
+ }
case TCPOPT_FASTOPEN:
datalen = len - 2;
@@ -654,7 +730,8 @@
magic = GET_BE_U_2(cp);
ND_PRINT("-");
- switch(magic) {
+ switch (magic)
+ {
case 0xf989: /* TCP Fast Open RFC 7413 */
print_tcp_fastopen_option(ndo, cp + 2, datalen - 2, TRUE);
@@ -671,7 +748,8 @@
datalen = len - 2;
if (datalen)
ND_PRINT(" 0x");
- for (i = 0; i < datalen; ++i) {
+ for (i = 0; i < datalen; ++i)
+ {
LENCHECK(i + 1);
ND_PRINT("%02x", GET_U_1(cp + i));
}
@@ -683,9 +761,9 @@
hlen -= datalen;
/* Check specification against observed length */
- ++datalen; /* option octet */
+ ++datalen; /* option octet */
if (!ZEROLENOPT(opt))
- ++datalen; /* size octet */
+ ++datalen; /* size octet */
if (datalen != len)
ND_PRINT("[len %u]", len);
ch = ',';
@@ -711,19 +789,23 @@
* Do a bounds check before decoding the payload.
* At least the header data is required.
*/
- if (!ND_TTEST_LEN(bp, header_len)) {
+ if (!ND_TTEST_LEN(bp, header_len))
+ {
ND_PRINT(" [remaining caplen(%u) < header length(%u)]",
ND_BYTES_AVAILABLE_AFTER(bp), header_len);
nd_trunc_longjmp(ndo);
}
bp += header_len;
- if ((flags & TH_RST) && ndo->ndo_vflag) {
+ if ((flags & TH_RST) && ndo->ndo_vflag)
+ {
print_tcp_rst_data(ndo, bp, length);
return;
}
- if (ndo->ndo_packettype) {
- switch (ndo->ndo_packettype) {
+ if (ndo->ndo_packettype)
+ {
+ switch (ndo->ndo_packettype)
+ {
case PT_ZMTP1:
zmtp1_print(ndo, bp, length);
break;
@@ -738,52 +820,107 @@
return;
}
- if (IS_SRC_OR_DST_PORT(TELNET_PORT)) {
+ if (IS_SRC_OR_DST_TCPPORT(TELNET_PORT))
+ {
telnet_print(ndo, bp, length);
- } else if (IS_SRC_OR_DST_PORT(SMTP_PORT)) {
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(SMTP_PORT))
+ {
ND_PRINT(": ");
smtp_print(ndo, bp, length);
- } else if (IS_SRC_OR_DST_PORT(WHOIS_PORT)) {
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(WHOIS_PORT))
+ {
ND_PRINT(": ");
whois_print(ndo, bp, length);
- } else if (IS_SRC_OR_DST_PORT(BGP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(BGP_PORT))
+ {
bgp_print(ndo, bp, length);
- else if (IS_SRC_OR_DST_PORT(PPTP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(PPTP_PORT))
+ {
pptp_print(ndo, bp);
- else if (IS_SRC_OR_DST_PORT(REDIS_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(REDIS_PORT))
+ {
resp_print(ndo, bp, length);
- else if (IS_SRC_OR_DST_PORT(SSH_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(SSH_PORT))
+ {
ssh_print(ndo, bp, length);
+ return;
+ }
#ifdef ENABLE_SMB
- else if (IS_SRC_OR_DST_PORT(NETBIOS_SSN_PORT))
+ if (IS_SRC_OR_DST_TCPPORT(NETBIOS_SSN_PORT))
+ {
nbt_tcp_print(ndo, bp, length);
- else if (IS_SRC_OR_DST_PORT(SMB_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(SMB_PORT))
+ {
smb_tcp_print(ndo, bp, length);
+ return;
+ }
#endif
- else if (IS_SRC_OR_DST_PORT(BEEP_PORT))
+ if (IS_SRC_OR_DST_TCPPORT(BEEP_PORT))
+ {
beep_print(ndo, bp, length);
- else if (IS_SRC_OR_DST_PORT(OPENFLOW_PORT_OLD) || IS_SRC_OR_DST_PORT(OPENFLOW_PORT_IANA))
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(OPENFLOW_PORT_OLD) || IS_SRC_OR_DST_TCPPORT(OPENFLOW_PORT_IANA))
+ {
openflow_print(ndo, bp, length);
- else if (IS_SRC_OR_DST_PORT(FTP_PORT)) {
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(FTP_PORT))
+ {
ND_PRINT(": ");
ftp_print(ndo, bp, length);
- } else if (IS_SRC_OR_DST_PORT(HTTP_PORT) || IS_SRC_OR_DST_PORT(HTTP_PORT_ALT)) {
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(HTTP_PORT) || IS_SRC_OR_DST_TCPPORT(HTTP_PORT_ALT))
+ {
ND_PRINT(": ");
http_print(ndo, bp, length);
- } else if (IS_SRC_OR_DST_PORT(RTSP_PORT) || IS_SRC_OR_DST_PORT(RTSP_PORT_ALT)) {
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(RTSP_PORT) || IS_SRC_OR_DST_TCPPORT(RTSP_PORT_ALT))
+ {
ND_PRINT(": ");
rtsp_print(ndo, bp, length);
- } else if (IS_SRC_OR_DST_PORT(NAMESERVER_PORT)) {
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(TCPDUMP_NAMESERVER_TCP_PORT))
+ {
/* over_tcp: TRUE, is_mdns: FALSE */
domain_print(ndo, bp, length, TRUE, FALSE);
- } else if (IS_SRC_OR_DST_PORT(MSDP_PORT)) {
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(MSDP_PORT))
+ {
msdp_print(ndo, bp, length);
- } else if (IS_SRC_OR_DST_PORT(RPKI_RTR_PORT)) {
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(RPKI_RTR_PORT))
+ {
rpki_rtr_print(ndo, bp, length);
- } else if (IS_SRC_OR_DST_PORT(LDP_PORT)) {
+ return;
+ }
+ if (IS_SRC_OR_DST_TCPPORT(TCPDUMP_LDP_PORT))
+ {
ldp_print(ndo, bp, length);
- } else if ((IS_SRC_OR_DST_PORT(NFS_PORT)) &&
- length >= 4 && ND_TTEST_4(bp)) {
+ return;
+ }
+ if ((IS_SRC_OR_DST_TCPPORT(NFS_PORT)) &&
+ length >= 4 && ND_TTEST_4(bp))
+ {
/*
* If data present, header length valid, and NFS port used,
* assume NFS.
@@ -795,24 +932,28 @@
enum sunrpc_msg_type direction;
fraglen = GET_BE_U_4(bp) & 0x7FFFFFFF;
- if (fraglen > (length) - 4)
- fraglen = (length) - 4;
+ if (fraglen > (length)-4)
+ fraglen = (length)-4;
rp = (const struct sunrpc_msg *)(bp + 4);
- if (ND_TTEST_4(rp->rm_direction)) {
- direction = (enum sunrpc_msg_type) GET_BE_U_4(rp->rm_direction);
- if (dport == NFS_PORT && direction == SUNRPC_CALL) {
+ if (ND_TTEST_4(rp->rm_direction))
+ {
+ direction = (enum sunrpc_msg_type)GET_BE_U_4(rp->rm_direction);
+ if (dport == NFS_PORT && direction == SUNRPC_CALL)
+ {
ND_PRINT(": NFS request xid %u ",
GET_BE_U_4(rp->rm_xid));
nfsreq_noaddr_print(ndo, (const u_char *)rp, fraglen, (const u_char *)ip);
return;
}
- if (sport == NFS_PORT && direction == SUNRPC_REPLY) {
+ if (sport == NFS_PORT && direction == SUNRPC_REPLY)
+ {
ND_PRINT(": NFS reply xid %u ",
GET_BE_U_4(rp->rm_xid));
nfsreply_noaddr_print(ndo, (const u_char *)rp, fraglen, (const u_char *)ip);
return;
}
}
+ return;
}
return;
@@ -849,12 +990,14 @@
u_char c;
ND_PRINT(ND_TTEST_LEN(sp, length) ? " [RST" : " [!RST");
- if (length > MAX_RST_DATA_LEN) {
- length = MAX_RST_DATA_LEN; /* can use -X for longer */
- ND_PRINT("+"); /* indicate we truncate */
+ if (length > MAX_RST_DATA_LEN)
+ {
+ length = MAX_RST_DATA_LEN; /* can use -X for longer */
+ ND_PRINT("+"); /* indicate we truncate */
}
ND_PRINT(" ");
- while (length && sp < ndo->ndo_snapend) {
+ while (length && sp < ndo->ndo_snapend)
+ {
c = GET_U_1(sp);
sp++;
fn_print_char(ndo, c);
@@ -872,14 +1015,20 @@
if (exp)
ND_PRINT("tfo");
- if (datalen == 0) {
+ if (datalen == 0)
+ {
/* Fast Open Cookie Request */
ND_PRINT(" cookiereq");
- } else {
+ }
+ else
+ {
/* Fast Open Cookie */
- if (datalen % 2 != 0 || datalen < 4 || datalen > 16) {
+ if (datalen % 2 != 0 || datalen < 4 || datalen > 16)
+ {
nd_print_invalid(ndo);
- } else {
+ }
+ else
+ {
ND_PRINT(" cookie ");
for (i = 0; i < datalen; ++i)
ND_PRINT("%02x", GET_U_1(cp + i));
@@ -891,7 +1040,7 @@
DIAG_OFF_DEPRECATION
static int
tcp_verify_signature(netdissect_options *ndo,
- const struct ip *ip, const struct tcphdr *tp,
+ const struct tcpdump_ip *ip, const struct tcphdr *tp,
const u_char *data, u_int length, const u_char *rcvsig)
{
struct tcphdr tp1;
@@ -899,18 +1048,20 @@
char zero_proto = 0;
MD5_CTX ctx;
uint16_t savecsum, tlen;
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip6_hdr *ip6;
uint32_t len32;
uint8_t nxt;
- if (data + length > ndo->ndo_snapend) {
+ if (data + length > ndo->ndo_snapend)
+ {
ND_PRINT("snaplen too short, ");
return (CANT_CHECK_SIGNATURE);
}
tp1 = *tp;
- if (ndo->ndo_sigsecret == NULL) {
+ if (ndo->ndo_sigsecret == NULL)
+ {
ND_PRINT("shared secret not supplied with -M, ");
return (CANT_CHECK_SIGNATURE);
}
@@ -919,7 +1070,8 @@
/*
* Step 1: Update MD5 hash with IP pseudo-header.
*/
- if (IP_V(ip) == 4) {
+ if (IP_V(ip) == 4)
+ {
MD5_Update(&ctx, (const char *)&ip->ip_src, sizeof(ip->ip_src));
MD5_Update(&ctx, (const char *)&ip->ip_dst, sizeof(ip->ip_dst));
MD5_Update(&ctx, (const char *)&zero_proto, sizeof(zero_proto));
@@ -927,8 +1079,10 @@
tlen = GET_BE_U_2(ip->ip_len) - IP_HL(ip) * 4;
tlen = htons(tlen);
MD5_Update(&ctx, (const char *)&tlen, sizeof(tlen));
- } else if (IP_V(ip) == 6) {
- ip6 = (const struct ip6_hdr *)ip;
+ }
+ else if (IP_V(ip) == 6)
+ {
+ ip6 = (const struct tcpdump_ip6_hdr *)ip;
MD5_Update(&ctx, (const char *)&ip6->ip6_src, sizeof(ip6->ip6_src));
MD5_Update(&ctx, (const char *)&ip6->ip6_dst, sizeof(ip6->ip6_dst));
len32 = htonl(GET_BE_U_2(ip6->ip6_plen));
@@ -939,7 +1093,9 @@
MD5_Update(&ctx, (const char *)&nxt, sizeof(nxt));
nxt = IPPROTO_TCP;
MD5_Update(&ctx, (const char *)&nxt, sizeof(nxt));
- } else {
+ }
+ else
+ {
ND_PRINT("IP version not 4 or 6, ");
return (CANT_CHECK_SIGNATURE);
}
diff -uNr tcpdump-tcpdump-4.99.4/print-tcp.h tcpdump-for-stellar/print-tcp.h
--- tcpdump-tcpdump-4.99.4/print-tcp.h 1970-01-01 08:00:00.000000000 +0800
+++ tcpdump-for-stellar/print-tcp.h 2024-10-30 17:34:06.265498697 +0800
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)tcp.h 8.1 (Berkeley) 6/10/93
+ */
+#pragma once
+/*
+ * TCP header.
+ * Per RFC 793, September, 1981.
+ */
+struct tcphdr
+{
+ nd_uint16_t th_sport; /* source port */
+ nd_uint16_t th_dport; /* destination port */
+ nd_uint32_t th_seq; /* sequence number */
+ nd_uint32_t th_ack; /* acknowledgement number */
+ nd_uint8_t th_offx2; /* data offset, rsvd */
+ nd_uint8_t th_flags;
+ nd_uint16_t th_win; /* window */
+ nd_uint16_t th_sum; /* checksum */
+ nd_uint16_t th_urp; /* urgent pointer */
+};
+
+#define TH_OFF(th) ((GET_U_1((th)->th_offx2) & 0xf0) >> 4)
+
+/* TCP flags */
+#define TH_FIN 0x01
+#define TH_SYN 0x02
+#define TH_RST 0x04
+#define TH_PUSH 0x08
+#define TH_ACK 0x10
+#define TH_URG 0x20
+#define TH_ECNECHO 0x40 /* ECN Echo */
+#define TH_CWR 0x80 /* ECN Cwnd Reduced */
+
+#define TCPOPT_EOL 0
+#define TCPOPT_NOP 1
+#define TCPOPT_MAXSEG 2
+#define TCPOLEN_MAXSEG 4
+#define TCPOPT_WSCALE 3 /* window scale factor (rfc1323) */
+#define TCPOPT_SACKOK 4 /* selective ack ok (rfc2018) */
+#define TCPOPT_SACK 5 /* selective ack (rfc2018) */
+#define TCPOPT_ECHO 6 /* echo (rfc1072) */
+#define TCPOPT_ECHOREPLY 7 /* echo (rfc1072) */
+#define TCPOPT_TIMESTAMP 8 /* timestamp (rfc1323) */
+#define TCPOLEN_TIMESTAMP 10
+#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP + 2) /* appendix A */
+#define TCPOPT_CC 11 /* T/TCP CC options (rfc1644) */
+#define TCPOPT_CCNEW 12 /* T/TCP CC options (rfc1644) */
+#define TCPOPT_CCECHO 13 /* T/TCP CC options (rfc1644) */
+#define TCPOPT_SIGNATURE 19 /* Keyed MD5 (rfc2385) */
+#define TCPOLEN_SIGNATURE 18
+#define TCP_SIGLEN 16 /* length of an option 19 digest */
+#define TCPOPT_SCPS 20 /* SCPS-TP (CCSDS 714.0-B-2) */
+#define TCPOPT_UTO 28 /* tcp user timeout (rfc5482) */
+#define TCPOLEN_UTO 4
+#define TCPOPT_TCPAO 29 /* TCP authentication option (rfc5925) */
+#define TCPOPT_MPTCP 30 /* MPTCP options */
+#define TCPOPT_FASTOPEN 34 /* TCP Fast Open (rfc7413) */
+#define TCPOPT_EXPERIMENT2 254 /* experimental headers (rfc4727) */
+
+#define TCPOPT_TSTAMP_HDR \
+ (TCPOPT_NOP << 24 | TCPOPT_NOP << 16 | TCPOPT_TIMESTAMP << 8 | TCPOLEN_TIMESTAMP)
+
+#ifndef FTP_PORT
+#define FTP_PORT 21
+#endif
+#ifndef SSH_PORT
+#define SSH_PORT 22
+#endif
+#ifndef TELNET_PORT
+#define TELNET_PORT 23
+#endif
+#ifndef SMTP_PORT
+#define SMTP_PORT 25
+#endif
+#ifndef WHOIS_PORT
+#define WHOIS_PORT 43
+#endif
+
+#define TCPDUMP_NAMESERVER_TCP_PORT 53
+
+#ifndef HTTP_PORT
+#define HTTP_PORT 80
+#endif
+#ifndef NETBIOS_SSN_PORT
+#define NETBIOS_SSN_PORT 139 /* RFC 1001, RFC 1002 */
+#endif
+#ifndef BGP_PORT
+#define BGP_PORT 179
+#endif
+#ifndef RPKI_RTR_PORT
+#define RPKI_RTR_PORT 323
+#endif
+#ifndef SMB_PORT
+#define SMB_PORT 445
+#endif
+#ifndef RTSP_PORT
+#define RTSP_PORT 554
+#endif
+#ifndef MSDP_PORT
+#define MSDP_PORT 639
+#endif
+#ifndef TCPDUMP_LDP_PORT
+#define TCPDUMP_LDP_PORT 646
+#endif
+#ifndef PPTP_PORT
+#define PPTP_PORT 1723
+#endif
+#ifndef NFS_PORT
+#define NFS_PORT 2049
+#endif
+#ifndef OPENFLOW_PORT_OLD
+#define OPENFLOW_PORT_OLD 6633
+#endif
+#ifndef OPENFLOW_PORT_IANA
+#define OPENFLOW_PORT_IANA 6653
+#endif
+#ifndef HTTP_PORT_ALT
+#define HTTP_PORT_ALT 8080
+#endif
+#ifndef RTSP_PORT_ALT
+#define RTSP_PORT_ALT 8554
+#endif
+#ifndef BEEP_PORT
+#define BEEP_PORT 10288
+#endif
+#ifndef REDIS_PORT
+#define REDIS_PORT 6379
+#endif
diff -uNr tcpdump-tcpdump-4.99.4/print-udp.c tcpdump-for-stellar/print-udp.c
--- tcpdump-tcpdump-4.99.4/print-udp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-udp.c 2024-10-30 17:34:05.631498702 +0800
@@ -20,109 +20,118 @@
*/
/* \summary: UDP printer */
-
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-
#include "netdissect-stdinc.h"
-
#include "netdissect.h"
#include "addrtoname.h"
#include "extract.h"
#include "appletalk.h"
-
-#include "udp.h"
-
-#include "ip.h"
-#include "ip6.h"
+#include "tcpdump_ip.h"
+#include "tcpdump_ip6.h"
#include "ipproto.h"
#include "rpc_auth.h"
#include "rpc_msg.h"
-
#include "nfs.h"
+#include "print-udp.h"
-
-struct rtcphdr {
- nd_uint16_t rh_flags; /* T:2 P:1 CNT:5 PT:8 */
- nd_uint16_t rh_len; /* length of message (in words) */
- nd_uint32_t rh_ssrc; /* synchronization src id */
+struct rtcphdr
+{
+ nd_uint16_t rh_flags; /* T:2 P:1 CNT:5 PT:8 */
+ nd_uint16_t rh_len; /* length of message (in words) */
+ nd_uint32_t rh_ssrc; /* synchronization src id */
};
-typedef struct {
- nd_uint32_t upper; /* more significant 32 bits */
- nd_uint32_t lower; /* less significant 32 bits */
+typedef struct
+{
+ nd_uint32_t upper; /* more significant 32 bits */
+ nd_uint32_t lower; /* less significant 32 bits */
} ntp64;
/*
* Sender report.
*/
-struct rtcp_sr {
- ntp64 sr_ntp; /* 64-bit ntp timestamp */
- nd_uint32_t sr_ts; /* reference media timestamp */
- nd_uint32_t sr_np; /* no. packets sent */
- nd_uint32_t sr_nb; /* no. bytes sent */
+struct rtcp_sr
+{
+ ntp64 sr_ntp; /* 64-bit ntp timestamp */
+ nd_uint32_t sr_ts; /* reference media timestamp */
+ nd_uint32_t sr_np; /* no. packets sent */
+ nd_uint32_t sr_nb; /* no. bytes sent */
};
/*
* Receiver report.
* Time stamps are middle 32-bits of ntp timestamp.
*/
-struct rtcp_rr {
- nd_uint32_t rr_srcid; /* sender being reported */
- nd_uint32_t rr_nl; /* no. packets lost */
- nd_uint32_t rr_ls; /* extended last seq number received */
- nd_uint32_t rr_dv; /* jitter (delay variance) */
- nd_uint32_t rr_lsr; /* orig. ts from last rr from this src */
- nd_uint32_t rr_dlsr; /* time from recpt of last rr to xmit time */
+struct rtcp_rr
+{
+ nd_uint32_t rr_srcid; /* sender being reported */
+ nd_uint32_t rr_nl; /* no. packets lost */
+ nd_uint32_t rr_ls; /* extended last seq number received */
+ nd_uint32_t rr_dv; /* jitter (delay variance) */
+ nd_uint32_t rr_lsr; /* orig. ts from last rr from this src */
+ nd_uint32_t rr_dlsr; /* time from recpt of last rr to xmit time */
};
/*XXX*/
-#define RTCP_PT_SR 200
-#define RTCP_PT_RR 201
-#define RTCP_PT_SDES 202
-#define RTCP_SDES_CNAME 1
-#define RTCP_SDES_NAME 2
-#define RTCP_SDES_EMAIL 3
-#define RTCP_SDES_PHONE 4
-#define RTCP_SDES_LOC 5
-#define RTCP_SDES_TOOL 6
-#define RTCP_SDES_NOTE 7
-#define RTCP_SDES_PRIV 8
-#define RTCP_PT_BYE 203
-#define RTCP_PT_APP 204
+#define RTCP_PT_SR 200
+#define RTCP_PT_RR 201
+#define RTCP_PT_SDES 202
+#define RTCP_SDES_CNAME 1
+#define RTCP_SDES_NAME 2
+#define RTCP_SDES_EMAIL 3
+#define RTCP_SDES_PHONE 4
+#define RTCP_SDES_LOC 5
+#define RTCP_SDES_TOOL 6
+#define RTCP_SDES_NOTE 7
+#define RTCP_SDES_PRIV 8
+#define RTCP_PT_BYE 203
+#define RTCP_PT_APP 204
+
+#define IS_SRC_OR_DST_UDPPORT(p) (sport == (p) || dport == (p))
+
+static inline int CHECK_IS_SRC_OR_DST_PORT(unsigned short p, unsigned short sport, unsigned short dport)
+{
+ return (sport == (p) || dport == (p));
+}
-static void
-vat_print(netdissect_options *ndo, const u_char *hdr, u_int length)
+// cppcheck-suppress
+static void vat_print(netdissect_options *ndo, const u_char *hdr, u_int length)
{
/* vat/vt audio */
u_int ts;
ndo->ndo_protocol = "vat";
- if (length < 2) {
+ if (length < 2)
+ {
ND_PRINT("udp/va/vat, length %u < 2", length);
return;
}
ts = GET_BE_U_2(hdr);
- if ((ts & 0xf060) != 0) {
+ if ((ts & 0xf060) != 0)
+ {
/* probably vt */
ND_PRINT("udp/vt %u %u / %u",
- length,
- ts & 0x3ff, ts >> 10);
- } else {
+ length,
+ ts & 0x3ff, ts >> 10);
+ }
+ else
+ {
/* probably vat */
uint32_t i0, i1;
- if (length < 8) {
+ if (length < 8)
+ {
ND_PRINT("udp/vat, length %u < 8", length);
return;
}
i0 = GET_BE_U_4(&((const u_int *)hdr)[0]);
i1 = GET_BE_U_4(&((const u_int *)hdr)[1]);
ND_PRINT("udp/vat %u c%u %u%s",
- length - 8,
- i0 & 0xffff,
- i1, i0 & 0x800000? "*" : "");
+ length - 8,
+ i0 & 0xffff,
+ i1, i0 & 0x800000 ? "*" : "");
/* audio format */
if (i0 & 0x1f0000)
ND_PRINT(" f%u", (i0 >> 16) & 0x1f);
@@ -131,17 +140,18 @@
}
}
-static void
-rtp_print(netdissect_options *ndo, const u_char *hdr, u_int len)
+// cppcheck-suppress
+static void rtp_print(netdissect_options *ndo, const u_char *hdr, u_int len)
{
/* rtp v1 or v2 */
const u_int *ip = (const u_int *)hdr;
u_int hasopt, hasext, contype, hasmarker, dlen;
uint32_t i0, i1;
- const char * ptype;
+ const char *ptype;
ndo->ndo_protocol = "rtp";
- if (len < 8) {
+ if (len < 8)
+ {
ND_PRINT("udp/rtp, length %u < 8", len);
return;
}
@@ -153,15 +163,19 @@
len -= 2;
hasopt = 0;
hasext = 0;
- if ((i0 >> 30) == 1) {
+ if ((i0 >> 30) == 1)
+ {
/* rtp v1 - draft-ietf-avt-rtp-04 */
hasopt = i0 & 0x800000;
contype = (i0 >> 16) & 0x3f;
hasmarker = i0 & 0x400000;
ptype = "rtpv1";
- } else {
+ }
+ else
+ {
/* rtp v2 - RFC 3550 */
- if (dlen < 4) {
+ if (dlen < 4)
+ {
ND_PRINT("udp/rtp, length %u < 12", dlen + 8);
return;
}
@@ -174,21 +188,25 @@
len -= 1;
}
ND_PRINT("udp/%s %u c%u %s%s %u %u",
- ptype,
- dlen,
- contype,
- (hasopt || hasext)? "+" : "",
- hasmarker? "*" : "",
- i0 & 0xffff,
- i1);
- if (ndo->ndo_vflag) {
+ ptype,
+ dlen,
+ contype,
+ (hasopt || hasext) ? "+" : "",
+ hasmarker ? "*" : "",
+ i0 & 0xffff,
+ i1);
+ if (ndo->ndo_vflag)
+ {
ND_PRINT(" %u", GET_BE_U_4(&((const u_int *)hdr)[2]));
- if (hasopt) {
+ if (hasopt)
+ {
u_int i2, optlen;
- do {
+ do
+ {
i2 = GET_BE_U_4(ip);
optlen = (i2 >> 16) & 0xff;
- if (optlen == 0 || optlen > len) {
+ if (optlen == 0 || optlen > len)
+ {
ND_PRINT(" !opt");
return;
}
@@ -196,11 +214,13 @@
len -= optlen;
} while ((int)i2 >= 0);
}
- if (hasext) {
+ if (hasext)
+ {
u_int i2, extlen;
i2 = GET_BE_U_4(ip);
extlen = (i2 & 0xffff) + 1;
- if (extlen > len) {
+ if (extlen > len)
+ {
ND_PRINT(" !ext");
return;
}
@@ -211,8 +231,8 @@
}
}
-static const u_char *
-rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep)
+// cppcheck-suppress
+static const u_char *rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep)
{
/* rtp v2 control (rtcp) */
const struct rtcp_rr *rr = 0;
@@ -230,7 +250,8 @@
len = (GET_BE_U_2(rh->rh_len) + 1) * 4;
flags = GET_BE_U_2(rh->rh_flags);
cnt = (flags >> 8) & 0x1f;
- switch (flags & 0xff) {
+ switch (flags & 0xff)
+ {
case RTCP_PT_SR:
sr = (const struct rtcp_sr *)(rh + 1);
ND_PRINT(" sr");
@@ -242,10 +263,10 @@
goto trunc;
ND_TCHECK_SIZE(sr);
ts = (double)(GET_BE_U_4(sr->sr_ntp.upper)) +
- ((double)(GET_BE_U_4(sr->sr_ntp.lower)) /
- FMAXINT);
+ ((double)(GET_BE_U_4(sr->sr_ntp.lower)) /
+ FMAXINT);
ND_PRINT(" @%.2f %u %up %ub", ts, GET_BE_U_4(sr->sr_ts),
- GET_BE_U_4(sr->sr_np), GET_BE_U_4(sr->sr_nb));
+ GET_BE_U_4(sr->sr_np), GET_BE_U_4(sr->sr_nb));
rr = (const struct rtcp_rr *)(sr + 1);
break;
case RTCP_PT_RR:
@@ -275,7 +296,8 @@
}
if (cnt > 1)
ND_PRINT(" c%u", cnt);
- while (cnt != 0) {
+ while (cnt != 0)
+ {
if ((const u_char *)(rr + 1) > ep)
goto trunc;
ND_TCHECK_SIZE(rr);
@@ -284,9 +306,9 @@
ts = (double)(GET_BE_U_4(rr->rr_lsr)) / 65536.;
dts = (double)(GET_BE_U_4(rr->rr_dlsr)) / 65536.;
ND_PRINT(" %ul %us %uj @%.2f+%.2f",
- GET_BE_U_4(rr->rr_nl) & 0x00ffffff,
- GET_BE_U_4(rr->rr_ls),
- GET_BE_U_4(rr->rr_dv), ts, dts);
+ GET_BE_U_4(rr->rr_nl) & 0x00ffffff,
+ GET_BE_U_4(rr->rr_ls),
+ GET_BE_U_4(rr->rr_dv), ts, dts);
cnt--;
}
return (hdr + len);
@@ -296,94 +318,112 @@
return ep;
}
-static uint16_t udp_cksum(netdissect_options *ndo, const struct ip *ip,
- const struct udphdr *up,
- u_int len)
+// cppcheck-suppress
+static uint16_t udp_cksum(netdissect_options *ndo, const struct tcpdump_ip *ip,
+ const struct udphdr *up,
+ u_int len)
{
return nextproto4_cksum(ndo, ip, (const uint8_t *)(const void *)up, len, len,
- IPPROTO_UDP);
+ IPPROTO_UDP);
}
-
-static uint16_t udp6_cksum(netdissect_options *ndo, const struct ip6_hdr *ip6,
- const struct udphdr *up, u_int len)
+// cppcheck-suppress
+static uint16_t udp6_cksum(netdissect_options *ndo, const struct tcpdump_ip6_hdr *ip6,
+ const struct udphdr *up, u_int len)
{
return nextproto6_cksum(ndo, ip6, (const uint8_t *)(const void *)up, len, len,
- IPPROTO_UDP);
+ IPPROTO_UDP);
}
-static void
-udpipaddr_print(netdissect_options *ndo, const struct ip *ip, int sport, int dport)
+// cppcheck-suppress
+static void udpipaddr_print(netdissect_options *ndo, const struct tcpdump_ip *ip, int sport, int dport)
{
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip6_hdr *ip6;
if (IP_V(ip) == 6)
- ip6 = (const struct ip6_hdr *)ip;
+ ip6 = (const struct tcpdump_ip6_hdr *)ip;
else
ip6 = NULL;
- if (ip6) {
- if (GET_U_1(ip6->ip6_nxt) == IPPROTO_UDP) {
- if (sport == -1) {
+ if (ip6)
+ {
+ if (GET_U_1(ip6->ip6_nxt) == IPPROTO_UDP)
+ {
+ if (sport == -1)
+ {
ND_PRINT("%s > %s: ",
- GET_IP6ADDR_STRING(ip6->ip6_src),
- GET_IP6ADDR_STRING(ip6->ip6_dst));
- } else {
+ GET_IP6ADDR_STRING(ip6->ip6_src),
+ GET_IP6ADDR_STRING(ip6->ip6_dst));
+ }
+ else
+ {
ND_PRINT("%s.%s > %s.%s: ",
- GET_IP6ADDR_STRING(ip6->ip6_src),
- udpport_string(ndo, (uint16_t)sport),
- GET_IP6ADDR_STRING(ip6->ip6_dst),
- udpport_string(ndo, (uint16_t)dport));
+ GET_IP6ADDR_STRING(ip6->ip6_src),
+ udpport_string(ndo, (uint16_t)sport),
+ GET_IP6ADDR_STRING(ip6->ip6_dst),
+ udpport_string(ndo, (uint16_t)dport));
}
- } else {
- if (sport != -1) {
+ }
+ else
+ {
+ if (sport != -1)
+ {
ND_PRINT("%s > %s: ",
- udpport_string(ndo, (uint16_t)sport),
- udpport_string(ndo, (uint16_t)dport));
+ udpport_string(ndo, (uint16_t)sport),
+ udpport_string(ndo, (uint16_t)dport));
}
}
- } else {
- if (GET_U_1(ip->ip_p) == IPPROTO_UDP) {
- if (sport == -1) {
+ }
+ else
+ {
+ if (GET_U_1(ip->ip_p) == IPPROTO_UDP)
+ {
+ if (sport == -1)
+ {
ND_PRINT("%s > %s: ",
- GET_IPADDR_STRING(ip->ip_src),
- GET_IPADDR_STRING(ip->ip_dst));
- } else {
+ GET_IPADDR_STRING(ip->ip_src),
+ GET_IPADDR_STRING(ip->ip_dst));
+ }
+ else
+ {
ND_PRINT("%s.%s > %s.%s: ",
- GET_IPADDR_STRING(ip->ip_src),
- udpport_string(ndo, (uint16_t)sport),
- GET_IPADDR_STRING(ip->ip_dst),
- udpport_string(ndo, (uint16_t)dport));
+ GET_IPADDR_STRING(ip->ip_src),
+ udpport_string(ndo, (uint16_t)sport),
+ GET_IPADDR_STRING(ip->ip_dst),
+ udpport_string(ndo, (uint16_t)dport));
}
- } else {
- if (sport != -1) {
+ }
+ else
+ {
+ if (sport != -1)
+ {
ND_PRINT("%s > %s: ",
- udpport_string(ndo, (uint16_t)sport),
- udpport_string(ndo, (uint16_t)dport));
+ udpport_string(ndo, (uint16_t)sport),
+ udpport_string(ndo, (uint16_t)dport));
}
}
}
}
-void
-udp_print(netdissect_options *ndo, const u_char *bp, u_int length,
- const u_char *bp2, int fragmented, u_int ttl_hl)
+// cppcheck-suppress
+void udp_print(netdissect_options *ndo, const u_char *bp, u_int length, const u_char *bp2, int fragmented, u_int ttl_hl)
{
const struct udphdr *up;
- const struct ip *ip;
+ const struct tcpdump_ip *ip;
const u_char *cp;
const u_char *ep = ndo->ndo_snapend;
uint16_t sport, dport;
u_int ulen;
- const struct ip6_hdr *ip6;
+ const struct tcpdump_ip6_hdr *ip6;
ndo->ndo_protocol = "udp";
up = (const struct udphdr *)bp;
- ip = (const struct ip *)bp2;
+ ip = (const struct tcpdump_ip *)bp2;
if (IP_V(ip) == 6)
- ip6 = (const struct ip6_hdr *)bp2;
+ ip6 = (const struct tcpdump_ip6_hdr *)bp2;
else
ip6 = NULL;
- if (!ND_TTEST_2(up->uh_dport)) {
+ if (!ND_TTEST_2(up->uh_dport))
+ {
udpipaddr_print(ndo, ip, -1, -1);
goto trunc;
}
@@ -391,12 +431,14 @@
sport = GET_BE_U_2(up->uh_sport);
dport = GET_BE_U_2(up->uh_dport);
- if (length < sizeof(struct udphdr)) {
+ if (length < sizeof(struct udphdr))
+ {
udpipaddr_print(ndo, ip, sport, dport);
ND_PRINT("truncated-udp %u", length);
return;
}
- if (!ND_TTEST_2(up->uh_ulen)) {
+ if (!ND_TTEST_2(up->uh_ulen))
+ {
udpipaddr_print(ndo, ip, sport, dport);
goto trunc;
}
@@ -408,7 +450,8 @@
*/
if (ulen == 0 && length > 65535)
ulen = length;
- if (ulen < sizeof(struct udphdr)) {
+ if (ulen < sizeof(struct udphdr))
+ {
udpipaddr_print(ndo, ip, sport, dport);
ND_PRINT("truncated-udplength %u", ulen);
return;
@@ -419,16 +462,19 @@
length = ulen;
cp = (const u_char *)(up + 1);
- if (cp > ndo->ndo_snapend) {
+ if (cp > ndo->ndo_snapend)
+ {
udpipaddr_print(ndo, ip, sport, dport);
goto trunc;
}
- if (ndo->ndo_packettype) {
+ if (ndo->ndo_packettype)
+ {
const struct sunrpc_msg *rp;
enum sunrpc_msg_type direction;
- switch (ndo->ndo_packettype) {
+ switch (ndo->ndo_packettype)
+ {
case PT_VAT:
udpipaddr_print(ndo, ip, sport, dport);
@@ -442,13 +488,13 @@
case PT_RPC:
rp = (const struct sunrpc_msg *)cp;
- direction = (enum sunrpc_msg_type) GET_BE_U_4(rp->rm_direction);
+ direction = (enum sunrpc_msg_type)GET_BE_U_4(rp->rm_direction);
if (direction == SUNRPC_CALL)
sunrpc_print(ndo, (const u_char *)rp, length,
- (const u_char *)ip);
+ (const u_char *)ip);
else
nfsreply_print(ndo, (const u_char *)rp, length,
- (const u_char *)ip); /*XXX*/
+ (const u_char *)ip); /*XXX*/
break;
case PT_RTP:
@@ -480,7 +526,7 @@
case PT_AODV:
udpipaddr_print(ndo, ip, sport, dport);
aodv_print(ndo, cp, length,
- ip6 != NULL);
+ ip6 != NULL);
break;
case PT_RADIUS:
@@ -520,29 +566,34 @@
}
udpipaddr_print(ndo, ip, sport, dport);
- if (!ndo->ndo_qflag) {
+ if (!ndo->ndo_qflag)
+ {
const struct sunrpc_msg *rp;
enum sunrpc_msg_type direction;
rp = (const struct sunrpc_msg *)cp;
- if (ND_TTEST_4(rp->rm_direction)) {
- direction = (enum sunrpc_msg_type) GET_BE_U_4(rp->rm_direction);
- if (dport == NFS_PORT && direction == SUNRPC_CALL) {
+ if (ND_TTEST_4(rp->rm_direction))
+ {
+ direction = (enum sunrpc_msg_type)GET_BE_U_4(rp->rm_direction);
+ if (dport == NFS_PORT && direction == SUNRPC_CALL)
+ {
ND_PRINT("NFS request xid %u ",
- GET_BE_U_4(rp->rm_xid));
+ GET_BE_U_4(rp->rm_xid));
nfsreq_noaddr_print(ndo, (const u_char *)rp, length,
- (const u_char *)ip);
+ (const u_char *)ip);
return;
}
- if (sport == NFS_PORT && direction == SUNRPC_REPLY) {
+ if (sport == NFS_PORT && direction == SUNRPC_REPLY)
+ {
ND_PRINT("NFS reply xid %u ",
- GET_BE_U_4(rp->rm_xid));
+ GET_BE_U_4(rp->rm_xid));
nfsreply_noaddr_print(ndo, (const u_char *)rp, length,
- (const u_char *)ip);
+ (const u_char *)ip);
return;
}
#ifdef notdef
- if (dport == SUNRPC_PORT && direction == SUNRPC_CALL) {
+ if (dport == 111 /*TCPDUMP_SUNRPC_PORT*/ && direction == SUNRPC_CALL)
+ {
sunrpc_print((const u_char *)rp, length, (const u_char *)ip);
return;
}
@@ -550,7 +601,8 @@
}
}
- if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented) {
+ if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented)
+ {
/* Check the checksum, if possible. */
uint16_t sum, udp_sum;
@@ -558,181 +610,353 @@
* XXX - do this even if vflag == 1?
* TCP does, and we do so for UDP-over-IPv6.
*/
- if (IP_V(ip) == 4 && (ndo->ndo_vflag > 1)) {
+ if (IP_V(ip) == 4 && (ndo->ndo_vflag > 1))
+ {
udp_sum = GET_BE_U_2(up->uh_sum);
- if (udp_sum == 0) {
+ if (udp_sum == 0)
+ {
ND_PRINT("[no cksum] ");
- } else if (ND_TTEST_LEN(cp, length)) {
+ }
+ else if (ND_TTEST_LEN(cp, length))
+ {
sum = udp_cksum(ndo, ip, up, length + sizeof(struct udphdr));
- if (sum != 0) {
+ if (sum != 0)
+ {
ND_PRINT("[bad udp cksum 0x%04x -> 0x%04x!] ",
- udp_sum,
- in_cksum_shouldbe(udp_sum, sum));
- } else
+ udp_sum,
+ in_cksum_shouldbe(udp_sum, sum));
+ }
+ else
ND_PRINT("[udp sum ok] ");
}
}
- else if (IP_V(ip) == 6) {
+ else if (IP_V(ip) == 6)
+ {
/* for IPv6, UDP checksum is mandatory */
- if (ND_TTEST_LEN(cp, length)) {
+ if (ND_TTEST_LEN(cp, length))
+ {
sum = udp6_cksum(ndo, ip6, up, length + sizeof(struct udphdr));
udp_sum = GET_BE_U_2(up->uh_sum);
- if (sum != 0) {
+ if (sum != 0)
+ {
ND_PRINT("[bad udp cksum 0x%04x -> 0x%04x!] ",
- udp_sum,
- in_cksum_shouldbe(udp_sum, sum));
- } else
+ udp_sum,
+ in_cksum_shouldbe(udp_sum, sum));
+ }
+ else
ND_PRINT("[udp sum ok] ");
}
}
}
- if (!ndo->ndo_qflag) {
- if (IS_SRC_OR_DST_PORT(NAMESERVER_PORT))
+ if (!ndo->ndo_qflag)
+ {
+ if (CHECK_IS_SRC_OR_DST_PORT(53 /*TCPDUMP_NAMESERVER_PORT*/, sport, dport))
+ {
/* over_tcp: FALSE, is_mdns: FALSE */
domain_print(ndo, cp, length, FALSE, FALSE);
- else if (IS_SRC_OR_DST_PORT(MULTICASTDNS_PORT))
+ return;
+ }
+
+ if (CHECK_IS_SRC_OR_DST_PORT(5353 /*TCPDUMP_MULTICASTDNS_PORT*/, sport, dport))
+ {
/* over_tcp: FALSE, is_mdns: TRUE */
domain_print(ndo, cp, length, FALSE, TRUE);
- else if (IS_SRC_OR_DST_PORT(TIMED_PORT))
+ return;
+ }
+
+ if (CHECK_IS_SRC_OR_DST_PORT(525 /*TCPDUMP_TIMED_PORT*/, sport, dport))
+ {
timed_print(ndo, (const u_char *)cp);
- else if (IS_SRC_OR_DST_PORT(TFTP_PORT))
+ return;
+ }
+ if (CHECK_IS_SRC_OR_DST_PORT(69 /*TCPDUMP_TFTP_PORT*/, sport, dport))
+ {
tftp_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(BOOTPC_PORT) || IS_SRC_OR_DST_PORT(BOOTPS_PORT))
+ return;
+ }
+ if (CHECK_IS_SRC_OR_DST_PORT(68 /*TCPDUMP_BOOTPC_PORT*/, sport, dport) || CHECK_IS_SRC_OR_DST_PORT(67 /*TCPDUMP_BOOTPS_PORT*/, sport, dport))
+ {
bootp_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(RIP_PORT))
+ return;
+ }
+ if (CHECK_IS_SRC_OR_DST_PORT(520 /*TCPDUMP_RIP_PORT*/, sport, dport))
+ {
rip_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(AODV_PORT))
- aodv_print(ndo, cp, length,
- ip6 != NULL);
- else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT))
- isakmp_print(ndo, cp, length, bp2);
- else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_NATT))
- isakmp_rfc3948_print(ndo, cp, length, bp2, IP_V(ip), fragmented, ttl_hl);
- else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER1) || IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER2))
+ return;
+ }
+ if (CHECK_IS_SRC_OR_DST_PORT(654 /*AODV_PORT*/, sport, dport))
+ {
+ aodv_print(ndo, cp, length, ip6 != NULL);
+ return;
+ }
+
+ if (CHECK_IS_SRC_OR_DST_PORT(500 /*TCPDUMP_ISAKMP_PORT*/, sport, dport))
+ {
+ isakmp_print(ndo, cp, length, bp2);
+ return;
+ }
+ if (CHECK_IS_SRC_OR_DST_PORT(4500 /*TCPDUMP_ISAKMP_PORT_NATT*/, sport, dport))
+ {
+ isakmp_rfc3948_print(ndo, cp, length, bp2, IP_V(ip), fragmented, ttl_hl);
+ return;
+ }
+ if (CHECK_IS_SRC_OR_DST_PORT(7500 /*TCPDUMP_ISAKMP_PORT_USER1*/, sport, dport) || CHECK_IS_SRC_OR_DST_PORT(8500 /*TCPDUMP_ISAKMP_PORT_USER2*/, sport, dport))
+ {
isakmp_print(ndo, cp, length, bp2);
- else if (IS_SRC_OR_DST_PORT(SNMP_PORT) || IS_SRC_OR_DST_PORT(SNMPTRAP_PORT))
+ return;
+ }
+ if (CHECK_IS_SRC_OR_DST_PORT(161 /*TCPDUMP_SNMP_PORT*/, sport, dport) || CHECK_IS_SRC_OR_DST_PORT(162 /*TCPDUMP_SNMPTRAP_PORT*/, sport, dport))
+ {
snmp_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(NTP_PORT))
+ return;
+ }
+ if (CHECK_IS_SRC_OR_DST_PORT(123 /*TCPDUMP_NTP_PORT*/, sport, dport))
+ {
ntp_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(KERBEROS_PORT) || IS_SRC_OR_DST_PORT(KERBEROS_SEC_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(88 /*TCPDUMP_KERBEROS_PORT*/) || CHECK_IS_SRC_OR_DST_PORT(750 /*TCPDUMP_KERBEROS_SEC_PORT*/, sport, dport))
+ {
krb_print(ndo, (const u_char *)cp);
- else if (IS_SRC_OR_DST_PORT(L2TP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(1701 /*TCPDUMP_L2TP_PORT*/))
+ {
l2tp_print(ndo, cp, length);
+ return;
+ }
#ifdef ENABLE_SMB
- else if (IS_SRC_OR_DST_PORT(NETBIOS_NS_PORT))
+ if (IS_SRC_OR_DST_UDPPORT(137 /*TCPDUMP_NETBIOS_NS_PORT*/))
+ {
nbt_udp137_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(NETBIOS_DGRAM_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(138 /*TCPDUMP_NETBIOS_DGRAM_PORT*/))
+ {
nbt_udp138_print(ndo, cp, length);
+ return;
+ }
#endif
- else if (dport == VAT_PORT)
+
+ if (dport == 3456 /*TCPDUMP_VAT_PORT*/)
+ {
vat_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(ZEPHYR_SRV_PORT) || IS_SRC_OR_DST_PORT(ZEPHYR_CLT_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(2103 /*TCPDUMP_ZEPHYR_SRV_PORT*/) || IS_SRC_OR_DST_UDPPORT(2104 /*ZEPHYR_CLT_PORT*/))
+ {
zephyr_print(ndo, cp, length);
+ return;
+ }
/*
* Since there are 10 possible ports to check, I think
* a <> test would be more efficient
*/
- else if ((sport >= RX_PORT_LOW && sport <= RX_PORT_HIGH) ||
- (dport >= RX_PORT_LOW && dport <= RX_PORT_HIGH))
- rx_print(ndo, cp, length, sport, dport,
- (const u_char *) ip);
- else if (IS_SRC_OR_DST_PORT(RIPNG_PORT))
+ if ((sport >= 7000 /*TCPDUMP_RX_PORT_LOW*/ && sport <= 7009 /*TCPDUMP_RX_PORT_HIGH*/) ||
+ (dport >= 7000 /*TCPDUMP_RX_PORT_LOW*/ && dport <= 7009 /*TCPDUMP_RX_PORT_HIGH*/))
+ {
+ rx_print(ndo, cp, length, sport, dport, (const u_char *)ip);
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(521 /*TCPDUMP_RIPNG_PORT*/))
+ {
ripng_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(DHCP6_SERV_PORT) || IS_SRC_OR_DST_PORT(DHCP6_CLI_PORT))
+ return;
+ }
+
+ if (IS_SRC_OR_DST_UDPPORT(546 /*TCPDUMP_DHCP6_SERV_PORT*/) || IS_SRC_OR_DST_UDPPORT(547 /*TCPDUMP_DHCP6_CLI_PORT*/))
+ {
dhcp6_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(AHCP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(5359 /*TCPDUMP_AHCP_PORT*/))
+ {
ahcp_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(BABEL_PORT) || IS_SRC_OR_DST_PORT(BABEL_PORT_OLD))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(6696 /*TCPDUMP_BABEL_PORT*/) || IS_SRC_OR_DST_UDPPORT(6697 /*TCPDUMP_BABEL_PORT_OLD*/))
+ {
babel_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(HNCP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(8231 /*TCPDUMP_HNCP_PORT*/))
+ {
hncp_print(ndo, cp, length);
+ return;
+ }
/*
* Kludge in test for whiteboard packets.
*/
- else if (dport == WB_PORT)
+ if (dport == 4567 /*TCPDUMP_WB_PORT*/)
+ {
wb_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(CISCO_AUTORP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(496 /*TCPDUMP_CISCO_AUTORP_PORT*/))
+ {
cisco_autorp_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(RADIUS_PORT) ||
- IS_SRC_OR_DST_PORT(RADIUS_NEW_PORT) ||
- IS_SRC_OR_DST_PORT(RADIUS_ACCOUNTING_PORT) ||
- IS_SRC_OR_DST_PORT(RADIUS_NEW_ACCOUNTING_PORT) ||
- IS_SRC_OR_DST_PORT(RADIUS_CISCO_COA_PORT) ||
- IS_SRC_OR_DST_PORT(RADIUS_COA_PORT) )
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(1645 /*TCPDUMP_RADIUS_PORT*/) ||
+ IS_SRC_OR_DST_UDPPORT(1812 /*TCPDUMP_RADIUS_NEW_PORT*/) ||
+ IS_SRC_OR_DST_UDPPORT(1646 /*TCPDUMP_RADIUS_ACCOUNTING_PORT*/) ||
+ IS_SRC_OR_DST_UDPPORT(1813 /*TCPDUMP_RADIUS_NEW_ACCOUNTING_PORT*/) ||
+ IS_SRC_OR_DST_UDPPORT(1700 /*TCPDUMP_RADIUS_CISCO_COA_PORT*/) ||
+ IS_SRC_OR_DST_UDPPORT(3799 /*TCPDUMP_RADIUS_COA_PORT*/))
+ {
radius_print(ndo, cp, length);
- else if (dport == HSRP_PORT)
+ return;
+ }
+ if (dport == 1985 /*TCPDUMP_HSRP_PORT*/)
+ {
hsrp_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(LWRES_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(921 /*TCPDUMP_LWRES_PORT*/))
+ {
lwres_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(LDP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(646 /*TCPDUMP_LDP_PORT*/))
+ {
ldp_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(OLSR_PORT))
- olsr_print(ndo, cp, length,
- (IP_V(ip) == 6) ? 1 : 0);
- else if (IS_SRC_OR_DST_PORT(MPLS_LSP_PING_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(698 /*TCPDUMP_OLSR_PORT*/))
+ {
+ olsr_print(ndo, cp, length, (IP_V(ip) == 6) ? 1 : 0);
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(3503 /*TCPDUMP_MPLS_LSP_PING_PORT*/))
+ {
lspping_print(ndo, cp, length);
- else if (sport == BCM_LI_PORT)
+ return;
+ }
+ if (sport == 49152 /*TCPDUMP_BCM_LI_PORT*/)
+ {
bcm_li_print(ndo, cp, length);
- else if (dport == BFD_CONTROL_PORT ||
- dport == BFD_MULTIHOP_PORT ||
- dport == BFD_LAG_PORT ||
- dport == BFD_ECHO_PORT )
+ return;
+ }
+
+ if (dport == 3784 /*TCPDUMP_BFD_CONTROL_PORT*/ ||
+ dport == 4784 /*TCPDUMP_BFD_MULTIHOP_PORT*/ ||
+ dport == 6784 /*TCPDUMP_BFD_LAG_PORT*/ ||
+ dport == 3785 /*TCPDUMP_BFD_ECHO_PORT*/)
+ {
bfd_print(ndo, cp, length, dport);
- else if (IS_SRC_OR_DST_PORT(LMP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(701 /*TCPDUMP_LMP_PORT*/))
+ {
lmp_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(VQP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(1589 /*TCPDUMP_VQP_PORT*/))
+ {
vqp_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(SFLOW_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(6343 /*TCPDUMP_SFLOW_PORT*/))
+ {
sflow_print(ndo, cp, length);
- else if (dport == LWAPP_CONTROL_PORT)
+ return;
+ }
+ if (dport == 12223 /*TCPDUMP_LWAPP_CONTROL_PORT*/)
+ {
lwapp_control_print(ndo, cp, length, 1);
- else if (sport == LWAPP_CONTROL_PORT)
+ return;
+ }
+ if (sport == 12223 /*TCPDUMP_LWAPP_CONTROL_PORT*/)
+ {
lwapp_control_print(ndo, cp, length, 0);
- else if (IS_SRC_OR_DST_PORT(LWAPP_DATA_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(12222 /*TCPDUMP_LWAPP_DATA_PORT*/))
+ {
lwapp_data_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(SIP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(5060 /*TCPDUMP_SIP_PORT*/))
+ {
sip_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(SYSLOG_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(514 /*TCPDUMP_SYSLOG_PORT*/))
+ {
syslog_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(OTV_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(8472 /*TCPDUMP_OTV_PORT*/))
+ {
otv_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(VXLAN_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(4789 /*TCPDUMP_VXLAN_PORT*/))
+ {
vxlan_print(ndo, cp, length);
- else if (dport == GENEVE_PORT)
+ return;
+ }
+ if (dport == 6081 /*TCPDUMP_GENEVE_PORT*/)
+ {
geneve_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(LISP_CONTROL_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(4342 /*TCPDUMP_LISP_CONTROL_PORT*/))
+ {
lisp_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(VXLAN_GPE_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(4790 /*TCPDUMP_VXLAN_GPE_PORT*/))
+ {
vxlan_gpe_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(ZEP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(17754 /*TCPDUMP_ZEP_PORT*/))
+ {
zep_print(ndo, cp, length);
- else if (IS_SRC_OR_DST_PORT(MPLS_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(6635 /*TCPDUMP_MPLS_PORT*/))
+ {
mpls_print(ndo, cp, length);
- else if (ND_TTEST_1(((const struct LAP *)cp)->type) &&
- GET_U_1(((const struct LAP *)cp)->type) == lapDDP &&
- (atalk_port(sport) || atalk_port(dport))) {
+ return;
+ }
+ if (ND_TTEST_1(((const struct LAP *)cp)->type) &&
+ GET_U_1(((const struct LAP *)cp)->type) == lapDDP &&
+ (atalk_port(sport) || atalk_port(dport)))
+ {
if (ndo->ndo_vflag)
ND_PRINT("kip ");
llap_print(ndo, cp, length);
- } else if (IS_SRC_OR_DST_PORT(PTP_EVENT_PORT) ||
- IS_SRC_OR_DST_PORT(PTP_GENERAL_PORT)) {
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(319 /*TCPDUMP_PTP_EVENT_PORT*/) ||
+ IS_SRC_OR_DST_UDPPORT(320 /*TCPDUMP_PTP_GENERAL_PORT*/))
+
+ {
ptp_print(ndo, cp, length);
- } else if (IS_SRC_OR_DST_PORT(SOMEIP_PORT))
+ return;
+ }
+ if (IS_SRC_OR_DST_UDPPORT(30490 /*TCPDUMP_SOMEIP_PORT*/))
someip_print(ndo, cp, length);
- else {
+ else
+ {
if (ulen > length && !fragmented)
ND_PRINT("UDP, bad length %u > %u",
- ulen, length);
+ ulen, length);
else
ND_PRINT("UDP, length %u", ulen);
}
- } else {
+ }
+
+ else
+ {
if (ulen > length && !fragmented)
ND_PRINT("UDP, bad length %u > %u",
- ulen, length);
+ ulen, length);
else
ND_PRINT("UDP, length %u", ulen);
}
diff -uNr tcpdump-tcpdump-4.99.4/print-udp.h tcpdump-for-stellar/print-udp.h
--- tcpdump-tcpdump-4.99.4/print-udp.h 1970-01-01 08:00:00.000000000 +0800
+++ tcpdump-for-stellar/print-udp.h 2024-10-30 17:34:06.265498697 +0800
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)udp.h 8.1 (Berkeley) 6/10/93
+ */
+
+#pragma once
+#include "netdissect.h"
+/*
+ * Udp protocol header.
+ * Per RFC 768, September, 1981.
+ */
+struct udphdr
+{
+ nd_uint16_t uh_sport; /* source port */
+ nd_uint16_t uh_dport; /* destination port */
+ nd_uint16_t uh_ulen; /* udp length */
+ nd_uint16_t uh_sum; /* udp checksum */
+};
+
+// #define TCPDUMP_NAMESERVER_PORT 53
+
+// #define TCPDUMP_BOOTPS_PORT 67 /* RFC951 */
+
+// #define TCPDUMP_BOOTPC_PORT 68 /* RFC951 */
+
+// #define TCPDUMP_TFTP_PORT 69 /*XXX*/
+
+// #define TCPDUMP_KERBEROS_PORT 88 /*XXX*/
+
+// #define TCPDUMP_SUNRPC_PORT 111 /*XXX*/
+
+// #define TCPDUMP_NTP_PORT 123 /*XXX*/
+
+// #define TCPDUMP_NETBIOS_NS_PORT 137 /* RFC 1001, RFC 1002 */
+
+// #define TCPDUMP_NETBIOS_DGRAM_PORT 138 /* RFC 1001, RFC 1002 */
+
+// #define TCPDUMP_SNMP_PORT 161 /*XXX*/
+
+// #define TCPDUMP_SNMPTRAP_PORT 162 /*XXX*/
+
+// #define TCPDUMP_PTP_EVENT_PORT 319 /* IANA */
+
+// #define TCPDUMP_PTP_GENERAL_PORT 320 /* IANA */
+
+// #define TCPDUMP_CISCO_AUTORP_PORT 496 /*XXX*/
+
+// #define TCPDUMP_ISAKMP_PORT 500 /*XXX*/
+
+// #define TCPDUMP_SYSLOG_PORT 514 /* rfc3164 */
+
+// #define TCPDUMP_RIP_PORT 520 /*XXX*/
+
+// #define TCPDUMP_RIPNG_PORT 521 /* RFC 2080 */
+
+// #define TCPDUMP_TIMED_PORT 525 /*XXX*/
+
+// #define TCPDUMP_DHCP6_SERV_PORT 546 /*XXX*/
+
+// #define TCPDUMP_DHCP6_CLI_PORT 547 /*XXX*/
+
+// #define TCPDUMP_LDP_PORT 646
+
+// #define TCPDUMP_AQDV_PORT 654 /*XXX*/
+
+// #define TCPDUMP_OLSR_PORT 698 /* rfc3626 */
+
+// #define TCPDUMP_LMP_PORT 701 /* rfc4204 */
+
+// #define TCPDUMP_KERBEROS_SEC_PORT 750 /*XXX - Kerberos v4 */
+
+// #define TCPDUMP_LWRES_PORT 921 /*XXX*/
+
+// #define TCPDUMP_VQP_PORT 1589 /*XXX*/
+
+// #define TCPDUMP_RADIUS_PORT 1645 /*XXX*/
+
+// #define TCPDUMP_RADIUS_ACCOUNTING_PORT 1646
+
+// #define TCPDUMP_RADIUS_CISCO_COA_PORT 1700
+
+// #define TCPDUMP_L2TP_PORT 1701 /*XXX*/
+
+// #define TCPDUMP_RADIUS_NEW_PORT 1812 /*XXX*/
+
+// #define TCPDUMP_RADIUS_NEW_ACCOUNTING_PORT 1813
+
+// #define TCPDUMP_HSRP_PORT 1985 /*XXX*/
+
+// #define TCPDUMP_ZEPHYR_SRV_PORT 2103 /*XXX*/
+
+// #define TCPDUMP_ZEPHYR_CLI_PORT 2104 /*XXX*/
+
+// #define TCPDUMP_VAT_PORT 3456 /*XXX*/
+
+// #define TCPDUMP_MPLS_LSP_PING_PORT 3503 /* draft-ietf-mpls-lsp-ping-02.txt */
+
+// #define TCPDUMP_BCM_LI_PORT 49152 /* SDK default */
+
+#define TCPDUMP_BFD_CONTROL_PORT 3784 /* RFC 5881 */
+
+#define TCPDUMP_BFD_ECHO_PORT 3785 /* RFC 5881 */
+
+// #define TCPDUMP_RADIUS_COA_PORT 3799 /* RFC 5176 */
+
+// #define TCPDUMP_LISP_CONTROL_PORT 4342 /* RFC 6830 */
+
+// #define TCPDUMP_ISAKMP_PORT_NATT 4500 /* rfc3948 */
+
+// #define TCPDUMP_WB_PORT 4567
+
+#define TCPDUMP_BFD_MULTIHOP_PORT 4784 /* RFC 5883 */
+
+// #define TCPDUMP_VXLAN_PORT 4789 /* RFC 7348 */
+
+// #define TCPDUMP_VXLAN_GPE_PORT 4790 /* draft-ietf-nvo3-vxlan-gpe-01 */
+
+// #define TCPDUMP_SIP_PORT 5060
+
+// #define TCPDUMP_MULTICASTDNS_PORT 5353 /* RFC 6762 */
+
+// #define TCPDUMP_AHCP_PORT 5359 /* draft-chroboczek-ahcp-00 */
+
+// #define TCPDUMP_GENEVE_PORT 6081 /* draft-gross-geneve-02 */
+
+// #define TCPDUMP_SFLOW_PORT 6343 /* https://sflow.org/developers/specifications.php */
+
+// #define TCPDUMP_MPLS_PORT 6635 /* RFC 7510 */
+
+// #define TCPDUMP_BABEL_PORT 6696 /* RFC 6126 errata */
+
+// #define TCPDUMP_BABEL_PORT_OLD 6697 /* RFC 6126 */
+
+#define TCPDUMP_BFD_LAG_PORT 6784 /* RFC 7310 */
+
+// #define TCPDUMP_RX_PORT_LOW 7000 /*XXX*/
+
+// #define TCPDUMP_RX_PORT_HIGH 7009 /*XXX*/
+
+// #define TCPDUMP_ISAKMP_PORT_USER1 7500 /*XXX - nonstandard*/
+
+// #define TCPDUMP_HNCP_PORT 8231 /* RFC 7788 */
+
+// #define TCPDUMP_OTV_PORT 8472 /* draft-hasmit-otv-04 */
+
+// #define TCPDUMP_ISAKMP_PORT_USER2 8500 /*XXX - nonstandard*/
+
+// #define TCPDUMP_LWAPP_DATA_PORT 12222 /* RFC 5412 */
+
+// #define TCPDUMP_LWAPP_CONTROL_PORT 12223 /* RFC 5412 */
+
+// #define TCPDUMP_ZEP_PORT 17754 /* XXX */
+
+// #define TCPDUMP_SOMEIP_PORT 30490 /* https://www.autosar.org/standards/foundation */
diff -uNr tcpdump-tcpdump-4.99.4/print-vrrp.c tcpdump-for-stellar/print-vrrp.c
--- tcpdump-tcpdump-4.99.4/print-vrrp.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/print-vrrp.c 2024-10-30 17:34:05.631498702 +0800
@@ -35,7 +35,7 @@
#include "extract.h"
#include "addrtoname.h"
-#include "ip.h"
+#include "tcpdump_ip.h"
#include "ipproto.h"
/*
* RFC 2338 (VRRP v2):
@@ -151,10 +151,10 @@
uint16_t cksum;
if (ver == 4)
- cksum = nextproto4_cksum(ndo, (const struct ip *)bp2, bp,
+ cksum = nextproto4_cksum(ndo, (const struct tcpdump_ip *)bp2, bp,
len, len, IPPROTO_VRRP);
else
- cksum = nextproto6_cksum(ndo, (const struct ip6_hdr *)bp2, bp,
+ cksum = nextproto6_cksum(ndo, (const struct tcpdump_ip6_hdr *)bp2, bp,
len, len, IPPROTO_VRRP);
if (cksum)
ND_PRINT(", (bad vrrp cksum %x)",
diff -uNr tcpdump-tcpdump-4.99.4/stellar_dump_ctrl_link.c tcpdump-for-stellar/stellar_dump_ctrl_link.c
--- tcpdump-tcpdump-4.99.4/stellar_dump_ctrl_link.c 1970-01-01 08:00:00.000000000 +0800
+++ tcpdump-for-stellar/stellar_dump_ctrl_link.c 2024-10-30 17:34:06.265498697 +0800
@@ -0,0 +1,266 @@
+#include "stellar_dump.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <pcap/pcap.h>
+#include <sys/types.h> /* See NOTES */
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <event2/event.h>
+#include <event2/listener.h>
+#include <event2/bufferevent.h>
+#include <event2/buffer.h>
+#include <event2/thread.h>
+#include <event2/http.h>
+
+struct libevent_http_client
+{
+ struct event_base *base;
+ struct evhttp_connection *conn;
+ struct evhttp_request *req;
+ uint32_t response_code;
+ char *response_cstr;
+};
+
+static struct libevent_http_client *g_ctrllink_http_client = NULL;
+static pthread_t keepalive_thread_id;
+static volatile int keepalive_running = 0;
+
+static struct libevent_http_client *evhttp_client_new(const char *server_ip, unsigned short server_port_host)
+{
+ struct libevent_http_client *evh_client = (struct libevent_http_client *)calloc(1, sizeof(struct libevent_http_client));
+ evh_client->base = event_base_new();
+ evh_client->conn = evhttp_connection_base_new(evh_client->base, NULL, server_ip, server_port_host);
+ evhttp_connection_set_timeout(evh_client->conn, CTRLLINK_CONNECT_TIMEOUT);
+ return evh_client;
+}
+
+static void evhttp_response_cb(struct evhttp_request *req, void *arg)
+{
+ struct libevent_http_client *evh_client = (struct libevent_http_client *)arg;
+ if (req == NULL)
+ {
+ return;
+ }
+
+ struct evbuffer *input_buffer = evhttp_request_get_input_buffer(req);
+ size_t evbuf_len = evbuffer_get_length(input_buffer);
+ if (NULL == input_buffer || 0 == evbuf_len)
+ {
+ return;
+ }
+ evh_client->response_cstr = (char *)calloc(1, evbuf_len + 1);
+ evbuffer_remove(input_buffer, evh_client->response_cstr, evbuf_len);
+ evh_client->response_code = evhttp_request_get_response_code(req);
+ // terminate event_base_dispatch()
+ event_base_loopbreak(evh_client->base);
+}
+
+static void evhttp_request_error_cb(enum evhttp_request_error errnum, void *arg)
+{
+ (void)arg;
+ (void)errnum;
+ // fprintf(stderr, "ERR monitor connection error: %d\n", errnum);
+ exit(1);
+}
+
+static void evhttp_conn_close_cb(struct evhttp_connection *conn, void *arg)
+{
+ (void)conn;
+ event_base_loopexit((struct event_base *)arg, NULL);
+ static volatile int barrier = 0;
+ if (__sync_bool_compare_and_swap(&barrier, 0, 1))
+ {
+ fprintf(stderr, "monitor connection closed.\n");
+ exit(1);
+ }
+}
+
+static int evhttp_client_request_new(struct libevent_http_client *evh_client)
+{
+ evh_client->req = evhttp_request_new(evhttp_response_cb, evh_client);
+ evhttp_request_set_error_cb(evh_client->req, evhttp_request_error_cb);
+ evhttp_connection_set_closecb(evh_client->conn, evhttp_conn_close_cb, evh_client->base);
+ evh_client->response_cstr = NULL;
+ evh_client->response_code = 204;
+ return 0;
+}
+static void evhttp_client_add_header(struct libevent_http_client *evh_client,
+ const char *key, const char *value)
+{
+ struct evkeyvalq *output_headers = evhttp_request_get_output_headers(evh_client->req);
+ evhttp_add_header(output_headers, key, value);
+}
+
+static unsigned int evhttp_run_cmd(struct libevent_http_client *evh_client, const char *cmd_uri)
+{
+ evhttp_client_request_new(evh_client);
+ evhttp_client_add_header(evh_client, "Connection", "keep-alive");
+ evhttp_client_add_header(evh_client, "Content-Length", "0");
+ evhttp_make_request(evh_client->conn, evh_client->req, EVHTTP_REQ_GET, cmd_uri);
+
+ int ret = event_base_dispatch(evh_client->base);
+ if (ret < 0)
+ {
+ fprintf(stderr, "event_base_dispatch failed!\n");
+ exit(1);
+ }
+ // here we receive the response from monitor server.
+ return evh_client->response_code;
+}
+
+static void *stellar_dump_ctrllink_keepalive(void *arg)
+{
+ (void)arg;
+ struct libevent_http_client *evh_client = g_ctrllink_http_client;
+ char keepalive_cmd[256] = {0};
+ snprintf(keepalive_cmd, sizeof(keepalive_cmd), "%s%s", CTRLLINK_CMD_URI_PREFIX, "ping%20stellar-dump-keepalive");
+ int cmd_ret;
+ while (keepalive_running)
+ {
+ cmd_ret = evhttp_run_cmd(evh_client, keepalive_cmd);
+ if (cmd_ret != 200)
+ {
+ fprintf(stderr, "ERR connection failed!\n");
+ exit(1);
+ }
+ if (evh_client->response_cstr)
+ {
+ free(evh_client->response_cstr);
+ evh_client->response_cstr = NULL;
+ }
+ if (keepalive_running)
+ {
+ sleep(1);
+ }
+ }
+ return NULL;
+}
+
+static char *http_url_encode(const char *originalText)
+{
+ // allocate memory for the worst possible case (all characters need to be encoded)
+ char *encodedText = (char *)malloc(sizeof(char) * strlen(originalText) * 3 + 1);
+ const char *hex = "0123456789abcdef";
+ int pos = 0;
+ for (size_t i = 0; i < strlen(originalText); i++)
+ {
+ if (('a' <= originalText[i] && originalText[i] <= 'z') || ('A' <= originalText[i] && originalText[i] <= 'Z') || ('0' <= originalText[i] && originalText[i] <= '9'))
+ {
+ encodedText[pos++] = originalText[i];
+ }
+ else if (originalText[i] == ' ')
+ {
+ encodedText[pos++] = '%';
+ encodedText[pos++] = hex[originalText[i] >> 4];
+ encodedText[pos++] = hex[originalText[i] & 15];
+ }
+ else
+ {
+ encodedText[pos++] = originalText[i];
+ }
+ }
+ encodedText[pos] = '\0';
+ return encodedText;
+}
+
+int stellar_dump_ctrllink_init(const struct stellar_dump_args *st_dump_arg)
+{
+ g_ctrllink_http_client = evhttp_client_new(st_dump_arg->stellar_server_ip, st_dump_arg->stellar_server_port_host_order);
+ char probe_cmd[256] = {};
+ snprintf(probe_cmd, sizeof(probe_cmd), "%s%s", CTRLLINK_CMD_URI_PREFIX, "ping stellar-dump-start");
+ char *encoded_url = http_url_encode(probe_cmd);
+ evhttp_run_cmd(g_ctrllink_http_client, encoded_url);
+ free(encoded_url);
+ if (g_ctrllink_http_client->response_code != 200)
+ {
+ fprintf(stderr, "Could not connect to stellar monitor server %s:%u\n", st_dump_arg->stellar_server_ip, st_dump_arg->stellar_server_port_host_order);
+ exit(1);
+ }
+ if (g_ctrllink_http_client->response_cstr)
+ {
+ free(g_ctrllink_http_client->response_cstr);
+ g_ctrllink_http_client->response_cstr = NULL;
+ }
+ return 0;
+}
+
+void stellar_dump_ctrllink_free(void)
+{
+ if (g_ctrllink_http_client)
+ {
+ evhttp_connection_free(g_ctrllink_http_client->conn);
+ event_base_loopbreak(g_ctrllink_http_client->base);
+ event_base_free(g_ctrllink_http_client->base);
+ if (g_ctrllink_http_client->response_cstr)
+ {
+ free(g_ctrllink_http_client->response_cstr);
+ g_ctrllink_http_client->response_cstr = NULL;
+ }
+ free(g_ctrllink_http_client);
+ g_ctrllink_http_client = NULL;
+ }
+}
+
+int stellar_dump_start(const struct stellar_dump_args *st_dump_arg)
+{
+ char dump_cmd[4096] = {};
+ strcat(dump_cmd, CTRLLINK_CMD_URI_PREFIX);
+ strcat(dump_cmd, "tcpdump ");
+
+ /* necessary arg */
+ sprintf(dump_cmd, "%s%s%s%u ", CTRLLINK_CMD_URI_PREFIX, "tcpdump ", "datalinkport ", st_dump_arg->datalink_recv_port_host_order);
+
+ /* optional args */
+ if (st_dump_arg->greedy_seek)
+ {
+ strcat(dump_cmd, "greedy ");
+ }
+ if (st_dump_arg->thread_enable_expression)
+ {
+ strcat(dump_cmd, "threads ");
+ strcat(dump_cmd, st_dump_arg->thread_enable_expression);
+ strcat(dump_cmd, " ");
+ }
+ if (st_dump_arg->bpf)
+ {
+ strcat(dump_cmd, "bpf ");
+ strcat(dump_cmd, st_dump_arg->bpf);
+ strcat(dump_cmd, " ");
+ }
+ char *encoded_url = http_url_encode(dump_cmd);
+ evhttp_run_cmd(g_ctrllink_http_client, encoded_url);
+ free(encoded_url);
+ if (g_ctrllink_http_client->response_code != 200)
+ {
+ fprintf(stderr, "Starting packet dump from server %s:%u : %s\r\n",
+ st_dump_arg->stellar_server_ip, st_dump_arg->stellar_server_port_host_order, g_ctrllink_http_client->response_cstr);
+ exit(1);
+ }
+ if (g_ctrllink_http_client->response_cstr)
+ {
+ free(g_ctrllink_http_client->response_cstr);
+ g_ctrllink_http_client->response_cstr = NULL;
+ }
+ return 0;
+}
+
+int stellar_dump_ctrllink_keepalive_start(const struct stellar_dump_args *st_dump_arg)
+{
+ keepalive_running = 1;
+ pthread_create(&keepalive_thread_id, NULL, stellar_dump_ctrllink_keepalive, (void *)st_dump_arg);
+ return 0;
+}
+
+void stellar_dump_ctrllink_keepalive_stop(void)
+{
+ keepalive_running = 0;
+ if (keepalive_thread_id != 0)
+ {
+ pthread_cancel(keepalive_thread_id);
+ pthread_join(keepalive_thread_id, NULL);
+ keepalive_thread_id = 0;
+ }
+}
diff -uNr tcpdump-tcpdump-4.99.4/stellar_dump_data_link.c tcpdump-for-stellar/stellar_dump_data_link.c
--- tcpdump-tcpdump-4.99.4/stellar_dump_data_link.c 1970-01-01 08:00:00.000000000 +0800
+++ tcpdump-for-stellar/stellar_dump_data_link.c 2024-10-30 17:34:06.265498697 +0800
@@ -0,0 +1,69 @@
+#include "stellar_dump.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <pcap/pcap.h>
+#include <sys/types.h> /* See NOTES */
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <errno.h>
+static int sockfd;
+
+int stellar_dump_datalink_init(struct stellar_dump_args *out_arg)
+{
+ uint16_t port;
+ struct sockaddr_in datalink_addr = {};
+ datalink_addr.sin_family = AF_INET;
+ datalink_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+
+ sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (sockfd < 0)
+ {
+ perror("socket");
+ return -1;
+ }
+ // int opt = 1;
+ // if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)) == -1)
+ // {
+ // perror("setsockopt SO_REUSEADDR");
+ // return -1;
+ // }
+
+ struct timeval tv = {};
+ tv.tv_sec = 1;
+ tv.tv_usec = 0;
+ setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv, sizeof(tv));
+
+ /* find an available port */
+ for (port = 60000; port < 65535; port++)
+ {
+ datalink_addr.sin_port = htons(port);
+ if (bind(sockfd, (struct sockaddr *)&datalink_addr, sizeof(datalink_addr)) != -1)
+ {
+ break;
+ }
+ }
+ if (port >= 65535)
+ {
+ fprintf(stderr, "no available data link port found\n");
+ return -1;
+ }
+ out_arg->datalink_recv_port_host_order = port;
+ return port;
+}
+
+ssize_t stellar_dump_datalink_recv(void *buf, size_t len, char **raw_pkt_start_ptr, struct pcap_pkthdr *phdr)
+{
+ ssize_t n;
+ n = recv(sockfd, buf, len, 0);
+ if (n < TZSP_HDR_LEN)
+ {
+ return -1;
+ }
+ gettimeofday(&phdr->ts, NULL);
+ phdr->caplen = n - TZSP_HDR_LEN;
+ phdr->len = n - TZSP_HDR_LEN;
+ *raw_pkt_start_ptr = (char *)buf + TZSP_HDR_LEN;
+ return n;
+}
\ No newline at end of file
diff -uNr tcpdump-tcpdump-4.99.4/stellar_dump.h tcpdump-for-stellar/stellar_dump.h
--- tcpdump-tcpdump-4.99.4/stellar_dump.h 1970-01-01 08:00:00.000000000 +0800
+++ tcpdump-for-stellar/stellar_dump.h 2024-10-30 17:34:06.265498697 +0800
@@ -0,0 +1,42 @@
+#pragma once
+#ifndef __FAVOR_BSD
+#define __FAVOR_BSD 1
+#endif
+#include <stdio.h>
+#include <stdint.h>
+#include <pcap/pcap.h>
+
+#define STELLAR_DUMP (1)
+#define PROGRAM_NAME "stellar_dump"
+
+#define CTRLLINK_DEFAULT_IP "127.0.0.1"
+#define CTRLLINK_DEFAULT_PORT 80
+
+#define TZSP_UDP_PORT 37008 /* default port of TZSP protocol: https://en.wikipedia.org/wiki/TZSP# */
+#define TZSP_HDR_LEN 5 /* length of TZSP header */
+
+#define CTRLLINK_CONNECT_TIMEOUT 3 /* seconds */
+
+#define DATALINK_RECV_BUF_SIZE 4096
+
+#define CTRLLINK_CMD_URI_PREFIX "/v1/stellar_monitor?raw_cmd="
+
+struct stellar_dump_args
+{
+ char *stellar_server_ip;
+ unsigned short stellar_server_port_host_order;
+ unsigned short datalink_recv_port_host_order;
+ int greedy_seek;
+ char *thread_enable_expression;
+ char *bpf;
+ int expect_packet_count; // arg -c
+};
+
+int stellar_dump_ctrllink_init(const struct stellar_dump_args *st_dump_arg);
+void stellar_dump_ctrllink_free(void);
+int stellar_dump_ctrllink_keepalive_start(const struct stellar_dump_args *st_dump_arg);
+void stellar_dump_ctrllink_keepalive_stop(void);
+
+int stellar_dump_datalink_init(struct stellar_dump_args *out_arg);
+int stellar_dump_start(const struct stellar_dump_args *st_dump_arg);
+ssize_t stellar_dump_datalink_recv(void *buf, size_t len, char **raw_pkt_start_ptr, struct pcap_pkthdr *phdr);
\ No newline at end of file
diff -uNr tcpdump-tcpdump-4.99.4/tcpdump.c tcpdump-for-stellar/tcpdump.c
--- tcpdump-tcpdump-4.99.4/tcpdump.c 2023-04-08 02:30:58.000000000 +0800
+++ tcpdump-for-stellar/tcpdump.c 2024-10-30 17:34:05.655498702 +0800
@@ -1,4 +1,4 @@
-/*
+/* PATCH FOR STELLAR-DUMP
* Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
* The Regents of the University of California. All rights reserved.
*
@@ -33,6 +33,24 @@
* combined efforts of Van, Steve McCanne and Craig Leres of LBL.
*/
+#if defined(__clang__)
+#pragma clang diagnostic ignored "-Wunused-function"
+#pragma clang diagnostic ignored "-Wunused-parameter"
+#pragma clang diagnostic ignored "-Wunused-label"
+#pragma clang diagnostic ignored "-Wunused-macros"
+#pragma clang diagnostic ignored "-Wunused-variable"
+#pragma clang diagnostic ignored "-Wunused-parameter"
+#elif defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wunused-function"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wunused-label"
+#pragma GCC diagnostic ignored "-Wunused-macros"
+#pragma GCC diagnostic ignored "-Wunused-variable"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#endif
+
+#include "stellar_dump.h"
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -57,7 +75,7 @@
*/
#ifndef lint
static const char copyright[] _U_ =
- "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
+ "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
The Regents of the University of California. All rights reserved.\n";
#endif
@@ -91,8 +109,8 @@
#include <libcasper.h>
#include <casper/cap_dns.h>
#include <sys/nv.h>
-#endif /* HAVE_CASPER */
-#endif /* HAVE_CAPSICUM */
+#endif /* HAVE_CASPER */
+#endif /* HAVE_CAPSICUM */
#ifdef HAVE_PCAP_OPEN
/*
* We found pcap_open() in the capture library, so we'll be using
@@ -116,6 +134,7 @@
#include <stdlib.h>
#include <string.h>
#include <limits.h>
+#include <ctype.h>
#ifdef _WIN32
#include <windows.h>
#else
@@ -131,9 +150,9 @@
* Use this in pathnames, but do *not* use it in URLs.
*/
#ifdef _WIN32
-#define PATH_SEPARATOR '\\'
+#define PATH_SEPARATOR '\\'
#else
-#define PATH_SEPARATOR '/'
+#define PATH_SEPARATOR '/'
#endif
/* capabilities convenience library */
@@ -182,19 +201,19 @@
#endif
#if defined(HAVE_PCAP_CREATE) || defined(_WIN32)
-static int Bflag; /* buffer size */
+static int Bflag; /* buffer size */
#endif
#ifdef HAVE_PCAP_DUMP_FTELL64
-static int64_t Cflag; /* rotate dump files after this many bytes */
+static int64_t Cflag; /* rotate dump files after this many bytes */
#else
-static long Cflag; /* rotate dump files after this many bytes */
+static long Cflag; /* rotate dump files after this many bytes */
#endif
-static int Cflag_count; /* Keep track of which file number we're writing */
+static int Cflag_count; /* Keep track of which file number we're writing */
#ifdef HAVE_PCAP_FINDALLDEVS
-static int Dflag; /* list available devices and exit */
+static int Dflag; /* list available devices and exit */
#endif
#ifdef HAVE_PCAP_FINDALLDEVS_EX
-static char *remote_interfaces_source; /* list available devices from this source and exit */
+static char *remote_interfaces_source; /* list available devices from this source and exit */
#endif
/*
@@ -210,28 +229,28 @@
* *export* a routine to set that flag.
*/
extern int dflag;
-int dflag; /* print filter code */
-static int Gflag; /* rotate dump files after this many seconds */
-static int Gflag_count; /* number of files created with Gflag rotation */
-static time_t Gflag_time; /* The last time_t the dump file was rotated. */
-static int Lflag; /* list available data link types and exit */
-static int Iflag; /* rfmon (monitor) mode */
+int dflag; /* print filter code */
+static int Gflag; /* rotate dump files after this many seconds */
+static int Gflag_count; /* number of files created with Gflag rotation */
+static time_t Gflag_time; /* The last time_t the dump file was rotated. */
+static int Lflag; /* list available data link types and exit */
+static int Iflag; /* rfmon (monitor) mode */
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
-static int Jflag; /* list available time stamp types */
-static int jflag = -1; /* packet time stamp source */
+static int Jflag; /* list available time stamp types */
+static int jflag = -1; /* packet time stamp source */
#endif
-static int lflag; /* line-buffered output */
-static int pflag; /* don't go promiscuous */
+static int lflag; /* line-buffered output */
+static int pflag; /* don't go promiscuous */
#ifdef HAVE_PCAP_SETDIRECTION
-static int Qflag = -1; /* restrict captured packet by send/receive direction */
+static int Qflag = -1; /* restrict captured packet by send/receive direction */
#endif
#ifdef HAVE_PCAP_DUMP_FLUSH
-static int Uflag; /* "unbuffered" output of dump files */
+static int Uflag; /* "unbuffered" output of dump files */
#endif
-static int Wflag; /* recycle output files after this number of files */
+static int Wflag; /* recycle output files after this number of files */
static int WflagChars;
-static char *zflag = NULL; /* compress each savefile using a specified command (like gzip or bzip2) */
-static int timeout = 1000; /* default timeout = 1000 ms = 1 s */
+static char *zflag = NULL; /* compress each savefile using a specified command (like gzip or bzip2) */
+static int timeout = 1000; /* default timeout = 1000 ms = 1 s */
#ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
static int immediate_mode;
#endif
@@ -246,7 +265,7 @@
static NORETURN void error(FORMAT_STRING(const char *), ...) PRINTFLIKE(1, 2);
static void warning(FORMAT_STRING(const char *), ...) PRINTFLIKE(1, 2);
static NORETURN void exit_tcpdump(int);
-static void (*setsignal (int sig, void (*func)(int)))(int);
+static void (*setsignal(int sig, void (*func)(int)))(int);
static void cleanup(int);
static void child_cleanup(int);
static void print_version(FILE *);
@@ -262,9 +281,9 @@
static NORETURN void show_remote_devices_and_exit(void);
#endif
-static void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
+void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
static void dump_packet_and_trunc(u_char *, const struct pcap_pkthdr *, const u_char *);
-static void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
+void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
static void droproot(const char *, const char *);
#ifdef SIGNAL_REQ_INFO
@@ -276,10 +295,10 @@
#endif
#ifdef _WIN32
- static HANDLE timer_handle = INVALID_HANDLE_VALUE;
- static void CALLBACK verbose_stats_dump(PVOID param, BOOLEAN timer_fired);
-#else /* _WIN32 */
- static void verbose_stats_dump(int sig);
+static HANDLE timer_handle = INVALID_HANDLE_VALUE;
+static void CALLBACK verbose_stats_dump(PVOID param, BOOLEAN timer_fired);
+#else /* _WIN32 */
+static void verbose_stats_dump(int sig);
#endif /* _WIN32 */
static void info(int);
@@ -288,38 +307,82 @@
#ifdef HAVE_PCAP_FINDALLDEVS
static const struct tok status_flags[] = {
#ifdef PCAP_IF_UP
- { PCAP_IF_UP, "Up" },
+ {PCAP_IF_UP, "Up"},
#endif
#ifdef PCAP_IF_RUNNING
- { PCAP_IF_RUNNING, "Running" },
+ {PCAP_IF_RUNNING, "Running"},
#endif
- { PCAP_IF_LOOPBACK, "Loopback" },
+ {PCAP_IF_LOOPBACK, "Loopback"},
#ifdef PCAP_IF_WIRELESS
- { PCAP_IF_WIRELESS, "Wireless" },
+ {PCAP_IF_WIRELESS, "Wireless"},
#endif
- { 0, NULL }
-};
+ {0, NULL}};
#endif
static pcap_t *pd;
static pcap_dumper_t *pdd = NULL;
static int supports_monitor_mode;
-
extern int optind;
extern int opterr;
extern char *optarg;
-struct dump_info {
- char *WFileName;
- char *CurrentFileName;
- pcap_t *pd;
+static netdissect_options Ndo;
+static netdissect_options *ndo = &Ndo;
+u_char *pcap_userdata;
+static char *cp, *infile, *cmdbuf, *device, *RFileName, *VFileName, *WFileName;
+pcap_handler callback;
+static int print = 0;
+static FILE *VFile;
+static char VFileLine[PATH_MAX + 1];
+static char ebuf[PCAP_ERRBUF_SIZE];
+int dlt, i;
+static char *endp;
+static int cnt = -1, op;
+static bpf_u_int32 localnet = 0, netmask = 0;
+
+static int Oflag = 1; /* run filter code optimizer */
+static int yflag_dlt = -1;
+static const char *yflag_dlt_name = NULL;
+
+static const char *dlt_name;
+static struct bpf_program fcode;
+#ifndef _WIN32
+static void (*oldhandler)(int);
+#endif
+
+static const char *username = NULL;
+#ifndef _WIN32
+static const char *chroot_dir = NULL;
+#endif
+// static char *ret = NULL;
+static char *end;
+#ifdef HAVE_PCAP_FINDALLDEVS
+static pcap_if_t *devlist;
+static long devnum;
+#endif
+static int status;
+
+#ifdef HAVE_CAPSICUM
+static cap_rights_t rights;
+#endif /* HAVE_CAPSICUM */
+static int cansandbox;
+
+static int argc;
+static char **argv;
+
+struct dump_info
+{
+ char *WFileName;
+ char *CurrentFileName;
+ pcap_t *pd;
pcap_dumper_t *pdd;
netdissect_options *ndo;
#ifdef HAVE_CAPSICUM
- int dirfd;
+ int dirfd;
#endif
};
+static struct dump_info dumpinfo;
#if defined(HAVE_PCAP_SET_PARSER_DEBUG)
/*
@@ -330,10 +393,11 @@
*/
#ifdef _WIN32
__declspec(dllimport)
-#else /* _WIN32 */
+#else /* _WIN32 */
extern
#endif /* _WIN32 */
-void pcap_set_parser_debug(int);
+void
+pcap_set_parser_debug(int);
#elif defined(HAVE_PCAP_DEBUG) || defined(HAVE_YYDEBUG)
/*
* We don't have pcap_set_parser_debug() in libpcap, but we do have
@@ -347,7 +411,7 @@
extern int pcap_debug;
pcap_debug = value;
-#else /* HAVE_PCAP_DEBUG */
+#else /* HAVE_PCAP_DEBUG */
extern int yydebug;
yydebug = value;
@@ -366,10 +430,11 @@
*/
#ifdef _WIN32
__declspec(dllimport)
-#else /* _WIN32 */
+#else /* _WIN32 */
extern
#endif /* _WIN32 */
-void pcap_set_optimizer_debug(int);
+void
+pcap_set_optimizer_debug(int);
#endif
/* VARARGS */
@@ -382,7 +447,8 @@
va_start(ap, fmt);
(void)vfprintf(stderr, fmt, ap);
va_end(ap);
- if (*fmt) {
+ if (*fmt)
+ {
fmt += strlen(fmt);
if (fmt[-1] != '\n')
(void)fputc('\n', stderr);
@@ -401,15 +467,15 @@
va_start(ap, fmt);
(void)vfprintf(stderr, fmt, ap);
va_end(ap);
- if (*fmt) {
+ if (*fmt)
+ {
fmt += strlen(fmt);
if (fmt[-1] != '\n')
(void)fputc('\n', stderr);
}
}
-static void
-exit_tcpdump(int status)
+static void exit_tcpdump(int status)
{
nd_cleanup();
exit(status);
@@ -428,20 +494,25 @@
if (n_tstamp_types < 0)
error("%s", pcap_geterr(pc));
- if (n_tstamp_types == 0) {
+ if (n_tstamp_types == 0)
+ {
fprintf(stderr, "Time stamp type cannot be set for %s\n",
- device);
+ device);
exit_tcpdump(S_SUCCESS);
}
fprintf(stderr, "Time stamp types for %s (use option -j to set):\n",
- device);
- for (i = 0; i < n_tstamp_types; i++) {
+ device);
+ for (i = 0; i < n_tstamp_types; i++)
+ {
tstamp_type_name = pcap_tstamp_type_val_to_name(tstamp_types[i]);
- if (tstamp_type_name != NULL) {
- (void) fprintf(stderr, " %s (%s)\n", tstamp_type_name,
- pcap_tstamp_type_val_to_description(tstamp_types[i]));
- } else {
- (void) fprintf(stderr, " %d\n", tstamp_types[i]);
+ if (tstamp_type_name != NULL)
+ {
+ (void)fprintf(stderr, " %s (%s)\n", tstamp_type_name,
+ pcap_tstamp_type_val_to_description(tstamp_types[i]));
+ }
+ else
+ {
+ (void)fprintf(stderr, " %d\n", tstamp_types[i]);
}
}
pcap_free_tstamp_types(tstamp_types);
@@ -471,28 +542,32 @@
* not in monitor mode).
*/
if (supports_monitor_mode)
- (void) fprintf(stderr, "Data link types for %s %s (use option -y to set):\n",
- device,
- Iflag ? "when in monitor mode" : "when not in monitor mode");
+ (void)fprintf(stderr, "Data link types for %s %s (use option -y to set):\n",
+ device,
+ Iflag ? "when in monitor mode" : "when not in monitor mode");
else
- (void) fprintf(stderr, "Data link types for %s (use option -y to set):\n",
- device);
+ (void)fprintf(stderr, "Data link types for %s (use option -y to set):\n",
+ device);
- for (i = 0; i < n_dlts; i++) {
+ for (i = 0; i < n_dlts; i++)
+ {
dlt_name = pcap_datalink_val_to_name(dlts[i]);
- if (dlt_name != NULL) {
- (void) fprintf(stderr, " %s (%s)", dlt_name,
- pcap_datalink_val_to_description(dlts[i]));
+ if (dlt_name != NULL)
+ {
+ (void)fprintf(stderr, " %s (%s)", dlt_name,
+ pcap_datalink_val_to_description(dlts[i]));
/*
* OK, does tcpdump handle that type?
*/
if (!has_printer(dlts[i]))
- (void) fprintf(stderr, " (printing not supported)");
+ (void)fprintf(stderr, " (printing not supported)");
fprintf(stderr, "\n");
- } else {
- (void) fprintf(stderr, " DLT %d (printing not supported)\n",
- dlts[i]);
+ }
+ else
+ {
+ (void)fprintf(stderr, " DLT %d (printing not supported)\n",
+ dlts[i]);
}
}
#ifdef HAVE_PCAP_FREE_DATALINKS
@@ -511,16 +586,20 @@
if (pcap_findalldevs(&devlist, ebuf) < 0)
error("%s", ebuf);
- for (i = 0, dev = devlist; dev != NULL; i++, dev = dev->next) {
- printf("%d.%s", i+1, dev->name);
+ for (i = 0, dev = devlist; dev != NULL; i++, dev = dev->next)
+ {
+ printf("%d.%s", i + 1, dev->name);
if (dev->description != NULL)
printf(" (%s)", dev->description);
- if (dev->flags != 0) {
+ if (dev->flags != 0)
+ {
printf(" [");
printf("%s", bittok2str(status_flags, "none", dev->flags));
#ifdef PCAP_IF_WIRELESS
- if (dev->flags & PCAP_IF_WIRELESS) {
- switch (dev->flags & PCAP_IF_CONNECTION_STATUS) {
+ if (dev->flags & PCAP_IF_WIRELESS)
+ {
+ switch (dev->flags & PCAP_IF_CONNECTION_STATUS)
+ {
case PCAP_IF_CONNECTION_STATUS_UNKNOWN:
printf(", Association status unknown");
@@ -537,8 +616,11 @@
case PCAP_IF_CONNECTION_STATUS_NOT_APPLICABLE:
break;
}
- } else {
- switch (dev->flags & PCAP_IF_CONNECTION_STATUS) {
+ }
+ else
+ {
+ switch (dev->flags & PCAP_IF_CONNECTION_STATUS)
+ {
case PCAP_IF_CONNECTION_STATUS_UNKNOWN:
printf(", Connection status unknown");
@@ -575,10 +657,11 @@
int i;
if (pcap_findalldevs_ex(remote_interfaces_source, NULL, &devlist,
- ebuf) < 0)
+ ebuf) < 0)
error("%s", ebuf);
- for (i = 0, dev = devlist; dev != NULL; i++, dev = dev->next) {
- printf("%d.%s", i+1, dev->name);
+ for (i = 0, dev = devlist; dev != NULL; i++, dev = dev->next)
+ {
+ printf("%d.%s", i + 1, dev->name);
if (dev->description != NULL)
printf(" (%s)", dev->description);
if (dev->flags != 0)
@@ -625,29 +708,29 @@
* version of libpcap we're using.
*/
#if defined(HAVE_PCAP_CREATE) || defined(_WIN32)
-#define B_FLAG "B:"
-#define B_FLAG_USAGE " [ -B size ]"
+#define B_FLAG "B:"
+#define B_FLAG_USAGE " [ -B size ]"
#else /* defined(HAVE_PCAP_CREATE) || defined(_WIN32) */
#define B_FLAG
#define B_FLAG_USAGE
#endif /* defined(HAVE_PCAP_CREATE) || defined(_WIN32) */
#ifdef HAVE_PCAP_FINDALLDEVS
-#define D_FLAG "D"
+#define D_FLAG "D"
#else
#define D_FLAG
#endif
#ifdef HAVE_PCAP_CREATE
-#define I_FLAG "I"
+#define I_FLAG "I"
#else /* HAVE_PCAP_CREATE */
#define I_FLAG
#endif /* HAVE_PCAP_CREATE */
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
-#define j_FLAG "j:"
-#define j_FLAG_USAGE " [ -j tstamptype ]"
-#define J_FLAG "J"
+#define j_FLAG "j:"
+#define j_FLAG_USAGE " [ -j tstamptype ]"
+#define J_FLAG "J"
#else /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */
#define j_FLAG
#define j_FLAG_USAGE
@@ -667,12 +750,18 @@
#endif
#ifdef HAVE_PCAP_DUMP_FLUSH
-#define U_FLAG "U"
+#define U_FLAG "U"
#else
#define U_FLAG
#endif
+#if STELLAR_DUMP
+#define SHORTOPTS "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOpq" Q_FLAG "r:s:StT:u" U_FLAG "vV:w:W:xXy:Yz:Z:P:k:g#"
+static struct stellar_dump_args g_stellar_dump_arg = {};
+static volatile int g_stellar_dump_run = 1;
+#else
#define SHORTOPTS "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOpq" Q_FLAG "r:s:StT:u" U_FLAG "vV:w:W:xXy:Yz:Z:#"
+#endif
/*
* Long options.
@@ -694,65 +783,70 @@
* component of the entry for the long option, and have a case for that
* option in the switch statement.
*/
-#define OPTION_VERSION 128
-#define OPTION_TSTAMP_PRECISION 129
-#define OPTION_IMMEDIATE_MODE 130
-#define OPTION_PRINT 131
-#define OPTION_LIST_REMOTE_INTERFACES 132
-#define OPTION_TSTAMP_MICRO 133
-#define OPTION_TSTAMP_NANO 134
-#define OPTION_FP_TYPE 135
-#define OPTION_COUNT 136
+#define OPTION_VERSION 128
+#define OPTION_TSTAMP_PRECISION 129
+#define OPTION_IMMEDIATE_MODE 130
+#define OPTION_PRINT 131
+#define OPTION_LIST_REMOTE_INTERFACES 132
+#define OPTION_TSTAMP_MICRO 133
+#define OPTION_TSTAMP_NANO 134
+#define OPTION_FP_TYPE 135
+#define OPTION_COUNT 136
static const struct option longopts[] = {
#if defined(HAVE_PCAP_CREATE) || defined(_WIN32)
- { "buffer-size", required_argument, NULL, 'B' },
+ {"buffer-size", required_argument, NULL, 'B'},
#endif
- { "list-interfaces", no_argument, NULL, 'D' },
+ {"list-interfaces", no_argument, NULL, 'D'},
#ifdef HAVE_PCAP_FINDALLDEVS_EX
- { "list-remote-interfaces", required_argument, NULL, OPTION_LIST_REMOTE_INTERFACES },
+ {"list-remote-interfaces", required_argument, NULL, OPTION_LIST_REMOTE_INTERFACES},
#endif
- { "help", no_argument, NULL, 'h' },
- { "interface", required_argument, NULL, 'i' },
+ {"help", no_argument, NULL, 'h'},
+ {"serverip", required_argument, NULL, 'i'},
#ifdef HAVE_PCAP_CREATE
- { "monitor-mode", no_argument, NULL, 'I' },
+ {"monitor-mode", no_argument, NULL, 'I'},
#endif
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
- { "time-stamp-type", required_argument, NULL, 'j' },
- { "list-time-stamp-types", no_argument, NULL, 'J' },
+ {"time-stamp-type", required_argument, NULL, 'j'},
+ {"list-time-stamp-types", no_argument, NULL, 'J'},
#endif
#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
- { "micro", no_argument, NULL, OPTION_TSTAMP_MICRO},
- { "nano", no_argument, NULL, OPTION_TSTAMP_NANO},
- { "time-stamp-precision", required_argument, NULL, OPTION_TSTAMP_PRECISION},
-#endif
- { "dont-verify-checksums", no_argument, NULL, 'K' },
- { "list-data-link-types", no_argument, NULL, 'L' },
- { "no-optimize", no_argument, NULL, 'O' },
- { "no-promiscuous-mode", no_argument, NULL, 'p' },
+ {"micro", no_argument, NULL, OPTION_TSTAMP_MICRO},
+ {"nano", no_argument, NULL, OPTION_TSTAMP_NANO},
+ {"time-stamp-precision", required_argument, NULL, OPTION_TSTAMP_PRECISION},
+#endif
+ {"dont-verify-checksums", no_argument, NULL, 'K'},
+ {"list-data-link-types", no_argument, NULL, 'L'},
+ {"no-optimize", no_argument, NULL, 'O'},
+ {"no-promiscuous-mode", no_argument, NULL, 'p'},
#ifdef HAVE_PCAP_SETDIRECTION
- { "direction", required_argument, NULL, 'Q' },
+ {"direction", required_argument, NULL, 'Q'},
#endif
- { "snapshot-length", required_argument, NULL, 's' },
- { "absolute-tcp-sequence-numbers", no_argument, NULL, 'S' },
+ {"snapshot-length", required_argument, NULL, 's'},
+ {"absolute-tcp-sequence-numbers", no_argument, NULL, 'S'},
#ifdef HAVE_PCAP_DUMP_FLUSH
- { "packet-buffered", no_argument, NULL, 'U' },
+ {"packet-buffered", no_argument, NULL, 'U'},
#endif
- { "linktype", required_argument, NULL, 'y' },
+ {"linktype", required_argument, NULL, 'y'},
#ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
- { "immediate-mode", no_argument, NULL, OPTION_IMMEDIATE_MODE },
+ {"immediate-mode", no_argument, NULL, OPTION_IMMEDIATE_MODE},
#endif
#ifdef HAVE_PCAP_SET_PARSER_DEBUG
- { "debug-filter-parser", no_argument, NULL, 'Y' },
+ {"debug-filter-parser", no_argument, NULL, 'Y'},
#endif
- { "relinquish-privileges", required_argument, NULL, 'Z' },
- { "count", no_argument, NULL, OPTION_COUNT },
- { "fp-type", no_argument, NULL, OPTION_FP_TYPE },
- { "number", no_argument, NULL, '#' },
- { "print", no_argument, NULL, OPTION_PRINT },
- { "version", no_argument, NULL, OPTION_VERSION },
- { NULL, 0, NULL, 0 }
-};
+ {"relinquish-privileges", required_argument, NULL, 'Z'},
+ {"count", no_argument, NULL, OPTION_COUNT},
+ {"fp-type", no_argument, NULL, OPTION_FP_TYPE},
+ {"number", no_argument, NULL, '#'},
+ {"print", no_argument, NULL, OPTION_PRINT},
+ {"version", no_argument, NULL, OPTION_VERSION},
+#if STELLAR_DUMP
+ {"greedy", no_argument, NULL, 'g'},
+ {"threads", required_argument, NULL, 'k'},
+ {"serverport", required_argument, NULL, 'P'},
+// {"classify", required_argument, NULL, 255},
+#endif
+ {NULL, 0, NULL, 0}};
#ifdef HAVE_PCAP_FINDALLDEVS_EX
#define LIST_REMOTE_INTERFACES_USAGE "[ --list-remote-interfaces remote-source ]"
@@ -777,11 +871,13 @@
error("Chroot without dropping root is insecure");
pw = getpwnam(username);
- if (pw) {
- if (chroot_dir) {
- if (chroot(chroot_dir) != 0 || chdir ("/") != 0)
+ if (pw)
+ {
+ if (chroot_dir)
+ {
+ if (chroot(chroot_dir) != 0 || chdir("/") != 0)
error("Couldn't chroot/chdir to '%.64s': %s",
- chroot_dir, pcap_strerror(errno));
+ chroot_dir, pcap_strerror(errno));
}
#ifdef HAVE_LIBCAP_NG
{
@@ -793,21 +889,23 @@
}
#else
if (initgroups(pw->pw_name, pw->pw_gid) != 0 ||
- setgid(pw->pw_gid) != 0 || setuid(pw->pw_uid) != 0)
+ setgid(pw->pw_gid) != 0 || setuid(pw->pw_uid) != 0)
error("Couldn't change to '%.32s' uid=%lu gid=%lu: %s",
- username,
- (unsigned long)pw->pw_uid,
- (unsigned long)pw->pw_gid,
- pcap_strerror(errno));
- else {
+ username,
+ (unsigned long)pw->pw_uid,
+ (unsigned long)pw->pw_gid,
+ pcap_strerror(errno));
+ else
+ {
fprintf(stderr, "dropped privs to %s\n", username);
}
#endif /* HAVE_LIBCAP_NG */
- } else
+ }
+ else
error("Couldn't find user '%.32s'", username);
#ifdef HAVE_LIBCAP_NG
/* We don't need CAP_SETUID, CAP_SETGID and CAP_SYS_CHROOT any more. */
-DIAG_OFF_ASSIGN_ENUM
+ DIAG_OFF_ASSIGN_ENUM
capng_updatev(
CAPNG_DROP,
CAPNG_EFFECTIVE | CAPNG_PERMITTED,
@@ -815,10 +913,9 @@
CAP_SETGID,
CAP_SYS_CHROOT,
-1);
-DIAG_ON_ASSIGN_ENUM
+ DIAG_ON_ASSIGN_ENUM
capng_apply(CAPNG_SELECT_BOTH);
#endif /* HAVE_LIBCAP_NG */
-
}
#endif /* _WIN32 */
@@ -828,7 +925,8 @@
int c = 0;
x -= 1;
- while (x > 0) {
+ while (x > 0)
+ {
c += 1;
x /= 10;
}
@@ -836,56 +934,61 @@
return c;
}
-
static void
MakeFilename(char *buffer, char *orig_name, int cnt, int max_chars)
{
- char *filename = malloc(PATH_MAX + 1);
- if (filename == NULL)
- error("%s: malloc", __func__);
- if (strlen(orig_name) == 0)
- error("an empty string is not a valid file name");
-
- /* Process with strftime if Gflag is set. */
- if (Gflag != 0) {
- struct tm *local_tm;
-
- /* Convert Gflag_time to a usable format */
- if ((local_tm = localtime(&Gflag_time)) == NULL) {
- error("%s: localtime", __func__);
- }
-
- /* There's no good way to detect an error in strftime since a return
- * value of 0 isn't necessarily failure; if orig_name is an empty
- * string, the formatted string will be empty.
- *
- * However, the C90 standard says that, if there *is* a
- * buffer overflow, the content of the buffer is undefined,
- * so we must check for a buffer overflow.
- *
- * So we check above for an empty orig_name, and only call
- * strftime() if it's non-empty, in which case the return
- * value will only be 0 if the formatted date doesn't fit
- * in the buffer.
- *
- * (We check above because, even if we don't use -G, we
- * want a better error message than "tcpdump: : No such
- * file or directory" for this case.)
- */
- if (strftime(filename, PATH_MAX, orig_name, local_tm) == 0) {
- error("%s: strftime", __func__);
- }
- } else {
- strncpy(filename, orig_name, PATH_MAX);
- }
+ char *filename = malloc(PATH_MAX + 1);
+ if (filename == NULL)
+ error("%s: malloc", __func__);
+ if (strlen(orig_name) == 0)
+ error("an empty string is not a valid file name");
+
+ /* Process with strftime if Gflag is set. */
+ if (Gflag != 0)
+ {
+ struct tm *local_tm;
+
+ /* Convert Gflag_time to a usable format */
+ if ((local_tm = localtime(&Gflag_time)) == NULL)
+ {
+ error("%s: localtime", __func__);
+ return;
+ }
+
+ /* There's no good way to detect an error in strftime since a return
+ * value of 0 isn't necessarily failure; if orig_name is an empty
+ * string, the formatted string will be empty.
+ *
+ * However, the C90 standard says that, if there *is* a
+ * buffer overflow, the content of the buffer is undefined,
+ * so we must check for a buffer overflow.
+ *
+ * So we check above for an empty orig_name, and only call
+ * strftime() if it's non-empty, in which case the return
+ * value will only be 0 if the formatted date doesn't fit
+ * in the buffer.
+ *
+ * (We check above because, even if we don't use -G, we
+ * want a better error message than "tcpdump: : No such
+ * file or directory" for this case.)
+ */
+ if (strftime(filename, PATH_MAX, orig_name, local_tm) == 0)
+ {
+ error("%s: strftime", __func__);
+ return;
+ }
+ }
+ else
+ {
+ strncpy(filename, orig_name, PATH_MAX);
+ }
if (cnt == 0 && max_chars == 0)
strncpy(buffer, filename, PATH_MAX + 1);
- else
- if (snprintf(buffer, PATH_MAX + 1, "%s%0*d", filename, max_chars, cnt) > PATH_MAX)
- /* Report an error if the filename is too large */
- error("too many output files or filename is too long (> %d)", PATH_MAX);
- free(filename);
+ else if (snprintf(buffer, PATH_MAX + 1, "%s%0*d", filename, max_chars, cnt) > PATH_MAX)
+ /* Report an error if the filename is too large */
+ error("too many output files or filename is too long (> %d)", PATH_MAX);
+ free(filename);
}
static char *
@@ -898,7 +1001,7 @@
if (!ret)
return NULL;
- len = strlen (ptr);
+ len = strlen(ptr);
if (len > 0 && ptr[len - 1] == '\n')
ptr[len - 1] = '\0';
@@ -932,7 +1035,7 @@
return (capdnsloc);
}
-#endif /* HAVE_CASPER */
+#endif /* HAVE_CASPER */
#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
static int
@@ -950,7 +1053,8 @@
static const char *
tstamp_precision_to_string(int precision)
{
- switch (precision) {
+ switch (precision)
+ {
case PCAP_TSTAMP_PRECISION_MICRO:
return "micro";
@@ -962,6 +1066,7 @@
return "unknown";
}
}
+
#endif
#ifdef HAVE_CAPSICUM
@@ -1025,10 +1130,12 @@
cap_rights_t rights;
cap_rights_init(&rights, CAP_SEEK, CAP_WRITE, CAP_FCNTL);
- if (cap_rights_limit(fd, &rights) < 0 && errno != ENOSYS) {
+ if (cap_rights_limit(fd, &rights) < 0 && errno != ENOSYS)
+ {
error("unable to limit dump descriptor");
}
- if (cap_fcntls_limit(fd, CAP_FCNTL_GETFL) < 0 && errno != ENOSYS) {
+ if (cap_fcntls_limit(fd, CAP_FCNTL_GETFL) < 0 && errno != ENOSYS)
+ {
error("unable to limit dump descriptor fcntls");
}
}
@@ -1037,8 +1144,7 @@
/*
* Copy arg vector into a new buffer, concatenating arguments with spaces.
*/
-static char *
-copy_argv(char **argv)
+static char *copy_argv(char **argv)
{
char **p;
size_t len = 0;
@@ -1058,7 +1164,8 @@
p = argv;
dst = buf;
- while ((src = *p++) != NULL) {
+ while ((src = *p++) != NULL)
+ {
while ((*dst++ = *src++) != '\0')
;
dst[-1] = ' ';
@@ -1075,7 +1182,7 @@
* we define it as 0 if it's not defined, so it does nothing.
*/
#ifndef O_BINARY
-#define O_BINARY 0
+#define O_BINARY 0
#endif
static char *
@@ -1086,7 +1193,7 @@
char *cp;
our_statb buf;
- fd = open(fname, O_RDONLY|O_BINARY);
+ fd = open(fname, O_RDONLY | O_BINARY);
if (fd < 0)
error("can't open %s: %s", fname, pcap_strerror(errno));
@@ -1103,17 +1210,18 @@
cp = malloc((u_int)buf.st_size + 1);
if (cp == NULL)
error("malloc(%d) for %s: %s", (u_int)buf.st_size + 1,
- fname, pcap_strerror(errno));
+ fname, pcap_strerror(errno));
cc = read(fd, cp, (u_int)buf.st_size);
if (cc < 0)
error("read %s: %s", fname, pcap_strerror(errno));
if (cc != buf.st_size)
- error("short read %s (%d != %d)", fname, (int) cc,
- (int)buf.st_size);
+ error("short read %s (%d != %d)", fname, (int)cc,
+ (int)buf.st_size);
close(fd);
/* replace "# comment" with spaces */
- for (i = 0; i < cc; i++) {
+ for (i = 0; i < cc; i++)
+ {
if (cp[i] == '#')
while (i < cc && cp[i] != '\n')
cp[i++] = ' ';
@@ -1135,19 +1243,22 @@
* of the device.
*/
p = strchr(device, ':');
- if (p != NULL) {
+ if (p != NULL)
+ {
/*
* We found it. Is it followed by "//"?
*/
- p++; /* skip the : */
- if (strncmp(p, "//", 2) == 0) {
+ p++; /* skip the : */
+ if (strncmp(p, "//", 2) == 0)
+ {
/*
* Yes. Search for the next /, at the end of the
* authority part of the URL.
*/
- p += 2; /* skip the // */
+ p += 2; /* skip the // */
p = strchr(p, '/');
- if (p != NULL) {
+ if (p != NULL)
+ {
/*
* OK, past the / is the path.
*/
@@ -1156,18 +1267,22 @@
}
}
devnum = strtol(device, &end, 10);
- if (device != end && *end == '\0') {
+ if (device != end && *end == '\0')
+ {
/*
* It's all-numeric, but is it a valid number?
*/
- if (devnum <= 0) {
+ if (devnum <= 0)
+ {
/*
* No, it's not an ordinal.
*/
error("Invalid adapter index");
}
return (devnum);
- } else {
+ }
+ else
+ {
/*
* It's not all-numeric; return -1, so our caller
* knows that.
@@ -1175,13 +1290,15 @@
return (-1);
}
}
+#endif
static char *
find_interface_by_number(const char *url
#ifndef HAVE_PCAP_FINDALLDEVS_EX
-_U_
+ _U_
#endif
-, long devnum)
+ ,
+ long devnum)
{
pcap_if_t *dev, *devlist;
long i;
@@ -1199,27 +1316,31 @@
* of the URL.
*/
endp = strchr(url, ':');
- if (endp != NULL) {
+ if (endp != NULL)
+ {
/*
* We found it. Is it followed by "//"?
*/
- endp++; /* skip the : */
- if (strncmp(endp, "//", 2) == 0) {
+ endp++; /* skip the : */
+ if (strncmp(endp, "//", 2) == 0)
+ {
/*
* Yes. Search for the next /, at the end of the
* authority part of the URL.
*/
- endp += 2; /* skip the // */
+ endp += 2; /* skip the // */
endp = strchr(endp, '/');
- } else
+ }
+ else
endp = NULL;
}
- if (endp != NULL) {
+ if (endp != NULL)
+ {
/*
* OK, everything from device to endp is a URL to hand
* to pcap_findalldevs_ex().
*/
- endp++; /* Include the trailing / in the URL; pcap_findalldevs_ex() requires it */
+ endp++; /* Include the trailing / in the URL; pcap_findalldevs_ex() requires it */
host_url = malloc(endp - url + 1);
if (host_url == NULL && (endp - url + 1) > 0)
error("Invalid allocation for host");
@@ -1228,24 +1349,30 @@
host_url[endp - url] = '\0';
status = pcap_findalldevs_ex(host_url, NULL, &devlist, ebuf);
free(host_url);
- } else
+ }
+ else
#endif
- status = pcap_findalldevs(&devlist, ebuf);
+ status = pcap_findalldevs(&devlist, ebuf);
if (status < 0)
+ {
error("%s", ebuf);
+ return NULL;
+ }
/*
* Look for the devnum-th entry in the list of devices (1-based).
*/
- for (i = 0, dev = devlist; i < devnum-1 && dev != NULL;
- i++, dev = dev->next)
+ for (i = 0, dev = devlist; i < devnum - 1 && dev != NULL;
+ i++, dev = dev->next)
;
if (dev == NULL)
+ {
error("Invalid adapter index");
+ return NULL;
+ }
device = strdup(dev->name);
pcap_freealldevs(devlist);
return (device);
}
-#endif
#ifdef HAVE_PCAP_OPEN
/*
@@ -1269,15 +1396,17 @@
* Is this an rpcap URL?
*/
if (strncmp(device, rpcap_prefix, sizeof(rpcap_prefix) - 1) == 0 ||
- strncmp(device, rpcap_ssl_prefix, sizeof(rpcap_ssl_prefix) - 1) == 0) {
+ strncmp(device, rpcap_ssl_prefix, sizeof(rpcap_ssl_prefix) - 1) == 0)
+ {
/*
* Yes. Open it with pcap_open().
*/
*ebuf = '\0';
pc = pcap_open(device, ndo->ndo_snaplen,
- pflag ? 0 : PCAP_OPENFLAG_PROMISCUOUS, timeout, NULL,
- ebuf);
- if (pc == NULL) {
+ pflag ? 0 : PCAP_OPENFLAG_PROMISCUOUS, timeout, NULL,
+ ebuf);
+ if (pc == NULL)
+ {
/*
* If this failed with "No such device" or "The system
* cannot find the device specified", that means
@@ -1286,7 +1415,7 @@
* actually an interface index.
*/
if (strstr(ebuf, "No such device") != NULL ||
- strstr(ebuf, "The system cannot find the device specified") != NULL)
+ strstr(ebuf, "The system cannot find the device specified") != NULL)
return (NULL);
error("%s", ebuf);
}
@@ -1298,7 +1427,8 @@
#ifdef HAVE_PCAP_CREATE
pc = pcap_create(device, ebuf);
- if (pc == NULL) {
+ if (pc == NULL)
+ {
/*
* If this failed with "No such device", that means
* the interface doesn't exist; return NULL, so that
@@ -1317,17 +1447,18 @@
status = pcap_set_tstamp_precision(pc, ndo->ndo_tstamp_precision);
if (status != 0)
error("%s: Can't set %ssecond time stamp precision: %s",
- device,
- tstamp_precision_to_string(ndo->ndo_tstamp_precision),
- pcap_statustostr(status));
+ device,
+ tstamp_precision_to_string(ndo->ndo_tstamp_precision),
+ pcap_statustostr(status));
#endif
#ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
- if (immediate_mode) {
+ if (immediate_mode)
+ {
status = pcap_set_immediate_mode(pc, 1);
if (status != 0)
error("%s: Can't set immediate mode: %s",
- device, pcap_statustostr(status));
+ device, pcap_statustostr(status));
}
#endif
/*
@@ -1337,7 +1468,8 @@
supports_monitor_mode = 1;
else
supports_monitor_mode = 0;
- if (ndo->ndo_snaplen != 0) {
+ if (ndo->ndo_snaplen != 0)
+ {
/*
* A snapshot length was explicitly specified;
* use it.
@@ -1345,66 +1477,73 @@
status = pcap_set_snaplen(pc, ndo->ndo_snaplen);
if (status != 0)
error("%s: Can't set snapshot length: %s",
- device, pcap_statustostr(status));
+ device, pcap_statustostr(status));
}
status = pcap_set_promisc(pc, !pflag);
if (status != 0)
error("%s: Can't set promiscuous mode: %s",
- device, pcap_statustostr(status));
- if (Iflag) {
+ device, pcap_statustostr(status));
+ if (Iflag)
+ {
status = pcap_set_rfmon(pc, 1);
if (status != 0)
error("%s: Can't set monitor mode: %s",
- device, pcap_statustostr(status));
+ device, pcap_statustostr(status));
}
status = pcap_set_timeout(pc, timeout);
if (status != 0)
error("%s: pcap_set_timeout failed: %s",
- device, pcap_statustostr(status));
- if (Bflag != 0) {
+ device, pcap_statustostr(status));
+ if (Bflag != 0)
+ {
status = pcap_set_buffer_size(pc, Bflag);
if (status != 0)
error("%s: Can't set buffer size: %s",
- device, pcap_statustostr(status));
+ device, pcap_statustostr(status));
}
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
- if (jflag != -1) {
+ if (jflag != -1)
+ {
status = pcap_set_tstamp_type(pc, jflag);
if (status < 0)
error("%s: Can't set time stamp type: %s",
- device, pcap_statustostr(status));
+ device, pcap_statustostr(status));
else if (status > 0)
warning("When trying to set timestamp type '%s' on %s: %s",
- pcap_tstamp_type_val_to_name(jflag), device,
- pcap_statustostr(status));
+ pcap_tstamp_type_val_to_name(jflag), device,
+ pcap_statustostr(status));
}
#endif
status = pcap_activate(pc);
- if (status < 0) {
+ if (status < 0)
+ {
/*
* pcap_activate() failed.
*/
cp = pcap_geterr(pc);
if (status == PCAP_ERROR)
error("%s", cp);
- else if (status == PCAP_ERROR_NO_SUCH_DEVICE) {
+ else if (status == PCAP_ERROR_NO_SUCH_DEVICE)
+ {
/*
* Return an error for our caller to handle.
*/
snprintf(ebuf, PCAP_ERRBUF_SIZE, "%s: %s\n(%s)",
- device, pcap_statustostr(status), cp);
- } else if (status == PCAP_ERROR_PERM_DENIED && *cp != '\0')
+ device, pcap_statustostr(status), cp);
+ }
+ else if (status == PCAP_ERROR_PERM_DENIED && *cp != '\0')
error("%s: %s\n(%s)", device,
- pcap_statustostr(status), cp);
+ pcap_statustostr(status), cp);
#ifdef __FreeBSD__
else if (status == PCAP_ERROR_RFMON_NOTSUP &&
- strncmp(device, "wlan", 4) == 0) {
+ strncmp(device, "wlan", 4) == 0)
+ {
char parent[8], newdev[8];
char sysctl[32];
size_t s = sizeof(parent);
snprintf(sysctl, sizeof(sysctl),
- "net.wlan.%d.%%parent", atoi(device + 4));
+ "net.wlan.%d.%%parent", atoi(device + 4));
sysctlbyname(sysctl, parent, &s, NULL, 0);
strlcpy(newdev, device, sizeof(newdev));
/* Suggest a new wlan device. */
@@ -1412,20 +1551,22 @@
* when the index is 9 or greater but the only consequence in this
* specific case would be an error message that looks a bit odd.
*/
- newdev[strlen(newdev)-1]++;
+ newdev[strlen(newdev) - 1]++;
error("%s is not a monitor mode VAP\n"
- "To create a new monitor mode VAP use:\n"
- " ifconfig %s create wlandev %s wlanmode monitor\n"
- "and use %s as the tcpdump interface",
- device, newdev, parent, newdev);
+ "To create a new monitor mode VAP use:\n"
+ " ifconfig %s create wlandev %s wlanmode monitor\n"
+ "and use %s as the tcpdump interface",
+ device, newdev, parent, newdev);
}
#endif
else
error("%s: %s", device,
- pcap_statustostr(status));
+ pcap_statustostr(status));
pcap_close(pc);
return (NULL);
- } else if (status > 0) {
+ }
+ else if (status > 0)
+ {
/*
* pcap_activate() succeeded, but it's warning us
* of a problem it had.
@@ -1434,22 +1575,23 @@
if (status == PCAP_WARNING)
warning("%s", cp);
else if (status == PCAP_WARNING_PROMISC_NOTSUP &&
- *cp != '\0')
+ *cp != '\0')
warning("%s: %s\n(%s)", device,
- pcap_statustostr(status), cp);
+ pcap_statustostr(status), cp);
else
warning("%s: %s", device,
- pcap_statustostr(status));
+ pcap_statustostr(status));
}
#ifdef HAVE_PCAP_SETDIRECTION
- if (Qflag != -1) {
+ if (Qflag != -1)
+ {
status = pcap_setdirection(pc, Qflag);
if (status != 0)
error("%s: pcap_setdirection() failed: %s",
- device, pcap_geterr(pc));
- }
+ device, pcap_geterr(pc));
+ }
#endif /* HAVE_PCAP_SETDIRECTION */
-#else /* HAVE_PCAP_CREATE */
+#else /* HAVE_PCAP_CREATE */
*ebuf = '\0';
/*
* If no snapshot length was specified, or a length of 0 was
@@ -1458,7 +1600,8 @@
if (ndo->ndo_snaplen == 0)
ndo->ndo_snaplen = MAXIMUM_SNAPLEN;
pc = pcap_open_live(device, ndo->ndo_snaplen, !pflag, timeout, ebuf);
- if (pc == NULL) {
+ if (pc == NULL)
+ {
/*
* If this failed with "No such device", that means
* the interface doesn't exist; return NULL, so that
@@ -1476,48 +1619,743 @@
return (pc);
}
-int
-main(int argc, char **argv)
+/*
+ * Catch a signal.
+ */
+static void (*setsignal(int sig, void (*func)(int)))(int)
{
- int cnt, op, i;
- bpf_u_int32 localnet = 0, netmask = 0;
- char *cp, *infile, *cmdbuf, *device, *RFileName, *VFileName, *WFileName;
- char *endp;
- pcap_handler callback;
- int dlt;
- const char *dlt_name;
- struct bpf_program fcode;
-#ifndef _WIN32
- void (*oldhandler)(int);
+#ifdef _WIN32
+ return (signal(sig, func));
+#else
+ struct sigaction old, new;
+
+ memset(&new, 0, sizeof(new));
+ new.sa_handler = func;
+ if ((sig == SIGCHLD)
+#ifdef SIGNAL_REQ_INFO
+ || (sig == SIGNAL_REQ_INFO)
#endif
- struct dump_info dumpinfo;
- u_char *pcap_userdata;
- char ebuf[PCAP_ERRBUF_SIZE];
- char VFileLine[PATH_MAX + 1];
- const char *username = NULL;
-#ifndef _WIN32
- const char *chroot_dir = NULL;
+#ifdef SIGNAL_FLUSH_PCAP
+ || (sig == SIGNAL_FLUSH_PCAP)
#endif
- char *ret = NULL;
- char *end;
-#ifdef HAVE_PCAP_FINDALLDEVS
- pcap_if_t *devlist;
- long devnum;
+ )
+ new.sa_flags = SA_RESTART;
+ if (sigaction(sig, &new, &old) < 0)
+ return (SIG_ERR);
+ return (old.sa_handler);
#endif
- int status;
- FILE *VFile;
+}
+
+/* make a clean exit on interrupts */
+static void cleanup(int signo _U_)
+{
+#ifdef _WIN32
+ if (timer_handle != INVALID_HANDLE_VALUE)
+ {
+ DeleteTimerQueueTimer(NULL, timer_handle, NULL);
+ CloseHandle(timer_handle);
+ timer_handle = INVALID_HANDLE_VALUE;
+ }
+#else /* _WIN32 */
+ struct itimerval timer;
+
+ timer.it_interval.tv_sec = 0;
+ timer.it_interval.tv_usec = 0;
+ timer.it_value.tv_sec = 0;
+ timer.it_value.tv_usec = 0;
+ setitimer(ITIMER_REAL, &timer, NULL);
+#endif /* _WIN32 */
+
+#ifdef HAVE_PCAP_BREAKLOOP
+ /*
+ * We have "pcap_breakloop()"; use it, so that we do as little
+ * as possible in the signal handler (it's probably not safe
+ * to do anything with standard I/O streams in a signal handler -
+ * the ANSI C standard doesn't say it is).
+ */
+ if (pd)
+ {
+ pcap_breakloop(pd);
+ pcap_close(pd);
+#ifdef HAVE_PCAP_DUMP_FLUSH
+ if (WFileName != NULL)
+ {
+ pcap_dump_flush(dumpinfo.pdd);
+ }
+#endif
+ pd = NULL;
+ }
+#else
+ /*
+ * We don't have "pcap_breakloop()"; this isn't safe, but
+ * it's the best we can do. Print the summary if we're
+ * not reading from a savefile - i.e., if we're doing a
+ * live capture - and exit.
+ */
+ if (pd != NULL && pcap_file(pd) == NULL)
+ {
+ /*
+ * We got interrupted, so perhaps we didn't
+ * manage to finish a line we were printing.
+ * Print an extra newline, just in case.
+ */
+ putchar('\n');
+ (void)fflush(stdout);
+ info(1);
+ }
+ exit_tcpdump(S_SUCCESS);
+#endif
+
+#if STELLAR_DUMP
+ if (fcode.bf_len != 0)
+ {
+ pcap_freecode(&fcode);
+ memset(&fcode, 0, sizeof(fcode));
+ }
+ g_stellar_dump_run = 0;
+ if (device != NULL) // for memleak check
+ {
+ free(device);
+ device = NULL;
+ }
+ if (RFileName == NULL && VFileName == NULL)
+ {
+ stellar_dump_ctrllink_keepalive_stop();
+ stellar_dump_ctrllink_free();
+ }
+ exit_tcpdump(S_SUCCESS);
+#endif
+}
+
+/*
+ On windows, we do not use a fork, so we do not care less about
+ waiting a child processes to die
+ */
+#if defined(HAVE_FORK) || defined(HAVE_VFORK)
+static void
+child_cleanup(int signo _U_)
+{
+ wait(NULL);
+}
+#endif /* HAVE_FORK && HAVE_VFORK */
+
+static void
+info(int verbose)
+{
+ struct pcap_stat stats;
+
+ /*
+ * Older versions of libpcap didn't set ps_ifdrop on some
+ * platforms; initialize it to 0 to handle that.
+ */
+ stats.ps_ifdrop = 0;
+ if (pcap_stats(pd, &stats) < 0)
+ {
+ (void)fprintf(stderr, "pcap_stats: %s\n", pcap_geterr(pd));
+ infoprint = 0;
+ return;
+ }
+
+ if (!verbose)
+ fprintf(stderr, "%s: ", program_name);
+
+ (void)fprintf(stderr, "%u packet%s captured", packets_captured,
+ PLURAL_SUFFIX(packets_captured));
+ if (!verbose)
+ fputs(", ", stderr);
+ else
+ putc('\n', stderr);
+ (void)fprintf(stderr, "%u packet%s received by filter", stats.ps_recv,
+ PLURAL_SUFFIX(stats.ps_recv));
+ if (!verbose)
+ fputs(", ", stderr);
+ else
+ putc('\n', stderr);
+ (void)fprintf(stderr, "%u packet%s dropped by kernel", stats.ps_drop,
+ PLURAL_SUFFIX(stats.ps_drop));
+ if (stats.ps_ifdrop != 0)
+ {
+ if (!verbose)
+ fputs(", ", stderr);
+ else
+ putc('\n', stderr);
+ (void)fprintf(stderr, "%u packet%s dropped by interface\n",
+ stats.ps_ifdrop, PLURAL_SUFFIX(stats.ps_ifdrop));
+ }
+ else
+ putc('\n', stderr);
+ infoprint = 0;
+}
+
+#if defined(HAVE_FORK) || defined(HAVE_VFORK)
+#ifdef HAVE_FORK
+#define fork_subprocess() fork()
+#else
+#define fork_subprocess() vfork()
+#endif
+static void
+compress_savefile(const char *filename)
+{
+ pid_t child;
+
+ child = fork_subprocess();
+ if (child == -1)
+ {
+ fprintf(stderr,
+ "compress_savefile: fork failed: %s\n",
+ pcap_strerror(errno));
+ return;
+ }
+ if (child != 0)
+ {
+ /* Parent process. */
+ return;
+ }
+
+ /*
+ * Child process.
+ * Set to lowest priority so that this doesn't disturb the capture.
+ */
+#ifdef NZERO
+ setpriority(PRIO_PROCESS, 0, NZERO - 1);
+#else
+ setpriority(PRIO_PROCESS, 0, 19);
+#endif
+ if (execlp(zflag, zflag, filename, (char *)NULL) == -1)
+ fprintf(stderr,
+ "compress_savefile: execlp(%s, %s) failed: %s\n",
+ zflag,
+ filename,
+ pcap_strerror(errno));
+#ifdef HAVE_FORK
+ exit(S_ERR_HOST_PROGRAM);
+#else
+ _exit(S_ERR_HOST_PROGRAM);
+#endif
+}
+#else /* HAVE_FORK && HAVE_VFORK */
+static void
+compress_savefile(const char *filename)
+{
+ fprintf(stderr,
+ "compress_savefile failed. Functionality not implemented under your system\n");
+}
+#endif /* HAVE_FORK && HAVE_VFORK */
+
+static void
+dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
+{
+ struct dump_info *dump_info;
+
+ ++packets_captured;
+
+ ++infodelay;
+
+ dump_info = (struct dump_info *)user;
+
+ /*
+ * XXX - this won't force the file to rotate on the specified time
+ * boundary, but it will rotate on the first packet received after the
+ * specified Gflag number of seconds. Note: if a Gflag time boundary
+ * and a Cflag size boundary coincide, the time rotation will occur
+ * first thereby cancelling the Cflag boundary (since the file should
+ * be 0).
+ */
+ if (Gflag != 0)
+ {
+ /* Check if it is time to rotate */
+ time_t t;
+
+ /* Get the current time */
+ if ((t = time(NULL)) == (time_t)-1)
+ {
+ error("%s: can't get current_time: %s",
+ __func__, pcap_strerror(errno));
+ }
+
+ /* If the time is greater than the specified window, rotate */
+ if (t - Gflag_time >= Gflag)
+ {
#ifdef HAVE_CAPSICUM
- cap_rights_t rights;
- int cansandbox;
-#endif /* HAVE_CAPSICUM */
- int Oflag = 1; /* run filter code optimizer */
- int yflag_dlt = -1;
- const char *yflag_dlt_name = NULL;
- int print = 0;
+ FILE *fp;
+ int fd;
+#endif
+
+ /* Update the Gflag_time */
+ Gflag_time = t;
+ /* Update Gflag_count */
+ Gflag_count++;
+ /*
+ * Close the current file and open a new one.
+ */
+ pcap_dump_close(dump_info->pdd);
+
+ /*
+ * Compress the file we just closed, if the user asked for it
+ */
+ if (zflag != NULL)
+ compress_savefile(dump_info->CurrentFileName);
+
+ /*
+ * Check to see if we've exceeded the Wflag (when
+ * not using Cflag).
+ */
+ if (Cflag == 0 && Wflag > 0 && Gflag_count >= Wflag)
+ {
+ (void)fprintf(stderr, "Maximum file limit reached: %d\n",
+ Wflag);
+ info(1);
+ exit_tcpdump(S_SUCCESS);
+ /* NOTREACHED */
+ }
+ if (dump_info->CurrentFileName != NULL)
+ free(dump_info->CurrentFileName);
+ /* Allocate space for max filename + \0. */
+ dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
+ if (dump_info->CurrentFileName == NULL)
+ error("dump_packet_and_trunc: malloc");
+ /*
+ * Gflag was set otherwise we wouldn't be here. Reset the count
+ * so multiple files would end with 1,2,3 in the filename.
+ * The counting is handled with the -C flow after this.
+ */
+ Cflag_count = 0;
+
+ /*
+ * This is always the first file in the Cflag
+ * rotation: e.g. 0
+ * We also don't need numbering if Cflag is not set.
+ */
+ if (Cflag != 0)
+ MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0,
+ WflagChars);
+ else
+ MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0, 0);
+
+#ifdef HAVE_LIBCAP_NG
+ capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
+ capng_apply(CAPNG_SELECT_BOTH);
+#endif /* HAVE_LIBCAP_NG */
+#ifdef HAVE_CAPSICUM
+ fd = openat(dump_info->dirfd,
+ dump_info->CurrentFileName,
+ O_CREAT | O_WRONLY | O_TRUNC, 0644);
+ if (fd < 0)
+ {
+ error("unable to open file %s",
+ dump_info->CurrentFileName);
+ }
+ fp = fdopen(fd, "w");
+ if (fp == NULL)
+ {
+ error("unable to fdopen file %s",
+ dump_info->CurrentFileName);
+ }
+ dump_info->pdd = pcap_dump_fopen(dump_info->pd, fp);
+#else /* !HAVE_CAPSICUM */
+ dump_info->pdd = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
+#endif
+#ifdef HAVE_LIBCAP_NG
+ capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
+ capng_apply(CAPNG_SELECT_BOTH);
+#endif /* HAVE_LIBCAP_NG */
+ if (dump_info->pdd == NULL)
+ error("%s", pcap_geterr(pd));
+#ifdef HAVE_CAPSICUM
+ set_dumper_capsicum_rights(dump_info->pdd);
+#endif
+ }
+ }
+
+ /*
+ * XXX - this won't prevent capture files from getting
+ * larger than Cflag - the last packet written to the
+ * file could put it over Cflag.
+ */
+ if (Cflag != 0)
+ {
+#ifdef HAVE_PCAP_DUMP_FTELL64
+ int64_t size = pcap_dump_ftell64(dump_info->pdd);
+#else
+ /*
+ * XXX - this only handles a Cflag value > 2^31-1 on
+ * LP64 platforms; to handle ILP32 (32-bit UN*X and
+ * Windows) or LLP64 (64-bit Windows) would require
+ * a version of libpcap with pcap_dump_ftell64().
+ */
+ long size = pcap_dump_ftell(dump_info->pdd);
+#endif
+
+ if (size == -1)
+ error("ftell fails on output file");
+ if (size > Cflag)
+ {
+#ifdef HAVE_CAPSICUM
+ FILE *fp;
+ int fd;
+#endif
+
+ /*
+ * Close the current file and open a new one.
+ */
+ pcap_dump_close(dump_info->pdd);
+
+ /*
+ * Compress the file we just closed, if the user
+ * asked for it.
+ */
+ if (zflag != NULL)
+ compress_savefile(dump_info->CurrentFileName);
+
+ Cflag_count++;
+ if (Wflag > 0)
+ {
+ if (Cflag_count >= Wflag)
+ Cflag_count = 0;
+ }
+ if (dump_info->CurrentFileName != NULL)
+ free(dump_info->CurrentFileName);
+ dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
+ if (dump_info->CurrentFileName == NULL)
+ error("%s: malloc", __func__);
+ MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, Cflag_count, WflagChars);
+#ifdef HAVE_LIBCAP_NG
+ capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
+ capng_apply(CAPNG_SELECT_BOTH);
+#endif /* HAVE_LIBCAP_NG */
+#ifdef HAVE_CAPSICUM
+ fd = openat(dump_info->dirfd, dump_info->CurrentFileName,
+ O_CREAT | O_WRONLY | O_TRUNC, 0644);
+ if (fd < 0)
+ {
+ error("unable to open file %s",
+ dump_info->CurrentFileName);
+ }
+ fp = fdopen(fd, "w");
+ if (fp == NULL)
+ {
+ error("unable to fdopen file %s",
+ dump_info->CurrentFileName);
+ }
+ dump_info->pdd = pcap_dump_fopen(dump_info->pd, fp);
+#else /* !HAVE_CAPSICUM */
+ dump_info->pdd = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
+#endif
+#ifdef HAVE_LIBCAP_NG
+ capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
+ capng_apply(CAPNG_SELECT_BOTH);
+#endif /* HAVE_LIBCAP_NG */
+ if (dump_info->pdd == NULL)
+ error("%s", pcap_geterr(pd));
+#ifdef HAVE_CAPSICUM
+ set_dumper_capsicum_rights(dump_info->pdd);
+#endif
+ }
+ }
+
+ pcap_dump((u_char *)dump_info->pdd, h, sp);
+#ifdef HAVE_PCAP_DUMP_FLUSH
+ if (Uflag)
+ pcap_dump_flush(dump_info->pdd);
+#endif
+
+ if (dump_info->ndo != NULL)
+ pretty_print_packet(dump_info->ndo, h, sp, packets_captured);
+
+ --infodelay;
+ if (infoprint)
+ info(0);
+}
+
+//#include "stellar/packet_manager.h"
+#include "packet_manager/packet_internal.h"
+#include "packet_manager/packet_parser.h"
+#include "stellar/log.h"
+#include "stellar/exdata.h"
+
+// fake variable and function
+__thread struct logger *__thread_local_logger = NULL;
+int exdata_set(struct exdata_runtime *rt, int idx, void *ex_ptr)
+{
+ return 0;
+}
+void *exdata_get(struct exdata_runtime *rt, int idx)
+{
+ return NULL;
+}
+int log_check_level(struct logger *logger, enum log_level level)
+{
+ return 0;
+}
+void log_print(struct logger *logger, enum log_level level, const char *module, const char *fmt, ...)
+{
+ return;
+}
+/*
+ * 0: not match
+ * not 0: match
+ */
+static int packet_filter_greedy(const struct pcap_pkthdr *h, const u_char *sp)
+{
+ if (NULL == cmdbuf || fcode.bf_len == 0)
+ {
+ return 1;
+ }
+
+ struct packet _pkt = {};
+ if (NULL == packet_parse(&_pkt, (char *)sp, h->caplen))
+ {
+ return 0;
+ }
+ struct packet *pkt = &_pkt;
+ const char *raw_pkt_hdr = packet_get_raw_data(pkt);
+ int raw_pkt_len = (int)packet_get_raw_len(pkt);
+ int pkt_layer = packet_get_layer_count(pkt);
+ int match = 0;
+ for (int i = 0; i < pkt_layer; i++)
+ {
+ const struct layer *layer = packet_get_layer_by_idx(pkt, i);
+ if (layer->proto == LAYER_PROTO_IPV4 || layer->proto == LAYER_PROTO_IPV6)
+ {
+ int remain_len = raw_pkt_len - (layer->hdr.raw - raw_pkt_hdr);
+ if (remain_len <= 0)
+ {
+ continue;
+ }
+ match = bpf_filter(fcode.bf_insns, (unsigned char *)layer->hdr.raw, remain_len, remain_len);
+ if (match)
+ {
+ break;
+ }
+ }
+ }
+ return match;
+}
+
+void dump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
+{
+ struct dump_info *dump_info;
+ if ((g_stellar_dump_arg.greedy_seek != 0) && packet_filter_greedy(h, sp) == 0)
+ {
+ return;
+ }
+
+ ++packets_captured;
+
+ ++infodelay;
+
+ dump_info = (struct dump_info *)user;
+
+ pcap_dump((u_char *)dump_info->pdd, h, sp);
+#ifdef HAVE_PCAP_DUMP_FLUSH
+ if (Uflag)
+ pcap_dump_flush(dump_info->pdd);
+#endif
+
+ if (dump_info->ndo != NULL)
+ pretty_print_packet(dump_info->ndo, h, sp, packets_captured);
+
+ --infodelay;
+ if (infoprint)
+ info(0);
+}
+
+void print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
+{
+ if ((g_stellar_dump_arg.greedy_seek != 0) && packet_filter_greedy(h, sp) == 0)
+ {
+ return;
+ }
+ ++packets_captured;
+
+ ++infodelay;
+
+ if (!count_mode)
+ pretty_print_packet((netdissect_options *)user, h, sp, packets_captured);
+
+ --infodelay;
+ if (infoprint)
+ info(0);
+}
+
+#ifdef SIGNAL_REQ_INFO
+static void
+requestinfo(int signo _U_)
+{
+ if (infodelay)
+ ++infoprint;
+ else
+ info(0);
+}
+#endif
+
+#ifdef SIGNAL_FLUSH_PCAP
+static void
+flushpcap(int signo _U_)
+{
+ if (pdd != NULL)
+ pcap_dump_flush(pdd);
+}
+#endif
+
+static void
+print_packets_captured(void)
+{
+ static u_int prev_packets_captured, first = 1;
+
+ if (infodelay == 0 && (first || packets_captured != prev_packets_captured))
+ {
+ fprintf(stderr, "Got %u\r", packets_captured);
+ first = 0;
+ prev_packets_captured = packets_captured;
+ }
+}
+
+/*
+ * Called once each second in verbose mode while dumping to file
+ */
+#ifdef _WIN32
+static void CALLBACK verbose_stats_dump(PVOID param _U_,
+ BOOLEAN timer_fired _U_)
+{
+ print_packets_captured();
+}
+#else /* _WIN32 */
+static void verbose_stats_dump(int sig _U_)
+{
+ print_packets_captured();
+}
+#endif /* _WIN32 */
+
+DIAG_OFF_DEPRECATION
+static void
+print_version(FILE *f)
+{
+#ifndef HAVE_PCAP_LIB_VERSION
+#ifdef HAVE_PCAP_VERSION
+ extern char pcap_version[];
+#else /* HAVE_PCAP_VERSION */
+ static char pcap_version[] = "unknown";
+#endif /* HAVE_PCAP_VERSION */
+#endif /* HAVE_PCAP_LIB_VERSION */
+ const char *smi_version_string;
+
+ (void)fprintf(f, "%s version " PACKAGE_VERSION "\n", program_name);
+#ifdef HAVE_PCAP_LIB_VERSION
+ (void)fprintf(f, "%s\n", pcap_lib_version());
+#else /* HAVE_PCAP_LIB_VERSION */
+ (void)fprintf(f, "libpcap version %s\n", pcap_version);
+#endif /* HAVE_PCAP_LIB_VERSION */
+
+#if defined(HAVE_LIBCRYPTO) && defined(SSLEAY_VERSION)
+ (void)fprintf(f, "%s\n", SSLeay_version(SSLEAY_VERSION));
+#endif
+
+ smi_version_string = nd_smi_version_string();
+ if (smi_version_string != NULL)
+ (void)fprintf(f, "SMI-library: %s\n", smi_version_string);
+
+#if defined(__SANITIZE_ADDRESS__)
+ (void)fprintf(f, "Compiled with AddressSanitizer/GCC.\n");
+#elif defined(__has_feature)
+#if __has_feature(address_sanitizer)
+ (void)fprintf(f, "Compiled with AddressSanitizer/Clang.\n");
+#elif __has_feature(memory_sanitizer)
+ (void)fprintf(f, "Compiled with MemorySanitizer/Clang.\n");
+#endif
+#endif /* __SANITIZE_ADDRESS__ or __has_feature */
+}
+DIAG_ON_DEPRECATION
+
+static void
+print_usage(FILE *f)
+{
+ print_version(f);
+ (void)fprintf(f,
+ "Usage: %s [-Abd" D_FLAG "efhH" I_FLAG J_FLAG "KlLnNOpqStu" U_FLAG "vxX#]" B_FLAG_USAGE " [ -c count ] [--count]\n", program_name);
+ (void)fprintf(f,
+ "\t\t[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]\n");
+#if STELLAR_DUMP == 0
+ (void)fprintf(f, "\t\t[ -i interface ]" IMMEDIATE_MODE_USAGE j_FLAG_USAGE "\n");
+#endif
+#ifdef HAVE_PCAP_FINDALLDEVS_EX
+ (void)fprintf(f,
+ "\t\t" LIST_REMOTE_INTERFACES_USAGE "\n");
+#endif
+#ifdef USE_LIBSMI
+ (void)fprintf(f,
+ "\t\t" m_FLAG_USAGE "\n");
+#endif
+
+ (void)fprintf(f, "\t\t[ -M secret ] [ --number ] [ --print ]" Q_FLAG_USAGE "\n");
+ (void)fprintf(f,
+ "\t\t[ -r file ] [ -s snaplen ] [ -T type ] [ --version ]\n");
+ (void)fprintf(f,
+ "\t\t[ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ]\n");
+#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
+ (void)fprintf(f,
+ "\t\t[ --time-stamp-precision precision ] [ --micro ] [ --nano ]\n");
+#endif
+ (void)fprintf(f,
+ "\t\t[ -z postrotate-command ] [ -Z user ] [ expression ]\n");
+#if STELLAR_DUMP
+ (void)fprintf(f, "\n --- \033[1m%s %s ---\033[0m\n", "The following options are customized for", PROGRAM_NAME);
+ (void)fprintf(f, "\t\t[ -i ] not interface, is stellar monitor ip (default: 127.0.0.1)\n");
+ (void)fprintf(f, "\t\t[ -P ] stellar monitor port (default: 80)\n");
+ (void)fprintf(f, "\t\t[ -g ] enable greedy seek to most inner IP layer for tunnel protocol (default: disable)\n");
+ (void)fprintf(f, "\t\t[ -k ] which threads enable packet dump, support comma-separated values, for example: 1,3,5 (default: all threads)\n");
+#endif
+}
- netdissect_options Ndo;
- netdissect_options *ndo = &Ndo;
+// static netdissect_options Ndo;
+// static netdissect_options *ndo = &Ndo;
+// static struct dump_info dumpinfo;
+// u_char *pcap_userdata;
+// static char *cp, *infile, *cmdbuf, *device, *RFileName, *VFileName, *WFileName;
+// pcap_handler callback;
+// static int print = 0;
+// static FILE *VFile;
+// static char VFileLine[PATH_MAX + 1];
+// static char ebuf[PCAP_ERRBUF_SIZE];
+// int dlt, i;
+// static char *endp;
+// static int cnt, op;
+// static bpf_u_int32 localnet = 0, netmask = 0;
+
+// static int Oflag = 1; /* run filter code optimizer */
+// static int yflag_dlt = -1;
+// static const char *yflag_dlt_name = NULL;
+
+// static const char *dlt_name;
+// static struct bpf_program fcode;
+// #ifndef _WIN32
+// static void (*oldhandler)(int);
+// #endif
+
+// static const char *username = NULL;
+// #ifndef _WIN32
+// static const char *chroot_dir = NULL;
+// #endif
+// static char *ret = NULL;
+// static char *end;
+// #ifdef HAVE_PCAP_FINDALLDEVS
+// static pcap_if_t *devlist;
+// static long devnum;
+// #endif
+// static int status;
+
+// #ifdef HAVE_CAPSICUM
+// static cap_rights_t rights;
+// static int cansandbox;
+// #endif /* HAVE_CAPSICUM */
+// static int argc;
+// static char **argv;
+
+int tcpdump_parse_args(int f_argc, char **f_argv)
+{
+ argc = f_argc;
+ argv = f_argv;
/*
* Initialize the netdissect code.
*/
@@ -1558,9 +2396,9 @@
if (abort_on_misalignment(ebuf, sizeof(ebuf)) < 0)
error("%s", ebuf);
- while (
- (op = getopt_long(argc, argv, SHORTOPTS, longopts, NULL)) != -1)
- switch (op) {
+ while ((op = getopt_long(argc, argv, SHORTOPTS, longopts, NULL)) != -1)
+ switch (op)
+ {
case 'a':
/* compatibility for old -a */
@@ -1576,7 +2414,7 @@
#if defined(HAVE_PCAP_CREATE) || defined(_WIN32)
case 'B':
- Bflag = atoi(optarg)*1024;
+ Bflag = atoi(optarg) * 1024;
if (Bflag <= 0)
error("invalid packet buffer size %s", optarg);
break;
@@ -1586,6 +2424,7 @@
cnt = atoi(optarg);
if (cnt <= 0)
error("invalid packet count %s", optarg);
+ g_stellar_dump_arg.expect_packet_count = cnt;
break;
case 'C':
@@ -1595,12 +2434,11 @@
#else
Cflag = strtol(optarg, &endp, 10);
#endif
- if (endp == optarg || *endp != '\0' || errno != 0
- || Cflag <= 0)
+ if (endp == optarg || *endp != '\0' || errno != 0 || Cflag <= 0)
error("invalid file size %s", optarg);
- /*
- * Will multiplying it by 1000000 overflow?
- */
+ /*
+ * Will multiplying it by 1000000 overflow?
+ */
#ifdef HAVE_PCAP_DUMP_FTELL64
if (Cflag > INT64_T_CONSTANT(0x7fffffffffffffff) / 1000000)
#else
@@ -1649,18 +2487,24 @@
infile = optarg;
break;
+#if STELLAR_DUMP
+ case 'g':
+ g_stellar_dump_arg.greedy_seek = 1;
+ break;
+#endif
case 'G':
Gflag = atoi(optarg);
if (Gflag < 0)
error("invalid number of seconds %s", optarg);
- /* We will create one file initially. */
- Gflag_count = 0;
+ /* We will create one file initially. */
+ Gflag_count = 0;
/* Grab the current time for rotation use. */
- if ((Gflag_time = time(NULL)) == (time_t)-1) {
+ if ((Gflag_time = time(NULL)) == (time_t)-1)
+ {
error("%s: can't get current time: %s",
- __func__, pcap_strerror(errno));
+ __func__, pcap_strerror(errno));
}
break;
@@ -1674,8 +2518,20 @@
break;
case 'i':
+ {
+#if STELLAR_DUMP
+ uint32_t tmp_ip;
+ g_stellar_dump_arg.stellar_server_ip = optarg;
+ if (inet_pton(AF_INET, g_stellar_dump_arg.stellar_server_ip, &tmp_ip) != 1)
+ {
+ printf("invalid ip address %s\n", g_stellar_dump_arg.stellar_server_ip);
+ exit(1);
+ }
+#else
device = optarg;
- break;
+#endif
+ }
+ break;
#ifdef HAVE_PCAP_CREATE
case 'I':
@@ -1717,17 +2573,38 @@
lflag = 1;
break;
+#if STELLAR_DUMP
+ case 'k':
+ {
+ const char *ptr = optarg;
+ size_t len = strlen(optarg);
+ for (i = 0; i < (int)len; i++)
+ {
+ if (isxdigit(ptr[i]) == 0 && ptr[i] != ',')
+ {
+ printf("invalid threads expression: %s\n", optarg);
+ exit(1);
+ }
+ }
+ g_stellar_dump_arg.thread_enable_expression = optarg;
+ }
+ break;
+#endif
+
case 'K':
++ndo->ndo_Kflag;
break;
case 'm':
- if (nd_have_smi_support()) {
+ if (nd_have_smi_support())
+ {
if (nd_load_smi_module(optarg, ebuf, sizeof(ebuf)) == -1)
error("%s", ebuf);
- } else {
+ }
+ else
+ {
(void)fprintf(stderr, "%s: ignoring option `-m %s' ",
- program_name, optarg);
+ program_name, optarg);
(void)fprintf(stderr, "(no libsmi support)\n");
}
break;
@@ -1756,6 +2633,19 @@
++pflag;
break;
+#if STELLAR_DUMP
+ case 'P':
+ {
+ int tmp_port = atoi(optarg);
+ if (tmp_port <= 0 || tmp_port > 65535)
+ {
+ printf("invalid port %s\n", optarg);
+ exit(1);
+ }
+ g_stellar_dump_arg.stellar_server_port_host_order = (unsigned short)tmp_port;
+ }
+ break;
+#endif
case 'q':
++ndo->ndo_qflag;
++ndo->ndo_suppress_default_print;
@@ -1763,6 +2653,7 @@
#ifdef HAVE_PCAP_SETDIRECTION
case 'Q':
+#if STELLAR_DUMP == 0
if (ascii_strcasecmp(optarg, "in") == 0)
Qflag = PCAP_D_IN;
else if (ascii_strcasecmp(optarg, "out") == 0)
@@ -1771,6 +2662,10 @@
Qflag = PCAP_D_INOUT;
else
error("unknown capture direction `%s'", optarg);
+#else
+ fprintf(stderr, "unsupport '-Q' option for %s\n", PROGRAM_NAME);
+ return -1;
+#endif
break;
#endif /* HAVE_PCAP_SETDIRECTION */
@@ -1780,10 +2675,9 @@
case 's':
ndo->ndo_snaplen = (int)strtol(optarg, &end, 0);
- if (optarg == end || *end != '\0'
- || ndo->ndo_snaplen < 0 || ndo->ndo_snaplen > MAXIMUM_SNAPLEN)
+ if (optarg == end || *end != '\0' || ndo->ndo_snaplen < 0 || ndo->ndo_snaplen > MAXIMUM_SNAPLEN)
error("invalid snaplen %s (must be >= 0 and <= %d)",
- optarg, MAXIMUM_SNAPLEN);
+ optarg, MAXIMUM_SNAPLEN);
break;
case 'S':
@@ -1888,11 +2782,11 @@
#ifdef HAVE_PCAP_SET_PARSER_DEBUG
case 'Y':
- {
+ {
/* Undocumented flag */
pcap_set_parser_debug(1);
- }
- break;
+ }
+ break;
#endif
case 'z':
zflag = optarg;
@@ -1970,15 +2864,31 @@
#endif
#if defined(DLT_LINUX_SLL2) && defined(HAVE_PCAP_SET_DATALINK)
-/* Set default linktype DLT_LINUX_SLL2 when capturing on the "any" device */
- if (device != NULL &&
- strncmp (device, "any", strlen("any")) == 0
- && yflag_dlt == -1)
- yflag_dlt = DLT_LINUX_SLL2;
+ /* Set default linktype DLT_LINUX_SLL2 when capturing on the "any" device */
+ if (device != NULL &&
+ strncmp(device, "any", strlen("any")) == 0 && yflag_dlt == -1)
+ yflag_dlt = DLT_LINUX_SLL2;
#endif
- switch (ndo->ndo_tflag) {
+#if STELLAR_DUMP
+ /* set default value */
+ if (g_stellar_dump_arg.stellar_server_ip == NULL)
+ {
+ g_stellar_dump_arg.stellar_server_ip = CTRLLINK_DEFAULT_IP;
+ }
+ if (g_stellar_dump_arg.stellar_server_port_host_order == 0)
+ {
+ g_stellar_dump_arg.stellar_server_port_host_order = CTRLLINK_DEFAULT_PORT;
+ }
+#endif
+ return 0;
+}
+int tcpdump_prepare(void)
+{
+ char *ret;
+ switch (ndo->ndo_tflag)
+ {
case 0: /* Default */
case 1: /* No time stamp */
case 2: /* Unix timeval style */
@@ -2013,7 +2923,8 @@
#ifdef WITH_CHROOT
/* if run as root, prepare for chrooting */
- if (getuid() == 0 || geteuid() == 0) {
+ if (getuid() == 0 || geteuid() == 0)
+ {
/* future extensibility for cmd-line arguments */
if (!chroot_dir)
chroot_dir = WITH_CHROOT;
@@ -2022,14 +2933,16 @@
#ifdef WITH_USER
/* if run as root, prepare for dropping root privileges */
- if (getuid() == 0 || geteuid() == 0) {
+ if (getuid() == 0 || geteuid() == 0)
+ {
/* Run with '-Z root' to restore old behaviour */
if (!username)
username = WITH_USER;
}
#endif
- if (RFileName != NULL || VFileName != NULL) {
+ if (RFileName != NULL || VFileName != NULL)
+ {
/*
* If RFileName is non-null, it's the pathname of a
* savefile to read. If VFileName is non-null, it's
@@ -2049,10 +2962,11 @@
* people's trace files (especially if we're set-UID
* root).
*/
- if (setgid(getgid()) != 0 || setuid(getuid()) != 0 )
+ if (setgid(getgid()) != 0 || setuid(getuid()) != 0)
fprintf(stderr, "Warning: setgid/setuid failed !\n");
#endif /* _WIN32 */
- if (VFileName != NULL) {
+ if (VFileName != NULL)
+ {
if (VFileName[0] == '-' && VFileName[1] == '\0')
VFile = stdin;
else
@@ -2069,7 +2983,7 @@
#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
pd = pcap_open_offline_with_tstamp_precision(RFileName,
- ndo->ndo_tstamp_precision, ebuf);
+ ndo->ndo_tstamp_precision, ebuf);
#else
pd = pcap_open_offline(RFileName, ebuf);
#endif
@@ -2079,25 +2993,31 @@
#ifdef HAVE_CAPSICUM
cap_rights_init(&rights, CAP_READ);
if (cap_rights_limit(fileno(pcap_file(pd)), &rights) < 0 &&
- errno != ENOSYS) {
+ errno != ENOSYS)
+ {
error("unable to limit pcap descriptor");
}
#endif
dlt = pcap_datalink(pd);
dlt_name = pcap_datalink_val_to_name(dlt);
fprintf(stderr, "reading from file %s", RFileName);
- if (dlt_name == NULL) {
- fprintf(stderr, ", link-type %u", dlt);
- } else {
+ if (dlt_name == NULL)
+ {
+ fprintf(stderr, ", link-type %d", dlt);
+ }
+ else
+ {
fprintf(stderr, ", link-type %s (%s)", dlt_name,
- pcap_datalink_val_to_description(dlt));
+ pcap_datalink_val_to_description(dlt));
}
fprintf(stderr, ", snapshot length %d\n", pcap_snapshot(pd));
#ifdef DLT_LINUX_SLL2
if (dlt == DLT_LINUX_SLL2)
fprintf(stderr, "Warning: interface names might be incorrect\n");
#endif
- } else if (dflag && !device) {
+ }
+ else if (dflag && !device)
+ {
int dump_dlt = DLT_EN10MB;
/*
* We're dumping the compiled code without an explicit
@@ -2119,12 +3039,16 @@
dump_dlt = yflag_dlt;
else
fprintf(stderr, "Warning: assuming Ethernet\n");
- pd = pcap_open_dead(dump_dlt, ndo->ndo_snaplen);
- } else {
+ pd = pcap_open_dead(dump_dlt, ndo->ndo_snaplen);
+ }
+ else
+ {
/*
* We're doing a live capture.
*/
- if (device == NULL) {
+ if (device == NULL)
+ {
+#if STELLAR_DUMP == 0
/*
* No interface was specified. Pick one.
*/
@@ -2148,13 +3072,21 @@
if (device == NULL)
error("%s", ebuf);
#endif
+#else
+ device = strdup("lo");
+#endif
}
/*
* Try to open the interface with the specified name.
*/
+#if STELLAR_DUMP == 0
pd = open_interface(device, ndo, ebuf);
- if (pd == NULL) {
+#else
+ pd = pcap_open_dead(DLT_EN10MB, 65535);
+#endif
+ if (pd == NULL)
+ {
/*
* That failed. If we can get a list of
* interfaces, and the interface name
@@ -2164,7 +3096,8 @@
*/
#ifdef HAVE_PCAP_FINDALLDEVS
devnum = parse_interface_number(device);
- if (devnum == -1) {
+ if (devnum == -1)
+ {
/*
* It's not a number; just report
* the open error and fail.
@@ -2184,7 +3117,7 @@
pd = open_interface(device, ndo, ebuf);
if (pd == NULL)
error("%s", ebuf);
-#else /* HAVE_PCAP_FINDALLDEVS */
+#else /* HAVE_PCAP_FINDALLDEVS */
/*
* We can't get a list of interfaces; just
* fail.
@@ -2202,14 +3135,16 @@
fprintf(stderr, "Warning: setgid/setuid failed !\n");
#endif /* _WIN32 */
#if !defined(HAVE_PCAP_CREATE) && defined(_WIN32)
- if(Bflag != 0)
- if(pcap_setbuff(pd, Bflag)==-1){
+ if (Bflag != 0)
+ if (pcap_setbuff(pd, Bflag) == -1)
+ {
error("%s", pcap_geterr(pd));
}
#endif /* !defined(HAVE_PCAP_CREATE) && defined(_WIN32) */
if (Lflag)
show_dlts_and_exit(pd, device);
- if (yflag_dlt >= 0) {
+ if (yflag_dlt >= 0)
+ {
#ifdef HAVE_PCAP_SET_DATALINK
if (pcap_set_datalink(pd, yflag_dlt) < 0)
error("%s", pcap_geterr(pd));
@@ -2219,31 +3154,36 @@
* data link type, so we only let them
* set it to what it already is.
*/
- if (yflag_dlt != pcap_datalink(pd)) {
+ if (yflag_dlt != pcap_datalink(pd))
+ {
error("%s is not one of the DLTs supported by this device\n",
- yflag_dlt_name);
+ yflag_dlt_name);
}
#endif
(void)fprintf(stderr, "%s: data link type %s\n",
- program_name,
- pcap_datalink_val_to_name(yflag_dlt));
+ program_name,
+ pcap_datalink_val_to_name(yflag_dlt));
(void)fflush(stderr);
}
i = pcap_snapshot(pd);
- if (ndo->ndo_snaplen < i) {
+ if (ndo->ndo_snaplen < i)
+ {
if (ndo->ndo_snaplen != 0)
warning("snaplen raised from %d to %d", ndo->ndo_snaplen, i);
ndo->ndo_snaplen = i;
- } else if (ndo->ndo_snaplen > i) {
+ }
+ else if (ndo->ndo_snaplen > i)
+ {
warning("snaplen lowered from %d to %d", ndo->ndo_snaplen, i);
ndo->ndo_snaplen = i;
}
- if(ndo->ndo_fflag != 0) {
- if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {
- warning("foreign (-f) flag used but: %s", ebuf);
- }
- }
-
+ if (ndo->ndo_fflag != 0)
+ {
+ if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0)
+ {
+ warning("foreign (-f) flag used but: %s", ebuf);
+ }
+ }
}
if (infile)
cmdbuf = read_infile(infile);
@@ -2253,9 +3193,32 @@
#ifdef HAVE_PCAP_SET_OPTIMIZER_DEBUG
pcap_set_optimizer_debug(dflag);
#endif
- if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
- error("%s", pcap_geterr(pd));
- if (dflag) {
+
+ if (cmdbuf != NULL)
+ {
+ int compile_ret;
+ if (RFileName != NULL)
+ {
+ if (g_stellar_dump_arg.greedy_seek == 0)
+ {
+ compile_ret = pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask);
+ }
+ else
+ {
+ compile_ret = pcap_compile_nopcap(65535, DLT_RAW, &fcode, cmdbuf, Oflag, netmask);
+ }
+ }
+ else
+ {
+ compile_ret = pcap_compile_nopcap(65535, DLT_RAW, &fcode, cmdbuf, Oflag, netmask);
+ }
+ if (compile_ret < 0)
+ {
+ error("pcap_compile: %s", pcap_geterr(pd));
+ }
+ }
+ if (dflag)
+ {
bpf_dump(&fcode, dflag);
pcap_close(pd);
free(cmdbuf);
@@ -2263,10 +3226,14 @@
exit_tcpdump(S_SUCCESS);
}
+#if STELLAR_DUMP
+ g_stellar_dump_arg.bpf = cmdbuf;
+#endif
+
#ifdef HAVE_CASPER
if (!ndo->ndo_nflag)
capdns = capdns_setup();
-#endif /* HAVE_CASPER */
+#endif /* HAVE_CASPER */
init_print(ndo, localnet, netmask);
@@ -2303,52 +3270,60 @@
* savefile doesn't handle the general case.
*/
- if (getuid() == 0 || geteuid() == 0) {
+ if (getuid() == 0 || geteuid() == 0)
+ {
#ifdef HAVE_LIBCAP_NG
/* Initialize capng */
capng_clear(CAPNG_SELECT_BOTH);
- if (username) {
-DIAG_OFF_ASSIGN_ENUM
+ if (username)
+ {
+ DIAG_OFF_ASSIGN_ENUM
capng_updatev(
CAPNG_ADD,
CAPNG_PERMITTED | CAPNG_EFFECTIVE,
CAP_SETUID,
CAP_SETGID,
-1);
-DIAG_ON_ASSIGN_ENUM
+ DIAG_ON_ASSIGN_ENUM
}
- if (chroot_dir) {
-DIAG_OFF_ASSIGN_ENUM
+ if (chroot_dir)
+ {
+ DIAG_OFF_ASSIGN_ENUM
capng_update(
CAPNG_ADD,
CAPNG_PERMITTED | CAPNG_EFFECTIVE,
- CAP_SYS_CHROOT
- );
-DIAG_ON_ASSIGN_ENUM
+ CAP_SYS_CHROOT);
+ DIAG_ON_ASSIGN_ENUM
}
- if (WFileName) {
-DIAG_OFF_ASSIGN_ENUM
+ if (WFileName)
+ {
+ DIAG_OFF_ASSIGN_ENUM
capng_update(
CAPNG_ADD,
CAPNG_PERMITTED | CAPNG_EFFECTIVE,
- CAP_DAC_OVERRIDE
- );
-DIAG_ON_ASSIGN_ENUM
+ CAP_DAC_OVERRIDE);
+ DIAG_ON_ASSIGN_ENUM
}
capng_apply(CAPNG_SELECT_BOTH);
#endif /* HAVE_LIBCAP_NG */
if (username || chroot_dir)
droproot(username, chroot_dir);
-
}
#endif /* _WIN32 */
- if (pcap_setfilter(pd, &fcode) < 0)
- error("%s", pcap_geterr(pd));
+ if (RFileName)
+ {
+ if ((pd != NULL) && (cmdbuf != NULL) && (0 == g_stellar_dump_arg.greedy_seek) && pcap_setfilter(pd, &fcode) < 0)
+ {
+ error("%s", pcap_geterr(pd));
+ return -1;
+ }
+ }
#ifdef HAVE_CAPSICUM
- if (RFileName == NULL && VFileName == NULL && pcap_fileno(pd) != -1) {
- static const unsigned long cmds[] = { BIOCGSTATS, BIOCROTZBUF };
+ if (RFileName == NULL && VFileName == NULL && pcap_fileno(pd) != -1)
+ {
+ static const unsigned long cmds[] = {BIOCGSTATS, BIOCROTZBUF};
/*
* The various libpcap devices use a combination of
@@ -2357,16 +3332,20 @@
*/
cap_rights_init(&rights, CAP_IOCTL, CAP_READ, CAP_EVENT);
if (cap_rights_limit(pcap_fileno(pd), &rights) < 0 &&
- errno != ENOSYS) {
+ errno != ENOSYS)
+ {
error("unable to limit pcap descriptor");
}
if (cap_ioctls_limit(pcap_fileno(pd), cmds,
- sizeof(cmds) / sizeof(cmds[0])) < 0 && errno != ENOSYS) {
+ sizeof(cmds) / sizeof(cmds[0])) < 0 &&
+ errno != ENOSYS)
+ {
error("unable to limit ioctls on pcap descriptor");
}
}
#endif
- if (WFileName) {
+ if (WFileName)
+ {
/* Do not exceed the default PATH_MAX for files. */
dumpinfo.CurrentFileName = (char *)malloc(PATH_MAX + 1);
@@ -2375,9 +3354,9 @@
/* We do not need numbering for dumpfiles if Cflag isn't set. */
if (Cflag != 0)
- MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, WflagChars);
+ MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, WflagChars);
else
- MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, 0);
+ MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, 0);
pdd = pcap_dump_open(pd, dumpinfo.CurrentFileName);
#ifdef HAVE_LIBCAP_NG
@@ -2387,10 +3366,8 @@
*/
capng_update(
CAPNG_DROP,
- (Cflag || Gflag ? 0 : CAPNG_PERMITTED)
- | CAPNG_EFFECTIVE,
- CAP_DAC_OVERRIDE
- );
+ (Cflag || Gflag ? 0 : CAPNG_PERMITTED) | CAPNG_EFFECTIVE,
+ CAP_DAC_OVERRIDE);
capng_apply(CAPNG_SELECT_BOTH);
#endif /* HAVE_LIBCAP_NG */
if (pdd == NULL)
@@ -2398,7 +3375,8 @@
#ifdef HAVE_CAPSICUM
set_dumper_capsicum_rights(pdd);
#endif
- if (Cflag != 0 || Gflag != 0) {
+ if (Cflag != 0 || Gflag != 0)
+ {
#ifdef HAVE_CAPSICUM
/*
* basename() and dirname() may modify their input buffer
@@ -2409,71 +3387,83 @@
*/
char *WFileName_copy;
- if ((WFileName_copy = strdup(WFileName)) == NULL) {
+ if ((WFileName_copy = strdup(WFileName)) == NULL)
+ {
error("Unable to allocate memory for file %s",
- WFileName);
+ WFileName);
}
DIAG_OFF_C11_EXTENSIONS
dumpinfo.WFileName = strdup(basename(WFileName_copy));
DIAG_ON_C11_EXTENSIONS
- if (dumpinfo.WFileName == NULL) {
+ if (dumpinfo.WFileName == NULL)
+ {
error("Unable to allocate memory for file %s",
- WFileName);
+ WFileName);
}
free(WFileName_copy);
- if ((WFileName_copy = strdup(WFileName)) == NULL) {
+ if ((WFileName_copy = strdup(WFileName)) == NULL)
+ {
error("Unable to allocate memory for file %s",
- WFileName);
+ WFileName);
}
DIAG_OFF_C11_EXTENSIONS
char *WFileName_dirname = dirname(WFileName_copy);
DIAG_ON_C11_EXTENSIONS
dumpinfo.dirfd = open(WFileName_dirname,
- O_DIRECTORY | O_RDONLY);
- if (dumpinfo.dirfd < 0) {
+ O_DIRECTORY | O_RDONLY);
+ if (dumpinfo.dirfd < 0)
+ {
error("unable to open directory %s",
- WFileName_dirname);
+ WFileName_dirname);
}
free(WFileName_dirname);
free(WFileName_copy);
cap_rights_init(&rights, CAP_CREATE, CAP_FCNTL,
- CAP_FTRUNCATE, CAP_LOOKUP, CAP_SEEK, CAP_WRITE);
+ CAP_FTRUNCATE, CAP_LOOKUP, CAP_SEEK, CAP_WRITE);
if (cap_rights_limit(dumpinfo.dirfd, &rights) < 0 &&
- errno != ENOSYS) {
+ errno != ENOSYS)
+ {
error("unable to limit directory rights");
}
if (cap_fcntls_limit(dumpinfo.dirfd, CAP_FCNTL_GETFL) < 0 &&
- errno != ENOSYS) {
+ errno != ENOSYS)
+ {
error("unable to limit dump descriptor fcntls");
}
-#else /* !HAVE_CAPSICUM */
+#else /* !HAVE_CAPSICUM */
dumpinfo.WFileName = WFileName;
#endif
callback = dump_packet_and_trunc;
dumpinfo.pd = pd;
dumpinfo.pdd = pdd;
pcap_userdata = (u_char *)&dumpinfo;
- } else {
+ }
+ else
+ {
callback = dump_packet;
dumpinfo.WFileName = WFileName;
dumpinfo.pd = pd;
dumpinfo.pdd = pdd;
pcap_userdata = (u_char *)&dumpinfo;
}
- if (print) {
+ if (print)
+ {
dlt = pcap_datalink(pd);
ndo->ndo_if_printer = get_if_printer(dlt);
dumpinfo.ndo = ndo;
- } else
+ }
+ else
dumpinfo.ndo = NULL;
#ifdef HAVE_PCAP_DUMP_FLUSH
if (Uflag)
pcap_dump_flush(pdd);
#endif
- } else {
+ }
+ else
+ {
dlt = pcap_datalink(pd);
ndo->ndo_if_printer = get_if_printer(dlt);
callback = print_packet;
@@ -2492,7 +3482,8 @@
(void)setsignal(SIGNAL_FLUSH_PCAP, flushpcap);
#endif
- if (ndo->ndo_vflag > 0 && WFileName && RFileName == NULL && !print) {
+ if (ndo->ndo_vflag > 0 && WFileName && RFileName == NULL && !print)
+ {
/*
* When capturing to a file, if "--print" wasn't specified,
*"-v" means tcpdump should, once per second,
@@ -2511,10 +3502,10 @@
* that printing the stats could be a "long wait".
*/
CreateTimerQueueTimer(&timer_handle, NULL,
- verbose_stats_dump, NULL, 1000, 1000,
- WT_EXECUTEDEFAULT|WT_EXECUTELONGFUNCTION);
+ verbose_stats_dump, NULL, 1000, 1000,
+ WT_EXECUTEDEFAULT | WT_EXECUTELONGFUNCTION);
setvbuf(stderr, NULL, _IONBF, 0);
-#else /* _WIN32 */
+#else /* _WIN32 */
/*
* Assume this is UN*X, and that it has setitimer(); that
* dates back to UNIX 95.
@@ -2529,30 +3520,38 @@
#endif /* _WIN32 */
}
- if (RFileName == NULL) {
+#if 0 == STELLAR_DUMP
+ if (RFileName == NULL)
+ {
/*
* Live capture (if -V was specified, we set RFileName
* to a file from the -V file). Print a message to
* the standard error on UN*X.
*/
- if (!ndo->ndo_vflag && !WFileName) {
+ if (!ndo->ndo_vflag && !WFileName)
+ {
(void)fprintf(stderr,
- "%s: verbose output suppressed, use -v[v]... for full protocol decode\n",
- program_name);
- } else
+ "%s: verbose output suppressed, use -v[v]... for full protocol decode\n",
+ program_name);
+ }
+ else
(void)fprintf(stderr, "%s: ", program_name);
dlt = pcap_datalink(pd);
dlt_name = pcap_datalink_val_to_name(dlt);
(void)fprintf(stderr, "listening on %s", device);
- if (dlt_name == NULL) {
+ if (dlt_name == NULL)
+ {
(void)fprintf(stderr, ", link-type %u", dlt);
- } else {
+ }
+ else
+ {
(void)fprintf(stderr, ", link-type %s (%s)", dlt_name,
- pcap_datalink_val_to_description(dlt));
+ pcap_datalink_val_to_description(dlt));
}
(void)fprintf(stderr, ", snapshot length %d bytes\n", ndo->ndo_snaplen);
(void)fflush(stderr);
}
+#endif
#ifdef HAVE_CAPSICUM
cansandbox = (VFileName == NULL && zflag == NULL);
@@ -2563,16 +3562,24 @@
#endif /* HAVE_CASPER */
if (cansandbox && cap_enter() < 0 && errno != ENOSYS)
error("unable to enter the capability mode");
-#endif /* HAVE_CAPSICUM */
+#endif /* HAVE_CAPSICUM */
+ return 0;
+}
- do {
+void tcpdump_run(void)
+{
+ char *ret = NULL;
+ do
+ {
status = pcap_loop(pd, cnt, callback, pcap_userdata);
- if (WFileName == NULL) {
+ if (WFileName == NULL)
+ {
/*
* We're printing packets. Flush the printed output,
* so it doesn't get intermingled with error output.
*/
- if (status == -2) {
+ if (status == -2)
+ {
/*
* We got interrupted, so perhaps we didn't
* manage to finish a line we were printing.
@@ -2582,7 +3589,8 @@
}
(void)fflush(stdout);
}
- if (status == -2) {
+ if (status == -2)
+ {
/*
* We got interrupted. If we are reading multiple
* files (via -V) set these so that we stop.
@@ -2590,24 +3598,32 @@
VFileName = NULL;
ret = NULL;
}
- if (status == -1) {
+ if (status == -1)
+ {
/*
* Error. Report it.
*/
(void)fprintf(stderr, "%s: pcap_loop: %s\n",
- program_name, pcap_geterr(pd));
+ program_name, pcap_geterr(pd));
}
- if (RFileName == NULL) {
+ if (RFileName == NULL)
+ {
/*
* We're doing a live capture. Report the capture
* statistics.
*/
info(1);
}
- pcap_close(pd);
- if (VFileName != NULL) {
+ if (pd)
+ {
+ pcap_close(pd);
+ pd = NULL;
+ }
+ if (VFileName != NULL)
+ {
ret = get_next_file(VFile, VFileLine);
- if (ret) {
+ if (ret)
+ {
int new_dlt;
RFileName = VFileLine;
@@ -2617,18 +3633,22 @@
#ifdef HAVE_CAPSICUM
cap_rights_init(&rights, CAP_READ);
if (cap_rights_limit(fileno(pcap_file(pd)),
- &rights) < 0 && errno != ENOSYS) {
+ &rights) < 0 &&
+ errno != ENOSYS)
+ {
error("unable to limit pcap descriptor");
}
#endif
new_dlt = pcap_datalink(pd);
- if (new_dlt != dlt) {
+ if (new_dlt != dlt)
+ {
/*
* The new file has a different
* link-layer header type from the
* previous one.
*/
- if (WFileName != NULL) {
+ if (WFileName != NULL)
+ {
/*
* We're writing raw packets
* that match the filter to
@@ -2667,586 +3687,86 @@
*/
dlt_name = pcap_datalink_val_to_name(dlt);
fprintf(stderr, "reading from file %s", RFileName);
- if (dlt_name == NULL) {
- fprintf(stderr, ", link-type %u", dlt);
- } else {
+ if (dlt_name == NULL)
+ {
+ fprintf(stderr, ", link-type %d", dlt);
+ }
+ else
+ {
fprintf(stderr, ", link-type %s (%s)",
- dlt_name,
- pcap_datalink_val_to_description(dlt));
+ dlt_name,
+ pcap_datalink_val_to_description(dlt));
}
fprintf(stderr, ", snapshot length %d\n", pcap_snapshot(pd));
}
}
- }
- while (ret != NULL);
+ } while (ret != NULL);
if (count_mode && RFileName != NULL)
fprintf(stdout, "%u packet%s\n", packets_captured,
- PLURAL_SUFFIX(packets_captured));
+ PLURAL_SUFFIX(packets_captured));
free(cmdbuf);
pcap_freecode(&fcode);
exit_tcpdump(status == -1 ? S_ERR_HOST_PROGRAM : S_SUCCESS);
}
-/*
- * Catch a signal.
- */
-static void
-(*setsignal (int sig, void (*func)(int)))(int)
-{
-#ifdef _WIN32
- return (signal(sig, func));
-#else
- struct sigaction old, new;
-
- memset(&new, 0, sizeof(new));
- new.sa_handler = func;
- if ((sig == SIGCHLD)
-# ifdef SIGNAL_REQ_INFO
- || (sig == SIGNAL_REQ_INFO)
-# endif
-# ifdef SIGNAL_FLUSH_PCAP
- || (sig == SIGNAL_FLUSH_PCAP)
-# endif
- )
- new.sa_flags = SA_RESTART;
- if (sigaction(sig, &new, &old) < 0)
- return (SIG_ERR);
- return (old.sa_handler);
-#endif
-}
-
-/* make a clean exit on interrupts */
-static void
-cleanup(int signo _U_)
+static void stellar_dump_run(void)
{
-#ifdef _WIN32
- if (timer_handle != INVALID_HANDLE_VALUE) {
- DeleteTimerQueueTimer(NULL, timer_handle, NULL);
- CloseHandle(timer_handle);
- timer_handle = INVALID_HANDLE_VALUE;
- }
-#else /* _WIN32 */
- struct itimerval timer;
-
- timer.it_interval.tv_sec = 0;
- timer.it_interval.tv_usec = 0;
- timer.it_value.tv_sec = 0;
- timer.it_value.tv_usec = 0;
- setitimer(ITIMER_REAL, &timer, NULL);
-#endif /* _WIN32 */
-
-#ifdef HAVE_PCAP_BREAKLOOP
- /*
- * We have "pcap_breakloop()"; use it, so that we do as little
- * as possible in the signal handler (it's probably not safe
- * to do anything with standard I/O streams in a signal handler -
- * the ANSI C standard doesn't say it is).
- */
- pcap_breakloop(pd);
-#else
- /*
- * We don't have "pcap_breakloop()"; this isn't safe, but
- * it's the best we can do. Print the summary if we're
- * not reading from a savefile - i.e., if we're doing a
- * live capture - and exit.
- */
- if (pd != NULL && pcap_file(pd) == NULL) {
+ if (stellar_dump_datalink_init(&g_stellar_dump_arg) < 0)
+ {
+ exit(1);
+ }
+ if (stellar_dump_ctrllink_init(&g_stellar_dump_arg) < 0)
+ {
+ exit(1);
+ }
+ if (stellar_dump_start(&g_stellar_dump_arg) < 0)
+ {
+ exit(1);
+ }
+ stellar_dump_ctrllink_keepalive_start(&g_stellar_dump_arg);
+ char recv_buf[DATALINK_RECV_BUF_SIZE];
+ struct pcap_pkthdr pcaphdr = {};
+ char *pkt_ptr;
+ int total_recv_pkt_num = 0;
+ while (g_stellar_dump_run)
+ {
+ if (stellar_dump_datalink_recv(recv_buf, DATALINK_RECV_BUF_SIZE, &pkt_ptr, &pcaphdr) < 0)
+ {
+ continue;
+ }
/*
- * We got interrupted, so perhaps we didn't
- * manage to finish a line we were printing.
- * Print an extra newline, just in case.
- */
- putchar('\n');
- (void)fflush(stdout);
- info(1);
- }
- exit_tcpdump(S_SUCCESS);
-#endif
-}
-
-/*
- On windows, we do not use a fork, so we do not care less about
- waiting a child processes to die
- */
-#if defined(HAVE_FORK) || defined(HAVE_VFORK)
-static void
-child_cleanup(int signo _U_)
-{
- wait(NULL);
-}
-#endif /* HAVE_FORK && HAVE_VFORK */
-
-static void
-info(int verbose)
-{
- struct pcap_stat stats;
-
- /*
- * Older versions of libpcap didn't set ps_ifdrop on some
- * platforms; initialize it to 0 to handle that.
- */
- stats.ps_ifdrop = 0;
- if (pcap_stats(pd, &stats) < 0) {
- (void)fprintf(stderr, "pcap_stats: %s\n", pcap_geterr(pd));
- infoprint = 0;
- return;
+ dump_packet: if set -w option, write packet to file
+ print_packet: print packet to stdout
+ */
+ callback(pcap_userdata, &pcaphdr, (u_char *)pkt_ptr);
+ if (g_stellar_dump_arg.expect_packet_count > 0 && ++total_recv_pkt_num >= g_stellar_dump_arg.expect_packet_count)
+ {
+ break;
+ }
}
-
- if (!verbose)
- fprintf(stderr, "%s: ", program_name);
-
- (void)fprintf(stderr, "%u packet%s captured", packets_captured,
- PLURAL_SUFFIX(packets_captured));
- if (!verbose)
- fputs(", ", stderr);
- else
- putc('\n', stderr);
- (void)fprintf(stderr, "%u packet%s received by filter", stats.ps_recv,
- PLURAL_SUFFIX(stats.ps_recv));
- if (!verbose)
- fputs(", ", stderr);
- else
- putc('\n', stderr);
- (void)fprintf(stderr, "%u packet%s dropped by kernel", stats.ps_drop,
- PLURAL_SUFFIX(stats.ps_drop));
- if (stats.ps_ifdrop != 0) {
- if (!verbose)
- fputs(", ", stderr);
- else
- putc('\n', stderr);
- (void)fprintf(stderr, "%u packet%s dropped by interface\n",
- stats.ps_ifdrop, PLURAL_SUFFIX(stats.ps_ifdrop));
- } else
- putc('\n', stderr);
- infoprint = 0;
+ exit(0);
}
-#if defined(HAVE_FORK) || defined(HAVE_VFORK)
-#ifdef HAVE_FORK
-#define fork_subprocess() fork()
-#else
-#define fork_subprocess() vfork()
-#endif
-static void
-compress_savefile(const char *filename)
+int stellar_dump(int argc, char **argv)
{
- pid_t child;
-
- child = fork_subprocess();
- if (child == -1) {
- fprintf(stderr,
- "compress_savefile: fork failed: %s\n",
- pcap_strerror(errno));
- return;
+ atexit((void (*)(void))cleanup);
+ if (tcpdump_parse_args(argc, argv) < 0)
+ {
+ return -1;
}
- if (child != 0) {
- /* Parent process. */
- return;
- }
-
- /*
- * Child process.
- * Set to lowest priority so that this doesn't disturb the capture.
- */
-#ifdef NZERO
- setpriority(PRIO_PROCESS, 0, NZERO - 1);
-#else
- setpriority(PRIO_PROCESS, 0, 19);
-#endif
- if (execlp(zflag, zflag, filename, (char *)NULL) == -1)
- fprintf(stderr,
- "compress_savefile: execlp(%s, %s) failed: %s\n",
- zflag,
- filename,
- pcap_strerror(errno));
-#ifdef HAVE_FORK
- exit(S_ERR_HOST_PROGRAM);
-#else
- _exit(S_ERR_HOST_PROGRAM);
-#endif
-}
-#else /* HAVE_FORK && HAVE_VFORK */
-static void
-compress_savefile(const char *filename)
-{
- fprintf(stderr,
- "compress_savefile failed. Functionality not implemented under your system\n");
-}
-#endif /* HAVE_FORK && HAVE_VFORK */
-
-static void
-dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
-{
- struct dump_info *dump_info;
-
- ++packets_captured;
-
- ++infodelay;
-
- dump_info = (struct dump_info *)user;
-
- /*
- * XXX - this won't force the file to rotate on the specified time
- * boundary, but it will rotate on the first packet received after the
- * specified Gflag number of seconds. Note: if a Gflag time boundary
- * and a Cflag size boundary coincide, the time rotation will occur
- * first thereby cancelling the Cflag boundary (since the file should
- * be 0).
- */
- if (Gflag != 0) {
- /* Check if it is time to rotate */
- time_t t;
-
- /* Get the current time */
- if ((t = time(NULL)) == (time_t)-1) {
- error("%s: can't get current_time: %s",
- __func__, pcap_strerror(errno));
- }
-
-
- /* If the time is greater than the specified window, rotate */
- if (t - Gflag_time >= Gflag) {
-#ifdef HAVE_CAPSICUM
- FILE *fp;
- int fd;
-#endif
-
- /* Update the Gflag_time */
- Gflag_time = t;
- /* Update Gflag_count */
- Gflag_count++;
- /*
- * Close the current file and open a new one.
- */
- pcap_dump_close(dump_info->pdd);
-
- /*
- * Compress the file we just closed, if the user asked for it
- */
- if (zflag != NULL)
- compress_savefile(dump_info->CurrentFileName);
-
- /*
- * Check to see if we've exceeded the Wflag (when
- * not using Cflag).
- */
- if (Cflag == 0 && Wflag > 0 && Gflag_count >= Wflag) {
- (void)fprintf(stderr, "Maximum file limit reached: %d\n",
- Wflag);
- info(1);
- exit_tcpdump(S_SUCCESS);
- /* NOTREACHED */
- }
- if (dump_info->CurrentFileName != NULL)
- free(dump_info->CurrentFileName);
- /* Allocate space for max filename + \0. */
- dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
- if (dump_info->CurrentFileName == NULL)
- error("dump_packet_and_trunc: malloc");
- /*
- * Gflag was set otherwise we wouldn't be here. Reset the count
- * so multiple files would end with 1,2,3 in the filename.
- * The counting is handled with the -C flow after this.
- */
- Cflag_count = 0;
-
- /*
- * This is always the first file in the Cflag
- * rotation: e.g. 0
- * We also don't need numbering if Cflag is not set.
- */
- if (Cflag != 0)
- MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0,
- WflagChars);
- else
- MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0, 0);
-
-#ifdef HAVE_LIBCAP_NG
- capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
- capng_apply(CAPNG_SELECT_BOTH);
-#endif /* HAVE_LIBCAP_NG */
-#ifdef HAVE_CAPSICUM
- fd = openat(dump_info->dirfd,
- dump_info->CurrentFileName,
- O_CREAT | O_WRONLY | O_TRUNC, 0644);
- if (fd < 0) {
- error("unable to open file %s",
- dump_info->CurrentFileName);
- }
- fp = fdopen(fd, "w");
- if (fp == NULL) {
- error("unable to fdopen file %s",
- dump_info->CurrentFileName);
- }
- dump_info->pdd = pcap_dump_fopen(dump_info->pd, fp);
-#else /* !HAVE_CAPSICUM */
- dump_info->pdd = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
-#endif
-#ifdef HAVE_LIBCAP_NG
- capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
- capng_apply(CAPNG_SELECT_BOTH);
-#endif /* HAVE_LIBCAP_NG */
- if (dump_info->pdd == NULL)
- error("%s", pcap_geterr(pd));
-#ifdef HAVE_CAPSICUM
- set_dumper_capsicum_rights(dump_info->pdd);
-#endif
- }
+ if (tcpdump_prepare() < 0)
+ {
+ return -1;
}
-
- /*
- * XXX - this won't prevent capture files from getting
- * larger than Cflag - the last packet written to the
- * file could put it over Cflag.
- */
- if (Cflag != 0) {
-#ifdef HAVE_PCAP_DUMP_FTELL64
- int64_t size = pcap_dump_ftell64(dump_info->pdd);
-#else
- /*
- * XXX - this only handles a Cflag value > 2^31-1 on
- * LP64 platforms; to handle ILP32 (32-bit UN*X and
- * Windows) or LLP64 (64-bit Windows) would require
- * a version of libpcap with pcap_dump_ftell64().
- */
- long size = pcap_dump_ftell(dump_info->pdd);
-#endif
-
- if (size == -1)
- error("ftell fails on output file");
- if (size > Cflag) {
-#ifdef HAVE_CAPSICUM
- FILE *fp;
- int fd;
-#endif
-
- /*
- * Close the current file and open a new one.
- */
- pcap_dump_close(dump_info->pdd);
-
- /*
- * Compress the file we just closed, if the user
- * asked for it.
- */
- if (zflag != NULL)
- compress_savefile(dump_info->CurrentFileName);
-
- Cflag_count++;
- if (Wflag > 0) {
- if (Cflag_count >= Wflag)
- Cflag_count = 0;
- }
- if (dump_info->CurrentFileName != NULL)
- free(dump_info->CurrentFileName);
- dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
- if (dump_info->CurrentFileName == NULL)
- error("%s: malloc", __func__);
- MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, Cflag_count, WflagChars);
-#ifdef HAVE_LIBCAP_NG
- capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
- capng_apply(CAPNG_SELECT_BOTH);
-#endif /* HAVE_LIBCAP_NG */
-#ifdef HAVE_CAPSICUM
- fd = openat(dump_info->dirfd, dump_info->CurrentFileName,
- O_CREAT | O_WRONLY | O_TRUNC, 0644);
- if (fd < 0) {
- error("unable to open file %s",
- dump_info->CurrentFileName);
- }
- fp = fdopen(fd, "w");
- if (fp == NULL) {
- error("unable to fdopen file %s",
- dump_info->CurrentFileName);
- }
- dump_info->pdd = pcap_dump_fopen(dump_info->pd, fp);
-#else /* !HAVE_CAPSICUM */
- dump_info->pdd = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
-#endif
-#ifdef HAVE_LIBCAP_NG
- capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
- capng_apply(CAPNG_SELECT_BOTH);
-#endif /* HAVE_LIBCAP_NG */
- if (dump_info->pdd == NULL)
- error("%s", pcap_geterr(pd));
-#ifdef HAVE_CAPSICUM
- set_dumper_capsicum_rights(dump_info->pdd);
-#endif
- }
+ if (RFileName != NULL || VFileName != NULL)
+ {
+ tcpdump_run();
}
-
- pcap_dump((u_char *)dump_info->pdd, h, sp);
-#ifdef HAVE_PCAP_DUMP_FLUSH
- if (Uflag)
- pcap_dump_flush(dump_info->pdd);
-#endif
-
- if (dump_info->ndo != NULL)
- pretty_print_packet(dump_info->ndo, h, sp, packets_captured);
-
- --infodelay;
- if (infoprint)
- info(0);
-}
-
-static void
-dump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
-{
- struct dump_info *dump_info;
-
- ++packets_captured;
-
- ++infodelay;
-
- dump_info = (struct dump_info *)user;
-
- pcap_dump((u_char *)dump_info->pdd, h, sp);
-#ifdef HAVE_PCAP_DUMP_FLUSH
- if (Uflag)
- pcap_dump_flush(dump_info->pdd);
-#endif
-
- if (dump_info->ndo != NULL)
- pretty_print_packet(dump_info->ndo, h, sp, packets_captured);
-
- --infodelay;
- if (infoprint)
- info(0);
-}
-
-static void
-print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
-{
- ++packets_captured;
-
- ++infodelay;
-
- if (!count_mode)
- pretty_print_packet((netdissect_options *)user, h, sp, packets_captured);
-
- --infodelay;
- if (infoprint)
- info(0);
-}
-
-#ifdef SIGNAL_REQ_INFO
-static void
-requestinfo(int signo _U_)
-{
- if (infodelay)
- ++infoprint;
else
- info(0);
-}
-#endif
-
-#ifdef SIGNAL_FLUSH_PCAP
-static void
-flushpcap(int signo _U_)
-{
- if (pdd != NULL)
- pcap_dump_flush(pdd);
-}
-#endif
-
-static void
-print_packets_captured (void)
-{
- static u_int prev_packets_captured, first = 1;
-
- if (infodelay == 0 && (first || packets_captured != prev_packets_captured)) {
- fprintf(stderr, "Got %u\r", packets_captured);
- first = 0;
- prev_packets_captured = packets_captured;
+ {
+ stellar_dump_run();
}
-}
-
-/*
- * Called once each second in verbose mode while dumping to file
- */
-#ifdef _WIN32
-static void CALLBACK verbose_stats_dump(PVOID param _U_,
- BOOLEAN timer_fired _U_)
-{
- print_packets_captured();
-}
-#else /* _WIN32 */
-static void verbose_stats_dump(int sig _U_)
-{
- print_packets_captured();
-}
-#endif /* _WIN32 */
-
-DIAG_OFF_DEPRECATION
-static void
-print_version(FILE *f)
-{
-#ifndef HAVE_PCAP_LIB_VERSION
- #ifdef HAVE_PCAP_VERSION
- extern char pcap_version[];
- #else /* HAVE_PCAP_VERSION */
- static char pcap_version[] = "unknown";
- #endif /* HAVE_PCAP_VERSION */
-#endif /* HAVE_PCAP_LIB_VERSION */
- const char *smi_version_string;
-
- (void)fprintf(f, "%s version " PACKAGE_VERSION "\n", program_name);
-#ifdef HAVE_PCAP_LIB_VERSION
- (void)fprintf(f, "%s\n", pcap_lib_version());
-#else /* HAVE_PCAP_LIB_VERSION */
- (void)fprintf(f, "libpcap version %s\n", pcap_version);
-#endif /* HAVE_PCAP_LIB_VERSION */
-
-#if defined(HAVE_LIBCRYPTO) && defined(SSLEAY_VERSION)
- (void)fprintf (f, "%s\n", SSLeay_version(SSLEAY_VERSION));
-#endif
-
- smi_version_string = nd_smi_version_string();
- if (smi_version_string != NULL)
- (void)fprintf (f, "SMI-library: %s\n", smi_version_string);
-
-#if defined(__SANITIZE_ADDRESS__)
- (void)fprintf (f, "Compiled with AddressSanitizer/GCC.\n");
-#elif defined(__has_feature)
-# if __has_feature(address_sanitizer)
- (void)fprintf (f, "Compiled with AddressSanitizer/Clang.\n");
-# elif __has_feature(memory_sanitizer)
- (void)fprintf (f, "Compiled with MemorySanitizer/Clang.\n");
-# endif
-#endif /* __SANITIZE_ADDRESS__ or __has_feature */
-}
-DIAG_ON_DEPRECATION
-
-static void
-print_usage(FILE *f)
-{
- print_version(f);
- (void)fprintf(f,
-"Usage: %s [-Abd" D_FLAG "efhH" I_FLAG J_FLAG "KlLnNOpqStu" U_FLAG "vxX#]" B_FLAG_USAGE " [ -c count ] [--count]\n", program_name);
- (void)fprintf(f,
-"\t\t[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]\n");
- (void)fprintf(f,
-"\t\t[ -i interface ]" IMMEDIATE_MODE_USAGE j_FLAG_USAGE "\n");
-#ifdef HAVE_PCAP_FINDALLDEVS_EX
- (void)fprintf(f,
-"\t\t" LIST_REMOTE_INTERFACES_USAGE "\n");
-#endif
-#ifdef USE_LIBSMI
- (void)fprintf(f,
-"\t\t" m_FLAG_USAGE "\n");
-#endif
- (void)fprintf(f,
-"\t\t[ -M secret ] [ --number ] [ --print ]" Q_FLAG_USAGE "\n");
- (void)fprintf(f,
-"\t\t[ -r file ] [ -s snaplen ] [ -T type ] [ --version ]\n");
- (void)fprintf(f,
-"\t\t[ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ]\n");
-#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
- (void)fprintf(f,
-"\t\t[ --time-stamp-precision precision ] [ --micro ] [ --nano ]\n");
-#endif
- (void)fprintf(f,
-"\t\t[ -z postrotate-command ] [ -Z user ] [ expression ]\n");
+ return 0;
}
diff -uNr tcpdump-tcpdump-4.99.4/tcpdump_ip6.h tcpdump-for-stellar/tcpdump_ip6.h
--- tcpdump-tcpdump-4.99.4/tcpdump_ip6.h 1970-01-01 08:00:00.000000000 +0800
+++ tcpdump-for-stellar/tcpdump_ip6.h 2024-10-30 17:34:06.265498697 +0800
@@ -0,0 +1,231 @@
+/* NetBSD: ip6.h,v 1.9 2000/07/13 05:34:21 itojun Exp */
+/* $KAME: ip6.h,v 1.9 2000/07/02 21:01:32 itojun Exp $ */
+
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)ip.h 8.1 (Berkeley) 6/10/93
+ */
+
+#ifndef ND_IP6_H_
+#define ND_IP6_H_
+
+/*
+ * Definition for internet protocol version 6.
+ * RFC 2460
+ */
+
+// struct ip6_hdr
+struct tcpdump_ip6_hdr
+{
+ union
+ {
+ // struct ip6_hdrctl
+ struct tcpdump_ip6_hdrctl
+ {
+ nd_uint32_t ip6_un1_flow; /* 20 bits of flow-ID */
+ nd_uint16_t ip6_un1_plen; /* payload length */
+ nd_uint8_t ip6_un1_nxt; /* next header */
+ nd_uint8_t ip6_un1_hlim; /* hop limit */
+ } ip6_un1;
+ nd_uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */
+ } ip6_ctlun;
+ nd_ipv6 ip6_src; /* source address */
+ nd_ipv6 ip6_dst; /* destination address */
+};
+
+#define ip6_vfc ip6_ctlun.ip6_un2_vfc
+#define IP6_VERSION(ip6_hdr) ((GET_U_1((ip6_hdr)->ip6_vfc) & 0xf0) >> 4)
+#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
+#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
+#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
+#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
+#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
+
+/* in network endian */
+#define IPV6_FLOWINFO_MASK ((uint32_t)htonl(0x0fffffff)) /* flow info (28 bits) */
+#define IPV6_FLOWLABEL_MASK ((uint32_t)htonl(0x000fffff)) /* flow label (20 bits) */
+
+/*
+ * Extension Headers
+ */
+
+// struct ip6_ext
+struct tcpdump_ip6_ext
+{
+ nd_uint8_t ip6e_nxt;
+ nd_uint8_t ip6e_len;
+};
+
+/* Hop-by-Hop options header */
+// struct ip6_hbh
+struct tcpdump_ip6_hbh
+{
+ nd_uint8_t ip6h_nxt; /* next header */
+ nd_uint8_t ip6h_len; /* length in units of 8 octets */
+ /* followed by options */
+};
+
+/* Destination options header */
+// struct ip6_dest
+struct tcpdump_ip6_dest
+{
+ nd_uint8_t ip6d_nxt; /* next header */
+ nd_uint8_t ip6d_len; /* length in units of 8 octets */
+ /* followed by options */
+};
+
+/* https://www.iana.org/assignments/ipv6-parameters/ipv6-parameters.xhtml */
+
+/* Option types and related macros */
+#define IP6OPT_PAD1 0x00 /* 00 0 00000 */
+#define IP6OPT_PADN 0x01 /* 00 0 00001 */
+#define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */
+#define IP6OPT_JUMBO_LEN 6
+#define IP6OPT_RPL 0x63 /* 01 1 00011 */
+#define IP6OPT_TUN_ENC_LIMIT 0x04 /* 00 0 00100 */
+#define IP6OPT_ROUTER_ALERT 0x05 /* 00 0 00101 */
+
+#define IP6OPT_RTALERT_LEN 4
+#define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */
+#define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */
+#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */
+#define IP6OPT_MINLEN 2
+
+#define IP6OPT_QUICK_START 0x26 /* 00 1 00110 */
+#define IP6OPT_CALIPSO 0x07 /* 00 0 00111 */
+#define IP6OPT_SMF_DPD 0x08 /* 00 0 01000 */
+#define IP6OPT_HOME_ADDRESS 0xc9 /* 11 0 01001 */
+#define IP6OPT_HOMEADDR_MINLEN 18
+#define IP6OPT_EID 0x8a /* 10 0 01010 */
+#define IP6OPT_ILNP_NOTICE 0x8b /* 10 0 01011 */
+#define IP6OPT_LINE_ID 0x8c /* 10 0 01100 */
+#define IP6OPT_MPL 0x6d /* 01 1 01101 */
+#define IP6OPT_IP_DFF 0xee /* 11 1 01110 */
+
+#define IP6OPT_TYPE(o) ((o) & 0xC0)
+#define IP6OPT_TYPE_SKIP 0x00
+#define IP6OPT_TYPE_DISCARD 0x40
+#define IP6OPT_TYPE_FORCEICMP 0x80
+#define IP6OPT_TYPE_ICMP 0xC0
+
+#define IP6OPT_MUTABLE 0x20
+
+/* Routing header */
+// struct ip6_rthdr
+struct tcpdump_ip6_rthdr
+{
+ nd_uint8_t ip6r_nxt; /* next header */
+ nd_uint8_t ip6r_len; /* length in units of 8 octets */
+ nd_uint8_t ip6r_type; /* routing type */
+ nd_uint8_t ip6r_segleft; /* segments left */
+ /* followed by routing type specific data */
+};
+
+#define IPV6_RTHDR_TYPE_0 0
+#define IPV6_RTHDR_TYPE_2 2
+#define IPV6_RTHDR_TYPE_4 4
+
+/* Type 0 Routing header */
+/* Also used for Type 2 */
+// struct ip6_rthdr0
+struct tcpdump_ip6_rthdr0
+{
+ nd_uint8_t ip6r0_nxt; /* next header */
+ nd_uint8_t ip6r0_len; /* length in units of 8 octets */
+ nd_uint8_t ip6r0_type; /* always zero */
+ nd_uint8_t ip6r0_segleft; /* segments left */
+ nd_uint32_t ip6r0_reserved; /* reserved field */
+ nd_ipv6 ip6r0_addr[1]; /* up to 23 addresses */
+};
+
+/**
+ * Type 4 Routing header
+ * known as Segment Routing Header 'SRH'
+ */
+// struct ip6_srh
+struct tcpdump_ip6_srh
+{
+ nd_uint8_t srh_nxt; /* next header */
+ nd_uint8_t srh_len; /* length in units of 8 octets */
+ nd_uint8_t srh_type; /* Routing Type 4 */
+ nd_uint8_t srh_segleft; /* segments left */
+ nd_uint8_t srh_last_ent; /* Last Entry*/
+ nd_uint8_t srh_flags; /* Flags */
+ nd_uint16_t srh_tag; /* Tag */
+ nd_ipv6 srh_segments[1]; /* SRH segments list*/
+};
+
+/* Fragment header */
+// struct ip6_frag
+struct tcpdump_ip6_frag
+{
+ nd_uint8_t ip6f_nxt; /* next header */
+ nd_uint8_t ip6f_reserved; /* reserved field */
+ nd_uint16_t ip6f_offlg; /* offset, reserved, and flag */
+ nd_uint32_t ip6f_ident; /* identification */
+};
+
+#define IP6F_OFF_MASK 0xfff8 /* mask out offset from ip6f_offlg */
+#define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */
+#define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */
+
+#endif /* not ND_IP6_H_ */
diff -uNr tcpdump-tcpdump-4.99.4/tcpdump_ip.h tcpdump-for-stellar/tcpdump_ip.h
--- tcpdump-tcpdump-4.99.4/tcpdump_ip.h 1970-01-01 08:00:00.000000000 +0800
+++ tcpdump-for-stellar/tcpdump_ip.h 2024-10-30 17:34:06.265498697 +0800
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)ip.h 8.2 (Berkeley) 6/1/94
+ */
+
+#ifndef netdissect_ip_h
+#define netdissect_ip_h
+/*
+ * Definitions for internet protocol version 4.
+ * Per RFC 791, September 1981.
+ */
+#define IPVERSION 4
+
+/*
+ * Structure of an internet header, naked of options.
+ *
+ * We declare ip_len and ip_off to be short, rather than u_short
+ * pragmatically since otherwise unsigned comparisons can result
+ * against negative integers quite easily, and fail in subtle ways.
+ */
+// struct ip
+struct tcpdump_ip
+{
+ nd_uint8_t ip_vhl; /* header length, version */
+#define IP_V(ip) ((GET_U_1((ip)->ip_vhl) & 0xf0) >> 4)
+#define IP_HL(ip) (GET_U_1((ip)->ip_vhl) & 0x0f)
+ nd_uint8_t ip_tos; /* type of service */
+ nd_uint16_t ip_len; /* total length */
+ nd_uint16_t ip_id; /* identification */
+ nd_uint16_t ip_off; /* fragment offset field */
+#define IP_DF 0x4000 /* don't fragment flag */
+#define IP_MF 0x2000 /* more fragments flag */
+#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
+ nd_uint8_t ip_ttl; /* time to live */
+ nd_uint8_t ip_p; /* protocol */
+ nd_uint16_t ip_sum; /* checksum */
+ nd_ipv4 ip_src, ip_dst; /* source and dest address */
+};
+
+#define IP_MAXPACKET 65535 /* maximum packet size */
+
+/*
+ * Definitions for IP type of service (ip_tos)
+ */
+#define IPTOS_LOWDELAY 0x10
+#define IPTOS_THROUGHPUT 0x08
+#define IPTOS_RELIABILITY 0x04
+
+/*
+ * Definitions for IP precedence (also in ip_tos) (hopefully unused)
+ */
+#define IPTOS_PREC_NETCONTROL 0xe0
+#define IPTOS_PREC_INTERNETCONTROL 0xc0
+#define IPTOS_PREC_CRITIC_ECP 0xa0
+#define IPTOS_PREC_FLASHOVERRIDE 0x80
+#define IPTOS_PREC_FLASH 0x60
+#define IPTOS_PREC_IMMEDIATE 0x40
+#define IPTOS_PREC_PRIORITY 0x20
+#define IPTOS_PREC_ROUTINE 0x00
+
+/*
+ * Definitions for options.
+ */
+#define IPOPT_COPIED(o) ((o) & 0x80)
+#define IPOPT_CLASS(o) ((o) & 0x60)
+#define IPOPT_NUMBER(o) ((o) & 0x1f)
+
+#define IPOPT_CONTROL 0x00
+#define IPOPT_RESERVED1 0x20
+#define IPOPT_DEBMEAS 0x40
+#define IPOPT_RESERVED2 0x60
+
+#define IPOPT_EOL 0 /* end of option list */
+#define IPOPT_NOP 1 /* no operation */
+
+#define IPOPT_RR 7 /* record packet route */
+#define IPOPT_TS 68 /* timestamp */
+#define IPOPT_RFC1393 82 /* traceroute RFC 1393 */
+#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */
+#define IPOPT_LSRR 131 /* loose source route */
+#define IPOPT_SATID 136 /* satnet id */
+#define IPOPT_SSRR 137 /* strict source route */
+#define IPOPT_RA 148 /* router-alert, rfc2113 */
+
+/*
+ * Offsets to fields in options other than EOL and NOP.
+ */
+#define IPOPT_OPTVAL 0 /* option ID */
+#define IPOPT_OLEN 1 /* option length */
+#define IPOPT_OFFSET 2 /* offset within option */
+#define IPOPT_MINOFF 4 /* min value of above */
+
+/*
+ * Time stamp option structure.
+ */
+// struct ip_timestamp
+struct tcpdump_ip_timestamp
+{
+ nd_uint8_t ipt_code; /* IPOPT_TS */
+ nd_uint8_t ipt_len; /* size of structure (variable) */
+ nd_uint8_t ipt_ptr; /* index of current entry */
+ nd_uint8_t ipt_oflwflg; /* flags, overflow counter */
+#define IPTS_OFLW(ip) (((ipt)->ipt_oflwflg & 0xf0) >> 4)
+#define IPTS_FLG(ip) ((ipt)->ipt_oflwflg & 0x0f)
+ union ipt_timestamp
+ {
+ nd_uint32_t ipt_time[1];
+ struct ipt_ta
+ {
+ nd_ipv4 ipt_addr;
+ nd_uint32_t ipt_time;
+ } ipt_ta[1];
+ } ipt_timestamp;
+};
+
+/* flag bits for ipt_flg */
+#define IPOPT_TS_TSONLY 0 /* timestamps only */
+#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
+#define IPOPT_TS_PRESPEC 3 /* specified modules only */
+
+/* bits for security (not byte swapped) */
+#define IPOPT_SECUR_UNCLASS 0x0000
+#define IPOPT_SECUR_CONFID 0xf135
+#define IPOPT_SECUR_EFTO 0x789a
+#define IPOPT_SECUR_MMMM 0xbc4d
+#define IPOPT_SECUR_RESTR 0xaf13
+#define IPOPT_SECUR_SECRET 0xd788
+#define IPOPT_SECUR_TOPSECRET 0x6bc5
+
+/*
+ * Internet implementation parameters.
+ */
+#define MAXTTL 255 /* maximum time to live (seconds) */
+#define IPDEFTTL 64 /* default ttl, from RFC 1340 */
+#define IPFRAGTTL 60 /* time to live for frags, slowhz */
+#define IPTTLDEC 1 /* subtracted when forwarding */
+
+#define IP_MSS 576 /* default maximum segment size */
+#endif /* netdissect_ip_h */
\ No newline at end of file