(root)/
strace-6.5/
tests-m32/
nlattr_ifla_af_inet6.h
       1  /*
       2   * IFLA_INET6_* protocol-specific netlink attribute decoding check common code.
       3   *
       4   * Copyright (c) 2018-2022 The strace developers.
       5   * All rights reserved.
       6   *
       7   * SPDX-License-Identifier: GPL-2.0-or-later
       8   */
       9  
      10  #ifndef STRACE_TESTS_NLATTR_IFLA_AF_INET6
      11  # define STRACE_TESTS_NLATTR_IFLA_AF_INET6
      12  
      13  # include "tests.h"
      14  
      15  static void
      16  print_arr_val(uint32_t *val, size_t idx, const char *idx_str)
      17  {
      18  	if (idx_str)
      19  		printf("[%s]=", idx_str);
      20  	else
      21  		printf("[%zu]=", idx);
      22  
      23  	printf("%d", *val);
      24  }
      25  
      26  static void
      27  print_arr_uval(uint64_t *val, size_t idx, const char *idx_str)
      28  {
      29  	if (idx_str)
      30  		printf("[%s]=", idx_str);
      31  	else
      32  		printf("[%zu]=", idx);
      33  
      34  	printf("%" PRIu64, *val);
      35  }
      36  
      37  static void
      38  print_inet6_conf_val(uint32_t *val, size_t idx)
      39  {
      40  	static const char * const strs[] = {
      41  		XLAT_KNOWN(0, "DEVCONF_FORWARDING"),
      42  		XLAT_KNOWN(1, "DEVCONF_HOPLIMIT"),
      43  	};
      44  
      45  	print_arr_val(val, idx, idx < ARRAY_SIZE(strs) ? strs[idx] : NULL);
      46  }
      47  
      48  static void
      49  print_inet6_stats_val(uint64_t *val, size_t idx)
      50  {
      51  	static const char * const strs[] = {
      52  		XLAT_KNOWN(0, "IPSTATS_MIB_NUM"),
      53  		XLAT_KNOWN(1, "IPSTATS_MIB_INPKTS"),
      54  	};
      55  
      56  	print_arr_uval(val, idx, idx < ARRAY_SIZE(strs) ? strs[idx] : NULL);
      57  }
      58  
      59  static void
      60  print_icmp6_stats_val(uint64_t *val, size_t idx)
      61  {
      62  	static const char * const strs[] = {
      63  		XLAT_KNOWN(0, "ICMP6_MIB_NUM"),
      64  		XLAT_KNOWN(1, "ICMP6_MIB_INMSGS"),
      65  		XLAT_KNOWN(2, "ICMP6_MIB_INERRORS"),
      66  		XLAT_KNOWN(3, "ICMP6_MIB_OUTMSGS"),
      67  		XLAT_KNOWN(4, "ICMP6_MIB_OUTERRORS"),
      68  		XLAT_KNOWN(5, "ICMP6_MIB_CSUMERRORS"),
      69  		XLAT_UNKNOWN(6, "ICMP6_MIB_???"),
      70  	};
      71  
      72  	print_arr_uval(val, idx, idx < ARRAY_SIZE(strs) ? strs[idx] : NULL);
      73  }
      74  
      75  static void
      76  check_ifla_af_inet6(int fd, void *nlh0, size_t hdrlen,
      77  		    void (*init_msg)(struct nlmsghdr *, unsigned int),
      78  		    void (*print_msg)(unsigned int),
      79  		    void *pattern, size_t depth)
      80  {
      81  	static const uint8_t unknown_msg[] = { 0xab, 0xac, 0xdb, 0xcd };
      82  
      83  	/* Undecoded, unknown */
      84  	TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
      85  				      0, XLAT_KNOWN(0, "IFLA_INET6_UNSPEC"),
      86  				      pattern, unknown_msg, print_quoted_hex,
      87  				      depth,
      88  				      printf("\"\\xab\\xac\\xdb\\xcd\""));
      89  	TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
      90  				      10, "0xa" NRAW(" /* IFLA_INET6_??? */"),
      91  				      pattern, unknown_msg, print_quoted_hex,
      92  				      depth,
      93  				      printf("\"\\xab\\xac\\xdb\\xcd\""));
      94  
      95  
      96  	/* IFLA_INET6_FLAGS */
      97  	static const struct {
      98  		uint32_t flags;
      99  		const char *str;
     100  	} inet6_flags[] = {
     101  		{ 0xf, "0xf" NRAW(" /* IF_??? */") },
     102  		{ ARG_XLAT_KNOWN(0x10, "IF_RS_SENT") },
     103  		{ ARG_XLAT_KNOWN(0xc0, "IF_RA_MANAGED|IF_RA_OTHERCONF") },
     104  		{ ARG_XLAT_KNOWN(0xdeadc0de, "IF_RS_SENT|IF_RA_MANAGED"
     105  					     "|IF_RA_OTHERCONF|IF_READY"
     106  					     "|0x5eadc00e") },
     107  	};
     108  
     109  	for (size_t i = 0; i < ARRAY_SIZE(inet6_flags); i++) {
     110  		TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen,
     111  					      init_msg, print_msg,
     112  					      1, XLAT_KNOWN(0x1,
     113  							    "IFLA_INET6_FLAGS"),
     114  					      pattern, inet6_flags[i].flags,
     115  					      print_quoted_hex, depth,
     116  					      printf("%s", inet6_flags[i].str));
     117  	}
     118  
     119  
     120  	/* IFLA_INET6_CONF */
     121  	uint32_t inet6_conf_vals[] = { 0xdeadc0de, 0xda7aface };
     122  	TEST_NESTED_NLATTR_ARRAY_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
     123  				     IFLA_INET6_CONF,
     124  				     XLAT_KNOWN(0x2, "IFLA_INET6_CONF"),
     125  				     pattern, inet6_conf_vals, depth,
     126  				     print_inet6_conf_val);
     127  
     128  
     129  	/* IFLA_INET6_STATS */
     130  	uint64_t inet6_stats_vals[] = { 0xdeadc0deda7aface, 0xdec0deedbadc0ded };
     131  	TEST_NESTED_NLATTR_ARRAY_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
     132  				    IFLA_INET6_STATS,
     133  				    XLAT_KNOWN(0x3, "IFLA_INET6_STATS"),
     134  				    pattern, inet6_stats_vals, depth,
     135  				    print_inet6_stats_val);
     136  
     137  
     138  	/* IFLA_INET6_MCAST */
     139  	TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
     140  				      4, XLAT_KNOWN(0x4, "IFLA_INET6_MCAST"),
     141  				      pattern, unknown_msg, print_quoted_hex,
     142  				      depth,
     143  				      printf("\"\\xab\\xac\\xdb\\xcd\""));
     144  
     145  
     146  	/* IFLA_INET6_CACHEINFO */
     147  	static const struct ifla_cacheinfo ci = {
     148  		0xbadc0ded, 0xfacebeef, 0xdecafeed, 0xdeadfeed,
     149  	};
     150  	TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg, 5,
     151  				      XLAT_KNOWN(0x5, "IFLA_INET6_CACHEINFO"),
     152  				      pattern, ci, print_quoted_hex, depth,
     153  				      printf("{");
     154  				      PRINT_FIELD_U(ci, max_reasm_len);
     155  				      printf(", ");
     156  				      PRINT_FIELD_U(ci, tstamp);
     157  				      printf(", ");
     158  				      PRINT_FIELD_U(ci, reachable_time);
     159  				      printf(", ");
     160  				      PRINT_FIELD_U(ci, retrans_time);
     161  				      printf("}"));
     162  
     163  
     164  	/* IFLA_INET6_ICMP6STATS */
     165  	uint64_t icmp6_stats_vals[] = {
     166  		0xdeadc0deda7aface, 0xdec0deedbadc0ded, 0xfacebeefdeadfeed,
     167  		0xdeadc0deda7afacd, 0xdec0deedbadc0dee, 0xfacebeefdeadfeef,
     168  		0xdeadc0deda7afacc
     169  	};
     170  	TEST_NESTED_NLATTR_ARRAY_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
     171  				     IFLA_INET6_ICMP6STATS,
     172  				     XLAT_KNOWN(0x6, "IFLA_INET6_ICMP6STATS"),
     173  				     pattern, icmp6_stats_vals, depth,
     174  				     print_icmp6_stats_val);
     175  
     176  
     177  	/* IFLA_INET6_TOKEN */
     178  	uint8_t inet6_addr[16] = {
     179  		0xba, 0xdc, 0x0d, 0xed, 0xfa, 0xce, 0xbe, 0xef,
     180  		0xde, 0xca, 0xfe, 0xed, 0xde, 0xad, 0xfe, 0xed,
     181  	};
     182  	TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
     183  				      7, XLAT_KNOWN(0x7, "IFLA_INET6_TOKEN"),
     184  				      pattern, inet6_addr, print_quoted_hex,
     185  				      depth,
     186  				      printf(XLAT_KNOWN_FMT("%s", "%s"),
     187  					     XLAT_SEL("\"\\xba\\xdc\\x0d\\xed"
     188  					     "\\xfa\\xce\\xbe\\xef"
     189  					     "\\xde\\xca\\xfe\\xed"
     190  					     "\\xde\\xad\\xfe\\xed\"",
     191  					     "inet_pton(AF_INET6"
     192  					     ", \"badc:ded:face:beef"
     193  					     ":deca:feed:dead:feed\")")));
     194  
     195  
     196  	/* IFLA_INET6_ADDR_GEN_MODE */
     197  	static const struct {
     198  		uint8_t flags;
     199  		const char *str;
     200  	} agms[] = {
     201  		{ ARG_XLAT_KNOWN(0, "IN6_ADDR_GEN_MODE_EUI64") },
     202  		{ ARG_XLAT_KNOWN(0x3, "IN6_ADDR_GEN_MODE_RANDOM") },
     203  		{ ARG_XLAT_UNKNOWN(0x4, "IN6_ADDR_GEN_MODE_???") },
     204  		{ ARG_XLAT_UNKNOWN(0xff, "IN6_ADDR_GEN_MODE_???") },
     205  	};
     206  
     207  	for (size_t i = 0; i < ARRAY_SIZE(agms); i++) {
     208  		TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen,
     209  					      init_msg, print_msg, 8,
     210  					      XLAT_KNOWN(0x8, "IFLA_INET6_ADDR_GEN_MODE"),
     211  					      pattern, agms[i].flags,
     212  					      print_quoted_hex, depth,
     213  					      printf("%s", agms[i].str));
     214  	}
     215  
     216  
     217  	/* IFLA_INET6_RA_MTU */
     218  	static const uint32_t ra_mtu = 0xdeadc0de;
     219  	TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
     220  				      9, XLAT_KNOWN(0x9, "IFLA_INET6_RA_MTU"),
     221  				      pattern, ra_mtu, print_quoted_hex, depth,
     222  				      printf("3735929054"));
     223  }
     224  
     225  #endif /* STRACE_TESTS_NLATTR_IFLA_AF_INET6 */