> This mail contains changes required to the kernel, subsequent ones have the 
> (most complicated) tcpdump(8) bit and (untested) pcap(3) bit.

Just as pcap_setdirection(3), it doesn't have any current user, but it
might be useful to some.


Index: lib/libpcap/Makefile
===================================================================
RCS file: /cvs/src/lib/libpcap/Makefile,v
retrieving revision 1.23
diff -u -p -r1.23 Makefile
--- lib/libpcap/Makefile        2 Aug 2012 13:38:39 -0000       1.23
+++ lib/libpcap/Makefile        19 Mar 2013 14:25:03 -0000
@@ -23,6 +23,7 @@ MLINKS=       pcap.3 pcap_open_live.3 pcap.3 p
        pcap.3 pcap_datalink_name_to_val.3 pcap.3 pcap_dump_fopen.3 \
        pcap.3 pcap_sendpacket.3 pcap.3 pcap_next_ex.3 \
        pcap.3 pcap_setdirection.3 pcap.3 pcap_dump_file.3 \
+       pcap.3 pcap_setqueue.3 \
        pcap.3 pcap_dump_ftell.3 pcap.3 pcap_fopen_offline.3 \
        pcap.3 pcap_dump_flush.3 pcap.3 pcap_create.3 \
        pcap.3 pcap_set_snaplen.3 pcap.3 pcap_set_promisc.3 \
Index: lib/libpcap/pcap-bpf.c
===================================================================
RCS file: /cvs/src/lib/libpcap/pcap-bpf.c,v
retrieving revision 1.21
diff -u -p -r1.21 pcap-bpf.c
--- lib/libpcap/pcap-bpf.c      25 May 2012 01:58:08 -0000      1.21
+++ lib/libpcap/pcap-bpf.c      19 Mar 2013 14:25:03 -0000
@@ -1028,6 +1028,17 @@ pcap_setdirection(pcap_t *p, pcap_direct
 }
 
 int
+pcap_setqueue(pcap_t *p, u_int32_t qid)
+{
+       if (ioctl(p->fd, BIOCSQUEUE, &qid) < 0) {
+               snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSQUEUE: %s",
+                   pcap_strerror(errno));
+               return (-1);
+       }
+       return (0);
+}
+
+int
 pcap_set_datalink(pcap_t *p, int dlt)
 {
        int i;
Index: lib/libpcap/pcap.3
===================================================================
RCS file: /cvs/src/lib/libpcap/pcap.3,v
retrieving revision 1.33
diff -u -p -r1.33 pcap.3
--- lib/libpcap/pcap.3  16 Jul 2012 08:55:48 -0000      1.33
+++ lib/libpcap/pcap.3  19 Mar 2013 14:25:04 -0000
@@ -62,6 +62,8 @@
 .Ft int
 .Fn pcap_setdirection "pcap_t *p" "pcap_direction_t dir"
 .Ft int
+.Fn pcap_setqueue "pcap_t *p" "u_int32_t qid"
+.Ft int
 .Fn pcap_datalink "pcap_t *p"
 .Ft int
 .Fn pcap_snapshot "pcap_t *p"
@@ -471,6 +473,16 @@ datalink types.
 .Fn pcap_setdirection
 is used to limit the direction that packets must be flowing in order
 to be captured.
+.Pp
+.Fn pcap_setqueue
+is used to only capture packets that are queued on a particular queue.
+The
+.Fa qid
+argument can be easily obtained using
+.Xr ioctl 2
+interface described in the
+.Xr pf 4
+manual page.
 .Pp
 .Fn pcap_list_datalinks
 returns an array of the supported datalink types for an opened live capture
Index: lib/libpcap/pcap.h
===================================================================
RCS file: /cvs/src/lib/libpcap/pcap.h,v
retrieving revision 1.15
diff -u -p -r1.15 pcap.h
--- lib/libpcap/pcap.h  25 May 2012 01:58:08 -0000      1.15
+++ lib/libpcap/pcap.h  19 Mar 2013 14:25:04 -0000
@@ -187,6 +187,7 @@ void        pcap_breakloop(pcap_t *);
 int    pcap_stats(pcap_t *, struct pcap_stat *);
 int    pcap_setfilter(pcap_t *, struct bpf_program *);
 int    pcap_setdirection(pcap_t *, pcap_direction_t);
+int    pcap_setqueue(pcap_t *, u_int32_t);
 int    pcap_getnonblock(pcap_t *, char *);
 int    pcap_setnonblock(pcap_t *, int, char *);
 void   pcap_perror(pcap_t *, char *);

Reply via email to