]> granicus.if.org Git - strace/commitdiff
rtnl_link: decode IFLA_AF_SPEC
authorEugene Syromyatnikov <evgsyr@gmail.com>
Mon, 7 May 2018 06:45:29 +0000 (08:45 +0200)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 6 Jun 2018 15:10:37 +0000 (15:10 +0000)
* xlat/in6_addr_gen_mode.in: New file.
* xlat/inet6_devconf_indices.in: Likewise.
* xlat/inet6_if_flags.in: Likewise.
* xlat/inet_devconf_indices.in: Likewise.
* xlat/rtnl_ifla_af_spec_inet6_attrs.in: Likewise.
* xlat/rtnl_ifla_af_spec_inet_attrs.in: Likewise.
* xlat/snmp_icmp6_stats.in: Likewise.
* xlat/snmp_ip_stats.in: Likewise.
* rtnl_link.c: Include netinet/in.h, xlat/in6_addr_gen_mode.h,
xlat/inet_devconf_indices.h, xlat/inet6_devconf_indices.h,
xlat/inet6_if_flags.h, xlat/rtnl_ifla_af_spec_inet_attrs.h,
xlat/rtnl_ifla_af_spec_inet6_attrs.h, xlat/snmp_icmp6_stats.h,
and xlat/snmp_ip_stats.h.
(decode_ifla_inet_conf, decode_ifla_inet6_flags,
decode_ifla_inet6_conf, decode_ifla_inet6_stats,
decode_ifla_inet6_cacheinfo, decode_ifla_inet6_icmp6_stats,
decode_ifla_inet6_token, decode_ifla_inet6_agm, decode_ifla_af,
decode_ifla_af_spec): New functions.
(ifla_inet_nla_decoders, ifla_inet6_nla_decoders,
nla_decoder_table_desc): New static constant variables.
(ifinfomsg_nla_decoders) <[IFLA_AF_SPEC]>: Change value from NULL to
decode_ifla_af_spec.

rtnl_link.c
xlat/in6_addr_gen_mode.in [new file with mode: 0644]
xlat/inet6_devconf_indices.in [new file with mode: 0644]
xlat/inet6_if_flags.in [new file with mode: 0644]
xlat/inet_devconf_indices.in [new file with mode: 0644]
xlat/rtnl_ifla_af_spec_inet6_attrs.in [new file with mode: 0644]
xlat/rtnl_ifla_af_spec_inet_attrs.in [new file with mode: 0644]
xlat/snmp_icmp6_stats.in [new file with mode: 0644]
xlat/snmp_ip_stats.in [new file with mode: 0644]

index 5f967cf3fdb1ea505c53a8219118c82395c2245a..7c64faa622da2d439e31e751ce7e424a74c90853 100644 (file)
 #include "print_fields.h"
 
 #include "netlink.h"
+
+#include <netinet/in.h>
+
 #ifdef HAVE_LINUX_IF_LINK_H
 # include <linux/if_link.h>
 #endif
 #include <linux/rtnetlink.h>
 
+#include "xlat/in6_addr_gen_mode.h"
+#include "xlat/inet_devconf_indices.h"
+#include "xlat/inet6_devconf_indices.h"
+#include "xlat/inet6_if_flags.h"
+#include "xlat/rtnl_ifla_af_spec_inet_attrs.h"
+#include "xlat/rtnl_ifla_af_spec_inet6_attrs.h"
 #include "xlat/rtnl_ifla_brport_attrs.h"
 #include "xlat/rtnl_ifla_events.h"
 #include "xlat/rtnl_ifla_info_attrs.h"
@@ -45,6 +54,8 @@
 #include "xlat/rtnl_ifla_vf_port_attrs.h"
 #include "xlat/rtnl_ifla_xdp_attrs.h"
 #include "xlat/rtnl_link_attrs.h"
+#include "xlat/snmp_icmp6_stats.h"
+#include "xlat/snmp_ip_stats.h"
 #include "xlat/xdp_flags.h"
 
 static bool
@@ -391,6 +402,227 @@ decode_ifla_event(struct tcb *const tcp,
        return true;
 }
 
+
+static bool
+decode_ifla_inet_conf(struct tcb *const tcp,
+                     const kernel_ulong_t addr,
+                     const unsigned int len,
+                     const void *const opaque_data)
+{
+       int elem;
+       size_t cnt = len / sizeof(elem);
+
+       if (!cnt)
+               return false;
+
+       print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
+                      tfetch_mem, print_int32_array_member, NULL,
+                      PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
+                       | XLAT_STYLE_FMT_D, ARRSZ_PAIR(inet_devconf_indices),
+                      "IPV4_DEVCONF_???");
+
+       return true;
+}
+
+static const nla_decoder_t ifla_inet_nla_decoders[] = {
+       [IFLA_INET_CONF] = decode_ifla_inet_conf,
+};
+
+static bool
+decode_ifla_inet6_flags(struct tcb *const tcp,
+                       const kernel_ulong_t addr,
+                       const unsigned int len,
+                       const void *const opaque_data)
+{
+       const struct decode_nla_xlat_opts opts = {
+               ARRSZ_PAIR(inet6_if_flags), "IF_???",
+               .size = 4,
+       };
+
+       return decode_nla_flags(tcp, addr, len, &opts);
+}
+
+static bool
+decode_ifla_inet6_conf(struct tcb *const tcp,
+                      const kernel_ulong_t addr,
+                      const unsigned int len,
+                      const void *const opaque_data)
+{
+       int elem;
+       size_t cnt = len / sizeof(elem);
+
+       if (!cnt)
+               return false;
+
+       print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
+                      tfetch_mem, print_int32_array_member, NULL,
+                      PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
+                       | XLAT_STYLE_FMT_D, ARRSZ_PAIR(inet6_devconf_indices),
+                      "DEVCONF_???");
+
+       return true;
+}
+
+static bool
+decode_ifla_inet6_stats(struct tcb *const tcp,
+                       const kernel_ulong_t addr,
+                       const unsigned int len,
+                       const void *const opaque_data)
+{
+       uint64_t elem;
+       size_t cnt = len / sizeof(elem);
+
+       if (!cnt)
+               return false;
+
+       print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
+                      tfetch_mem, print_uint64_array_member, NULL,
+                      PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
+                       | XLAT_STYLE_FMT_U, ARRSZ_PAIR(snmp_ip_stats),
+                      "IPSTATS_MIB_???");
+
+       return true;
+}
+
+static bool
+decode_ifla_inet6_cacheinfo(struct tcb *const tcp,
+                           const kernel_ulong_t addr,
+                           const unsigned int len,
+                           const void *const opaque_data)
+{
+       struct {
+               uint32_t max_reasm_len;
+               uint32_t tstamp;
+               uint32_t reachable_time;
+               uint32_t retrans_time;
+       } ci;
+
+       if (len < sizeof(ci))
+               return false;
+       else if (!umove_or_printaddr(tcp, addr, &ci)) {
+               PRINT_FIELD_U("{", ci, max_reasm_len);
+               PRINT_FIELD_U(", ", ci, tstamp);
+               PRINT_FIELD_U(", ", ci, reachable_time);
+               PRINT_FIELD_U(", ", ci, retrans_time);
+               tprints("}");
+       }
+
+       return true;
+}
+
+static bool
+decode_ifla_inet6_icmp6_stats(struct tcb *const tcp,
+                             const kernel_ulong_t addr,
+                             const unsigned int len,
+                             const void *const opaque_data)
+{
+       uint64_t elem;
+       size_t cnt = len / sizeof(elem);
+
+       if (!cnt)
+               return false;
+
+       print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
+                      tfetch_mem, print_uint64_array_member, NULL,
+                      PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
+                       | XLAT_STYLE_FMT_U, ARRSZ_PAIR(snmp_icmp6_stats),
+                      "ICMP6_MIB_???");
+
+       return true;
+}
+
+static bool
+decode_ifla_inet6_token(struct tcb *const tcp,
+                       const kernel_ulong_t addr,
+                       const unsigned int len,
+                       const void *const opaque_data)
+{
+       struct in6_addr in6;
+
+       if (len < sizeof(in6))
+               return false;
+       else if (!umove_or_printaddr(tcp, addr, &in6))
+               print_inet_addr(AF_INET6, &in6, sizeof(in6), NULL);
+
+       return true;
+}
+
+static bool
+decode_ifla_inet6_agm(struct tcb *const tcp,
+                     const kernel_ulong_t addr,
+                     const unsigned int len,
+                     const void *const opaque_data)
+{
+       const struct decode_nla_xlat_opts opts = {
+               ARRSZ_PAIR(in6_addr_gen_mode), "IN6_ADDR_GEN_MODE_???",
+               .xt = XT_INDEXED,
+               .size = 1,
+       };
+
+       return decode_nla_xval(tcp, addr, len, &opts);
+}
+
+static const nla_decoder_t ifla_inet6_nla_decoders[] = {
+       [IFLA_INET6_FLAGS]              = decode_ifla_inet6_flags,
+       [IFLA_INET6_CONF]               = decode_ifla_inet6_conf,
+       [IFLA_INET6_STATS]              = decode_ifla_inet6_stats,
+       [IFLA_INET6_MCAST]              = NULL, /* unused */
+       [IFLA_INET6_CACHEINFO]          = decode_ifla_inet6_cacheinfo,
+       [IFLA_INET6_ICMP6STATS]         = decode_ifla_inet6_icmp6_stats,
+       [IFLA_INET6_TOKEN]              = decode_ifla_inet6_token,
+       [IFLA_INET6_ADDR_GEN_MODE]      = decode_ifla_inet6_agm,
+};
+
+static const struct nla_decoder_table_desc {
+       const struct xlat *xlat;
+       const char *dflt;
+       const nla_decoder_t *table;
+       size_t size;
+} ifla_af_spec_protos[] = {
+       [AF_INET]       = {
+               rtnl_ifla_af_spec_inet_attrs, "IFLA_INET_???",
+               ARRSZ_PAIR(ifla_inet_nla_decoders),
+       },
+       [AF_INET6]      = {
+               rtnl_ifla_af_spec_inet6_attrs, "IFLA_INET6_???",
+               ARRSZ_PAIR(ifla_inet6_nla_decoders),
+       },
+};
+
+static bool
+decode_ifla_af(struct tcb *const tcp,
+              const kernel_ulong_t addr,
+              const unsigned int len,
+              const void *const opaque_data)
+{
+       uintptr_t proto = (uintptr_t) opaque_data;
+       const struct nla_decoder_table_desc *desc
+               = proto < ARRAY_SIZE(ifla_af_spec_protos)
+                       ? ifla_af_spec_protos + proto : NULL;
+
+       if (!desc || !desc->table)
+               return false;
+
+       decode_nlattr(tcp, addr, len,
+                     desc->xlat, desc->dflt, desc->table, desc->size, NULL);
+
+       return true;
+}
+
+static bool
+decode_ifla_af_spec(struct tcb *const tcp,
+                   const kernel_ulong_t addr,
+                   const unsigned int len,
+                   const void *const opaque_data)
+{
+       nla_decoder_t af_spec_decoder = &decode_ifla_af;
+
+       decode_nlattr(tcp, addr, len, addrfams, "AF_???",
+                     &af_spec_decoder, 0, opaque_data);
+
+       return true;
+}
+
 static const nla_decoder_t ifinfomsg_nla_decoders[] = {
        [IFLA_ADDRESS]          = NULL, /* unimplemented */
        [IFLA_BROADCAST]        = NULL, /* unimplemented */
@@ -417,7 +649,7 @@ static const nla_decoder_t ifinfomsg_nla_decoders[] = {
        [IFLA_STATS64]          = decode_rtnl_link_stats64,
        [IFLA_VF_PORTS]         = decode_ifla_vf_ports,
        [IFLA_PORT_SELF]        = decode_ifla_port,
-       [IFLA_AF_SPEC]          = NULL, /* unimplemented */
+       [IFLA_AF_SPEC]          = decode_ifla_af_spec,
        [IFLA_GROUP]            = decode_nla_u32,
        [IFLA_NET_NS_FD]        = decode_nla_fd,
        [IFLA_EXT_MASK]         = decode_nla_u32,
diff --git a/xlat/in6_addr_gen_mode.in b/xlat/in6_addr_gen_mode.in
new file mode 100644 (file)
index 0000000..5d01a13
--- /dev/null
@@ -0,0 +1,5 @@
+#value_indexed
+IN6_ADDR_GEN_MODE_EUI64                        0
+IN6_ADDR_GEN_MODE_NONE                 1
+IN6_ADDR_GEN_MODE_STABLE_PRIVACY       2
+IN6_ADDR_GEN_MODE_RANDOM               3
diff --git a/xlat/inet6_devconf_indices.in b/xlat/inet6_devconf_indices.in
new file mode 100644 (file)
index 0000000..89efe7f
--- /dev/null
@@ -0,0 +1,52 @@
+#value_indexed
+DEVCONF_FORWARDING                             0
+DEVCONF_HOPLIMIT                               1
+DEVCONF_MTU6                                   2
+DEVCONF_ACCEPT_RA                              3
+DEVCONF_ACCEPT_REDIRECTS                       4
+DEVCONF_AUTOCONF                               5
+DEVCONF_DAD_TRANSMITS                          6
+DEVCONF_RTR_SOLICITS                           7
+DEVCONF_RTR_SOLICIT_INTERVAL                   8
+DEVCONF_RTR_SOLICIT_DELAY                      9
+DEVCONF_USE_TEMPADDR                           10
+DEVCONF_TEMP_VALID_LFT                         11
+DEVCONF_TEMP_PREFERED_LFT                      12
+DEVCONF_REGEN_MAX_RETRY                                13
+DEVCONF_MAX_DESYNC_FACTOR                      14
+DEVCONF_MAX_ADDRESSES                          15
+DEVCONF_FORCE_MLD_VERSION                      16
+DEVCONF_ACCEPT_RA_DEFRTR                       17
+DEVCONF_ACCEPT_RA_PINFO                                18
+DEVCONF_ACCEPT_RA_RTR_PREF                     19
+DEVCONF_RTR_PROBE_INTERVAL                     20
+DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN             21
+DEVCONF_PROXY_NDP                              22
+DEVCONF_OPTIMISTIC_DAD                         23
+DEVCONF_ACCEPT_SOURCE_ROUTE                    24
+DEVCONF_MC_FORWARDING                          25
+DEVCONF_DISABLE_IPV6                           26
+DEVCONF_ACCEPT_DAD                             27
+DEVCONF_FORCE_TLLAO                            28
+DEVCONF_NDISC_NOTIFY                           29
+DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL      30
+DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL      31
+DEVCONF_SUPPRESS_FRAG_NDISC                    32
+DEVCONF_ACCEPT_RA_FROM_LOCAL                   33
+DEVCONF_USE_OPTIMISTIC                         34
+DEVCONF_ACCEPT_RA_MTU                          35
+DEVCONF_STABLE_SECRET                          36
+DEVCONF_USE_OIF_ADDRS_ONLY                     37
+DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT                        38
+DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN            39
+DEVCONF_DROP_UNICAST_IN_L2_MULTICAST           40
+DEVCONF_DROP_UNSOLICITED_NA                    41
+DEVCONF_KEEP_ADDR_ON_DOWN                      42
+DEVCONF_RTR_SOLICIT_MAX_INTERVAL               43
+DEVCONF_SEG6_ENABLED                           44
+DEVCONF_SEG6_REQUIRE_HMAC                      45
+DEVCONF_ENHANCED_DAD                           46
+DEVCONF_ADDR_GEN_MODE                          47
+DEVCONF_DISABLE_POLICY                         48
+DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN             49
+DEVCONF_NDISC_TCLASS                           50
diff --git a/xlat/inet6_if_flags.in b/xlat/inet6_if_flags.in
new file mode 100644 (file)
index 0000000..befd223
--- /dev/null
@@ -0,0 +1,6 @@
+/* sort -k2,2g */
+IF_RS_SENT     0x10
+IF_RA_RCVD     0x20
+IF_RA_MANAGED  0x40
+IF_RA_OTHERCONF        0x80
+IF_READY       0x80000000
diff --git a/xlat/inet_devconf_indices.in b/xlat/inet_devconf_indices.in
new file mode 100644 (file)
index 0000000..74c00fd
--- /dev/null
@@ -0,0 +1,32 @@
+#value_indexed
+IPV4_DEVCONF_FORWARDING-1                              1
+IPV4_DEVCONF_MC_FORWARDING-1                           2
+IPV4_DEVCONF_PROXY_ARP-1                               3
+IPV4_DEVCONF_ACCEPT_REDIRECTS-1                                4
+IPV4_DEVCONF_SECURE_REDIRECTS-1                                5
+IPV4_DEVCONF_SEND_REDIRECTS-1                          6
+IPV4_DEVCONF_SHARED_MEDIA-1                            7
+IPV4_DEVCONF_RP_FILTER-1                               8
+IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE-1                     9
+IPV4_DEVCONF_BOOTP_RELAY-1                             10
+IPV4_DEVCONF_LOG_MARTIANS-1                            11
+IPV4_DEVCONF_TAG-1                                     12
+IPV4_DEVCONF_ARPFILTER-1                               13
+IPV4_DEVCONF_MEDIUM_ID-1                               14
+IPV4_DEVCONF_NOXFRM-1                                  15
+IPV4_DEVCONF_NOPOLICY-1                                        16
+IPV4_DEVCONF_FORCE_IGMP_VERSION-1                      17
+IPV4_DEVCONF_ARP_ANNOUNCE-1                            18
+IPV4_DEVCONF_ARP_IGNORE-1                              19
+IPV4_DEVCONF_PROMOTE_SECONDARIES-1                     20
+IPV4_DEVCONF_ARP_ACCEPT-1                              21
+IPV4_DEVCONF_ARP_NOTIFY-1                              22
+IPV4_DEVCONF_ACCEPT_LOCAL-1                            23
+IPV4_DEVCONF_SRC_VMARK-1                               24
+IPV4_DEVCONF_PROXY_ARP_PVLAN-1                         25
+IPV4_DEVCONF_ROUTE_LOCALNET-1                          26
+IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL-1      27
+IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL-1      28
+IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN-1             29
+IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST-1            30
+IPV4_DEVCONF_DROP_GRATUITOUS_ARP-1                     31
diff --git a/xlat/rtnl_ifla_af_spec_inet6_attrs.in b/xlat/rtnl_ifla_af_spec_inet6_attrs.in
new file mode 100644 (file)
index 0000000..9717d5a
--- /dev/null
@@ -0,0 +1,10 @@
+#value_indexed
+IFLA_INET6_UNSPEC              0
+IFLA_INET6_FLAGS               1
+IFLA_INET6_CONF                        2
+IFLA_INET6_STATS               3
+IFLA_INET6_MCAST               4
+IFLA_INET6_CACHEINFO           5
+IFLA_INET6_ICMP6STATS          6
+IFLA_INET6_TOKEN               7
+IFLA_INET6_ADDR_GEN_MODE       8
diff --git a/xlat/rtnl_ifla_af_spec_inet_attrs.in b/xlat/rtnl_ifla_af_spec_inet_attrs.in
new file mode 100644 (file)
index 0000000..7979975
--- /dev/null
@@ -0,0 +1,3 @@
+#value_indexed
+IFLA_INET_UNSPEC       0
+IFLA_INET_CONF         1
diff --git a/xlat/snmp_icmp6_stats.in b/xlat/snmp_icmp6_stats.in
new file mode 100644 (file)
index 0000000..ee4769e
--- /dev/null
@@ -0,0 +1,7 @@
+#value_indexed
+ICMP6_MIB_NUM          0
+ICMP6_MIB_INMSGS       1
+ICMP6_MIB_INERRORS     2
+ICMP6_MIB_OUTMSGS      3
+ICMP6_MIB_OUTERRORS    4
+ICMP6_MIB_CSUMERRORS   5
diff --git a/xlat/snmp_ip_stats.in b/xlat/snmp_ip_stats.in
new file mode 100644 (file)
index 0000000..4bfb7ee
--- /dev/null
@@ -0,0 +1,37 @@
+#value_indexed
+IPSTATS_MIB_NUM                        0
+IPSTATS_MIB_INPKTS             1
+IPSTATS_MIB_INOCTETS           2
+IPSTATS_MIB_INDELIVERS         3
+IPSTATS_MIB_OUTFORWDATAGRAMS   4
+IPSTATS_MIB_OUTPKTS            5
+IPSTATS_MIB_OUTOCTETS          6
+IPSTATS_MIB_INHDRERRORS                7
+IPSTATS_MIB_INTOOBIGERRORS     8
+IPSTATS_MIB_INNOROUTES         9
+IPSTATS_MIB_INADDRERRORS       10
+IPSTATS_MIB_INUNKNOWNPROTOS    11
+IPSTATS_MIB_INTRUNCATEDPKTS    12
+IPSTATS_MIB_INDISCARDS         13
+IPSTATS_MIB_OUTDISCARDS                14
+IPSTATS_MIB_OUTNOROUTES                15
+IPSTATS_MIB_REASMTIMEOUT       16
+IPSTATS_MIB_REASMREQDS         17
+IPSTATS_MIB_REASMOKS           18
+IPSTATS_MIB_REASMFAILS         19
+IPSTATS_MIB_FRAGOKS            20
+IPSTATS_MIB_FRAGFAILS          21
+IPSTATS_MIB_FRAGCREATES                22
+IPSTATS_MIB_INMCASTPKTS                23
+IPSTATS_MIB_OUTMCASTPKTS       24
+IPSTATS_MIB_INBCASTPKTS                25
+IPSTATS_MIB_OUTBCASTPKTS       26
+IPSTATS_MIB_INMCASTOCTETS      27
+IPSTATS_MIB_OUTMCASTOCTETS     28
+IPSTATS_MIB_INBCASTOCTETS      29
+IPSTATS_MIB_OUTBCASTOCTETS     30
+IPSTATS_MIB_CSUMERRORS         31
+IPSTATS_MIB_NOECTPKTS          32
+IPSTATS_MIB_ECT1PKTS           33
+IPSTATS_MIB_ECT0PKTS           34
+IPSTATS_MIB_CEPKTS             35