X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/05bf9bfc237231a3d10e8f160a9037efdcec70f3..73262f4d5247e32bc740e38a8e23f5b5abb75e7a:/tcpdump.c diff --git a/tcpdump.c b/tcpdump.c index 5435c7d4..739f9c8a 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -105,6 +105,9 @@ static int Lflag; /* list available data link types and exit */ #ifdef HAVE_PCAP_SET_TSTAMP_TYPE static int Jflag; /* list available time stamp types */ #endif +#ifdef HAVE_PCAP_SETDIRECTION +int Pflag = -1; /* Restrict captured packet by sent/receive direction */ +#endif static char *zflag = NULL; /* compress each savefile using a specified command (like gzip or bzip2) */ static int infodelay; @@ -312,9 +315,6 @@ static struct printer printers[] = { }; static struct ndo_printer ndo_printers[] = { -#ifdef DLT_NFLOG - { nflog_if_print, DLT_NFLOG}, -#endif { ether_if_print, DLT_EN10MB }, #ifdef DLT_IPNET { ipnet_if_print, DLT_IPNET }, @@ -333,6 +333,9 @@ static struct ndo_printer ndo_printers[] = { #endif #ifdef DLT_NETANALYZER_TRANSPARENT { netanalyzer_transparent_if_print, DLT_NETANALYZER_TRANSPARENT }, +#endif +#ifdef DLT_NFLOG + { nflog_if_print, DLT_NFLOG}, #endif { NULL, 0 }, }; @@ -520,6 +523,12 @@ show_dlts_and_exit(const char *device, pcap_t *pd) #define U_FLAG #endif +#ifdef HAVE_PCAP_SETDIRECTION +#define P_FLAG "P:" +#else +#define P_FLAG +#endif + #ifndef WIN32 /* Drop root privileges and chroot if necessary */ static void @@ -738,7 +747,7 @@ main(int argc, char **argv) #endif while ( - (op = getopt(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOpqr:Rs:StT:u" U_FLAG "V:vw:W:xXy:Yz:Z:")) != -1) + (op = getopt(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOp" P_FLAG "qr:Rs:StT:u" U_FLAG "vV:w:W:xXy:Yz:Z:")) != -1) switch (op) { case 'a': @@ -960,7 +969,18 @@ main(int argc, char **argv) case 'p': ++pflag; break; - +#ifdef HAVE_PCAP_SETDIRECTION + case 'P': + if (strcasecmp(optarg, "in") == 0) + Pflag = PCAP_D_IN; + else if (strcasecmp(optarg, "out") == 0) + Pflag = PCAP_D_OUT; + else if (strcasecmp(optarg, "inout") == 0) + Pflag = PCAP_D_INOUT; + else + error("unknown capture direction `%s'", optarg); + break; +#endif /* HAVE_PCAP_SETDIRECTION */ case 'q': ++qflag; ++suppress_default_print; @@ -1022,6 +1042,8 @@ main(int argc, char **argv) packettype = PT_PGM; else if (strcasecmp(optarg, "pgm_zmtp1") == 0) packettype = PT_PGM_ZMTP1; + else if (strcasecmp(optarg, "lmp") == 0) + packettype = PT_LMP; else error("unknown packet type `%s'", optarg); break; @@ -1311,6 +1333,14 @@ main(int argc, char **argv) warning("%s: %s", device, pcap_statustostr(status)); } +#ifdef HAVE_PCAP_SETDIRECTION + if (Pflag != -1) { + status = pcap_setdirection(pd, Pflag); + if (status != 0) + error("%s: pcap_setdirection() failed: %s", + device, pcap_geterr(pd)); + } +#endif #else *ebuf = '\0'; pd = pcap_open_live(device, snaplen, !pflag, 1000, ebuf); @@ -2096,6 +2126,10 @@ usage(void) "\t\t[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]\n"); (void)fprintf(stderr, "\t\t[ -i interface ]" j_FLAG_USAGE " [ -M secret ]\n"); +#ifdef HAVE_PCAP_SETDIRECTION + (void)fprintf(stderr, +"\t\t[ -P in|out|inout ]\n"); +#endif (void)fprintf(stderr, "\t\t[ -r file ] [ -s snaplen ] [ -T type ] [ -V file ] [ -w file ]\n"); (void)fprintf(stderr,