(root)/
strace-6.5/
src/
print_mac.c
       1  /*
       2   * Copyright (c) 2018-2022 The strace developers.
       3   * All rights reserved.
       4   *
       5   * SPDX-License-Identifier: LGPL-2.1-or-later
       6   */
       7  
       8  #include "defs.h"
       9  
      10  #include "error_prints.h"
      11  #include "xstring.h"
      12  
      13  #define XLAT_MACROS_ONLY
      14  # include "xlat/arp_hardware_types.h"
      15  #undef XLAT_MACROS_ONLY
      16  
      17  DIAG_PUSH_IGNORE_OVERRIDE_INIT
      18  
      19  static uint8_t hwaddr_sizes[] = {
      20  	[0 ... ARPHRD_VSOCKMON] = 255,
      21  
      22  	[ARPHRD_NETROM]     =  7 /* AX25_ADDR_LEN */,
      23  	[ARPHRD_ETHER]      =  6 /* ETH_ALEN */,
      24  	/* ARPHRD_EETHER - no actual devices in Linux */
      25  	[ARPHRD_AX25]       =  7 /* AX25_ADDR_LEN */,
      26  	/* ARPHRD_PRONET - no actual devices in Linux */
      27  	/* ARPHRD_CHAOS - no actual devices in Linux */
      28  	[ARPHRD_IEEE802]    =  6 /* FC_ALEN */,
      29  	[ARPHRD_ARCNET]     =  1 /* ARCNET_ALEN */,
      30  	/* ARPHRD_APPLETLK - no actual devices in Linux */
      31  	[ARPHRD_DLCI]       = sizeof(short),
      32  	/* ARPHRD_ATM - no explicit setting */
      33  	/* ARPHRD_METRICOM - no actual devices in Linux */
      34  	[ARPHRD_IEEE1394]   = 16 /* FWNET_ALEN */,
      35  	[ARPHRD_EUI64]      =  8 /* EUI64_ADDR_LEN */,
      36  	[ARPHRD_INFINIBAND] = 20 /* INFINIBAND_ALEN */,
      37  	[ARPHRD_SLIP]       =  0,
      38  	/* ARPHRD_CSLIP - no actual devices in Linux */
      39  	/* ARPHRD_SLIP6 - no actual devices in Linux */
      40  	/* ARPHRD_CSLIP6 - no actual devices in Linux */
      41  	/* ARPHRD_RSRVD - no actual devices in Linux */
      42  	/* ARPHRD_ADAPT - no actual devices in Linux */
      43  	[ARPHRD_ROSE]       =  5 /* ROSE_ADDR_LEN */,
      44  	[ARPHRD_X25]        =  0,
      45  	/* ARPHRD_HWX25 - no actual devices in Linux */
      46  	[ARPHRD_CAN]        =  0,
      47  	[ARPHRD_MCTP]       =  1,
      48  	[ARPHRD_PPP]        =  0,
      49  	/* ARPHRD_CISCO - no actual devices in Linux */
      50  	/* ARPHRD_LAPB - no actual devices in Linux */
      51  	/* ARPHRD_DDCMP - no actual devices in Linux */
      52  	[ARPHRD_RAWHDLC]    =  0,
      53  	[ARPHRD_RAWIP]      =  0,
      54  	[ARPHRD_TUNNEL]     =  4 /* IPIP */,
      55  	[ARPHRD_TUNNEL6]    = 16 /* sizeof(struct in6_addr) */,
      56  	/* ARPHRD_FRAD - no actual devices in Linux */
      57  	/* ARPHRD_SKIP - no actual devices in Linux */
      58  	[ARPHRD_LOOPBACK]   =  6 /* ETH_ALEN */,
      59  	[ARPHRD_LOCALTLK]   =  1 /* LTALK_ALEN */,
      60  	[ARPHRD_FDDI]       =  6 /* FDDI_K_ALEN */,
      61  	/* ARPHRD_BIF - no actual devices in Linux */
      62  	[ARPHRD_SIT]        =  4,
      63  	[ARPHRD_IPDDP]      =  0,
      64  	[ARPHRD_IPGRE]      =  4,
      65  	[ARPHRD_PIMREG]     =  0,
      66  	[ARPHRD_HIPPI]      =  6 /* HIPPI_ALEN */,
      67  	/* ARPHRD_ASH - no actual devices in Linux */
      68  	/* ARPHRD_ECONET - no actual devices in Linux */
      69  	[ARPHRD_IRDA]       =  4 /* LAP_ALEN */,
      70  	/* ARPHRD_FCPP - no actual devices in Linux */
      71  	/* ARPHRD_FCAL - no actual devices in Linux */
      72  	/* ARPHRD_FCPL - no actual devices in Linux */
      73  	/* ARPHRD_FCFABRIC - no actual devices in Linux */
      74  	/* ARPHRD_IEEE802_TR - no actual devices in Linux */
      75  	[ARPHRD_IEEE80211]  =  6 /* ETH_ALEN */,
      76  	[ARPHRD_IEEE80211_PRISM] = 6 /* ETH_ALEN */,
      77  	[ARPHRD_IEEE80211_RADIOTAP] = 6 /* ETH_ALEN */,
      78  	[ARPHRD_IEEE802154]
      79  		= 8 /* IEEE802154_EXTENDED_ADDR_LEN */,
      80  	[ARPHRD_IEEE802154_MONITOR]
      81  		= 8 /* IEEE802154_EXTENDED_ADDR_LEN */,
      82  	[ARPHRD_PHONET]     =  1,
      83  	[ARPHRD_PHONET_PIPE] = 1,
      84  	[ARPHRD_CAIF]       =  0,
      85  	[ARPHRD_IP6GRE]     = 16 /* sizeof(struct in6_addr) */,
      86  	[ARPHRD_NETLINK]    =  0,
      87  	[ARPHRD_6LOWPAN]    =  8 /* EUI64_ADDR_LEN */
      88  		/* ^ or ETH_ALEN, depending on lltype */,
      89  	[ARPHRD_VSOCKMON]   =  0,
      90  };
      91  
      92  DIAG_POP_IGNORE_OVERRIDE_INIT
      93  
      94  static const char *
      95  sprint_mac_addr(const uint8_t addr[], size_t size)
      96  {
      97  	static char res[MAX_ADDR_LEN * 3];
      98  
      99  	if (size > MAX_ADDR_LEN) {
     100  		error_func_msg("Address size (%zu) is more than maximum "
     101  			       "supported (%u)", size, MAX_ADDR_LEN);
     102  
     103  		return NULL;
     104  	}
     105  
     106  	char *ptr = res;
     107  
     108  	for (size_t i = 0; i < size; i++)
     109  		ptr = xappendstr(res, ptr, "%s%02x", i ? ":" : "", addr[i]);
     110  
     111  	return res;
     112  }
     113  
     114  void
     115  print_mac_addr(const char *prefix, const uint8_t addr[], size_t size)
     116  {
     117  	tprints_string(prefix);
     118  	if (xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV
     119  	    || size > MAX_ADDR_LEN)
     120  		print_quoted_string((const char *) addr, size,
     121  				    QUOTE_FORCE_HEX);
     122  	if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW
     123  	    || size > MAX_ADDR_LEN)
     124  		return;
     125  	(xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE
     126  		? tprints_comment : tprints_string)(sprint_mac_addr(addr, size));
     127  }
     128  
     129  static const char *
     130  sprint_hwaddr(const uint8_t hwaddr[], size_t size, uint32_t devtype)
     131  {
     132  	uint8_t sz = (devtype < ARRAY_SIZE(hwaddr_sizes))
     133  			? hwaddr_sizes[devtype] : 255;
     134  
     135  	return sprint_mac_addr(hwaddr, MIN(size, sz));
     136  }
     137  
     138  void
     139  print_hwaddr(const char *prefix, const uint8_t addr[], size_t size,
     140  	     uint32_t devtype)
     141  {
     142  	tprints_string(prefix);
     143  	if (xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV
     144  	    || size > MAX_ADDR_LEN)
     145  		print_quoted_string((const char *) addr, size,
     146  				    QUOTE_FORCE_HEX);
     147  	if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW
     148  	    || size > MAX_ADDR_LEN)
     149  		return;
     150  	(xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE
     151  		? tprints_comment : tprints_string)(sprint_hwaddr(addr, size,
     152  							   devtype));
     153  }