From d28437cdf2133533c9092b881ce0e4c243d6c1f6 Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Wed, 20 Nov 2019 09:28:31 -0500 Subject: [PATCH] classify: per-interface rx/tx pcap capture filters Finish the feature, and fix a couple of doc bugs Type: feature Signed-off-by: Dave Barach Change-Id: I2c62745fda137776204c8fc4fca0e7e288051573 --- docs/gettingstarted/developers/vnet.md | 18 +++++++++++++----- src/vnet/ethernet/node.c | 14 ++++++++++++-- src/vnet/interface_output.c | 11 ++++++++++- 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); + } } } -- 2.16.6