11401 lines
348 KiB
Diff
11401 lines
348 KiB
Diff
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
|