* defs.h [!MAX_ADDR_LEN] (MAX_ADDR_LEN): New macro.
(sprint_hwaddr): New declaration.
(print_hwaddr): New inline function, a wrapper for sprint_hwaddr.
* print_fields.h (PRINT_FIELD_HWADDR_SZ): New macro.
* print_mac.c: Include "xlat/arp_hardware_types.h" under
XLAT_MACROS_ONLY.
[!MAX_ADDR_LEN] (MAX_ADDR_LEN): Remove.
(sprint_hwaddr): New function.
* sock.c (print_ifreq) <SIOCSIFHWADDR, SIOCGIFHWADDR>: Print hardware
address using PRINT_FIELD_HWADDR_SZ.
extern const char *sprinttime_nsec(long long sec, unsigned long long nsec);
extern const char *sprinttime_usec(long long sec, unsigned long long usec);
+#ifndef MAX_ADDR_LEN
+# define MAX_ADDR_LEN 32
+#endif
+
extern const char *sprint_mac_addr(const uint8_t addr[], size_t size);
extern void print_mac_addr(const char *prefix,
const uint8_t addr[], size_t size);
+extern const char *sprint_hwaddr(const uint8_t addr[], size_t size,
+ uint32_t devtype);
+extern void print_hwaddr(const char *prefix,
+ const uint8_t addr[], size_t size, uint32_t devtype);
+
extern void print_uuid(const unsigned char *uuid);
extern void print_symbolic_mode_t(unsigned int);
(size_)); \
} while (0)
+#define PRINT_FIELD_HWADDR_SZ(prefix_, where_, field_, size_, hwtype_) \
+ do { \
+ static_assert(sizeof(((where_).field_)[0]) == 1, \
+ "hwaddress is not a byte array"); \
+ STRACE_PRINTF("%s%s=", (prefix_), #field_); \
+ print_hwaddr("", (const uint8_t *) ((where_).field_), \
+ (size_), (hwtype_)); \
+ } while (0)
+
#endif /* !STRACE_PRINT_FIELDS_H */
#include "error_prints.h"
#include "xstring.h"
-#ifndef MAX_ADDR_LEN
-# define MAX_ADDR_LEN 32
-#endif
+#define XLAT_MACROS_ONLY
+# include "xlat/arp_hardware_types.h"
+#undef XLAT_MACROS_ONLY
+
+DIAG_PUSH_IGNORE_OVERRIDE_INIT
+
+static uint8_t hwaddr_sizes[] = {
+ [0 ... ARPHRD_IEEE802_TR] = 255,
+
+ [ARPHRD_NETROM] = 7 /* AX25_ADDR_LEN */,
+ [ARPHRD_ETHER] = 6 /* ETH_ALEN */,
+ /* ARPHRD_EETHER - no actual devices in Linux */
+ [ARPHRD_AX25] = 7 /* AX25_ADDR_LEN */,
+ /* ARPHRD_PRONET - no actual devices in Linux */
+ /* ARPHRD_CHAOS - no actual devices in Linux */
+ [ARPHRD_IEEE802] = 6 /* FC_ALEN */,
+ [ARPHRD_ARCNET] = 1 /* ARCNET_ALEN */,
+ /* ARPHRD_APPLETLK - no actual devices in Linux */
+ [ARPHRD_DLCI] = sizeof(short),
+ /* ARPHRD_ATM - no explicit setting */
+ /* ARPHRD_METRICOM - no actual devices in Linux */
+ [ARPHRD_IEEE1394] = 16 /* FWNET_ALEN */,
+ [ARPHRD_EUI64] = 8 /* EUI64_ADDR_LEN */,
+ [ARPHRD_INFINIBAND] = 20 /* INFINIBAND_ALEN */,
+ [ARPHRD_SLIP] = 0,
+ /* ARPHRD_CSLIP - no actual devices in Linux */
+ /* ARPHRD_SLIP6 - no actual devices in Linux */
+ /* ARPHRD_CSLIP6 - no actual devices in Linux */
+ /* ARPHRD_RSRVD - no actual devices in Linux */
+ /* ARPHRD_ADAPT - no actual devices in Linux */
+ [ARPHRD_ROSE] = 5 /* ROSE_ADDR_LEN */,
+ [ARPHRD_X25] = 0,
+ /* ARPHRD_HWX25 - no actual devices in Linux */
+ [ARPHRD_CAN] = 0,
+ [ARPHRD_PPP] = 0,
+ /* ARPHRD_CISCO - no actual devices in Linux */
+ /* ARPHRD_LAPB - no actual devices in Linux */
+ /* ARPHRD_DDCMP - no actual devices in Linux */
+ [ARPHRD_RAWHDLC] = 0,
+ [ARPHRD_RAWIP] = 0,
+ [ARPHRD_TUNNEL] = 4 /* IPIP */,
+ [ARPHRD_TUNNEL6] = 16 /* sizeof(struct in6_addr) */,
+ /* ARPHRD_FRAD - no actual devices in Linux */
+ /* ARPHRD_SKIP - no actual devices in Linux */
+ [ARPHRD_LOOPBACK] = 6 /* ETH_ALEN */,
+ [ARPHRD_LOCALTLK] = 1 /* LTALK_ALEN */,
+ [ARPHRD_FDDI] = 6 /* FDDI_K_ALEN */,
+ /* ARPHRD_BIF - no actual devices in Linux */
+ [ARPHRD_SIT] = 4,
+ [ARPHRD_IPDDP] = 0,
+ [ARPHRD_IPGRE] = 4,
+ [ARPHRD_PIMREG] = 0,
+ [ARPHRD_HIPPI] = 6 /* HIPPI_ALEN */,
+ /* ARPHRD_ASH - no actual devices in Linux */
+ /* ARPHRD_ECONET - no actual devices in Linux */
+ [ARPHRD_IRDA] = 4 /* LAP_ALEN */,
+ /* ARPHRD_FCPP - no actual devices in Linux */
+ /* ARPHRD_FCAL - no actual devices in Linux */
+ /* ARPHRD_FCPL - no actual devices in Linux */
+ /* ARPHRD_FCFABRIC - no actual devices in Linux */
+ /* ARPHRD_IEEE802_TR - no actual devices in Linux */
+ [ARPHRD_IEEE80211] = 6 /* ETH_ALEN */,
+ [ARPHRD_IEEE80211_PRISM] = 6 /* ETH_ALEN */,
+ [ARPHRD_IEEE80211_RADIOTAP] = 6 /* ETH_ALEN */,
+ [ARPHRD_IEEE802154]
+ = 8 /* IEEE802154_EXTENDED_ADDR_LEN */,
+ [ARPHRD_IEEE802154_MONITOR]
+ = 8 /* IEEE802154_EXTENDED_ADDR_LEN */,
+ [ARPHRD_PHONET] = 1,
+ [ARPHRD_PHONET_PIPE] = 1,
+ [ARPHRD_CAIF] = 0,
+ [ARPHRD_IP6GRE] = 16 /* sizeof(struct in6_addr) */,
+ [ARPHRD_NETLINK] = 0,
+ [ARPHRD_6LOWPAN] = 8 /* EUI64_ADDR_LEN */
+ /* ^ or ETH_ALEN, depending on lltype */,
+ [ARPHRD_VSOCKMON] = 0,
+};
+
+DIAG_POP_IGNORE_OVERRIDE_INIT
const char *
sprint_mac_addr(const uint8_t addr[], size_t size)
(xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE
? tprints_comment : tprints)(sprint_mac_addr(addr, size));
}
+
+const char *
+sprint_hwaddr(const uint8_t hwaddr[], size_t size, uint32_t devtype)
+{
+ uint8_t sz = (devtype < ARRAY_SIZE(hwaddr_sizes))
+ ? hwaddr_sizes[devtype] : 255;
+
+ return sprint_mac_addr(hwaddr, MIN(size, sz));
+}
+
+void
+print_hwaddr(const char *prefix, const uint8_t addr[], size_t size,
+ uint32_t devtype)
+{
+ tprints(prefix);
+ if (xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV)
+ print_quoted_string((const char *) addr, size,
+ QUOTE_FORCE_HEX);
+ if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW)
+ return;
+ (xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE
+ ? tprints_comment : tprints)(sprint_hwaddr(addr, size,
+ devtype));
+}
print_quoted_string(ifname, IFNAMSIZ + 1, QUOTE_0_TERMINATED);
}
-DIAG_PUSH_IGNORE_OVERRIDE_INIT
-
static void
print_ifreq(struct tcb *const tcp, const unsigned int code,
const kernel_ulong_t arg, const struct_ifreq *const ifr)
break;
case SIOCSIFHWADDR:
case SIOCGIFHWADDR: {
- static uint8_t hwaddr_sizes[] = {
- [0 ... ARPHRD_IEEE802_TR] = 255,
-
- [ARPHRD_NETROM] = 7 /* AX25_ADDR_LEN */,
- [ARPHRD_ETHER] = 6 /* ETH_ALEN */,
- /* ARPHRD_EETHER - no actual devices in Linux */
- [ARPHRD_AX25] = 7 /* AX25_ADDR_LEN */,
- /* ARPHRD_PRONET - no actual devices in Linux */
- /* ARPHRD_CHAOS - no actual devices in Linux */
- [ARPHRD_IEEE802] = 6 /* FC_ALEN */,
- [ARPHRD_ARCNET] = 1 /* ARCNET_ALEN */,
- /* ARPHRD_APPLETLK - no actual devices in Linux */
- [ARPHRD_DLCI] = sizeof(short),
- /* ARPHRD_ATM - no explicit setting */
- /* ARPHRD_METRICOM - no actual devices in Linux */
- [ARPHRD_IEEE1394] = 16 /* FWNET_ALEN */,
- [ARPHRD_EUI64] = 8 /* EUI64_ADDR_LEN */,
- [ARPHRD_INFINIBAND] = 20 /* INFINIBAND_ALEN */,
- [ARPHRD_SLIP] = 0,
- /* ARPHRD_CSLIP - no actual devices in Linux */
- /* ARPHRD_SLIP6 - no actual devices in Linux */
- /* ARPHRD_CSLIP6 - no actual devices in Linux */
- /* ARPHRD_RSRVD - no actual devices in Linux */
- /* ARPHRD_ADAPT - no actual devices in Linux */
- [ARPHRD_ROSE] = 5 /* ROSE_ADDR_LEN */,
- [ARPHRD_X25] = 0,
- /* ARPHRD_HWX25 - no actual devices in Linux */
- [ARPHRD_CAN] = 0,
- [ARPHRD_PPP] = 0,
- /* ARPHRD_CISCO - no actual devices in Linux */
- /* ARPHRD_LAPB - no actual devices in Linux */
- /* ARPHRD_DDCMP - no actual devices in Linux */
- [ARPHRD_RAWHDLC] = 0,
- [ARPHRD_RAWIP] = 0,
- [ARPHRD_TUNNEL] = 4 /* IPIP */,
- [ARPHRD_TUNNEL6] = 16 /* sizeof(struct in6_addr) */,
- /* ARPHRD_FRAD - no actual devices in Linux */
- /* ARPHRD_SKIP - no actual devices in Linux */
- [ARPHRD_LOOPBACK] = 6 /* ETH_ALEN */,
- [ARPHRD_LOCALTLK] = 1 /* LTALK_ALEN */,
- [ARPHRD_FDDI] = 6 /* FDDI_K_ALEN */,
- /* ARPHRD_BIF - no actual devices in Linux */
- [ARPHRD_SIT] = 4,
- [ARPHRD_IPDDP] = 0,
- [ARPHRD_IPGRE] = 4,
- [ARPHRD_PIMREG] = 0,
- [ARPHRD_HIPPI] = 6 /* HIPPI_ALEN */,
- /* ARPHRD_ASH - no actual devices in Linux */
- /* ARPHRD_ECONET - no actual devices in Linux */
- [ARPHRD_IRDA] = 4 /* LAP_ALEN */,
- /* ARPHRD_FCPP - no actual devices in Linux */
- /* ARPHRD_FCAL - no actual devices in Linux */
- /* ARPHRD_FCPL - no actual devices in Linux */
- /* ARPHRD_FCFABRIC - no actual devices in Linux */
- /* ARPHRD_IEEE802_TR - no actual devices in Linux */
- [ARPHRD_IEEE80211] = 6 /* ETH_ALEN */,
- [ARPHRD_IEEE80211_PRISM] = 6 /* ETH_ALEN */,
- [ARPHRD_IEEE80211_RADIOTAP] = 6 /* ETH_ALEN */,
- [ARPHRD_IEEE802154]
- = 8 /* IEEE802154_EXTENDED_ADDR_LEN */,
- [ARPHRD_IEEE802154_MONITOR]
- = 8 /* IEEE802154_EXTENDED_ADDR_LEN */,
- [ARPHRD_PHONET] = 1,
- [ARPHRD_PHONET_PIPE] = 1,
- [ARPHRD_CAIF] = 0,
- [ARPHRD_IP6GRE] = 16 /* sizeof(struct in6_addr) */,
- [ARPHRD_NETLINK] = 0,
- [ARPHRD_6LOWPAN] = 8 /* EUI64_ADDR_LEN */
- /* ^ or ETH_ALEN, depending on lltype */,
- [ARPHRD_VSOCKMON] = 0,
- };
-
- uint16_t proto = ifr->ifr_hwaddr.sa_family;
- uint8_t sz = (proto < ARRAY_SIZE(hwaddr_sizes))
- ? hwaddr_sizes[proto] : 255;
-
PRINT_FIELD_XVAL_SORTED_SIZED("ifr_hwaddr={", ifr->ifr_hwaddr,
sa_family, arp_hardware_types,
arp_hardware_types_size,
"ARPHRD_???");
- PRINT_FIELD_MAC_SZ(", ", ifr->ifr_hwaddr, sa_data,
- MIN(sizeof(ifr->ifr_hwaddr.sa_data), sz));
+ PRINT_FIELD_HWADDR_SZ(", ", ifr->ifr_hwaddr, sa_data,
+ sizeof(ifr->ifr_hwaddr.sa_data),
+ ifr->ifr_hwaddr.sa_family);
tprints("}");
break;
}
}
}
-DIAG_POP_IGNORE_OVERRIDE_INIT
-
static unsigned int
print_ifc_len(int len)
{