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 ^^^^^^^ >> --- >> 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