On Tue, Mar 11, 2025 at 04:06:41PM +0100, Eelco Chaudron wrote: > > > On 11 Mar 2025, at 16:01, Eelco Chaudron wrote: > > > On 27 Feb 2025, at 18:23, Adrian Moreno wrote: > > > >> Use pcapng instead of pcap format and store the result, the key (if > >> available) and the input port name so they are visible in > >> wireshark/tshark. > >> > >> Signed-off-by: Adrian Moreno <amore...@redhat.com> > > > > Some comments minor below. > > Did some testing and the port number does not seem to be part of the capture. > > ./upcall_monitor.py -d decode -k nlraw -r error -w error.pcap > > $ tshark -r error.pcap -V > Packet comments > cpu=18 comm=ksoftirqd/18 pid=128 upcall_type=1 result=-11 > > [Expert Info (Comment/Comment): cpu=18 comm=ksoftirqd/18 pid=128 > upcall_type=1 result=-11 > ] > [cpu=18 comm=ksoftirqd/18 pid=128 upcall_type=1 result=-11 > ] > [Severity level: Comment] > [Group: Comment] > Frame 1: 1496 bytes on wire (11968 bits), 64 bytes captured (512 bits) on > interface unknown, id 0 > Interface id: 0 (unknown) > Interface name: unknown > ^^^^^^^ >
That's weird, I cannot reproduce it. How did you generate the failed upcall? > >> --- > >> utilities/usdt-scripts/upcall_monitor.py | 53 +++++++++++++++++++----- > >> 1 file changed, 42 insertions(+), 11 deletions(-) > >> > >> diff --git a/utilities/usdt-scripts/upcall_monitor.py > >> b/utilities/usdt-scripts/upcall_monitor.py > >> index a1adeee0a..77378751f 100755 > >> --- a/utilities/usdt-scripts/upcall_monitor.py > >> +++ b/utilities/usdt-scripts/upcall_monitor.py > >> @@ -118,7 +118,12 @@ > >> > >> from bcc import BPF, USDT, USDTException > >> from os.path import exists > >> -from scapy.all import hexdump, wrpcap > >> +try: > >> + # Try using pcapng support from scapy >= 2.4. > >> + from scapy.all import hexdump, PcapNgWriter > >> +except ImportError: > >> + from scapy.all import hexdump, wrpcap > >> + > >> from scapy.layers.l2 import Ether > >> > >> from usdt_lib import DpPortMapping > >> @@ -282,40 +287,48 @@ int kretprobe__ovs_dp_upcall(struct pt_regs *ctx) > >> #endif > >> """ > >> > >> +pcap_writer = None > >> + > >> > >> # > >> # print_key() > >> # > >> def print_key(event, decode_dump): > > > > As this is no longer printing a key, I would change it to format_key(). > > > >> + lines = [] > >> if event.key_size < options.flow_key_size: > >> key_len = event.key_size > >> else: > >> key_len = options.flow_key_size > >> > >> if not key_len: > >> - return > >> + return [] > >> > >> if options.flow_key_decode != 'none': > >> - print(" Flow key size {} bytes, size captured {} bytes.". > >> - format(event.key_size, key_len)) > >> + lines.append(" Flow key size {} bytes, size captured {} bytes.". > >> + format(event.key_size, key_len)) > >> > >> if options.flow_key_decode == 'hex': > >> # > >> # Abuse scapy's hex dump to dump flow key > >> # > >> - print(re.sub('^', ' ' * 4, > >> hexdump(Ether(bytes(event.key)[:key_len]), > >> - dump=True), > >> - flags=re.MULTILINE)) > >> + lines.extend(re.sub('^', ' ' * 4, > >> + hexdump( > >> + Ether(bytes(event.key)[:key_len]), > >> + dump=True), > >> + flags=re.MULTILINE).split("\n")) > >> > >> if options.flow_key_decode == "nlraw": > >> - for line in decode_dump: > >> - print(line) > >> + lines.extend(decode_dump) > >> + > >> + return lines > >> > >> > >> # > >> # print_event() > >> # > >> def print_event(ctx, data, size): > >> + global pcap_writer > >> + > >> event = b["events"].event(data) > >> dp = event.dpif_name.decode("utf-8") > >> > >> @@ -350,7 +363,9 @@ def print_event(ctx, data, size): > >> # > >> # Dump flow key information > >> # > >> - print_key(event, key_dump) > >> + key_lines = print_key(event, key_dump) > >> + for line in key_lines: > >> + print(line) > >> > >> # > >> # Decode packet only if there is data > >> @@ -383,7 +398,23 @@ def print_event(ctx, data, size): > >> print(re.sub('^', ' ' * 4, packet.show(dump=True), > >> flags=re.MULTILINE)) > >> > >> if options.pcap is not None: > >> - wrpcap(options.pcap, packet, append=True, > >> snaplen=options.packet_size) > >> + try: > >> + if pcap_writer is None: > >> + pcap_writer = PcapNgWriter(options.pcap) > >> + > >> + comment = "cpu={} comm={} pid={} upcall_type={} result={}". > >> format( > > > > Adding the time stamp here might also be useful to “quickly” see the > > inter-packet gap. > > > >> + event.cpu, event.comm.decode("utf-8"), event.pid, > >> + event.upcall_type, event.result) > >> + > >> + if options.flow_key_decode != 'none': > >> + comment = comment + "\n" + "\n".join(key_lines) > >> + > >> + packet.comment = comment > >> + packet.sniffed_on = "{} ({})".format(port, dp) > >> + pcap_writer.write(packet) > >> + except NameError: # PcapNgWriter not found > >> + wrpcap(options.pcap, packet, append=True, > >> + snaplen=options.packet_size) > >> > >> > >> # > >> -- > >> 2.48.1 > >> > >> _______________________________________________ > >> dev mailing list > >> d...@openvswitch.org > >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev