From 70ae9deaaac7a621c87ba7613f112cfee515bd8d Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Mon, 6 Jan 2025 03:34:22 +0900 Subject: [PATCH] lsfd: add PACKET.PROTOCOL.RAW, a new column Using sizeof for the calculating buffer size is suggested by @karelzak. Signed-off-by: Masatake YAMATO --- lsfd-cmd/lsfd.1.adoc | 5 ++- lsfd-cmd/lsfd.c | 5 ++- lsfd-cmd/lsfd.h | 1 + lsfd-cmd/sock-xinfo.c | 38 ++++++++++--------- .../expected/lsfd/mkfds-mapped-packet-socket | 16 ++++++-- tests/ts/lsfd/mkfds-mapped-packet-socket | 37 +++++++++--------- 6 files changed, 60 insertions(+), 42 deletions(-) diff --git a/lsfd-cmd/lsfd.1.adoc b/lsfd-cmd/lsfd.1.adoc index 2fa13b916..39a1312c4 100644 --- a/lsfd-cmd/lsfd.1.adoc +++ b/lsfd-cmd/lsfd.1.adoc @@ -397,7 +397,10 @@ PACKET.IFACE <``string``>:: Interface name associated with the packet socket. PACKET.PROTOCOL <``string``>:: -L2 protocol associated with the packet socket. +L2 protocol name associated with the packet socket (decoded). + +PACKET.PROTOCOL.RAW <``number``>:: +L2 protocol number associated with the packet socket (raw). PARTITION <``string``>:: Block device name resolved by `/proc/partition`. diff --git a/lsfd-cmd/lsfd.c b/lsfd-cmd/lsfd.c index ffaca8c31..4d05c3b27 100644 --- a/lsfd-cmd/lsfd.c +++ b/lsfd-cmd/lsfd.c @@ -312,7 +312,10 @@ static const struct colinfo infos[] = { N_("net interface associated with the packet socket") }, [COL_PACKET_PROTOCOL] = { "PACKET.PROTOCOL", 0, SCOLS_FL_RIGHT,SCOLS_JSON_STRING, - N_("L2 protocol associated with the packet socket") }, + N_("L2 protocol name associated with the packet socket (decoded)") }, + [COL_PACKET_PROTOCOL_RAW]={"PACKET.PROTOCOL.RAW", + 0, SCOLS_FL_RIGHT,SCOLS_JSON_NUMBER, + N_("L2 protocol number associated with the packet socket (raw)") }, [COL_PARTITION] = { "PARTITION", 0, SCOLS_FL_RIGHT, SCOLS_JSON_STRING, N_("block device name resolved by /proc/partition") }, diff --git a/lsfd-cmd/lsfd.h b/lsfd-cmd/lsfd.h index f6e640ae6..814605a1b 100644 --- a/lsfd-cmd/lsfd.h +++ b/lsfd-cmd/lsfd.h @@ -101,6 +101,7 @@ enum { COL_OWNER, /* file */ COL_PACKET_IFACE, COL_PACKET_PROTOCOL, + COL_PACKET_PROTOCOL_RAW, COL_PARTITION, COL_PID, COL_PIDFD_COMM, diff --git a/lsfd-cmd/sock-xinfo.c b/lsfd-cmd/sock-xinfo.c index be1da8d28..438756274 100644 --- a/lsfd-cmd/sock-xinfo.c +++ b/lsfd-cmd/sock-xinfo.c @@ -2110,8 +2110,6 @@ struct packet_xinfo { static const char *packet_decode_protocol(uint16_t proto) { switch (proto) { - case 0: - return NULL; case ETH_P_802_3: return "802_3"; case ETH_P_AX25: @@ -2372,9 +2370,9 @@ static const char *packet_decode_protocol(uint16_t proto) case ETH_P_802_3_MIN: return "802_3_min"; #endif - default: - return "unknown"; } + + return NULL; } static char *packet_get_name(struct sock_xinfo *sock_xinfo, @@ -2383,21 +2381,22 @@ static char *packet_get_name(struct sock_xinfo *sock_xinfo, struct packet_xinfo *pkt = (struct packet_xinfo *)sock_xinfo; char *str = NULL; const char *type = sock_decode_type(pkt->type); - const char *proto = packet_decode_protocol(pkt->protocol); + const char *proto_str = packet_decode_protocol(pkt->protocol); + char proto_buf[ sizeof("unknown(") + sizeof (stringify_value(UINT16_MAX)) + sizeof (")") ]; const char *iface = get_iface_name(sock_xinfo->netns_inode, pkt->iface); - if (iface && proto) + if (proto_str == NULL) { + snprintf(proto_buf, sizeof(proto_buf), "unknown(%"PRIu16")", pkt->protocol); + proto_str = proto_buf; + } + + if (iface) xasprintf(&str, "type=%s protocol=%s iface=%s", - type, proto, iface); - else if (proto) - xasprintf(&str, "type=%s protocol=%s", - type, proto); - else if (iface) - xasprintf(&str, "type=%s iface=%s", - type, iface); + type, proto_str, iface); else - xasprintf(&str, "type=%s", type); + xasprintf(&str, "type=%s protocol=%s", + type, proto_str); return str; } @@ -2436,12 +2435,15 @@ static bool packet_fill_column(struct proc *proc __attribute__((__unused__)), case COL_PACKET_PROTOCOL: { const char *proto; proto = packet_decode_protocol(pkt->protocol); - if (proto) { + if (proto) *str = xstrdup(proto); - return true; - } - break; + else + xstrfappend(str, "unknown(%"PRIu16")", pkt->protocol); + return true; } + case COL_PACKET_PROTOCOL_RAW: + xasprintf(str, "%"PRIu16, pkt->protocol); + return true; default: break; } diff --git a/tests/expected/lsfd/mkfds-mapped-packet-socket b/tests/expected/lsfd/mkfds-mapped-packet-socket index 2e9db5eb5..92893f2dd 100644 --- a/tests/expected/lsfd/mkfds-mapped-packet-socket +++ b/tests/expected/lsfd/mkfds-mapped-packet-socket @@ -1,8 +1,16 @@ PACKET SOCK.PROTONAME: 0 -type=raw protocol=ppptalk iface=lo raw PACKET lo ppptalk -NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL: 0 +type=raw protocol=ppptalk iface=lo raw PACKET lo ppptalk 16 +NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL,PACKET.PROTOCOL.RAW: 0 PACKET SOCK.PROTONAME: 0 -type=dgram protocol=ppptalk iface=lo dgram PACKET lo ppptalk -NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL: 0 +type=dgram protocol=ppptalk iface=lo dgram PACKET lo ppptalk 16 +NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL,PACKET.PROTOCOL.RAW: 0 +PACKET +SOCK.PROTONAME: 0 +type=raw protocol=unknown(10000) iface=lo raw PACKET lo unknown(10000) 10000 +NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL,PACKET.PROTOCOL.RAW: 0 +PACKET +SOCK.PROTONAME: 0 +type=dgram protocol=unknown(10000) iface=lo dgram PACKET lo unknown(10000) 10000 +NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL,PACKET.PROTOCOL.RAW: 0 diff --git a/tests/ts/lsfd/mkfds-mapped-packet-socket b/tests/ts/lsfd/mkfds-mapped-packet-socket index c3a73c54e..6df9579b5 100755 --- a/tests/ts/lsfd/mkfds-mapped-packet-socket +++ b/tests/ts/lsfd/mkfds-mapped-packet-socket @@ -35,28 +35,29 @@ FD=3 EXPR= INTERFACE=lo SOCKTYPE= -PROTOCOL=$(printf "%d" 0x10) ERR= -for SOCKTYPE in RAW DGRAM; do - coproc MKFDS { "$TS_HELPER_MKFDS" mapped-packet-socket $FD \ - interface=${INTERFACE} socktype=${SOCKTYPE} protocol=${PROTOCOL}; } - if read -u ${MKFDS[0]} PID; then - EXPR='(ASSOC == "shm") and (STTYPE == "SOCK") and (MODE == "-w-")' - ${TS_CMD_LSFD} -p "$PID" -n -o SOCK.PROTONAME -Q "${EXPR}" - echo 'SOCK.PROTONAME': $? +for PROTOCOL in $(printf "%d" 0x10) 10000; do + for SOCKTYPE in RAW DGRAM; do + coproc MKFDS { "$TS_HELPER_MKFDS" mapped-packet-socket $FD \ + interface=${INTERFACE} socktype=${SOCKTYPE} protocol=${PROTOCOL}; } + if read -u ${MKFDS[0]} PID; then + EXPR='(ASSOC == "shm") and (STTYPE == "SOCK") and (MODE == "-w-")' + ${TS_CMD_LSFD} -p "$PID" -n -o SOCK.PROTONAME -Q "${EXPR}" + echo 'SOCK.PROTONAME': $? - EXPR="(FD == $FD)" - ${TS_CMD_LSFD} -p "$PID" -n -o NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL -Q "${EXPR}" - echo 'NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL': $? + EXPR="(FD == $FD)" + ${TS_CMD_LSFD} -p "$PID" -n -o NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL,PACKET.PROTOCOL.RAW -Q "${EXPR}" + echo 'NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL,PACKET.PROTOCOL.RAW': $? - echo DONE >&"${MKFDS[1]}" - fi - wait ${MKFDS_PID} - ERR=$? - if [ $ERR != 0 ]; then - break - fi + echo DONE >&"${MKFDS[1]}" + fi + wait ${MKFDS_PID} + ERR=$? + if [ $ERR != 0 ]; then + break + fi + done done > $TS_OUTPUT 2>&1 if [[ "$ERR" == "$ENOPROTOOPT" ]]; then -- 2.47.3