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`.
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") },
COL_OWNER, /* file */
COL_PACKET_IFACE,
COL_PACKET_PROTOCOL,
+ COL_PACKET_PROTOCOL_RAW,
COL_PARTITION,
COL_PID,
COL_PIDFD_COMM,
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:
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,
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;
}
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;
}
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
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