]> The Tcpdump Group git mirrors - tcpdump/commitdiff
add support for pcap_setdirection() (GH#252)
authorThomas Jacob <[email protected]>
Tue, 25 Aug 2009 19:42:12 +0000 (21:42 +0200)
committerDenis Ovsienko <[email protected]>
Thu, 12 Sep 2013 09:55:58 +0000 (13:55 +0400)
Adds -P in|out|inout option, includes man page and command line help
updates.

configure.in
tcpdump.1.in
tcpdump.c

index 4c8059b88578aef6e42c62aa9f829a90aa3b4639..6cbb1ebf38f01bb1378035726d8a075643e5b804 100644 (file)
@@ -806,6 +806,13 @@ else
                AC_MSG_RESULT(no)
        fi
 fi
+
+AC_CHECK_FUNCS(pcap_setdirection)
+if test $ac_cv_func_pcap_setdirection = "yes" ; then
+dnl Check for capture direction setting support
+       AC_DEFINE(HAVE_PCAP_SETDIRECTION)
+fi
+
 AC_REPLACE_FUNCS(bpf_dump)     dnl moved to libpcap in 0.6
 
 V_GROUP=0
index 6cafc196ad1679b235fd94a078c1c2c18922e8f5..ae3d44c19b7f7e7b6f9a9125e4441bec56f846e5 100644 (file)
@@ -70,6 +70,11 @@ tcpdump \- dump traffic on a network
 .br
 .ti +8
 [
+.B \-P
+.I in|out|inout
+]
+.ti +8
+[
 .B \-r
 .I file
 ]
@@ -474,6 +479,11 @@ Note that the interface might be in promiscuous
 mode for some other reason; hence, `-p' cannot be used as an abbreviation for
 `ether host {local-hw-addr} or ether broadcast'.
 .TP
+.B \-P
+Choose send/receive direction \fIdirection\fR for which packets should be
+captured. Possible values are `in', `out' and `inout'. Not available
+on all platforms.
+.TP
 .B \-q
 Quick (quiet?) output.
 Print less protocol information so output
index 6a9c26a87d3c62a7d670afd0ed7d781221cdfcbe..1145d1982c932e979887d32a025d534c008c07ec 100644 (file)
--- 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 = PCAP_D_INOUT;      /* 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;
@@ -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 "V:vw: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;
@@ -1313,6 +1333,12 @@ main(int argc, char **argv)
                                warning("%s: %s", device,
                                    pcap_statustostr(status));
                }
+#ifdef HAVE_PCAP_SETDIRECTION
+               status = pcap_setdirection(pd, Pflag);
+               if (status != 0)
+                       error("%s: pcap_set_direction failed: %s",
+                           device,  pcap_geterr(pd));
+#endif
 #else
                *ebuf = '\0';
                pd = pcap_open_live(device, snaplen, !pflag, 1000, ebuf);
@@ -2098,6 +2124,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,