summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/gettingstarted/developers/vnet.md18
-rwxr-xr-xsrc/vnet/ethernet/node.c14
-rw-r--r--src/vnet/interface_output.c11
3 files changed, 35 insertions, 8 deletions
diff --git a/docs/gettingstarted/developers/vnet.md b/docs/gettingstarted/developers/vnet.md
index f9d7bd597fa..a5cd9e73594 100644
--- a/docs/gettingstarted/developers/vnet.md
+++ b/docs/gettingstarted/developers/vnet.md
@@ -549,22 +549,30 @@ not, the CLI command add a new table and the indicated mask rule
### Configure a simple pcap classify filter
```
- classify filter pcap mask l3 ip4 src match l3 ip4 src 192.168.1.11"
- pcap rx trace on max 100 filter
+ classify filter pcap mask l3 ip4 src match l3 ip4 src 192.168.1.11
+ pcap trace rx max 100 filter
```
-### Configure a simple interface packet-tracer filter
+### Configure a simple per-interface capture filter
```
classify filter GigabitEthernet3/0/0 mask l3 ip4 src match l3 ip4 src 192.168.1.11"
- [device-driver debug CLI TBD]
+ pcap trace rx max 100 intfc GigabitEthernet3/0/0
+```
+
+Note that per-interface capture filters are _always_ applied.
+
+### Clear per-interface capture filters
+
+```
+ classify filter GigabitEthernet3/0/0 del
```
### Configure another fairly simple pcap classify filter
```
classify filter pcap mask l3 ip4 src dst match l3 ip4 src 192.168.1.10 dst 192.168.2.10
- pcap tx trace on max 100 filter
+ pcap trace tx max 100 filter
```
### Clear all current classifier filters
diff --git a/src/vnet/ethernet/node.c b/src/vnet/ethernet/node.c
index 9c9143dd4ba..428a8d5662c 100755
--- a/src/vnet/ethernet/node.c
+++ b/src/vnet/ethernet/node.c
@@ -1125,8 +1125,18 @@ ethernet_input_trace (vlib_main_t * vm, vlib_node_runtime_t * node,
if (pp->pcap_sw_if_index == 0 ||
pp->pcap_sw_if_index == vnet_buffer (b0)->sw_if_index[VLIB_RX])
{
- pcap_add_buffer (&pp->pcap_main, vm, bi0,
- pp->max_bytes_per_pkt);
+ vnet_main_t *vnm = vnet_get_main ();
+ vnet_hw_interface_t *hi =
+ vnet_get_sup_hw_interface
+ (vnm, vnet_buffer (b0)->sw_if_index[VLIB_RX]);
+
+ /* Capture pkt if not filtered, or if filter hits */
+ if (hi->trace_classify_table_index == ~0 ||
+ vnet_is_packet_traced_inline
+ (b0, hi->trace_classify_table_index,
+ 0 /* full classify */ ))
+ pcap_add_buffer (&pp->pcap_main, vm, bi0,
+ pp->max_bytes_per_pkt);
}
}
}
diff --git a/src/vnet/interface_output.c b/src/vnet/interface_output.c
index 5e702e3b96c..49775d58d80 100644
--- a/src/vnet/interface_output.c
+++ b/src/vnet/interface_output.c
@@ -503,7 +503,16 @@ static_always_inline void vnet_interface_pcap_tx_trace
sw_if_index = vnet_buffer (b0)->sw_if_index[VLIB_TX];
if (pp->pcap_sw_if_index == 0 || pp->pcap_sw_if_index == sw_if_index)
- pcap_add_buffer (&pp->pcap_main, vm, bi0, pp->max_bytes_per_pkt);
+ {
+ vnet_main_t *vnm = vnet_get_main ();
+ vnet_hw_interface_t *hi =
+ vnet_get_sup_hw_interface (vnm, sw_if_index);
+ /* Capture pkt if not filtered, or if filter hits */
+ if (hi->trace_classify_table_index == ~0 ||
+ vnet_is_packet_traced_inline
+ (b0, hi->trace_classify_table_index, 0 /* full classify */ ))
+ pcap_add_buffer (&pp->pcap_main, vm, bi0, pp->max_bytes_per_pkt);
+ }
}
}