diff --git a/home/nipa/nipa_out/963409/ynl/new-code/rt-link-user.c b/home/nipa/nipa_out/963409/ynl/new-code/rt-link-user.c new file mode 100644 index 000000000000..d863daa691c0 --- /dev/null +++ b/home/nipa/nipa_out/963409/ynl/new-code/rt-link-user.c @@ -0,0 +1,6098 @@ +// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) +/* Do not edit directly, auto-generated from: */ +/* Documentation/netlink/specs/rt-link.yaml */ +/* YNL-GEN user source */ + +#include +#include +#include "rt-link-user.h" +#include "ynl.h" +#include +#include +#include +#include +#include + +#include + +/* Enums */ +static const char * const rt_link_op_strmap[] = { + // skip "newlink-ntf", duplicate reply value + [16] = "getlink", + [92] = "getstats", +}; + +const char *rt_link_op_str(int op) +{ + if (op < 0 || op >= (int)YNL_ARRAY_SIZE(rt_link_op_strmap)) + return NULL; + return rt_link_op_strmap[op]; +} + +static const char * const rt_link_ifinfo_flags_strmap[] = { + [0] = "up", + [1] = "broadcast", + [2] = "debug", + [3] = "loopback", + [4] = "point-to-point", + [5] = "no-trailers", + [6] = "running", + [7] = "no-arp", + [8] = "promisc", + [9] = "all-multi", + [10] = "master", + [11] = "slave", + [12] = "multicast", + [13] = "portsel", + [14] = "auto-media", + [15] = "dynamic", + [16] = "lower-up", + [17] = "dormant", + [18] = "echo", +}; + +const char *rt_link_ifinfo_flags_str(enum net_device_flags value) +{ + value = ffs(value) - 1; + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_ifinfo_flags_strmap)) + return NULL; + return rt_link_ifinfo_flags_strmap[value]; +} + +static const char * const rt_link_vlan_protocols_strmap[] = { + [33024] = "8021q", + [34984] = "8021ad", +}; + +const char *rt_link_vlan_protocols_str(int value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_vlan_protocols_strmap)) + return NULL; + return rt_link_vlan_protocols_strmap[value]; +} + +static const char * const rt_link_ipv4_devconf_strmap[] = { + [0] = "forwarding", + [1] = "mc-forwarding", + [2] = "proxy-arp", + [3] = "accept-redirects", + [4] = "secure-redirects", + [5] = "send-redirects", + [6] = "shared-media", + [7] = "rp-filter", + [8] = "accept-source-route", + [9] = "bootp-relay", + [10] = "log-martians", + [11] = "tag", + [12] = "arpfilter", + [13] = "medium-id", + [14] = "noxfrm", + [15] = "nopolicy", + [16] = "force-igmp-version", + [17] = "arp-announce", + [18] = "arp-ignore", + [19] = "promote-secondaries", + [20] = "arp-accept", + [21] = "arp-notify", + [22] = "accept-local", + [23] = "src-vmark", + [24] = "proxy-arp-pvlan", + [25] = "route-localnet", + [26] = "igmpv2-unsolicited-report-interval", + [27] = "igmpv3-unsolicited-report-interval", + [28] = "ignore-routes-with-linkdown", + [29] = "drop-unicast-in-l2-multicast", + [30] = "drop-gratuitous-arp", + [31] = "bc-forwarding", + [32] = "arp-evict-nocarrier", +}; + +const char *rt_link_ipv4_devconf_str(int value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_ipv4_devconf_strmap)) + return NULL; + return rt_link_ipv4_devconf_strmap[value]; +} + +static const char * const rt_link_ipv6_devconf_strmap[] = { + [0] = "forwarding", + [1] = "hoplimit", + [2] = "mtu6", + [3] = "accept-ra", + [4] = "accept-redirects", + [5] = "autoconf", + [6] = "dad-transmits", + [7] = "rtr-solicits", + [8] = "rtr-solicit-interval", + [9] = "rtr-solicit-delay", + [10] = "use-tempaddr", + [11] = "temp-valid-lft", + [12] = "temp-prefered-lft", + [13] = "regen-max-retry", + [14] = "max-desync-factor", + [15] = "max-addresses", + [16] = "force-mld-version", + [17] = "accept-ra-defrtr", + [18] = "accept-ra-pinfo", + [19] = "accept-ra-rtr-pref", + [20] = "rtr-probe-interval", + [21] = "accept-ra-rt-info-max-plen", + [22] = "proxy-ndp", + [23] = "optimistic-dad", + [24] = "accept-source-route", + [25] = "mc-forwarding", + [26] = "disable-ipv6", + [27] = "accept-dad", + [28] = "force-tllao", + [29] = "ndisc-notify", + [30] = "mldv1-unsolicited-report-interval", + [31] = "mldv2-unsolicited-report-interval", + [32] = "suppress-frag-ndisc", + [33] = "accept-ra-from-local", + [34] = "use-optimistic", + [35] = "accept-ra-mtu", + [36] = "stable-secret", + [37] = "use-oif-addrs-only", + [38] = "accept-ra-min-hop-limit", + [39] = "ignore-routes-with-linkdown", + [40] = "drop-unicast-in-l2-multicast", + [41] = "drop-unsolicited-na", + [42] = "keep-addr-on-down", + [43] = "rtr-solicit-max-interval", + [44] = "seg6-enabled", + [45] = "seg6-require-hmac", + [46] = "enhanced-dad", + [47] = "addr-gen-mode", + [48] = "disable-policy", + [49] = "accept-ra-rt-info-min-plen", + [50] = "ndisc-tclass", + [51] = "rpl-seg-enabled", + [52] = "ra-defrtr-metric", + [53] = "ioam6-enabled", + [54] = "ioam6-id", + [55] = "ioam6-id-wide", + [56] = "ndisc-evict-nocarrier", + [57] = "accept-untracked-na", +}; + +const char *rt_link_ipv6_devconf_str(int value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_ipv6_devconf_strmap)) + return NULL; + return rt_link_ipv6_devconf_strmap[value]; +} + +static const char * const rt_link_ifla_icmp6_stats_strmap[] = { + [0] = "num", + [1] = "inmsgs", + [2] = "inerrors", + [3] = "outmsgs", + [4] = "outerrors", + [5] = "csumerrors", + [6] = "ratelimithost", +}; + +const char *rt_link_ifla_icmp6_stats_str(int value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_ifla_icmp6_stats_strmap)) + return NULL; + return rt_link_ifla_icmp6_stats_strmap[value]; +} + +static const char * const rt_link_ifla_inet6_stats_strmap[] = { + [0] = "num", + [1] = "inpkts", + [2] = "inoctets", + [3] = "indelivers", + [4] = "outforwdatagrams", + [5] = "outpkts", + [6] = "outoctets", + [7] = "inhdrerrors", + [8] = "intoobigerrors", + [9] = "innoroutes", + [10] = "inaddrerrors", + [11] = "inunknownprotos", + [12] = "intruncatedpkts", + [13] = "indiscards", + [14] = "outdiscards", + [15] = "outnoroutes", + [16] = "reasmtimeout", + [17] = "reasmreqds", + [18] = "reasmoks", + [19] = "reasmfails", + [20] = "fragoks", + [21] = "fragfails", + [22] = "fragcreates", + [23] = "inmcastpkts", + [24] = "outmcastpkts", + [25] = "inbcastpkts", + [26] = "outbcastpkts", + [27] = "inmcastoctets", + [28] = "outmcastoctets", + [29] = "inbcastoctets", + [30] = "outbcastoctets", + [31] = "csumerrors", + [32] = "noectpkts", + [33] = "ect1-pkts", + [34] = "ect0-pkts", + [35] = "cepkts", + [36] = "reasm-overlaps", +}; + +const char *rt_link_ifla_inet6_stats_str(int value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_ifla_inet6_stats_strmap)) + return NULL; + return rt_link_ifla_inet6_stats_strmap[value]; +} + +static const char * const rt_link_vlan_flags_strmap[] = { + [0] = "reorder-hdr", + [1] = "gvrp", + [2] = "loose-binding", + [3] = "mvrp", + [4] = "bridge-binding", +}; + +const char *rt_link_vlan_flags_str(int value) +{ + value = ffs(value) - 1; + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_vlan_flags_strmap)) + return NULL; + return rt_link_vlan_flags_strmap[value]; +} + +static const char * const rt_link_ifla_vf_link_state_enum_strmap[] = { + [0] = "auto", + [1] = "enable", + [2] = "disable", +}; + +const char *rt_link_ifla_vf_link_state_enum_str(int value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_ifla_vf_link_state_enum_strmap)) + return NULL; + return rt_link_ifla_vf_link_state_enum_strmap[value]; +} + +static const char * const rt_link_rtext_filter_strmap[] = { + [0] = "vf", + [1] = "brvlan", + [2] = "brvlan-compressed", + [3] = "skip-stats", + [4] = "mrp", + [5] = "cfm-config", + [6] = "cfm-status", + [7] = "mst", +}; + +const char *rt_link_rtext_filter_str(int value) +{ + value = ffs(value) - 1; + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_rtext_filter_strmap)) + return NULL; + return rt_link_rtext_filter_strmap[value]; +} + +static const char * const rt_link_netkit_policy_strmap[] = { + [0] = "forward", + [2] = "blackhole", +}; + +const char *rt_link_netkit_policy_str(int value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_netkit_policy_strmap)) + return NULL; + return rt_link_netkit_policy_strmap[value]; +} + +static const char * const rt_link_netkit_mode_strmap[] = { + [0] = "l2", + [1] = "l3", +}; + +const char *rt_link_netkit_mode_str(enum netkit_mode value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_netkit_mode_strmap)) + return NULL; + return rt_link_netkit_mode_strmap[value]; +} + +static const char * const rt_link_netkit_scrub_strmap[] = { + [0] = "none", + [1] = "default", +}; + +const char *rt_link_netkit_scrub_str(int value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_netkit_scrub_strmap)) + return NULL; + return rt_link_netkit_scrub_strmap[value]; +} + +static const char * const rt_link_ovpn_mode_strmap[] = { + [0] = "p2p", + [1] = "mp", +}; + +const char *rt_link_ovpn_mode_str(enum ovpn_mode value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_link_ovpn_mode_strmap)) + return NULL; + return rt_link_ovpn_mode_strmap[value]; +} + +/* Policies */ +const struct ynl_policy_attr rt_link_vf_ports_attrs_policy[IFLA_MAX + 1] = { +}; + +const struct ynl_policy_nest rt_link_vf_ports_attrs_nest = { + .max_attr = IFLA_MAX, + .table = rt_link_vf_ports_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_port_self_attrs_policy[IFLA_MAX + 1] = { +}; + +const struct ynl_policy_nest rt_link_port_self_attrs_nest = { + .max_attr = IFLA_MAX, + .table = rt_link_port_self_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_xdp_attrs_policy[IFLA_XDP_MAX + 1] = { + [IFLA_XDP_FD] = { .name = "fd", .type = YNL_PT_U32, }, + [IFLA_XDP_ATTACHED] = { .name = "attached", .type = YNL_PT_U8, }, + [IFLA_XDP_FLAGS] = { .name = "flags", .type = YNL_PT_U32, }, + [IFLA_XDP_PROG_ID] = { .name = "prog-id", .type = YNL_PT_U32, }, + [IFLA_XDP_DRV_PROG_ID] = { .name = "drv-prog-id", .type = YNL_PT_U32, }, + [IFLA_XDP_SKB_PROG_ID] = { .name = "skb-prog-id", .type = YNL_PT_U32, }, + [IFLA_XDP_HW_PROG_ID] = { .name = "hw-prog-id", .type = YNL_PT_U32, }, + [IFLA_XDP_EXPECTED_FD] = { .name = "expected-fd", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_xdp_attrs_nest = { + .max_attr = IFLA_XDP_MAX, + .table = rt_link_xdp_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_prop_list_link_attrs_policy[IFLA_MAX + 1] = { + [IFLA_ALT_IFNAME] = { .name = "alt-ifname", .type = YNL_PT_NUL_STR, }, +}; + +const struct ynl_policy_nest rt_link_prop_list_link_attrs_nest = { + .max_attr = IFLA_MAX, + .table = rt_link_prop_list_link_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_link_dpll_pin_attrs_policy[DPLL_A_MAX + 1] = { + [DPLL_A_ID] = { .name = "id", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_link_dpll_pin_attrs_nest = { + .max_attr = DPLL_A_MAX, + .table = rt_link_link_dpll_pin_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_ifla_attrs_policy[IFLA_INET_MAX + 1] = { + [IFLA_INET_CONF] = { .name = "conf", .type = YNL_PT_BINARY,}, +}; + +const struct ynl_policy_nest rt_link_ifla_attrs_nest = { + .max_attr = IFLA_INET_MAX, + .table = rt_link_ifla_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_ifla6_attrs_policy[IFLA_INET6_MAX + 1] = { + [IFLA_INET6_FLAGS] = { .name = "flags", .type = YNL_PT_U32, }, + [IFLA_INET6_CONF] = { .name = "conf", .type = YNL_PT_BINARY,}, + [IFLA_INET6_STATS] = { .name = "stats", .type = YNL_PT_BINARY,}, + [IFLA_INET6_MCAST] = { .name = "mcast", .type = YNL_PT_BINARY,}, + [IFLA_INET6_CACHEINFO] = { .name = "cacheinfo", .type = YNL_PT_BINARY,}, + [IFLA_INET6_ICMP6STATS] = { .name = "icmp6stats", .type = YNL_PT_BINARY,}, + [IFLA_INET6_TOKEN] = { .name = "token", .type = YNL_PT_BINARY,}, + [IFLA_INET6_ADDR_GEN_MODE] = { .name = "addr-gen-mode", .type = YNL_PT_U8, }, + [IFLA_INET6_RA_MTU] = { .name = "ra-mtu", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_ifla6_attrs_nest = { + .max_attr = IFLA_INET6_MAX, + .table = rt_link_ifla6_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_mctp_attrs_policy[IFLA_MCTP_MAX + 1] = { + [IFLA_MCTP_NET] = { .name = "net", .type = YNL_PT_U32, }, + [IFLA_MCTP_PHYS_BINDING] = { .name = "phys-binding", .type = YNL_PT_U8, }, +}; + +const struct ynl_policy_nest rt_link_mctp_attrs_nest = { + .max_attr = IFLA_MCTP_MAX, + .table = rt_link_mctp_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_hw_s_info_one_policy[IFLA_OFFLOAD_XSTATS_HW_S_INFO_MAX + 1] = { + [IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST] = { .name = "request", .type = YNL_PT_U8, }, + [IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED] = { .name = "used", .type = YNL_PT_U8, }, +}; + +const struct ynl_policy_nest rt_link_hw_s_info_one_nest = { + .max_attr = IFLA_OFFLOAD_XSTATS_HW_S_INFO_MAX, + .table = rt_link_hw_s_info_one_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_bridge_attrs_policy[IFLA_BR_MAX + 1] = { + [IFLA_BR_FORWARD_DELAY] = { .name = "forward-delay", .type = YNL_PT_U32, }, + [IFLA_BR_HELLO_TIME] = { .name = "hello-time", .type = YNL_PT_U32, }, + [IFLA_BR_MAX_AGE] = { .name = "max-age", .type = YNL_PT_U32, }, + [IFLA_BR_AGEING_TIME] = { .name = "ageing-time", .type = YNL_PT_U32, }, + [IFLA_BR_STP_STATE] = { .name = "stp-state", .type = YNL_PT_U32, }, + [IFLA_BR_PRIORITY] = { .name = "priority", .type = YNL_PT_U16, }, + [IFLA_BR_VLAN_FILTERING] = { .name = "vlan-filtering", .type = YNL_PT_U8, }, + [IFLA_BR_VLAN_PROTOCOL] = { .name = "vlan-protocol", .type = YNL_PT_U16, }, + [IFLA_BR_GROUP_FWD_MASK] = { .name = "group-fwd-mask", .type = YNL_PT_U16, }, + [IFLA_BR_ROOT_ID] = { .name = "root-id", .type = YNL_PT_BINARY,}, + [IFLA_BR_BRIDGE_ID] = { .name = "bridge-id", .type = YNL_PT_BINARY,}, + [IFLA_BR_ROOT_PORT] = { .name = "root-port", .type = YNL_PT_U16, }, + [IFLA_BR_ROOT_PATH_COST] = { .name = "root-path-cost", .type = YNL_PT_U32, }, + [IFLA_BR_TOPOLOGY_CHANGE] = { .name = "topology-change", .type = YNL_PT_U8, }, + [IFLA_BR_TOPOLOGY_CHANGE_DETECTED] = { .name = "topology-change-detected", .type = YNL_PT_U8, }, + [IFLA_BR_HELLO_TIMER] = { .name = "hello-timer", .type = YNL_PT_U64, }, + [IFLA_BR_TCN_TIMER] = { .name = "tcn-timer", .type = YNL_PT_U64, }, + [IFLA_BR_TOPOLOGY_CHANGE_TIMER] = { .name = "topology-change-timer", .type = YNL_PT_U64, }, + [IFLA_BR_GC_TIMER] = { .name = "gc-timer", .type = YNL_PT_U64, }, + [IFLA_BR_GROUP_ADDR] = { .name = "group-addr", .type = YNL_PT_BINARY,}, + [IFLA_BR_FDB_FLUSH] = { .name = "fdb-flush", .type = YNL_PT_BINARY,}, + [IFLA_BR_MCAST_ROUTER] = { .name = "mcast-router", .type = YNL_PT_U8, }, + [IFLA_BR_MCAST_SNOOPING] = { .name = "mcast-snooping", .type = YNL_PT_U8, }, + [IFLA_BR_MCAST_QUERY_USE_IFADDR] = { .name = "mcast-query-use-ifaddr", .type = YNL_PT_U8, }, + [IFLA_BR_MCAST_QUERIER] = { .name = "mcast-querier", .type = YNL_PT_U8, }, + [IFLA_BR_MCAST_HASH_ELASTICITY] = { .name = "mcast-hash-elasticity", .type = YNL_PT_U32, }, + [IFLA_BR_MCAST_HASH_MAX] = { .name = "mcast-hash-max", .type = YNL_PT_U32, }, + [IFLA_BR_MCAST_LAST_MEMBER_CNT] = { .name = "mcast-last-member-cnt", .type = YNL_PT_U32, }, + [IFLA_BR_MCAST_STARTUP_QUERY_CNT] = { .name = "mcast-startup-query-cnt", .type = YNL_PT_U32, }, + [IFLA_BR_MCAST_LAST_MEMBER_INTVL] = { .name = "mcast-last-member-intvl", .type = YNL_PT_U64, }, + [IFLA_BR_MCAST_MEMBERSHIP_INTVL] = { .name = "mcast-membership-intvl", .type = YNL_PT_U64, }, + [IFLA_BR_MCAST_QUERIER_INTVL] = { .name = "mcast-querier-intvl", .type = YNL_PT_U64, }, + [IFLA_BR_MCAST_QUERY_INTVL] = { .name = "mcast-query-intvl", .type = YNL_PT_U64, }, + [IFLA_BR_MCAST_QUERY_RESPONSE_INTVL] = { .name = "mcast-query-response-intvl", .type = YNL_PT_U64, }, + [IFLA_BR_MCAST_STARTUP_QUERY_INTVL] = { .name = "mcast-startup-query-intvl", .type = YNL_PT_U64, }, + [IFLA_BR_NF_CALL_IPTABLES] = { .name = "nf-call-iptables", .type = YNL_PT_U8, }, + [IFLA_BR_NF_CALL_IP6TABLES] = { .name = "nf-call-ip6tables", .type = YNL_PT_U8, }, + [IFLA_BR_NF_CALL_ARPTABLES] = { .name = "nf-call-arptables", .type = YNL_PT_U8, }, + [IFLA_BR_VLAN_DEFAULT_PVID] = { .name = "vlan-default-pvid", .type = YNL_PT_U16, }, + [IFLA_BR_PAD] = { .name = "pad", .type = YNL_PT_IGNORE, }, + [IFLA_BR_VLAN_STATS_ENABLED] = { .name = "vlan-stats-enabled", .type = YNL_PT_U8, }, + [IFLA_BR_MCAST_STATS_ENABLED] = { .name = "mcast-stats-enabled", .type = YNL_PT_U8, }, + [IFLA_BR_MCAST_IGMP_VERSION] = { .name = "mcast-igmp-version", .type = YNL_PT_U8, }, + [IFLA_BR_MCAST_MLD_VERSION] = { .name = "mcast-mld-version", .type = YNL_PT_U8, }, + [IFLA_BR_VLAN_STATS_PER_PORT] = { .name = "vlan-stats-per-port", .type = YNL_PT_U8, }, + [IFLA_BR_MULTI_BOOLOPT] = { .name = "multi-boolopt", .type = YNL_PT_BINARY,}, + [IFLA_BR_MCAST_QUERIER_STATE] = { .name = "mcast-querier-state", .type = YNL_PT_BINARY,}, + [IFLA_BR_FDB_N_LEARNED] = { .name = "fdb-n-learned", .type = YNL_PT_U32, }, + [IFLA_BR_FDB_MAX_LEARNED] = { .name = "fdb-max-learned", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_bridge_attrs_nest = { + .max_attr = IFLA_BR_MAX, + .table = rt_link_linkinfo_bridge_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_gre_attrs_policy[IFLA_GRE_MAX + 1] = { + [IFLA_GRE_LINK] = { .name = "link", .type = YNL_PT_U32, }, + [IFLA_GRE_IFLAGS] = { .name = "iflags", .type = YNL_PT_U16, }, + [IFLA_GRE_OFLAGS] = { .name = "oflags", .type = YNL_PT_U16, }, + [IFLA_GRE_IKEY] = { .name = "ikey", .type = YNL_PT_U32, }, + [IFLA_GRE_OKEY] = { .name = "okey", .type = YNL_PT_U32, }, + [IFLA_GRE_LOCAL] = { .name = "local", .type = YNL_PT_BINARY,}, + [IFLA_GRE_REMOTE] = { .name = "remote", .type = YNL_PT_BINARY,}, + [IFLA_GRE_TTL] = { .name = "ttl", .type = YNL_PT_U8, }, + [IFLA_GRE_TOS] = { .name = "tos", .type = YNL_PT_U8, }, + [IFLA_GRE_PMTUDISC] = { .name = "pmtudisc", .type = YNL_PT_U8, }, + [IFLA_GRE_ENCAP_LIMIT] = { .name = "encap-limit", .type = YNL_PT_U32, }, + [IFLA_GRE_FLOWINFO] = { .name = "flowinfo", .type = YNL_PT_U32, }, + [IFLA_GRE_FLAGS] = { .name = "flags", .type = YNL_PT_U32, }, + [IFLA_GRE_ENCAP_TYPE] = { .name = "encap-type", .type = YNL_PT_U16, }, + [IFLA_GRE_ENCAP_FLAGS] = { .name = "encap-flags", .type = YNL_PT_U16, }, + [IFLA_GRE_ENCAP_SPORT] = { .name = "encap-sport", .type = YNL_PT_U16, }, + [IFLA_GRE_ENCAP_DPORT] = { .name = "encap-dport", .type = YNL_PT_U16, }, + [IFLA_GRE_COLLECT_METADATA] = { .name = "collect-metadata", .type = YNL_PT_FLAG, }, + [IFLA_GRE_IGNORE_DF] = { .name = "ignore-df", .type = YNL_PT_U8, }, + [IFLA_GRE_FWMARK] = { .name = "fwmark", .type = YNL_PT_U32, }, + [IFLA_GRE_ERSPAN_INDEX] = { .name = "erspan-index", .type = YNL_PT_U32, }, + [IFLA_GRE_ERSPAN_VER] = { .name = "erspan-ver", .type = YNL_PT_U8, }, + [IFLA_GRE_ERSPAN_DIR] = { .name = "erspan-dir", .type = YNL_PT_U8, }, + [IFLA_GRE_ERSPAN_HWID] = { .name = "erspan-hwid", .type = YNL_PT_U16, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_gre_attrs_nest = { + .max_attr = IFLA_GRE_MAX, + .table = rt_link_linkinfo_gre_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_geneve_attrs_policy[IFLA_GENEVE_MAX + 1] = { + [IFLA_GENEVE_ID] = { .name = "id", .type = YNL_PT_U32, }, + [IFLA_GENEVE_REMOTE] = { .name = "remote", .type = YNL_PT_BINARY,}, + [IFLA_GENEVE_TTL] = { .name = "ttl", .type = YNL_PT_U8, }, + [IFLA_GENEVE_TOS] = { .name = "tos", .type = YNL_PT_U8, }, + [IFLA_GENEVE_PORT] = { .name = "port", .type = YNL_PT_U16, }, + [IFLA_GENEVE_COLLECT_METADATA] = { .name = "collect-metadata", .type = YNL_PT_FLAG, }, + [IFLA_GENEVE_REMOTE6] = { .name = "remote6", .type = YNL_PT_BINARY,}, + [IFLA_GENEVE_UDP_CSUM] = { .name = "udp-csum", .type = YNL_PT_U8, }, + [IFLA_GENEVE_UDP_ZERO_CSUM6_TX] = { .name = "udp-zero-csum6-tx", .type = YNL_PT_U8, }, + [IFLA_GENEVE_UDP_ZERO_CSUM6_RX] = { .name = "udp-zero-csum6-rx", .type = YNL_PT_U8, }, + [IFLA_GENEVE_LABEL] = { .name = "label", .type = YNL_PT_U32, }, + [IFLA_GENEVE_TTL_INHERIT] = { .name = "ttl-inherit", .type = YNL_PT_U8, }, + [IFLA_GENEVE_DF] = { .name = "df", .type = YNL_PT_U8, }, + [IFLA_GENEVE_INNER_PROTO_INHERIT] = { .name = "inner-proto-inherit", .type = YNL_PT_FLAG, }, + [IFLA_GENEVE_PORT_RANGE] = { .name = "port-range", .type = YNL_PT_BINARY,}, +}; + +const struct ynl_policy_nest rt_link_linkinfo_geneve_attrs_nest = { + .max_attr = IFLA_GENEVE_MAX, + .table = rt_link_linkinfo_geneve_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_iptun_attrs_policy[IFLA_IPTUN_MAX + 1] = { + [IFLA_IPTUN_LINK] = { .name = "link", .type = YNL_PT_U32, }, + [IFLA_IPTUN_LOCAL] = { .name = "local", .type = YNL_PT_BINARY,}, + [IFLA_IPTUN_REMOTE] = { .name = "remote", .type = YNL_PT_BINARY,}, + [IFLA_IPTUN_TTL] = { .name = "ttl", .type = YNL_PT_U8, }, + [IFLA_IPTUN_TOS] = { .name = "tos", .type = YNL_PT_U8, }, + [IFLA_IPTUN_ENCAP_LIMIT] = { .name = "encap-limit", .type = YNL_PT_U8, }, + [IFLA_IPTUN_FLOWINFO] = { .name = "flowinfo", .type = YNL_PT_U32, }, + [IFLA_IPTUN_FLAGS] = { .name = "flags", .type = YNL_PT_U16, }, + [IFLA_IPTUN_PROTO] = { .name = "proto", .type = YNL_PT_U8, }, + [IFLA_IPTUN_PMTUDISC] = { .name = "pmtudisc", .type = YNL_PT_U8, }, + [IFLA_IPTUN_6RD_PREFIX] = { .name = "6rd-prefix", .type = YNL_PT_BINARY,}, + [IFLA_IPTUN_6RD_RELAY_PREFIX] = { .name = "6rd-relay-prefix", .type = YNL_PT_BINARY,}, + [IFLA_IPTUN_6RD_PREFIXLEN] = { .name = "6rd-prefixlen", .type = YNL_PT_U16, }, + [IFLA_IPTUN_6RD_RELAY_PREFIXLEN] = { .name = "6rd-relay-prefixlen", .type = YNL_PT_U16, }, + [IFLA_IPTUN_ENCAP_TYPE] = { .name = "encap-type", .type = YNL_PT_U16, }, + [IFLA_IPTUN_ENCAP_FLAGS] = { .name = "encap-flags", .type = YNL_PT_U16, }, + [IFLA_IPTUN_ENCAP_SPORT] = { .name = "encap-sport", .type = YNL_PT_U16, }, + [IFLA_IPTUN_ENCAP_DPORT] = { .name = "encap-dport", .type = YNL_PT_U16, }, + [IFLA_IPTUN_COLLECT_METADATA] = { .name = "collect-metadata", .type = YNL_PT_FLAG, }, + [IFLA_IPTUN_FWMARK] = { .name = "fwmark", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_iptun_attrs_nest = { + .max_attr = IFLA_IPTUN_MAX, + .table = rt_link_linkinfo_iptun_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_ip6tnl_attrs_policy[IFLA_IPTUN_MAX + 1] = { + [IFLA_IPTUN_LINK] = { .name = "link", .type = YNL_PT_U32, }, + [IFLA_IPTUN_LOCAL] = { .name = "local", .type = YNL_PT_BINARY,}, + [IFLA_IPTUN_REMOTE] = { .name = "remote", .type = YNL_PT_BINARY,}, + [IFLA_IPTUN_TTL] = { .name = "ttl", .type = YNL_PT_U8, }, + [IFLA_IPTUN_ENCAP_LIMIT] = { .name = "encap-limit", .type = YNL_PT_U8, }, + [IFLA_IPTUN_FLOWINFO] = { .name = "flowinfo", .type = YNL_PT_U32, }, + [IFLA_IPTUN_FLAGS] = { .name = "flags", .type = YNL_PT_U32, }, + [IFLA_IPTUN_PROTO] = { .name = "proto", .type = YNL_PT_U8, }, + [IFLA_IPTUN_ENCAP_TYPE] = { .name = "encap-type", .type = YNL_PT_U16, }, + [IFLA_IPTUN_ENCAP_FLAGS] = { .name = "encap-flags", .type = YNL_PT_U16, }, + [IFLA_IPTUN_ENCAP_SPORT] = { .name = "encap-sport", .type = YNL_PT_U16, }, + [IFLA_IPTUN_ENCAP_DPORT] = { .name = "encap-dport", .type = YNL_PT_U16, }, + [IFLA_IPTUN_COLLECT_METADATA] = { .name = "collect-metadata", .type = YNL_PT_FLAG, }, + [IFLA_IPTUN_FWMARK] = { .name = "fwmark", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_ip6tnl_attrs_nest = { + .max_attr = IFLA_IPTUN_MAX, + .table = rt_link_linkinfo_ip6tnl_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_tun_attrs_policy[IFLA_TUN_MAX + 1] = { + [IFLA_TUN_OWNER] = { .name = "owner", .type = YNL_PT_U32, }, + [IFLA_TUN_GROUP] = { .name = "group", .type = YNL_PT_U32, }, + [IFLA_TUN_TYPE] = { .name = "type", .type = YNL_PT_U8, }, + [IFLA_TUN_PI] = { .name = "pi", .type = YNL_PT_U8, }, + [IFLA_TUN_VNET_HDR] = { .name = "vnet-hdr", .type = YNL_PT_U8, }, + [IFLA_TUN_PERSIST] = { .name = "persist", .type = YNL_PT_U8, }, + [IFLA_TUN_MULTI_QUEUE] = { .name = "multi-queue", .type = YNL_PT_U8, }, + [IFLA_TUN_NUM_QUEUES] = { .name = "num-queues", .type = YNL_PT_U32, }, + [IFLA_TUN_NUM_DISABLED_QUEUES] = { .name = "num-disabled-queues", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_tun_attrs_nest = { + .max_attr = IFLA_TUN_MAX, + .table = rt_link_linkinfo_tun_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_vrf_attrs_policy[IFLA_VRF_MAX + 1] = { + [IFLA_VRF_TABLE] = { .name = "table", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_vrf_attrs_nest = { + .max_attr = IFLA_VRF_MAX, + .table = rt_link_linkinfo_vrf_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_vti_attrs_policy[IFLA_VTI_MAX + 1] = { + [IFLA_VTI_LINK] = { .name = "link", .type = YNL_PT_U32, }, + [IFLA_VTI_IKEY] = { .name = "ikey", .type = YNL_PT_U32, }, + [IFLA_VTI_OKEY] = { .name = "okey", .type = YNL_PT_U32, }, + [IFLA_VTI_LOCAL] = { .name = "local", .type = YNL_PT_BINARY,}, + [IFLA_VTI_REMOTE] = { .name = "remote", .type = YNL_PT_BINARY,}, + [IFLA_VTI_FWMARK] = { .name = "fwmark", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_vti_attrs_nest = { + .max_attr = IFLA_VTI_MAX, + .table = rt_link_linkinfo_vti_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_vti6_attrs_policy[IFLA_VTI_MAX + 1] = { + [IFLA_VTI_LINK] = { .name = "link", .type = YNL_PT_U32, }, + [IFLA_VTI_IKEY] = { .name = "ikey", .type = YNL_PT_U32, }, + [IFLA_VTI_OKEY] = { .name = "okey", .type = YNL_PT_U32, }, + [IFLA_VTI_LOCAL] = { .name = "local", .type = YNL_PT_BINARY,}, + [IFLA_VTI_REMOTE] = { .name = "remote", .type = YNL_PT_BINARY,}, + [IFLA_VTI_FWMARK] = { .name = "fwmark", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_vti6_attrs_nest = { + .max_attr = IFLA_VTI_MAX, + .table = rt_link_linkinfo_vti6_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_netkit_attrs_policy[IFLA_NETKIT_MAX + 1] = { + [IFLA_NETKIT_PEER_INFO] = { .name = "peer-info", .type = YNL_PT_BINARY,}, + [IFLA_NETKIT_PRIMARY] = { .name = "primary", .type = YNL_PT_U8, }, + [IFLA_NETKIT_POLICY] = { .name = "policy", .type = YNL_PT_U32, }, + [IFLA_NETKIT_PEER_POLICY] = { .name = "peer-policy", .type = YNL_PT_U32, }, + [IFLA_NETKIT_MODE] = { .name = "mode", .type = YNL_PT_U32, }, + [IFLA_NETKIT_SCRUB] = { .name = "scrub", .type = YNL_PT_U32, }, + [IFLA_NETKIT_PEER_SCRUB] = { .name = "peer-scrub", .type = YNL_PT_U32, }, + [IFLA_NETKIT_HEADROOM] = { .name = "headroom", .type = YNL_PT_U16, }, + [IFLA_NETKIT_TAILROOM] = { .name = "tailroom", .type = YNL_PT_U16, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_netkit_attrs_nest = { + .max_attr = IFLA_NETKIT_MAX, + .table = rt_link_linkinfo_netkit_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_ovpn_attrs_policy[IFLA_OVPN_MAX + 1] = { + [IFLA_OVPN_MODE] = { .name = "mode", .type = YNL_PT_U8, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_ovpn_attrs_nest = { + .max_attr = IFLA_OVPN_MAX, + .table = rt_link_linkinfo_ovpn_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_brport_attrs_policy[IFLA_BRPORT_MAX + 1] = { + [IFLA_BRPORT_STATE] = { .name = "state", .type = YNL_PT_U8, }, + [IFLA_BRPORT_PRIORITY] = { .name = "priority", .type = YNL_PT_U16, }, + [IFLA_BRPORT_COST] = { .name = "cost", .type = YNL_PT_U32, }, + [IFLA_BRPORT_MODE] = { .name = "mode", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_GUARD] = { .name = "guard", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_PROTECT] = { .name = "protect", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_FAST_LEAVE] = { .name = "fast-leave", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_LEARNING] = { .name = "learning", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_UNICAST_FLOOD] = { .name = "unicast-flood", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_PROXYARP] = { .name = "proxyarp", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_LEARNING_SYNC] = { .name = "learning-sync", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_PROXYARP_WIFI] = { .name = "proxyarp-wifi", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_ROOT_ID] = { .name = "root-id", .type = YNL_PT_BINARY,}, + [IFLA_BRPORT_BRIDGE_ID] = { .name = "bridge-id", .type = YNL_PT_BINARY,}, + [IFLA_BRPORT_DESIGNATED_PORT] = { .name = "designated-port", .type = YNL_PT_U16, }, + [IFLA_BRPORT_DESIGNATED_COST] = { .name = "designated-cost", .type = YNL_PT_U16, }, + [IFLA_BRPORT_ID] = { .name = "id", .type = YNL_PT_U16, }, + [IFLA_BRPORT_NO] = { .name = "no", .type = YNL_PT_U16, }, + [IFLA_BRPORT_TOPOLOGY_CHANGE_ACK] = { .name = "topology-change-ack", .type = YNL_PT_U8, }, + [IFLA_BRPORT_CONFIG_PENDING] = { .name = "config-pending", .type = YNL_PT_U8, }, + [IFLA_BRPORT_MESSAGE_AGE_TIMER] = { .name = "message-age-timer", .type = YNL_PT_U64, }, + [IFLA_BRPORT_FORWARD_DELAY_TIMER] = { .name = "forward-delay-timer", .type = YNL_PT_U64, }, + [IFLA_BRPORT_HOLD_TIMER] = { .name = "hold-timer", .type = YNL_PT_U64, }, + [IFLA_BRPORT_FLUSH] = { .name = "flush", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_MULTICAST_ROUTER] = { .name = "multicast-router", .type = YNL_PT_U8, }, + [IFLA_BRPORT_PAD] = { .name = "pad", .type = YNL_PT_IGNORE, }, + [IFLA_BRPORT_MCAST_FLOOD] = { .name = "mcast-flood", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_MCAST_TO_UCAST] = { .name = "mcast-to-ucast", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_VLAN_TUNNEL] = { .name = "vlan-tunnel", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_BCAST_FLOOD] = { .name = "bcast-flood", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_GROUP_FWD_MASK] = { .name = "group-fwd-mask", .type = YNL_PT_U16, }, + [IFLA_BRPORT_NEIGH_SUPPRESS] = { .name = "neigh-suppress", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_ISOLATED] = { .name = "isolated", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_BACKUP_PORT] = { .name = "backup-port", .type = YNL_PT_U32, }, + [IFLA_BRPORT_MRP_RING_OPEN] = { .name = "mrp-ring-open", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_MRP_IN_OPEN] = { .name = "mrp-in-open", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT] = { .name = "mcast-eht-hosts-limit", .type = YNL_PT_U32, }, + [IFLA_BRPORT_MCAST_EHT_HOSTS_CNT] = { .name = "mcast-eht-hosts-cnt", .type = YNL_PT_U32, }, + [IFLA_BRPORT_LOCKED] = { .name = "locked", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_MAB] = { .name = "mab", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_MCAST_N_GROUPS] = { .name = "mcast-n-groups", .type = YNL_PT_U32, }, + [IFLA_BRPORT_MCAST_MAX_GROUPS] = { .name = "mcast-max-groups", .type = YNL_PT_U32, }, + [IFLA_BRPORT_NEIGH_VLAN_SUPPRESS] = { .name = "neigh-vlan-suppress", .type = YNL_PT_FLAG, }, + [IFLA_BRPORT_BACKUP_NHID] = { .name = "backup-nhid", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_brport_attrs_nest = { + .max_attr = IFLA_BRPORT_MAX, + .table = rt_link_linkinfo_brport_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_bond_slave_attrs_policy[IFLA_BOND_SLAVE_MAX + 1] = { + [IFLA_BOND_SLAVE_STATE] = { .name = "state", .type = YNL_PT_U8, }, + [IFLA_BOND_SLAVE_MII_STATUS] = { .name = "mii-status", .type = YNL_PT_U8, }, + [IFLA_BOND_SLAVE_LINK_FAILURE_COUNT] = { .name = "link-failure-count", .type = YNL_PT_U32, }, + [IFLA_BOND_SLAVE_PERM_HWADDR] = { .name = "perm-hwaddr", .type = YNL_PT_BINARY,}, + [IFLA_BOND_SLAVE_QUEUE_ID] = { .name = "queue-id", .type = YNL_PT_U16, }, + [IFLA_BOND_SLAVE_AD_AGGREGATOR_ID] = { .name = "ad-aggregator-id", .type = YNL_PT_U16, }, + [IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE] = { .name = "ad-actor-oper-port-state", .type = YNL_PT_U8, }, + [IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE] = { .name = "ad-partner-oper-port-state", .type = YNL_PT_U16, }, + [IFLA_BOND_SLAVE_PRIO] = { .name = "prio", .type = YNL_PT_U32, }, +}; + +const struct ynl_policy_nest rt_link_bond_slave_attrs_nest = { + .max_attr = IFLA_BOND_SLAVE_MAX, + .table = rt_link_bond_slave_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_vf_stats_attrs_policy[IFLA_VF_STATS_MAX + 1] = { + [IFLA_VF_STATS_RX_PACKETS] = { .name = "rx-packets", .type = YNL_PT_U64, }, + [IFLA_VF_STATS_TX_PACKETS] = { .name = "tx-packets", .type = YNL_PT_U64, }, + [IFLA_VF_STATS_RX_BYTES] = { .name = "rx-bytes", .type = YNL_PT_U64, }, + [IFLA_VF_STATS_TX_BYTES] = { .name = "tx-bytes", .type = YNL_PT_U64, }, + [IFLA_VF_STATS_BROADCAST] = { .name = "broadcast", .type = YNL_PT_U64, }, + [IFLA_VF_STATS_MULTICAST] = { .name = "multicast", .type = YNL_PT_U64, }, + [IFLA_VF_STATS_PAD] = { .name = "pad", .type = YNL_PT_IGNORE, }, + [IFLA_VF_STATS_RX_DROPPED] = { .name = "rx-dropped", .type = YNL_PT_U64, }, + [IFLA_VF_STATS_TX_DROPPED] = { .name = "tx-dropped", .type = YNL_PT_U64, }, +}; + +const struct ynl_policy_nest rt_link_vf_stats_attrs_nest = { + .max_attr = IFLA_VF_STATS_MAX, + .table = rt_link_vf_stats_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_vf_vlan_attrs_policy[IFLA_VF_VLAN_INFO_MAX + 1] = { + [IFLA_VF_VLAN_INFO] = { .name = "info", .type = YNL_PT_BINARY,}, +}; + +const struct ynl_policy_nest rt_link_vf_vlan_attrs_nest = { + .max_attr = IFLA_VF_VLAN_INFO_MAX, + .table = rt_link_vf_vlan_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_bond_ad_info_attrs_policy[IFLA_BOND_AD_INFO_MAX + 1] = { + [IFLA_BOND_AD_INFO_AGGREGATOR] = { .name = "aggregator", .type = YNL_PT_U16, }, + [IFLA_BOND_AD_INFO_NUM_PORTS] = { .name = "num-ports", .type = YNL_PT_U16, }, + [IFLA_BOND_AD_INFO_ACTOR_KEY] = { .name = "actor-key", .type = YNL_PT_U16, }, + [IFLA_BOND_AD_INFO_PARTNER_KEY] = { .name = "partner-key", .type = YNL_PT_U16, }, + [IFLA_BOND_AD_INFO_PARTNER_MAC] = { .name = "partner-mac", .type = YNL_PT_BINARY,}, +}; + +const struct ynl_policy_nest rt_link_bond_ad_info_attrs_nest = { + .max_attr = IFLA_BOND_AD_INFO_MAX, + .table = rt_link_bond_ad_info_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_ifla_vlan_qos_policy[IFLA_VLAN_QOS_MAX + 1] = { + [IFLA_VLAN_QOS_MAPPING] = { .name = "mapping", .type = YNL_PT_BINARY,}, +}; + +const struct ynl_policy_nest rt_link_ifla_vlan_qos_nest = { + .max_attr = IFLA_VLAN_QOS_MAX, + .table = rt_link_ifla_vlan_qos_policy, +}; + +const struct ynl_policy_attr rt_link_af_spec_attrs_policy[AF_MAX + 1] = { + [AF_INET] = { .name = "inet", .type = YNL_PT_NEST, .nest = &rt_link_ifla_attrs_nest, }, + [AF_INET6] = { .name = "inet6", .type = YNL_PT_NEST, .nest = &rt_link_ifla6_attrs_nest, }, + [AF_MCTP] = { .name = "mctp", .type = YNL_PT_NEST, .nest = &rt_link_mctp_attrs_nest, }, +}; + +const struct ynl_policy_nest rt_link_af_spec_attrs_nest = { + .max_attr = AF_MAX, + .table = rt_link_af_spec_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_link_offload_xstats_policy[IFLA_OFFLOAD_XSTATS_MAX + 1] = { + [IFLA_OFFLOAD_XSTATS_CPU_HIT] = { .name = "cpu-hit", .type = YNL_PT_BINARY,}, + [IFLA_OFFLOAD_XSTATS_HW_S_INFO] = { .name = "hw-s-info", .type = YNL_PT_NEST, .nest = &rt_link_hw_s_info_one_nest, }, + [IFLA_OFFLOAD_XSTATS_L3_STATS] = { .name = "l3-stats", .type = YNL_PT_BINARY,}, +}; + +const struct ynl_policy_nest rt_link_link_offload_xstats_nest = { + .max_attr = IFLA_OFFLOAD_XSTATS_MAX, + .table = rt_link_link_offload_xstats_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_member_data_msg_policy[] = { + [0] = { .type = YNL_PT_SUBMSG, .name = "bridge", .nest = &rt_link_linkinfo_brport_attrs_nest, }, + [1] = { .type = YNL_PT_SUBMSG, .name = "bond", .nest = &rt_link_bond_slave_attrs_nest, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_member_data_msg_nest = { + .max_attr = 1, + .table = rt_link_linkinfo_member_data_msg_policy, +}; + +const struct ynl_policy_attr rt_link_vfinfo_attrs_policy[IFLA_VF_MAX + 1] = { + [IFLA_VF_MAC] = { .name = "mac", .type = YNL_PT_BINARY,}, + [IFLA_VF_VLAN] = { .name = "vlan", .type = YNL_PT_BINARY,}, + [IFLA_VF_TX_RATE] = { .name = "tx-rate", .type = YNL_PT_BINARY,}, + [IFLA_VF_SPOOFCHK] = { .name = "spoofchk", .type = YNL_PT_BINARY,}, + [IFLA_VF_LINK_STATE] = { .name = "link-state", .type = YNL_PT_BINARY,}, + [IFLA_VF_RATE] = { .name = "rate", .type = YNL_PT_BINARY,}, + [IFLA_VF_RSS_QUERY_EN] = { .name = "rss-query-en", .type = YNL_PT_BINARY,}, + [IFLA_VF_STATS] = { .name = "stats", .type = YNL_PT_NEST, .nest = &rt_link_vf_stats_attrs_nest, }, + [IFLA_VF_TRUST] = { .name = "trust", .type = YNL_PT_BINARY,}, + [IFLA_VF_IB_NODE_GUID] = { .name = "ib-node-guid", .type = YNL_PT_BINARY,}, + [IFLA_VF_IB_PORT_GUID] = { .name = "ib-port-guid", .type = YNL_PT_BINARY,}, + [IFLA_VF_VLAN_LIST] = { .name = "vlan-list", .type = YNL_PT_NEST, .nest = &rt_link_vf_vlan_attrs_nest, }, + [IFLA_VF_BROADCAST] = { .name = "broadcast", .type = YNL_PT_BINARY,}, +}; + +const struct ynl_policy_nest rt_link_vfinfo_attrs_nest = { + .max_attr = IFLA_VF_MAX, + .table = rt_link_vfinfo_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_bond_attrs_policy[IFLA_BOND_MAX + 1] = { + [IFLA_BOND_MODE] = { .name = "mode", .type = YNL_PT_U8, }, + [IFLA_BOND_ACTIVE_SLAVE] = { .name = "active-slave", .type = YNL_PT_U32, }, + [IFLA_BOND_MIIMON] = { .name = "miimon", .type = YNL_PT_U32, }, + [IFLA_BOND_UPDELAY] = { .name = "updelay", .type = YNL_PT_U32, }, + [IFLA_BOND_DOWNDELAY] = { .name = "downdelay", .type = YNL_PT_U32, }, + [IFLA_BOND_USE_CARRIER] = { .name = "use-carrier", .type = YNL_PT_U8, }, + [IFLA_BOND_ARP_INTERVAL] = { .name = "arp-interval", .type = YNL_PT_U32, }, + [IFLA_BOND_ARP_IP_TARGET] = { .name = "arp-ip-target", .type = YNL_PT_U32, }, + [IFLA_BOND_ARP_VALIDATE] = { .name = "arp-validate", .type = YNL_PT_U32, }, + [IFLA_BOND_ARP_ALL_TARGETS] = { .name = "arp-all-targets", .type = YNL_PT_U32, }, + [IFLA_BOND_PRIMARY] = { .name = "primary", .type = YNL_PT_U32, }, + [IFLA_BOND_PRIMARY_RESELECT] = { .name = "primary-reselect", .type = YNL_PT_U8, }, + [IFLA_BOND_FAIL_OVER_MAC] = { .name = "fail-over-mac", .type = YNL_PT_U8, }, + [IFLA_BOND_XMIT_HASH_POLICY] = { .name = "xmit-hash-policy", .type = YNL_PT_U8, }, + [IFLA_BOND_RESEND_IGMP] = { .name = "resend-igmp", .type = YNL_PT_U32, }, + [IFLA_BOND_NUM_PEER_NOTIF] = { .name = "num-peer-notif", .type = YNL_PT_U8, }, + [IFLA_BOND_ALL_SLAVES_ACTIVE] = { .name = "all-slaves-active", .type = YNL_PT_U8, }, + [IFLA_BOND_MIN_LINKS] = { .name = "min-links", .type = YNL_PT_U32, }, + [IFLA_BOND_LP_INTERVAL] = { .name = "lp-interval", .type = YNL_PT_U32, }, + [IFLA_BOND_PACKETS_PER_SLAVE] = { .name = "packets-per-slave", .type = YNL_PT_U32, }, + [IFLA_BOND_AD_LACP_RATE] = { .name = "ad-lacp-rate", .type = YNL_PT_U8, }, + [IFLA_BOND_AD_SELECT] = { .name = "ad-select", .type = YNL_PT_U8, }, + [IFLA_BOND_AD_INFO] = { .name = "ad-info", .type = YNL_PT_NEST, .nest = &rt_link_bond_ad_info_attrs_nest, }, + [IFLA_BOND_AD_ACTOR_SYS_PRIO] = { .name = "ad-actor-sys-prio", .type = YNL_PT_U16, }, + [IFLA_BOND_AD_USER_PORT_KEY] = { .name = "ad-user-port-key", .type = YNL_PT_U16, }, + [IFLA_BOND_AD_ACTOR_SYSTEM] = { .name = "ad-actor-system", .type = YNL_PT_BINARY,}, + [IFLA_BOND_TLB_DYNAMIC_LB] = { .name = "tlb-dynamic-lb", .type = YNL_PT_U8, }, + [IFLA_BOND_PEER_NOTIF_DELAY] = { .name = "peer-notif-delay", .type = YNL_PT_U32, }, + [IFLA_BOND_AD_LACP_ACTIVE] = { .name = "ad-lacp-active", .type = YNL_PT_U8, }, + [IFLA_BOND_MISSED_MAX] = { .name = "missed-max", .type = YNL_PT_U8, }, + [IFLA_BOND_NS_IP6_TARGET] = { .name = "ns-ip6-target", .type = YNL_PT_BINARY, .len = 16, }, + [IFLA_BOND_COUPLED_CONTROL] = { .name = "coupled-control", .type = YNL_PT_U8, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_bond_attrs_nest = { + .max_attr = IFLA_BOND_MAX, + .table = rt_link_linkinfo_bond_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_vlan_attrs_policy[IFLA_VLAN_MAX + 1] = { + [IFLA_VLAN_ID] = { .name = "id", .type = YNL_PT_U16, }, + [IFLA_VLAN_FLAGS] = { .name = "flags", .type = YNL_PT_BINARY,}, + [IFLA_VLAN_EGRESS_QOS] = { .name = "egress-qos", .type = YNL_PT_NEST, .nest = &rt_link_ifla_vlan_qos_nest, }, + [IFLA_VLAN_INGRESS_QOS] = { .name = "ingress-qos", .type = YNL_PT_NEST, .nest = &rt_link_ifla_vlan_qos_nest, }, + [IFLA_VLAN_PROTOCOL] = { .name = "protocol", .type = YNL_PT_U16, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_vlan_attrs_nest = { + .max_attr = IFLA_VLAN_MAX, + .table = rt_link_linkinfo_vlan_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_vfinfo_list_attrs_policy[IFLA_VF_MAX + 1] = { + [IFLA_VF_INFO] = { .name = "info", .type = YNL_PT_NEST, .nest = &rt_link_vfinfo_attrs_nest, }, +}; + +const struct ynl_policy_nest rt_link_vfinfo_list_attrs_nest = { + .max_attr = IFLA_VF_MAX, + .table = rt_link_vfinfo_list_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_data_msg_policy[] = { + [0] = { .type = YNL_PT_SUBMSG, .name = "bond", .nest = &rt_link_linkinfo_bond_attrs_nest, }, + [1] = { .type = YNL_PT_SUBMSG, .name = "bridge", .nest = &rt_link_linkinfo_bridge_attrs_nest, }, + [2] = { .type = YNL_PT_SUBMSG, .name = "erspan", .nest = &rt_link_linkinfo_gre_attrs_nest, }, + [3] = { .type = YNL_PT_SUBMSG, .name = "gre", .nest = &rt_link_linkinfo_gre_attrs_nest, }, + [4] = { .type = YNL_PT_SUBMSG, .name = "gretap", .nest = &rt_link_linkinfo_gre_attrs_nest, }, + [5] = { .type = YNL_PT_SUBMSG, .name = "geneve", .nest = &rt_link_linkinfo_geneve_attrs_nest, }, + [6] = { .type = YNL_PT_SUBMSG, .name = "ipip", .nest = &rt_link_linkinfo_iptun_attrs_nest, }, + [7] = { .type = YNL_PT_SUBMSG, .name = "ip6tnl", .nest = &rt_link_linkinfo_ip6tnl_attrs_nest, }, + [8] = { .type = YNL_PT_SUBMSG, .name = "sit", .nest = &rt_link_linkinfo_iptun_attrs_nest, }, + [9] = { .type = YNL_PT_SUBMSG, .name = "tun", .nest = &rt_link_linkinfo_tun_attrs_nest, }, + [10] = { .type = YNL_PT_SUBMSG, .name = "vlan", .nest = &rt_link_linkinfo_vlan_attrs_nest, }, + [11] = { .type = YNL_PT_SUBMSG, .name = "vrf", .nest = &rt_link_linkinfo_vrf_attrs_nest, }, + [12] = { .type = YNL_PT_SUBMSG, .name = "vti", .nest = &rt_link_linkinfo_vti_attrs_nest, }, + [13] = { .type = YNL_PT_SUBMSG, .name = "vti6", .nest = &rt_link_linkinfo_vti6_attrs_nest, }, + [14] = { .type = YNL_PT_SUBMSG, .name = "netkit", .nest = &rt_link_linkinfo_netkit_attrs_nest, }, + [15] = { .type = YNL_PT_SUBMSG, .name = "ovpn", .nest = &rt_link_linkinfo_ovpn_attrs_nest, }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_data_msg_nest = { + .max_attr = 15, + .table = rt_link_linkinfo_data_msg_policy, +}; + +const struct ynl_policy_attr rt_link_linkinfo_attrs_policy[IFLA_INFO_MAX + 1] = { + [IFLA_INFO_KIND] = { .name = "kind", .type = YNL_PT_NUL_STR, .is_selector = 1, }, + [IFLA_INFO_DATA] = { .name = "data", .type = YNL_PT_NEST, .nest = &rt_link_linkinfo_data_msg_nest, .is_submsg = 1, .selector_type = 1 }, + [IFLA_INFO_XSTATS] = { .name = "xstats", .type = YNL_PT_BINARY,}, + [IFLA_INFO_SLAVE_KIND] = { .name = "slave-kind", .type = YNL_PT_NUL_STR, .is_selector = 1, }, + [IFLA_INFO_SLAVE_DATA] = { .name = "slave-data", .type = YNL_PT_NEST, .nest = &rt_link_linkinfo_member_data_msg_nest, .is_submsg = 1, .selector_type = 4 }, +}; + +const struct ynl_policy_nest rt_link_linkinfo_attrs_nest = { + .max_attr = IFLA_INFO_MAX, + .table = rt_link_linkinfo_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_link_attrs_policy[IFLA_MAX + 1] = { + [IFLA_ADDRESS] = { .name = "address", .type = YNL_PT_BINARY,}, + [IFLA_BROADCAST] = { .name = "broadcast", .type = YNL_PT_BINARY,}, + [IFLA_IFNAME] = { .name = "ifname", .type = YNL_PT_NUL_STR, }, + [IFLA_MTU] = { .name = "mtu", .type = YNL_PT_U32, }, + [IFLA_LINK] = { .name = "link", .type = YNL_PT_U32, }, + [IFLA_QDISC] = { .name = "qdisc", .type = YNL_PT_NUL_STR, }, + [IFLA_STATS] = { .name = "stats", .type = YNL_PT_BINARY,}, + [IFLA_COST] = { .name = "cost", .type = YNL_PT_NUL_STR, }, + [IFLA_PRIORITY] = { .name = "priority", .type = YNL_PT_NUL_STR, }, + [IFLA_MASTER] = { .name = "master", .type = YNL_PT_U32, }, + [IFLA_WIRELESS] = { .name = "wireless", .type = YNL_PT_NUL_STR, }, + [IFLA_PROTINFO] = { .name = "protinfo", .type = YNL_PT_NUL_STR, }, + [IFLA_TXQLEN] = { .name = "txqlen", .type = YNL_PT_U32, }, + [IFLA_MAP] = { .name = "map", .type = YNL_PT_BINARY,}, + [IFLA_WEIGHT] = { .name = "weight", .type = YNL_PT_U32, }, + [IFLA_OPERSTATE] = { .name = "operstate", .type = YNL_PT_U8, }, + [IFLA_LINKMODE] = { .name = "linkmode", .type = YNL_PT_U8, }, + [IFLA_LINKINFO] = { .name = "linkinfo", .type = YNL_PT_NEST, .nest = &rt_link_linkinfo_attrs_nest, }, + [IFLA_NET_NS_PID] = { .name = "net-ns-pid", .type = YNL_PT_U32, }, + [IFLA_IFALIAS] = { .name = "ifalias", .type = YNL_PT_NUL_STR, }, + [IFLA_NUM_VF] = { .name = "num-vf", .type = YNL_PT_U32, }, + [IFLA_VFINFO_LIST] = { .name = "vfinfo-list", .type = YNL_PT_NEST, .nest = &rt_link_vfinfo_list_attrs_nest, }, + [IFLA_STATS64] = { .name = "stats64", .type = YNL_PT_BINARY,}, + [IFLA_VF_PORTS] = { .name = "vf-ports", .type = YNL_PT_NEST, .nest = &rt_link_vf_ports_attrs_nest, }, + [IFLA_PORT_SELF] = { .name = "port-self", .type = YNL_PT_NEST, .nest = &rt_link_port_self_attrs_nest, }, + [IFLA_AF_SPEC] = { .name = "af-spec", .type = YNL_PT_NEST, .nest = &rt_link_af_spec_attrs_nest, }, + [IFLA_GROUP] = { .name = "group", .type = YNL_PT_U32, }, + [IFLA_NET_NS_FD] = { .name = "net-ns-fd", .type = YNL_PT_U32, }, + [IFLA_EXT_MASK] = { .name = "ext-mask", .type = YNL_PT_U32, }, + [IFLA_PROMISCUITY] = { .name = "promiscuity", .type = YNL_PT_U32, }, + [IFLA_NUM_TX_QUEUES] = { .name = "num-tx-queues", .type = YNL_PT_U32, }, + [IFLA_NUM_RX_QUEUES] = { .name = "num-rx-queues", .type = YNL_PT_U32, }, + [IFLA_CARRIER] = { .name = "carrier", .type = YNL_PT_U8, }, + [IFLA_PHYS_PORT_ID] = { .name = "phys-port-id", .type = YNL_PT_BINARY,}, + [IFLA_CARRIER_CHANGES] = { .name = "carrier-changes", .type = YNL_PT_U32, }, + [IFLA_PHYS_SWITCH_ID] = { .name = "phys-switch-id", .type = YNL_PT_BINARY,}, + [IFLA_LINK_NETNSID] = { .name = "link-netnsid", .type = YNL_PT_U32, }, + [IFLA_PHYS_PORT_NAME] = { .name = "phys-port-name", .type = YNL_PT_NUL_STR, }, + [IFLA_PROTO_DOWN] = { .name = "proto-down", .type = YNL_PT_U8, }, + [IFLA_GSO_MAX_SEGS] = { .name = "gso-max-segs", .type = YNL_PT_U32, }, + [IFLA_GSO_MAX_SIZE] = { .name = "gso-max-size", .type = YNL_PT_U32, }, + [IFLA_PAD] = { .name = "pad", .type = YNL_PT_IGNORE, }, + [IFLA_XDP] = { .name = "xdp", .type = YNL_PT_NEST, .nest = &rt_link_xdp_attrs_nest, }, + [IFLA_EVENT] = { .name = "event", .type = YNL_PT_U32, }, + [IFLA_NEW_NETNSID] = { .name = "new-netnsid", .type = YNL_PT_U32, }, + [IFLA_TARGET_NETNSID] = { .name = "target-netnsid", .type = YNL_PT_U32, }, + [IFLA_CARRIER_UP_COUNT] = { .name = "carrier-up-count", .type = YNL_PT_U32, }, + [IFLA_CARRIER_DOWN_COUNT] = { .name = "carrier-down-count", .type = YNL_PT_U32, }, + [IFLA_NEW_IFINDEX] = { .name = "new-ifindex", .type = YNL_PT_U32, }, + [IFLA_MIN_MTU] = { .name = "min-mtu", .type = YNL_PT_U32, }, + [IFLA_MAX_MTU] = { .name = "max-mtu", .type = YNL_PT_U32, }, + [IFLA_PROP_LIST] = { .name = "prop-list", .type = YNL_PT_NEST, .nest = &rt_link_prop_list_link_attrs_nest, }, + [IFLA_ALT_IFNAME] = { .name = "alt-ifname", .type = YNL_PT_NUL_STR, }, + [IFLA_PERM_ADDRESS] = { .name = "perm-address", .type = YNL_PT_BINARY,}, + [IFLA_PROTO_DOWN_REASON] = { .name = "proto-down-reason", .type = YNL_PT_NUL_STR, }, + [IFLA_PARENT_DEV_NAME] = { .name = "parent-dev-name", .type = YNL_PT_NUL_STR, }, + [IFLA_PARENT_DEV_BUS_NAME] = { .name = "parent-dev-bus-name", .type = YNL_PT_NUL_STR, }, + [IFLA_GRO_MAX_SIZE] = { .name = "gro-max-size", .type = YNL_PT_U32, }, + [IFLA_TSO_MAX_SIZE] = { .name = "tso-max-size", .type = YNL_PT_U32, }, + [IFLA_TSO_MAX_SEGS] = { .name = "tso-max-segs", .type = YNL_PT_U32, }, + [IFLA_ALLMULTI] = { .name = "allmulti", .type = YNL_PT_U32, }, + [IFLA_DEVLINK_PORT] = { .name = "devlink-port", .type = YNL_PT_BINARY,}, + [IFLA_GSO_IPV4_MAX_SIZE] = { .name = "gso-ipv4-max-size", .type = YNL_PT_U32, }, + [IFLA_GRO_IPV4_MAX_SIZE] = { .name = "gro-ipv4-max-size", .type = YNL_PT_U32, }, + [IFLA_DPLL_PIN] = { .name = "dpll-pin", .type = YNL_PT_NEST, .nest = &rt_link_link_dpll_pin_attrs_nest, }, + [IFLA_MAX_PACING_OFFLOAD_HORIZON] = { .name = "max-pacing-offload-horizon", .type = YNL_PT_UINT, }, + [IFLA_NETNS_IMMUTABLE] = { .name = "netns-immutable", .type = YNL_PT_U8, }, +}; + +const struct ynl_policy_nest rt_link_link_attrs_nest = { + .max_attr = IFLA_MAX, + .table = rt_link_link_attrs_policy, +}; + +const struct ynl_policy_attr rt_link_stats_attrs_policy[IFLA_STATS_MAX + 1] = { + [IFLA_STATS_LINK_64] = { .name = "link-64", .type = YNL_PT_BINARY,}, + [IFLA_STATS_LINK_XSTATS] = { .name = "link-xstats", .type = YNL_PT_BINARY,}, + [IFLA_STATS_LINK_XSTATS_SLAVE] = { .name = "link-xstats-slave", .type = YNL_PT_BINARY,}, + [IFLA_STATS_LINK_OFFLOAD_XSTATS] = { .name = "link-offload-xstats", .type = YNL_PT_NEST, .nest = &rt_link_link_offload_xstats_nest, }, + [IFLA_STATS_AF_SPEC] = { .name = "af-spec", .type = YNL_PT_BINARY,}, +}; + +const struct ynl_policy_nest rt_link_stats_attrs_nest = { + .max_attr = IFLA_STATS_MAX, + .table = rt_link_stats_attrs_policy, +}; + +/* Common nested types */ +void rt_link_vf_ports_attrs_free(struct rt_link_vf_ports_attrs *obj) +{ +} + +int rt_link_vf_ports_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_vf_ports_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_vf_ports_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + return 0; +} + +void rt_link_port_self_attrs_free(struct rt_link_port_self_attrs *obj) +{ +} + +int rt_link_port_self_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_port_self_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_port_self_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + return 0; +} + +void rt_link_xdp_attrs_free(struct rt_link_xdp_attrs *obj) +{ +} + +int rt_link_xdp_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_xdp_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.fd) + ynl_attr_put_s32(nlh, IFLA_XDP_FD, obj->fd); + if (obj->_present.attached) + ynl_attr_put_u8(nlh, IFLA_XDP_ATTACHED, obj->attached); + if (obj->_present.flags) + ynl_attr_put_u32(nlh, IFLA_XDP_FLAGS, obj->flags); + if (obj->_present.prog_id) + ynl_attr_put_u32(nlh, IFLA_XDP_PROG_ID, obj->prog_id); + if (obj->_present.drv_prog_id) + ynl_attr_put_u32(nlh, IFLA_XDP_DRV_PROG_ID, obj->drv_prog_id); + if (obj->_present.skb_prog_id) + ynl_attr_put_u32(nlh, IFLA_XDP_SKB_PROG_ID, obj->skb_prog_id); + if (obj->_present.hw_prog_id) + ynl_attr_put_u32(nlh, IFLA_XDP_HW_PROG_ID, obj->hw_prog_id); + if (obj->_present.expected_fd) + ynl_attr_put_s32(nlh, IFLA_XDP_EXPECTED_FD, obj->expected_fd); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_xdp_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_xdp_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_XDP_FD) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fd = 1; + dst->fd = ynl_attr_get_s32(attr); + } else if (type == IFLA_XDP_ATTACHED) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.attached = 1; + dst->attached = ynl_attr_get_u8(attr); + } else if (type == IFLA_XDP_FLAGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flags = 1; + dst->flags = ynl_attr_get_u32(attr); + } else if (type == IFLA_XDP_PROG_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.prog_id = 1; + dst->prog_id = ynl_attr_get_u32(attr); + } else if (type == IFLA_XDP_DRV_PROG_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.drv_prog_id = 1; + dst->drv_prog_id = ynl_attr_get_u32(attr); + } else if (type == IFLA_XDP_SKB_PROG_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.skb_prog_id = 1; + dst->skb_prog_id = ynl_attr_get_u32(attr); + } else if (type == IFLA_XDP_HW_PROG_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.hw_prog_id = 1; + dst->hw_prog_id = ynl_attr_get_u32(attr); + } else if (type == IFLA_XDP_EXPECTED_FD) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.expected_fd = 1; + dst->expected_fd = ynl_attr_get_s32(attr); + } + } + + return 0; +} + +void +rt_link_prop_list_link_attrs_free(struct rt_link_prop_list_link_attrs *obj) +{ + unsigned int i; + + for (i = 0; i < obj->_count.alt_ifname; i++) + free(obj->alt_ifname[i]); + free(obj->alt_ifname); +} + +int rt_link_prop_list_link_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_prop_list_link_attrs *obj) +{ + struct nlattr *nest; + unsigned int i; + + nest = ynl_attr_nest_start(nlh, attr_type); + for (i = 0; i < obj->_count.alt_ifname; i++) + ynl_attr_put_str(nlh, IFLA_ALT_IFNAME, obj->alt_ifname[i]->str); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_prop_list_link_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_prop_list_link_attrs *dst = yarg->data; + unsigned int n_alt_ifname = 0; + const struct nlattr *attr; + int i; + + if (dst->alt_ifname) + return ynl_error_parse(yarg, "attribute already present (prop-list-link-attrs.alt-ifname)"); + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_ALT_IFNAME) { + n_alt_ifname++; + } + } + + if (n_alt_ifname) { + dst->alt_ifname = calloc(n_alt_ifname, sizeof(*dst->alt_ifname)); + dst->_count.alt_ifname = n_alt_ifname; + i = 0; + ynl_attr_for_each_nested(attr, nested) { + if (ynl_attr_type(attr) == IFLA_ALT_IFNAME) { + unsigned int len; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->alt_ifname[i] = malloc(sizeof(struct ynl_string) + len + 1); + dst->alt_ifname[i]->len = len; + memcpy(dst->alt_ifname[i]->str, ynl_attr_get_str(attr), len); + dst->alt_ifname[i]->str[len] = 0; + i++; + } + } + } + + return 0; +} + +void rt_link_link_dpll_pin_attrs_free(struct rt_link_link_dpll_pin_attrs *obj) +{ +} + +void rt_link_ifla_attrs_free(struct rt_link_ifla_attrs *obj) +{ + free(obj->conf); +} + +int rt_link_ifla_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_ifla_attrs *obj) +{ + struct nlattr *nest; + unsigned int i; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_count.conf) { + i = obj->_count.conf * sizeof(__u32); + ynl_attr_put(nlh, IFLA_INET_CONF, obj->conf, i); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_ifla_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_ifla_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_INET_CONF) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_count.conf = len / sizeof(__u32); + len = dst->_count.conf * sizeof(__u32); + dst->conf = malloc(len); + memcpy(dst->conf, ynl_attr_data(attr), len); + } + } + + return 0; +} + +void rt_link_ifla6_attrs_free(struct rt_link_ifla6_attrs *obj) +{ + free(obj->conf); + free(obj->stats); + free(obj->mcast); + free(obj->cacheinfo); + free(obj->icmp6stats); + free(obj->token); +} + +int rt_link_ifla6_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_ifla6_attrs *obj) +{ + struct nlattr *nest; + unsigned int i; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.flags) + ynl_attr_put_u32(nlh, IFLA_INET6_FLAGS, obj->flags); + if (obj->_count.conf) { + i = obj->_count.conf * sizeof(__u32); + ynl_attr_put(nlh, IFLA_INET6_CONF, obj->conf, i); + } + if (obj->_count.stats) { + i = obj->_count.stats * sizeof(__u64); + ynl_attr_put(nlh, IFLA_INET6_STATS, obj->stats, i); + } + if (obj->_len.mcast) + ynl_attr_put(nlh, IFLA_INET6_MCAST, obj->mcast, obj->_len.mcast); + if (obj->_len.cacheinfo) + ynl_attr_put(nlh, IFLA_INET6_CACHEINFO, obj->cacheinfo, obj->_len.cacheinfo); + if (obj->_count.icmp6stats) { + i = obj->_count.icmp6stats * sizeof(__u64); + ynl_attr_put(nlh, IFLA_INET6_ICMP6STATS, obj->icmp6stats, i); + } + if (obj->_len.token) + ynl_attr_put(nlh, IFLA_INET6_TOKEN, obj->token, obj->_len.token); + if (obj->_present.addr_gen_mode) + ynl_attr_put_u8(nlh, IFLA_INET6_ADDR_GEN_MODE, obj->addr_gen_mode); + if (obj->_present.ra_mtu) + ynl_attr_put_u32(nlh, IFLA_INET6_RA_MTU, obj->ra_mtu); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_ifla6_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_ifla6_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_INET6_FLAGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flags = 1; + dst->flags = ynl_attr_get_u32(attr); + } else if (type == IFLA_INET6_CONF) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_count.conf = len / sizeof(__u32); + len = dst->_count.conf * sizeof(__u32); + dst->conf = malloc(len); + memcpy(dst->conf, ynl_attr_data(attr), len); + } else if (type == IFLA_INET6_STATS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_count.stats = len / sizeof(__u64); + len = dst->_count.stats * sizeof(__u64); + dst->stats = malloc(len); + memcpy(dst->stats, ynl_attr_data(attr), len); + } else if (type == IFLA_INET6_MCAST) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.mcast = len; + dst->mcast = malloc(len); + memcpy(dst->mcast, ynl_attr_data(attr), len); + } else if (type == IFLA_INET6_CACHEINFO) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.cacheinfo = len; + if (len < sizeof(struct ifla_cacheinfo)) + dst->cacheinfo = calloc(1, sizeof(struct ifla_cacheinfo)); + else + dst->cacheinfo = malloc(len); + memcpy(dst->cacheinfo, ynl_attr_data(attr), len); + } else if (type == IFLA_INET6_ICMP6STATS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_count.icmp6stats = len / sizeof(__u64); + len = dst->_count.icmp6stats * sizeof(__u64); + dst->icmp6stats = malloc(len); + memcpy(dst->icmp6stats, ynl_attr_data(attr), len); + } else if (type == IFLA_INET6_TOKEN) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.token = len; + dst->token = malloc(len); + memcpy(dst->token, ynl_attr_data(attr), len); + } else if (type == IFLA_INET6_ADDR_GEN_MODE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.addr_gen_mode = 1; + dst->addr_gen_mode = ynl_attr_get_u8(attr); + } else if (type == IFLA_INET6_RA_MTU) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ra_mtu = 1; + dst->ra_mtu = ynl_attr_get_u32(attr); + } + } + + return 0; +} + +void rt_link_mctp_attrs_free(struct rt_link_mctp_attrs *obj) +{ +} + +int rt_link_mctp_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_mctp_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.net) + ynl_attr_put_u32(nlh, IFLA_MCTP_NET, obj->net); + if (obj->_present.phys_binding) + ynl_attr_put_u8(nlh, IFLA_MCTP_PHYS_BINDING, obj->phys_binding); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_mctp_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_mctp_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_MCTP_NET) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.net = 1; + dst->net = ynl_attr_get_u32(attr); + } else if (type == IFLA_MCTP_PHYS_BINDING) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.phys_binding = 1; + dst->phys_binding = ynl_attr_get_u8(attr); + } + } + + return 0; +} + +void rt_link_hw_s_info_one_free(struct rt_link_hw_s_info_one *obj) +{ +} + +int rt_link_hw_s_info_one_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested, __u32 idx) +{ + struct rt_link_hw_s_info_one *dst = yarg->data; + const struct nlattr *attr; + + dst->idx = idx; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.request = 1; + dst->request = ynl_attr_get_u8(attr); + } else if (type == IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.used = 1; + dst->used = ynl_attr_get_u8(attr); + } + } + + return 0; +} + +void +rt_link_linkinfo_bridge_attrs_free(struct rt_link_linkinfo_bridge_attrs *obj) +{ + free(obj->root_id); + free(obj->bridge_id); + free(obj->group_addr); + free(obj->fdb_flush); + free(obj->multi_boolopt); + free(obj->mcast_querier_state); +} + +int rt_link_linkinfo_bridge_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_bridge_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.forward_delay) + ynl_attr_put_u32(nlh, IFLA_BR_FORWARD_DELAY, obj->forward_delay); + if (obj->_present.hello_time) + ynl_attr_put_u32(nlh, IFLA_BR_HELLO_TIME, obj->hello_time); + if (obj->_present.max_age) + ynl_attr_put_u32(nlh, IFLA_BR_MAX_AGE, obj->max_age); + if (obj->_present.ageing_time) + ynl_attr_put_u32(nlh, IFLA_BR_AGEING_TIME, obj->ageing_time); + if (obj->_present.stp_state) + ynl_attr_put_u32(nlh, IFLA_BR_STP_STATE, obj->stp_state); + if (obj->_present.priority) + ynl_attr_put_u16(nlh, IFLA_BR_PRIORITY, obj->priority); + if (obj->_present.vlan_filtering) + ynl_attr_put_u8(nlh, IFLA_BR_VLAN_FILTERING, obj->vlan_filtering); + if (obj->_present.vlan_protocol) + ynl_attr_put_u16(nlh, IFLA_BR_VLAN_PROTOCOL, obj->vlan_protocol); + if (obj->_present.group_fwd_mask) + ynl_attr_put_u16(nlh, IFLA_BR_GROUP_FWD_MASK, obj->group_fwd_mask); + if (obj->_len.root_id) + ynl_attr_put(nlh, IFLA_BR_ROOT_ID, obj->root_id, obj->_len.root_id); + if (obj->_len.bridge_id) + ynl_attr_put(nlh, IFLA_BR_BRIDGE_ID, obj->bridge_id, obj->_len.bridge_id); + if (obj->_present.root_port) + ynl_attr_put_u16(nlh, IFLA_BR_ROOT_PORT, obj->root_port); + if (obj->_present.root_path_cost) + ynl_attr_put_u32(nlh, IFLA_BR_ROOT_PATH_COST, obj->root_path_cost); + if (obj->_present.topology_change) + ynl_attr_put_u8(nlh, IFLA_BR_TOPOLOGY_CHANGE, obj->topology_change); + if (obj->_present.topology_change_detected) + ynl_attr_put_u8(nlh, IFLA_BR_TOPOLOGY_CHANGE_DETECTED, obj->topology_change_detected); + if (obj->_present.hello_timer) + ynl_attr_put_u64(nlh, IFLA_BR_HELLO_TIMER, obj->hello_timer); + if (obj->_present.tcn_timer) + ynl_attr_put_u64(nlh, IFLA_BR_TCN_TIMER, obj->tcn_timer); + if (obj->_present.topology_change_timer) + ynl_attr_put_u64(nlh, IFLA_BR_TOPOLOGY_CHANGE_TIMER, obj->topology_change_timer); + if (obj->_present.gc_timer) + ynl_attr_put_u64(nlh, IFLA_BR_GC_TIMER, obj->gc_timer); + if (obj->_len.group_addr) + ynl_attr_put(nlh, IFLA_BR_GROUP_ADDR, obj->group_addr, obj->_len.group_addr); + if (obj->_len.fdb_flush) + ynl_attr_put(nlh, IFLA_BR_FDB_FLUSH, obj->fdb_flush, obj->_len.fdb_flush); + if (obj->_present.mcast_router) + ynl_attr_put_u8(nlh, IFLA_BR_MCAST_ROUTER, obj->mcast_router); + if (obj->_present.mcast_snooping) + ynl_attr_put_u8(nlh, IFLA_BR_MCAST_SNOOPING, obj->mcast_snooping); + if (obj->_present.mcast_query_use_ifaddr) + ynl_attr_put_u8(nlh, IFLA_BR_MCAST_QUERY_USE_IFADDR, obj->mcast_query_use_ifaddr); + if (obj->_present.mcast_querier) + ynl_attr_put_u8(nlh, IFLA_BR_MCAST_QUERIER, obj->mcast_querier); + if (obj->_present.mcast_hash_elasticity) + ynl_attr_put_u32(nlh, IFLA_BR_MCAST_HASH_ELASTICITY, obj->mcast_hash_elasticity); + if (obj->_present.mcast_hash_max) + ynl_attr_put_u32(nlh, IFLA_BR_MCAST_HASH_MAX, obj->mcast_hash_max); + if (obj->_present.mcast_last_member_cnt) + ynl_attr_put_u32(nlh, IFLA_BR_MCAST_LAST_MEMBER_CNT, obj->mcast_last_member_cnt); + if (obj->_present.mcast_startup_query_cnt) + ynl_attr_put_u32(nlh, IFLA_BR_MCAST_STARTUP_QUERY_CNT, obj->mcast_startup_query_cnt); + if (obj->_present.mcast_last_member_intvl) + ynl_attr_put_u64(nlh, IFLA_BR_MCAST_LAST_MEMBER_INTVL, obj->mcast_last_member_intvl); + if (obj->_present.mcast_membership_intvl) + ynl_attr_put_u64(nlh, IFLA_BR_MCAST_MEMBERSHIP_INTVL, obj->mcast_membership_intvl); + if (obj->_present.mcast_querier_intvl) + ynl_attr_put_u64(nlh, IFLA_BR_MCAST_QUERIER_INTVL, obj->mcast_querier_intvl); + if (obj->_present.mcast_query_intvl) + ynl_attr_put_u64(nlh, IFLA_BR_MCAST_QUERY_INTVL, obj->mcast_query_intvl); + if (obj->_present.mcast_query_response_intvl) + ynl_attr_put_u64(nlh, IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, obj->mcast_query_response_intvl); + if (obj->_present.mcast_startup_query_intvl) + ynl_attr_put_u64(nlh, IFLA_BR_MCAST_STARTUP_QUERY_INTVL, obj->mcast_startup_query_intvl); + if (obj->_present.nf_call_iptables) + ynl_attr_put_u8(nlh, IFLA_BR_NF_CALL_IPTABLES, obj->nf_call_iptables); + if (obj->_present.nf_call_ip6tables) + ynl_attr_put_u8(nlh, IFLA_BR_NF_CALL_IP6TABLES, obj->nf_call_ip6tables); + if (obj->_present.nf_call_arptables) + ynl_attr_put_u8(nlh, IFLA_BR_NF_CALL_ARPTABLES, obj->nf_call_arptables); + if (obj->_present.vlan_default_pvid) + ynl_attr_put_u16(nlh, IFLA_BR_VLAN_DEFAULT_PVID, obj->vlan_default_pvid); + if (obj->_present.vlan_stats_enabled) + ynl_attr_put_u8(nlh, IFLA_BR_VLAN_STATS_ENABLED, obj->vlan_stats_enabled); + if (obj->_present.mcast_stats_enabled) + ynl_attr_put_u8(nlh, IFLA_BR_MCAST_STATS_ENABLED, obj->mcast_stats_enabled); + if (obj->_present.mcast_igmp_version) + ynl_attr_put_u8(nlh, IFLA_BR_MCAST_IGMP_VERSION, obj->mcast_igmp_version); + if (obj->_present.mcast_mld_version) + ynl_attr_put_u8(nlh, IFLA_BR_MCAST_MLD_VERSION, obj->mcast_mld_version); + if (obj->_present.vlan_stats_per_port) + ynl_attr_put_u8(nlh, IFLA_BR_VLAN_STATS_PER_PORT, obj->vlan_stats_per_port); + if (obj->_len.multi_boolopt) + ynl_attr_put(nlh, IFLA_BR_MULTI_BOOLOPT, obj->multi_boolopt, obj->_len.multi_boolopt); + if (obj->_len.mcast_querier_state) + ynl_attr_put(nlh, IFLA_BR_MCAST_QUERIER_STATE, obj->mcast_querier_state, obj->_len.mcast_querier_state); + if (obj->_present.fdb_n_learned) + ynl_attr_put_u32(nlh, IFLA_BR_FDB_N_LEARNED, obj->fdb_n_learned); + if (obj->_present.fdb_max_learned) + ynl_attr_put_u32(nlh, IFLA_BR_FDB_MAX_LEARNED, obj->fdb_max_learned); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_bridge_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_bridge_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_BR_FORWARD_DELAY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.forward_delay = 1; + dst->forward_delay = ynl_attr_get_u32(attr); + } else if (type == IFLA_BR_HELLO_TIME) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.hello_time = 1; + dst->hello_time = ynl_attr_get_u32(attr); + } else if (type == IFLA_BR_MAX_AGE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.max_age = 1; + dst->max_age = ynl_attr_get_u32(attr); + } else if (type == IFLA_BR_AGEING_TIME) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ageing_time = 1; + dst->ageing_time = ynl_attr_get_u32(attr); + } else if (type == IFLA_BR_STP_STATE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.stp_state = 1; + dst->stp_state = ynl_attr_get_u32(attr); + } else if (type == IFLA_BR_PRIORITY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.priority = 1; + dst->priority = ynl_attr_get_u16(attr); + } else if (type == IFLA_BR_VLAN_FILTERING) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vlan_filtering = 1; + dst->vlan_filtering = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_VLAN_PROTOCOL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vlan_protocol = 1; + dst->vlan_protocol = ynl_attr_get_u16(attr); + } else if (type == IFLA_BR_GROUP_FWD_MASK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.group_fwd_mask = 1; + dst->group_fwd_mask = ynl_attr_get_u16(attr); + } else if (type == IFLA_BR_ROOT_ID) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.root_id = len; + if (len < sizeof(struct ifla_bridge_id)) + dst->root_id = calloc(1, sizeof(struct ifla_bridge_id)); + else + dst->root_id = malloc(len); + memcpy(dst->root_id, ynl_attr_data(attr), len); + } else if (type == IFLA_BR_BRIDGE_ID) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.bridge_id = len; + if (len < sizeof(struct ifla_bridge_id)) + dst->bridge_id = calloc(1, sizeof(struct ifla_bridge_id)); + else + dst->bridge_id = malloc(len); + memcpy(dst->bridge_id, ynl_attr_data(attr), len); + } else if (type == IFLA_BR_ROOT_PORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.root_port = 1; + dst->root_port = ynl_attr_get_u16(attr); + } else if (type == IFLA_BR_ROOT_PATH_COST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.root_path_cost = 1; + dst->root_path_cost = ynl_attr_get_u32(attr); + } else if (type == IFLA_BR_TOPOLOGY_CHANGE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.topology_change = 1; + dst->topology_change = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_TOPOLOGY_CHANGE_DETECTED) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.topology_change_detected = 1; + dst->topology_change_detected = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_HELLO_TIMER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.hello_timer = 1; + dst->hello_timer = ynl_attr_get_u64(attr); + } else if (type == IFLA_BR_TCN_TIMER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tcn_timer = 1; + dst->tcn_timer = ynl_attr_get_u64(attr); + } else if (type == IFLA_BR_TOPOLOGY_CHANGE_TIMER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.topology_change_timer = 1; + dst->topology_change_timer = ynl_attr_get_u64(attr); + } else if (type == IFLA_BR_GC_TIMER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.gc_timer = 1; + dst->gc_timer = ynl_attr_get_u64(attr); + } else if (type == IFLA_BR_GROUP_ADDR) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.group_addr = len; + dst->group_addr = malloc(len); + memcpy(dst->group_addr, ynl_attr_data(attr), len); + } else if (type == IFLA_BR_FDB_FLUSH) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.fdb_flush = len; + dst->fdb_flush = malloc(len); + memcpy(dst->fdb_flush, ynl_attr_data(attr), len); + } else if (type == IFLA_BR_MCAST_ROUTER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_router = 1; + dst->mcast_router = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_MCAST_SNOOPING) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_snooping = 1; + dst->mcast_snooping = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_MCAST_QUERY_USE_IFADDR) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_query_use_ifaddr = 1; + dst->mcast_query_use_ifaddr = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_MCAST_QUERIER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_querier = 1; + dst->mcast_querier = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_MCAST_HASH_ELASTICITY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_hash_elasticity = 1; + dst->mcast_hash_elasticity = ynl_attr_get_u32(attr); + } else if (type == IFLA_BR_MCAST_HASH_MAX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_hash_max = 1; + dst->mcast_hash_max = ynl_attr_get_u32(attr); + } else if (type == IFLA_BR_MCAST_LAST_MEMBER_CNT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_last_member_cnt = 1; + dst->mcast_last_member_cnt = ynl_attr_get_u32(attr); + } else if (type == IFLA_BR_MCAST_STARTUP_QUERY_CNT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_startup_query_cnt = 1; + dst->mcast_startup_query_cnt = ynl_attr_get_u32(attr); + } else if (type == IFLA_BR_MCAST_LAST_MEMBER_INTVL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_last_member_intvl = 1; + dst->mcast_last_member_intvl = ynl_attr_get_u64(attr); + } else if (type == IFLA_BR_MCAST_MEMBERSHIP_INTVL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_membership_intvl = 1; + dst->mcast_membership_intvl = ynl_attr_get_u64(attr); + } else if (type == IFLA_BR_MCAST_QUERIER_INTVL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_querier_intvl = 1; + dst->mcast_querier_intvl = ynl_attr_get_u64(attr); + } else if (type == IFLA_BR_MCAST_QUERY_INTVL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_query_intvl = 1; + dst->mcast_query_intvl = ynl_attr_get_u64(attr); + } else if (type == IFLA_BR_MCAST_QUERY_RESPONSE_INTVL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_query_response_intvl = 1; + dst->mcast_query_response_intvl = ynl_attr_get_u64(attr); + } else if (type == IFLA_BR_MCAST_STARTUP_QUERY_INTVL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_startup_query_intvl = 1; + dst->mcast_startup_query_intvl = ynl_attr_get_u64(attr); + } else if (type == IFLA_BR_NF_CALL_IPTABLES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.nf_call_iptables = 1; + dst->nf_call_iptables = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_NF_CALL_IP6TABLES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.nf_call_ip6tables = 1; + dst->nf_call_ip6tables = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_NF_CALL_ARPTABLES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.nf_call_arptables = 1; + dst->nf_call_arptables = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_VLAN_DEFAULT_PVID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vlan_default_pvid = 1; + dst->vlan_default_pvid = ynl_attr_get_u16(attr); + } else if (type == IFLA_BR_VLAN_STATS_ENABLED) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vlan_stats_enabled = 1; + dst->vlan_stats_enabled = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_MCAST_STATS_ENABLED) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_stats_enabled = 1; + dst->mcast_stats_enabled = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_MCAST_IGMP_VERSION) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_igmp_version = 1; + dst->mcast_igmp_version = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_MCAST_MLD_VERSION) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_mld_version = 1; + dst->mcast_mld_version = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_VLAN_STATS_PER_PORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vlan_stats_per_port = 1; + dst->vlan_stats_per_port = ynl_attr_get_u8(attr); + } else if (type == IFLA_BR_MULTI_BOOLOPT) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.multi_boolopt = len; + if (len < sizeof(struct br_boolopt_multi)) + dst->multi_boolopt = calloc(1, sizeof(struct br_boolopt_multi)); + else + dst->multi_boolopt = malloc(len); + memcpy(dst->multi_boolopt, ynl_attr_data(attr), len); + } else if (type == IFLA_BR_MCAST_QUERIER_STATE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.mcast_querier_state = len; + dst->mcast_querier_state = malloc(len); + memcpy(dst->mcast_querier_state, ynl_attr_data(attr), len); + } else if (type == IFLA_BR_FDB_N_LEARNED) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fdb_n_learned = 1; + dst->fdb_n_learned = ynl_attr_get_u32(attr); + } else if (type == IFLA_BR_FDB_MAX_LEARNED) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fdb_max_learned = 1; + dst->fdb_max_learned = ynl_attr_get_u32(attr); + } + } + + return 0; +} + +void rt_link_linkinfo_gre_attrs_free(struct rt_link_linkinfo_gre_attrs *obj) +{ + free(obj->local); + free(obj->remote); +} + +int rt_link_linkinfo_gre_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_gre_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.link) + ynl_attr_put_u32(nlh, IFLA_GRE_LINK, obj->link); + if (obj->_present.iflags) + ynl_attr_put_u16(nlh, IFLA_GRE_IFLAGS, obj->iflags); + if (obj->_present.oflags) + ynl_attr_put_u16(nlh, IFLA_GRE_OFLAGS, obj->oflags); + if (obj->_present.ikey) + ynl_attr_put_u32(nlh, IFLA_GRE_IKEY, obj->ikey); + if (obj->_present.okey) + ynl_attr_put_u32(nlh, IFLA_GRE_OKEY, obj->okey); + if (obj->_len.local) + ynl_attr_put(nlh, IFLA_GRE_LOCAL, obj->local, obj->_len.local); + if (obj->_len.remote) + ynl_attr_put(nlh, IFLA_GRE_REMOTE, obj->remote, obj->_len.remote); + if (obj->_present.ttl) + ynl_attr_put_u8(nlh, IFLA_GRE_TTL, obj->ttl); + if (obj->_present.tos) + ynl_attr_put_u8(nlh, IFLA_GRE_TOS, obj->tos); + if (obj->_present.pmtudisc) + ynl_attr_put_u8(nlh, IFLA_GRE_PMTUDISC, obj->pmtudisc); + if (obj->_present.encap_limit) + ynl_attr_put_u32(nlh, IFLA_GRE_ENCAP_LIMIT, obj->encap_limit); + if (obj->_present.flowinfo) + ynl_attr_put_u32(nlh, IFLA_GRE_FLOWINFO, obj->flowinfo); + if (obj->_present.flags) + ynl_attr_put_u32(nlh, IFLA_GRE_FLAGS, obj->flags); + if (obj->_present.encap_type) + ynl_attr_put_u16(nlh, IFLA_GRE_ENCAP_TYPE, obj->encap_type); + if (obj->_present.encap_flags) + ynl_attr_put_u16(nlh, IFLA_GRE_ENCAP_FLAGS, obj->encap_flags); + if (obj->_present.encap_sport) + ynl_attr_put_u16(nlh, IFLA_GRE_ENCAP_SPORT, obj->encap_sport); + if (obj->_present.encap_dport) + ynl_attr_put_u16(nlh, IFLA_GRE_ENCAP_DPORT, obj->encap_dport); + if (obj->_present.collect_metadata) + ynl_attr_put(nlh, IFLA_GRE_COLLECT_METADATA, NULL, 0); + if (obj->_present.ignore_df) + ynl_attr_put_u8(nlh, IFLA_GRE_IGNORE_DF, obj->ignore_df); + if (obj->_present.fwmark) + ynl_attr_put_u32(nlh, IFLA_GRE_FWMARK, obj->fwmark); + if (obj->_present.erspan_index) + ynl_attr_put_u32(nlh, IFLA_GRE_ERSPAN_INDEX, obj->erspan_index); + if (obj->_present.erspan_ver) + ynl_attr_put_u8(nlh, IFLA_GRE_ERSPAN_VER, obj->erspan_ver); + if (obj->_present.erspan_dir) + ynl_attr_put_u8(nlh, IFLA_GRE_ERSPAN_DIR, obj->erspan_dir); + if (obj->_present.erspan_hwid) + ynl_attr_put_u16(nlh, IFLA_GRE_ERSPAN_HWID, obj->erspan_hwid); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_gre_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_gre_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_GRE_LINK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.link = 1; + dst->link = ynl_attr_get_u32(attr); + } else if (type == IFLA_GRE_IFLAGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.iflags = 1; + dst->iflags = ynl_attr_get_u16(attr); + } else if (type == IFLA_GRE_OFLAGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.oflags = 1; + dst->oflags = ynl_attr_get_u16(attr); + } else if (type == IFLA_GRE_IKEY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ikey = 1; + dst->ikey = ynl_attr_get_u32(attr); + } else if (type == IFLA_GRE_OKEY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.okey = 1; + dst->okey = ynl_attr_get_u32(attr); + } else if (type == IFLA_GRE_LOCAL) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.local = len; + dst->local = malloc(len); + memcpy(dst->local, ynl_attr_data(attr), len); + } else if (type == IFLA_GRE_REMOTE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.remote = len; + dst->remote = malloc(len); + memcpy(dst->remote, ynl_attr_data(attr), len); + } else if (type == IFLA_GRE_TTL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ttl = 1; + dst->ttl = ynl_attr_get_u8(attr); + } else if (type == IFLA_GRE_TOS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tos = 1; + dst->tos = ynl_attr_get_u8(attr); + } else if (type == IFLA_GRE_PMTUDISC) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.pmtudisc = 1; + dst->pmtudisc = ynl_attr_get_u8(attr); + } else if (type == IFLA_GRE_ENCAP_LIMIT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_limit = 1; + dst->encap_limit = ynl_attr_get_u32(attr); + } else if (type == IFLA_GRE_FLOWINFO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flowinfo = 1; + dst->flowinfo = ynl_attr_get_u32(attr); + } else if (type == IFLA_GRE_FLAGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flags = 1; + dst->flags = ynl_attr_get_u32(attr); + } else if (type == IFLA_GRE_ENCAP_TYPE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_type = 1; + dst->encap_type = ynl_attr_get_u16(attr); + } else if (type == IFLA_GRE_ENCAP_FLAGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_flags = 1; + dst->encap_flags = ynl_attr_get_u16(attr); + } else if (type == IFLA_GRE_ENCAP_SPORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_sport = 1; + dst->encap_sport = ynl_attr_get_u16(attr); + } else if (type == IFLA_GRE_ENCAP_DPORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_dport = 1; + dst->encap_dport = ynl_attr_get_u16(attr); + } else if (type == IFLA_GRE_COLLECT_METADATA) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.collect_metadata = 1; + } else if (type == IFLA_GRE_IGNORE_DF) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ignore_df = 1; + dst->ignore_df = ynl_attr_get_u8(attr); + } else if (type == IFLA_GRE_FWMARK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fwmark = 1; + dst->fwmark = ynl_attr_get_u32(attr); + } else if (type == IFLA_GRE_ERSPAN_INDEX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.erspan_index = 1; + dst->erspan_index = ynl_attr_get_u32(attr); + } else if (type == IFLA_GRE_ERSPAN_VER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.erspan_ver = 1; + dst->erspan_ver = ynl_attr_get_u8(attr); + } else if (type == IFLA_GRE_ERSPAN_DIR) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.erspan_dir = 1; + dst->erspan_dir = ynl_attr_get_u8(attr); + } else if (type == IFLA_GRE_ERSPAN_HWID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.erspan_hwid = 1; + dst->erspan_hwid = ynl_attr_get_u16(attr); + } + } + + return 0; +} + +void +rt_link_linkinfo_geneve_attrs_free(struct rt_link_linkinfo_geneve_attrs *obj) +{ + free(obj->remote); + free(obj->remote6); + free(obj->port_range); +} + +int rt_link_linkinfo_geneve_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_geneve_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.id) + ynl_attr_put_u32(nlh, IFLA_GENEVE_ID, obj->id); + if (obj->_len.remote) + ynl_attr_put(nlh, IFLA_GENEVE_REMOTE, obj->remote, obj->_len.remote); + if (obj->_present.ttl) + ynl_attr_put_u8(nlh, IFLA_GENEVE_TTL, obj->ttl); + if (obj->_present.tos) + ynl_attr_put_u8(nlh, IFLA_GENEVE_TOS, obj->tos); + if (obj->_present.port) + ynl_attr_put_u16(nlh, IFLA_GENEVE_PORT, obj->port); + if (obj->_present.collect_metadata) + ynl_attr_put(nlh, IFLA_GENEVE_COLLECT_METADATA, NULL, 0); + if (obj->_len.remote6) + ynl_attr_put(nlh, IFLA_GENEVE_REMOTE6, obj->remote6, obj->_len.remote6); + if (obj->_present.udp_csum) + ynl_attr_put_u8(nlh, IFLA_GENEVE_UDP_CSUM, obj->udp_csum); + if (obj->_present.udp_zero_csum6_tx) + ynl_attr_put_u8(nlh, IFLA_GENEVE_UDP_ZERO_CSUM6_TX, obj->udp_zero_csum6_tx); + if (obj->_present.udp_zero_csum6_rx) + ynl_attr_put_u8(nlh, IFLA_GENEVE_UDP_ZERO_CSUM6_RX, obj->udp_zero_csum6_rx); + if (obj->_present.label) + ynl_attr_put_u32(nlh, IFLA_GENEVE_LABEL, obj->label); + if (obj->_present.ttl_inherit) + ynl_attr_put_u8(nlh, IFLA_GENEVE_TTL_INHERIT, obj->ttl_inherit); + if (obj->_present.df) + ynl_attr_put_u8(nlh, IFLA_GENEVE_DF, obj->df); + if (obj->_present.inner_proto_inherit) + ynl_attr_put(nlh, IFLA_GENEVE_INNER_PROTO_INHERIT, NULL, 0); + if (obj->_len.port_range) + ynl_attr_put(nlh, IFLA_GENEVE_PORT_RANGE, obj->port_range, obj->_len.port_range); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_geneve_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_geneve_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_GENEVE_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.id = 1; + dst->id = ynl_attr_get_u32(attr); + } else if (type == IFLA_GENEVE_REMOTE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.remote = len; + dst->remote = malloc(len); + memcpy(dst->remote, ynl_attr_data(attr), len); + } else if (type == IFLA_GENEVE_TTL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ttl = 1; + dst->ttl = ynl_attr_get_u8(attr); + } else if (type == IFLA_GENEVE_TOS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tos = 1; + dst->tos = ynl_attr_get_u8(attr); + } else if (type == IFLA_GENEVE_PORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.port = 1; + dst->port = ynl_attr_get_u16(attr); + } else if (type == IFLA_GENEVE_COLLECT_METADATA) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.collect_metadata = 1; + } else if (type == IFLA_GENEVE_REMOTE6) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.remote6 = len; + dst->remote6 = malloc(len); + memcpy(dst->remote6, ynl_attr_data(attr), len); + } else if (type == IFLA_GENEVE_UDP_CSUM) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.udp_csum = 1; + dst->udp_csum = ynl_attr_get_u8(attr); + } else if (type == IFLA_GENEVE_UDP_ZERO_CSUM6_TX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.udp_zero_csum6_tx = 1; + dst->udp_zero_csum6_tx = ynl_attr_get_u8(attr); + } else if (type == IFLA_GENEVE_UDP_ZERO_CSUM6_RX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.udp_zero_csum6_rx = 1; + dst->udp_zero_csum6_rx = ynl_attr_get_u8(attr); + } else if (type == IFLA_GENEVE_LABEL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.label = 1; + dst->label = ynl_attr_get_u32(attr); + } else if (type == IFLA_GENEVE_TTL_INHERIT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ttl_inherit = 1; + dst->ttl_inherit = ynl_attr_get_u8(attr); + } else if (type == IFLA_GENEVE_DF) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.df = 1; + dst->df = ynl_attr_get_u8(attr); + } else if (type == IFLA_GENEVE_INNER_PROTO_INHERIT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.inner_proto_inherit = 1; + } else if (type == IFLA_GENEVE_PORT_RANGE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.port_range = len; + if (len < sizeof(struct ifla_geneve_port_range)) + dst->port_range = calloc(1, sizeof(struct ifla_geneve_port_range)); + else + dst->port_range = malloc(len); + memcpy(dst->port_range, ynl_attr_data(attr), len); + } + } + + return 0; +} + +void +rt_link_linkinfo_iptun_attrs_free(struct rt_link_linkinfo_iptun_attrs *obj) +{ + free(obj->local); + free(obj->remote); + free(obj->_6rd_prefix); + free(obj->_6rd_relay_prefix); +} + +int rt_link_linkinfo_iptun_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_iptun_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.link) + ynl_attr_put_u32(nlh, IFLA_IPTUN_LINK, obj->link); + if (obj->_len.local) + ynl_attr_put(nlh, IFLA_IPTUN_LOCAL, obj->local, obj->_len.local); + if (obj->_len.remote) + ynl_attr_put(nlh, IFLA_IPTUN_REMOTE, obj->remote, obj->_len.remote); + if (obj->_present.ttl) + ynl_attr_put_u8(nlh, IFLA_IPTUN_TTL, obj->ttl); + if (obj->_present.tos) + ynl_attr_put_u8(nlh, IFLA_IPTUN_TOS, obj->tos); + if (obj->_present.encap_limit) + ynl_attr_put_u8(nlh, IFLA_IPTUN_ENCAP_LIMIT, obj->encap_limit); + if (obj->_present.flowinfo) + ynl_attr_put_u32(nlh, IFLA_IPTUN_FLOWINFO, obj->flowinfo); + if (obj->_present.flags) + ynl_attr_put_u16(nlh, IFLA_IPTUN_FLAGS, obj->flags); + if (obj->_present.proto) + ynl_attr_put_u8(nlh, IFLA_IPTUN_PROTO, obj->proto); + if (obj->_present.pmtudisc) + ynl_attr_put_u8(nlh, IFLA_IPTUN_PMTUDISC, obj->pmtudisc); + if (obj->_len._6rd_prefix) + ynl_attr_put(nlh, IFLA_IPTUN_6RD_PREFIX, obj->_6rd_prefix, obj->_len._6rd_prefix); + if (obj->_len._6rd_relay_prefix) + ynl_attr_put(nlh, IFLA_IPTUN_6RD_RELAY_PREFIX, obj->_6rd_relay_prefix, obj->_len._6rd_relay_prefix); + if (obj->_present._6rd_prefixlen) + ynl_attr_put_u16(nlh, IFLA_IPTUN_6RD_PREFIXLEN, obj->_6rd_prefixlen); + if (obj->_present._6rd_relay_prefixlen) + ynl_attr_put_u16(nlh, IFLA_IPTUN_6RD_RELAY_PREFIXLEN, obj->_6rd_relay_prefixlen); + if (obj->_present.encap_type) + ynl_attr_put_u16(nlh, IFLA_IPTUN_ENCAP_TYPE, obj->encap_type); + if (obj->_present.encap_flags) + ynl_attr_put_u16(nlh, IFLA_IPTUN_ENCAP_FLAGS, obj->encap_flags); + if (obj->_present.encap_sport) + ynl_attr_put_u16(nlh, IFLA_IPTUN_ENCAP_SPORT, obj->encap_sport); + if (obj->_present.encap_dport) + ynl_attr_put_u16(nlh, IFLA_IPTUN_ENCAP_DPORT, obj->encap_dport); + if (obj->_present.collect_metadata) + ynl_attr_put(nlh, IFLA_IPTUN_COLLECT_METADATA, NULL, 0); + if (obj->_present.fwmark) + ynl_attr_put_u32(nlh, IFLA_IPTUN_FWMARK, obj->fwmark); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_iptun_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_iptun_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_IPTUN_LINK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.link = 1; + dst->link = ynl_attr_get_u32(attr); + } else if (type == IFLA_IPTUN_LOCAL) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.local = len; + dst->local = malloc(len); + memcpy(dst->local, ynl_attr_data(attr), len); + } else if (type == IFLA_IPTUN_REMOTE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.remote = len; + dst->remote = malloc(len); + memcpy(dst->remote, ynl_attr_data(attr), len); + } else if (type == IFLA_IPTUN_TTL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ttl = 1; + dst->ttl = ynl_attr_get_u8(attr); + } else if (type == IFLA_IPTUN_TOS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tos = 1; + dst->tos = ynl_attr_get_u8(attr); + } else if (type == IFLA_IPTUN_ENCAP_LIMIT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_limit = 1; + dst->encap_limit = ynl_attr_get_u8(attr); + } else if (type == IFLA_IPTUN_FLOWINFO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flowinfo = 1; + dst->flowinfo = ynl_attr_get_u32(attr); + } else if (type == IFLA_IPTUN_FLAGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flags = 1; + dst->flags = ynl_attr_get_u16(attr); + } else if (type == IFLA_IPTUN_PROTO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.proto = 1; + dst->proto = ynl_attr_get_u8(attr); + } else if (type == IFLA_IPTUN_PMTUDISC) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.pmtudisc = 1; + dst->pmtudisc = ynl_attr_get_u8(attr); + } else if (type == IFLA_IPTUN_6RD_PREFIX) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len._6rd_prefix = len; + dst->_6rd_prefix = malloc(len); + memcpy(dst->_6rd_prefix, ynl_attr_data(attr), len); + } else if (type == IFLA_IPTUN_6RD_RELAY_PREFIX) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len._6rd_relay_prefix = len; + dst->_6rd_relay_prefix = malloc(len); + memcpy(dst->_6rd_relay_prefix, ynl_attr_data(attr), len); + } else if (type == IFLA_IPTUN_6RD_PREFIXLEN) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present._6rd_prefixlen = 1; + dst->_6rd_prefixlen = ynl_attr_get_u16(attr); + } else if (type == IFLA_IPTUN_6RD_RELAY_PREFIXLEN) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present._6rd_relay_prefixlen = 1; + dst->_6rd_relay_prefixlen = ynl_attr_get_u16(attr); + } else if (type == IFLA_IPTUN_ENCAP_TYPE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_type = 1; + dst->encap_type = ynl_attr_get_u16(attr); + } else if (type == IFLA_IPTUN_ENCAP_FLAGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_flags = 1; + dst->encap_flags = ynl_attr_get_u16(attr); + } else if (type == IFLA_IPTUN_ENCAP_SPORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_sport = 1; + dst->encap_sport = ynl_attr_get_u16(attr); + } else if (type == IFLA_IPTUN_ENCAP_DPORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_dport = 1; + dst->encap_dport = ynl_attr_get_u16(attr); + } else if (type == IFLA_IPTUN_COLLECT_METADATA) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.collect_metadata = 1; + } else if (type == IFLA_IPTUN_FWMARK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fwmark = 1; + dst->fwmark = ynl_attr_get_u32(attr); + } + } + + return 0; +} + +void +rt_link_linkinfo_ip6tnl_attrs_free(struct rt_link_linkinfo_ip6tnl_attrs *obj) +{ + free(obj->local); + free(obj->remote); +} + +int rt_link_linkinfo_ip6tnl_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_ip6tnl_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.link) + ynl_attr_put_u32(nlh, IFLA_IPTUN_LINK, obj->link); + if (obj->_len.local) + ynl_attr_put(nlh, IFLA_IPTUN_LOCAL, obj->local, obj->_len.local); + if (obj->_len.remote) + ynl_attr_put(nlh, IFLA_IPTUN_REMOTE, obj->remote, obj->_len.remote); + if (obj->_present.ttl) + ynl_attr_put_u8(nlh, IFLA_IPTUN_TTL, obj->ttl); + if (obj->_present.encap_limit) + ynl_attr_put_u8(nlh, IFLA_IPTUN_ENCAP_LIMIT, obj->encap_limit); + if (obj->_present.flowinfo) + ynl_attr_put_u32(nlh, IFLA_IPTUN_FLOWINFO, obj->flowinfo); + if (obj->_present.flags) + ynl_attr_put_u32(nlh, IFLA_IPTUN_FLAGS, obj->flags); + if (obj->_present.proto) + ynl_attr_put_u8(nlh, IFLA_IPTUN_PROTO, obj->proto); + if (obj->_present.encap_type) + ynl_attr_put_u16(nlh, IFLA_IPTUN_ENCAP_TYPE, obj->encap_type); + if (obj->_present.encap_flags) + ynl_attr_put_u16(nlh, IFLA_IPTUN_ENCAP_FLAGS, obj->encap_flags); + if (obj->_present.encap_sport) + ynl_attr_put_u16(nlh, IFLA_IPTUN_ENCAP_SPORT, obj->encap_sport); + if (obj->_present.encap_dport) + ynl_attr_put_u16(nlh, IFLA_IPTUN_ENCAP_DPORT, obj->encap_dport); + if (obj->_present.collect_metadata) + ynl_attr_put(nlh, IFLA_IPTUN_COLLECT_METADATA, NULL, 0); + if (obj->_present.fwmark) + ynl_attr_put_u32(nlh, IFLA_IPTUN_FWMARK, obj->fwmark); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_ip6tnl_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_ip6tnl_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_IPTUN_LINK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.link = 1; + dst->link = ynl_attr_get_u32(attr); + } else if (type == IFLA_IPTUN_LOCAL) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.local = len; + dst->local = malloc(len); + memcpy(dst->local, ynl_attr_data(attr), len); + } else if (type == IFLA_IPTUN_REMOTE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.remote = len; + dst->remote = malloc(len); + memcpy(dst->remote, ynl_attr_data(attr), len); + } else if (type == IFLA_IPTUN_TTL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ttl = 1; + dst->ttl = ynl_attr_get_u8(attr); + } else if (type == IFLA_IPTUN_ENCAP_LIMIT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_limit = 1; + dst->encap_limit = ynl_attr_get_u8(attr); + } else if (type == IFLA_IPTUN_FLOWINFO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flowinfo = 1; + dst->flowinfo = ynl_attr_get_u32(attr); + } else if (type == IFLA_IPTUN_FLAGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flags = 1; + dst->flags = ynl_attr_get_u32(attr); + } else if (type == IFLA_IPTUN_PROTO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.proto = 1; + dst->proto = ynl_attr_get_u8(attr); + } else if (type == IFLA_IPTUN_ENCAP_TYPE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_type = 1; + dst->encap_type = ynl_attr_get_u16(attr); + } else if (type == IFLA_IPTUN_ENCAP_FLAGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_flags = 1; + dst->encap_flags = ynl_attr_get_u16(attr); + } else if (type == IFLA_IPTUN_ENCAP_SPORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_sport = 1; + dst->encap_sport = ynl_attr_get_u16(attr); + } else if (type == IFLA_IPTUN_ENCAP_DPORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.encap_dport = 1; + dst->encap_dport = ynl_attr_get_u16(attr); + } else if (type == IFLA_IPTUN_COLLECT_METADATA) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.collect_metadata = 1; + } else if (type == IFLA_IPTUN_FWMARK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fwmark = 1; + dst->fwmark = ynl_attr_get_u32(attr); + } + } + + return 0; +} + +void rt_link_linkinfo_tun_attrs_free(struct rt_link_linkinfo_tun_attrs *obj) +{ +} + +int rt_link_linkinfo_tun_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_tun_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.owner) + ynl_attr_put_u32(nlh, IFLA_TUN_OWNER, obj->owner); + if (obj->_present.group) + ynl_attr_put_u32(nlh, IFLA_TUN_GROUP, obj->group); + if (obj->_present.type) + ynl_attr_put_u8(nlh, IFLA_TUN_TYPE, obj->type); + if (obj->_present.pi) + ynl_attr_put_u8(nlh, IFLA_TUN_PI, obj->pi); + if (obj->_present.vnet_hdr) + ynl_attr_put_u8(nlh, IFLA_TUN_VNET_HDR, obj->vnet_hdr); + if (obj->_present.persist) + ynl_attr_put_u8(nlh, IFLA_TUN_PERSIST, obj->persist); + if (obj->_present.multi_queue) + ynl_attr_put_u8(nlh, IFLA_TUN_MULTI_QUEUE, obj->multi_queue); + if (obj->_present.num_queues) + ynl_attr_put_u32(nlh, IFLA_TUN_NUM_QUEUES, obj->num_queues); + if (obj->_present.num_disabled_queues) + ynl_attr_put_u32(nlh, IFLA_TUN_NUM_DISABLED_QUEUES, obj->num_disabled_queues); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_tun_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_tun_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_TUN_OWNER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.owner = 1; + dst->owner = ynl_attr_get_u32(attr); + } else if (type == IFLA_TUN_GROUP) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.group = 1; + dst->group = ynl_attr_get_u32(attr); + } else if (type == IFLA_TUN_TYPE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.type = 1; + dst->type = ynl_attr_get_u8(attr); + } else if (type == IFLA_TUN_PI) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.pi = 1; + dst->pi = ynl_attr_get_u8(attr); + } else if (type == IFLA_TUN_VNET_HDR) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vnet_hdr = 1; + dst->vnet_hdr = ynl_attr_get_u8(attr); + } else if (type == IFLA_TUN_PERSIST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.persist = 1; + dst->persist = ynl_attr_get_u8(attr); + } else if (type == IFLA_TUN_MULTI_QUEUE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.multi_queue = 1; + dst->multi_queue = ynl_attr_get_u8(attr); + } else if (type == IFLA_TUN_NUM_QUEUES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.num_queues = 1; + dst->num_queues = ynl_attr_get_u32(attr); + } else if (type == IFLA_TUN_NUM_DISABLED_QUEUES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.num_disabled_queues = 1; + dst->num_disabled_queues = ynl_attr_get_u32(attr); + } + } + + return 0; +} + +void rt_link_linkinfo_vrf_attrs_free(struct rt_link_linkinfo_vrf_attrs *obj) +{ +} + +int rt_link_linkinfo_vrf_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_vrf_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.table) + ynl_attr_put_u32(nlh, IFLA_VRF_TABLE, obj->table); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_vrf_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_vrf_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_VRF_TABLE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.table = 1; + dst->table = ynl_attr_get_u32(attr); + } + } + + return 0; +} + +void rt_link_linkinfo_vti_attrs_free(struct rt_link_linkinfo_vti_attrs *obj) +{ + free(obj->local); + free(obj->remote); +} + +int rt_link_linkinfo_vti_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_vti_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.link) + ynl_attr_put_u32(nlh, IFLA_VTI_LINK, obj->link); + if (obj->_present.ikey) + ynl_attr_put_u32(nlh, IFLA_VTI_IKEY, obj->ikey); + if (obj->_present.okey) + ynl_attr_put_u32(nlh, IFLA_VTI_OKEY, obj->okey); + if (obj->_len.local) + ynl_attr_put(nlh, IFLA_VTI_LOCAL, obj->local, obj->_len.local); + if (obj->_len.remote) + ynl_attr_put(nlh, IFLA_VTI_REMOTE, obj->remote, obj->_len.remote); + if (obj->_present.fwmark) + ynl_attr_put_u32(nlh, IFLA_VTI_FWMARK, obj->fwmark); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_vti_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_vti_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_VTI_LINK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.link = 1; + dst->link = ynl_attr_get_u32(attr); + } else if (type == IFLA_VTI_IKEY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ikey = 1; + dst->ikey = ynl_attr_get_u32(attr); + } else if (type == IFLA_VTI_OKEY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.okey = 1; + dst->okey = ynl_attr_get_u32(attr); + } else if (type == IFLA_VTI_LOCAL) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.local = len; + dst->local = malloc(len); + memcpy(dst->local, ynl_attr_data(attr), len); + } else if (type == IFLA_VTI_REMOTE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.remote = len; + dst->remote = malloc(len); + memcpy(dst->remote, ynl_attr_data(attr), len); + } else if (type == IFLA_VTI_FWMARK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fwmark = 1; + dst->fwmark = ynl_attr_get_u32(attr); + } + } + + return 0; +} + +void rt_link_linkinfo_vti6_attrs_free(struct rt_link_linkinfo_vti6_attrs *obj) +{ + free(obj->local); + free(obj->remote); +} + +int rt_link_linkinfo_vti6_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_vti6_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.link) + ynl_attr_put_u32(nlh, IFLA_VTI_LINK, obj->link); + if (obj->_present.ikey) + ynl_attr_put_u32(nlh, IFLA_VTI_IKEY, obj->ikey); + if (obj->_present.okey) + ynl_attr_put_u32(nlh, IFLA_VTI_OKEY, obj->okey); + if (obj->_len.local) + ynl_attr_put(nlh, IFLA_VTI_LOCAL, obj->local, obj->_len.local); + if (obj->_len.remote) + ynl_attr_put(nlh, IFLA_VTI_REMOTE, obj->remote, obj->_len.remote); + if (obj->_present.fwmark) + ynl_attr_put_u32(nlh, IFLA_VTI_FWMARK, obj->fwmark); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_vti6_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_vti6_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_VTI_LINK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.link = 1; + dst->link = ynl_attr_get_u32(attr); + } else if (type == IFLA_VTI_IKEY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ikey = 1; + dst->ikey = ynl_attr_get_u32(attr); + } else if (type == IFLA_VTI_OKEY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.okey = 1; + dst->okey = ynl_attr_get_u32(attr); + } else if (type == IFLA_VTI_LOCAL) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.local = len; + dst->local = malloc(len); + memcpy(dst->local, ynl_attr_data(attr), len); + } else if (type == IFLA_VTI_REMOTE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.remote = len; + dst->remote = malloc(len); + memcpy(dst->remote, ynl_attr_data(attr), len); + } else if (type == IFLA_VTI_FWMARK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fwmark = 1; + dst->fwmark = ynl_attr_get_u32(attr); + } + } + + return 0; +} + +void +rt_link_linkinfo_netkit_attrs_free(struct rt_link_linkinfo_netkit_attrs *obj) +{ + free(obj->peer_info); +} + +int rt_link_linkinfo_netkit_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_netkit_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_len.peer_info) + ynl_attr_put(nlh, IFLA_NETKIT_PEER_INFO, obj->peer_info, obj->_len.peer_info); + if (obj->_present.primary) + ynl_attr_put_u8(nlh, IFLA_NETKIT_PRIMARY, obj->primary); + if (obj->_present.policy) + ynl_attr_put_u32(nlh, IFLA_NETKIT_POLICY, obj->policy); + if (obj->_present.peer_policy) + ynl_attr_put_u32(nlh, IFLA_NETKIT_PEER_POLICY, obj->peer_policy); + if (obj->_present.mode) + ynl_attr_put_u32(nlh, IFLA_NETKIT_MODE, obj->mode); + if (obj->_present.scrub) + ynl_attr_put_u32(nlh, IFLA_NETKIT_SCRUB, obj->scrub); + if (obj->_present.peer_scrub) + ynl_attr_put_u32(nlh, IFLA_NETKIT_PEER_SCRUB, obj->peer_scrub); + if (obj->_present.headroom) + ynl_attr_put_u16(nlh, IFLA_NETKIT_HEADROOM, obj->headroom); + if (obj->_present.tailroom) + ynl_attr_put_u16(nlh, IFLA_NETKIT_TAILROOM, obj->tailroom); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_netkit_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_netkit_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_NETKIT_PEER_INFO) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.peer_info = len; + dst->peer_info = malloc(len); + memcpy(dst->peer_info, ynl_attr_data(attr), len); + } else if (type == IFLA_NETKIT_PRIMARY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.primary = 1; + dst->primary = ynl_attr_get_u8(attr); + } else if (type == IFLA_NETKIT_POLICY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.policy = 1; + dst->policy = ynl_attr_get_u32(attr); + } else if (type == IFLA_NETKIT_PEER_POLICY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.peer_policy = 1; + dst->peer_policy = ynl_attr_get_u32(attr); + } else if (type == IFLA_NETKIT_MODE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mode = 1; + dst->mode = ynl_attr_get_u32(attr); + } else if (type == IFLA_NETKIT_SCRUB) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.scrub = 1; + dst->scrub = ynl_attr_get_u32(attr); + } else if (type == IFLA_NETKIT_PEER_SCRUB) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.peer_scrub = 1; + dst->peer_scrub = ynl_attr_get_u32(attr); + } else if (type == IFLA_NETKIT_HEADROOM) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.headroom = 1; + dst->headroom = ynl_attr_get_u16(attr); + } else if (type == IFLA_NETKIT_TAILROOM) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tailroom = 1; + dst->tailroom = ynl_attr_get_u16(attr); + } + } + + return 0; +} + +void rt_link_linkinfo_ovpn_attrs_free(struct rt_link_linkinfo_ovpn_attrs *obj) +{ +} + +int rt_link_linkinfo_ovpn_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_ovpn_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.mode) + ynl_attr_put_u8(nlh, IFLA_OVPN_MODE, obj->mode); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_ovpn_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_ovpn_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_OVPN_MODE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mode = 1; + dst->mode = ynl_attr_get_u8(attr); + } + } + + return 0; +} + +void +rt_link_linkinfo_brport_attrs_free(struct rt_link_linkinfo_brport_attrs *obj) +{ + free(obj->root_id); + free(obj->bridge_id); +} + +int rt_link_linkinfo_brport_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_brport_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.state) + ynl_attr_put_u8(nlh, IFLA_BRPORT_STATE, obj->state); + if (obj->_present.priority) + ynl_attr_put_u16(nlh, IFLA_BRPORT_PRIORITY, obj->priority); + if (obj->_present.cost) + ynl_attr_put_u32(nlh, IFLA_BRPORT_COST, obj->cost); + if (obj->_present.mode) + ynl_attr_put(nlh, IFLA_BRPORT_MODE, NULL, 0); + if (obj->_present.guard) + ynl_attr_put(nlh, IFLA_BRPORT_GUARD, NULL, 0); + if (obj->_present.protect) + ynl_attr_put(nlh, IFLA_BRPORT_PROTECT, NULL, 0); + if (obj->_present.fast_leave) + ynl_attr_put(nlh, IFLA_BRPORT_FAST_LEAVE, NULL, 0); + if (obj->_present.learning) + ynl_attr_put(nlh, IFLA_BRPORT_LEARNING, NULL, 0); + if (obj->_present.unicast_flood) + ynl_attr_put(nlh, IFLA_BRPORT_UNICAST_FLOOD, NULL, 0); + if (obj->_present.proxyarp) + ynl_attr_put(nlh, IFLA_BRPORT_PROXYARP, NULL, 0); + if (obj->_present.learning_sync) + ynl_attr_put(nlh, IFLA_BRPORT_LEARNING_SYNC, NULL, 0); + if (obj->_present.proxyarp_wifi) + ynl_attr_put(nlh, IFLA_BRPORT_PROXYARP_WIFI, NULL, 0); + if (obj->_len.root_id) + ynl_attr_put(nlh, IFLA_BRPORT_ROOT_ID, obj->root_id, obj->_len.root_id); + if (obj->_len.bridge_id) + ynl_attr_put(nlh, IFLA_BRPORT_BRIDGE_ID, obj->bridge_id, obj->_len.bridge_id); + if (obj->_present.designated_port) + ynl_attr_put_u16(nlh, IFLA_BRPORT_DESIGNATED_PORT, obj->designated_port); + if (obj->_present.designated_cost) + ynl_attr_put_u16(nlh, IFLA_BRPORT_DESIGNATED_COST, obj->designated_cost); + if (obj->_present.id) + ynl_attr_put_u16(nlh, IFLA_BRPORT_ID, obj->id); + if (obj->_present.no) + ynl_attr_put_u16(nlh, IFLA_BRPORT_NO, obj->no); + if (obj->_present.topology_change_ack) + ynl_attr_put_u8(nlh, IFLA_BRPORT_TOPOLOGY_CHANGE_ACK, obj->topology_change_ack); + if (obj->_present.config_pending) + ynl_attr_put_u8(nlh, IFLA_BRPORT_CONFIG_PENDING, obj->config_pending); + if (obj->_present.message_age_timer) + ynl_attr_put_u64(nlh, IFLA_BRPORT_MESSAGE_AGE_TIMER, obj->message_age_timer); + if (obj->_present.forward_delay_timer) + ynl_attr_put_u64(nlh, IFLA_BRPORT_FORWARD_DELAY_TIMER, obj->forward_delay_timer); + if (obj->_present.hold_timer) + ynl_attr_put_u64(nlh, IFLA_BRPORT_HOLD_TIMER, obj->hold_timer); + if (obj->_present.flush) + ynl_attr_put(nlh, IFLA_BRPORT_FLUSH, NULL, 0); + if (obj->_present.multicast_router) + ynl_attr_put_u8(nlh, IFLA_BRPORT_MULTICAST_ROUTER, obj->multicast_router); + if (obj->_present.mcast_flood) + ynl_attr_put(nlh, IFLA_BRPORT_MCAST_FLOOD, NULL, 0); + if (obj->_present.mcast_to_ucast) + ynl_attr_put(nlh, IFLA_BRPORT_MCAST_TO_UCAST, NULL, 0); + if (obj->_present.vlan_tunnel) + ynl_attr_put(nlh, IFLA_BRPORT_VLAN_TUNNEL, NULL, 0); + if (obj->_present.bcast_flood) + ynl_attr_put(nlh, IFLA_BRPORT_BCAST_FLOOD, NULL, 0); + if (obj->_present.group_fwd_mask) + ynl_attr_put_u16(nlh, IFLA_BRPORT_GROUP_FWD_MASK, obj->group_fwd_mask); + if (obj->_present.neigh_suppress) + ynl_attr_put(nlh, IFLA_BRPORT_NEIGH_SUPPRESS, NULL, 0); + if (obj->_present.isolated) + ynl_attr_put(nlh, IFLA_BRPORT_ISOLATED, NULL, 0); + if (obj->_present.backup_port) + ynl_attr_put_u32(nlh, IFLA_BRPORT_BACKUP_PORT, obj->backup_port); + if (obj->_present.mrp_ring_open) + ynl_attr_put(nlh, IFLA_BRPORT_MRP_RING_OPEN, NULL, 0); + if (obj->_present.mrp_in_open) + ynl_attr_put(nlh, IFLA_BRPORT_MRP_IN_OPEN, NULL, 0); + if (obj->_present.mcast_eht_hosts_limit) + ynl_attr_put_u32(nlh, IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT, obj->mcast_eht_hosts_limit); + if (obj->_present.mcast_eht_hosts_cnt) + ynl_attr_put_u32(nlh, IFLA_BRPORT_MCAST_EHT_HOSTS_CNT, obj->mcast_eht_hosts_cnt); + if (obj->_present.locked) + ynl_attr_put(nlh, IFLA_BRPORT_LOCKED, NULL, 0); + if (obj->_present.mab) + ynl_attr_put(nlh, IFLA_BRPORT_MAB, NULL, 0); + if (obj->_present.mcast_n_groups) + ynl_attr_put_u32(nlh, IFLA_BRPORT_MCAST_N_GROUPS, obj->mcast_n_groups); + if (obj->_present.mcast_max_groups) + ynl_attr_put_u32(nlh, IFLA_BRPORT_MCAST_MAX_GROUPS, obj->mcast_max_groups); + if (obj->_present.neigh_vlan_suppress) + ynl_attr_put(nlh, IFLA_BRPORT_NEIGH_VLAN_SUPPRESS, NULL, 0); + if (obj->_present.backup_nhid) + ynl_attr_put_u32(nlh, IFLA_BRPORT_BACKUP_NHID, obj->backup_nhid); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_brport_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_brport_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_BRPORT_STATE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.state = 1; + dst->state = ynl_attr_get_u8(attr); + } else if (type == IFLA_BRPORT_PRIORITY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.priority = 1; + dst->priority = ynl_attr_get_u16(attr); + } else if (type == IFLA_BRPORT_COST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.cost = 1; + dst->cost = ynl_attr_get_u32(attr); + } else if (type == IFLA_BRPORT_MODE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mode = 1; + } else if (type == IFLA_BRPORT_GUARD) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.guard = 1; + } else if (type == IFLA_BRPORT_PROTECT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.protect = 1; + } else if (type == IFLA_BRPORT_FAST_LEAVE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fast_leave = 1; + } else if (type == IFLA_BRPORT_LEARNING) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.learning = 1; + } else if (type == IFLA_BRPORT_UNICAST_FLOOD) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.unicast_flood = 1; + } else if (type == IFLA_BRPORT_PROXYARP) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.proxyarp = 1; + } else if (type == IFLA_BRPORT_LEARNING_SYNC) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.learning_sync = 1; + } else if (type == IFLA_BRPORT_PROXYARP_WIFI) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.proxyarp_wifi = 1; + } else if (type == IFLA_BRPORT_ROOT_ID) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.root_id = len; + if (len < sizeof(struct ifla_bridge_id)) + dst->root_id = calloc(1, sizeof(struct ifla_bridge_id)); + else + dst->root_id = malloc(len); + memcpy(dst->root_id, ynl_attr_data(attr), len); + } else if (type == IFLA_BRPORT_BRIDGE_ID) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.bridge_id = len; + if (len < sizeof(struct ifla_bridge_id)) + dst->bridge_id = calloc(1, sizeof(struct ifla_bridge_id)); + else + dst->bridge_id = malloc(len); + memcpy(dst->bridge_id, ynl_attr_data(attr), len); + } else if (type == IFLA_BRPORT_DESIGNATED_PORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.designated_port = 1; + dst->designated_port = ynl_attr_get_u16(attr); + } else if (type == IFLA_BRPORT_DESIGNATED_COST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.designated_cost = 1; + dst->designated_cost = ynl_attr_get_u16(attr); + } else if (type == IFLA_BRPORT_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.id = 1; + dst->id = ynl_attr_get_u16(attr); + } else if (type == IFLA_BRPORT_NO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.no = 1; + dst->no = ynl_attr_get_u16(attr); + } else if (type == IFLA_BRPORT_TOPOLOGY_CHANGE_ACK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.topology_change_ack = 1; + dst->topology_change_ack = ynl_attr_get_u8(attr); + } else if (type == IFLA_BRPORT_CONFIG_PENDING) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.config_pending = 1; + dst->config_pending = ynl_attr_get_u8(attr); + } else if (type == IFLA_BRPORT_MESSAGE_AGE_TIMER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.message_age_timer = 1; + dst->message_age_timer = ynl_attr_get_u64(attr); + } else if (type == IFLA_BRPORT_FORWARD_DELAY_TIMER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.forward_delay_timer = 1; + dst->forward_delay_timer = ynl_attr_get_u64(attr); + } else if (type == IFLA_BRPORT_HOLD_TIMER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.hold_timer = 1; + dst->hold_timer = ynl_attr_get_u64(attr); + } else if (type == IFLA_BRPORT_FLUSH) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flush = 1; + } else if (type == IFLA_BRPORT_MULTICAST_ROUTER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.multicast_router = 1; + dst->multicast_router = ynl_attr_get_u8(attr); + } else if (type == IFLA_BRPORT_MCAST_FLOOD) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_flood = 1; + } else if (type == IFLA_BRPORT_MCAST_TO_UCAST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_to_ucast = 1; + } else if (type == IFLA_BRPORT_VLAN_TUNNEL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vlan_tunnel = 1; + } else if (type == IFLA_BRPORT_BCAST_FLOOD) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.bcast_flood = 1; + } else if (type == IFLA_BRPORT_GROUP_FWD_MASK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.group_fwd_mask = 1; + dst->group_fwd_mask = ynl_attr_get_u16(attr); + } else if (type == IFLA_BRPORT_NEIGH_SUPPRESS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.neigh_suppress = 1; + } else if (type == IFLA_BRPORT_ISOLATED) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.isolated = 1; + } else if (type == IFLA_BRPORT_BACKUP_PORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.backup_port = 1; + dst->backup_port = ynl_attr_get_u32(attr); + } else if (type == IFLA_BRPORT_MRP_RING_OPEN) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mrp_ring_open = 1; + } else if (type == IFLA_BRPORT_MRP_IN_OPEN) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mrp_in_open = 1; + } else if (type == IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_eht_hosts_limit = 1; + dst->mcast_eht_hosts_limit = ynl_attr_get_u32(attr); + } else if (type == IFLA_BRPORT_MCAST_EHT_HOSTS_CNT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_eht_hosts_cnt = 1; + dst->mcast_eht_hosts_cnt = ynl_attr_get_u32(attr); + } else if (type == IFLA_BRPORT_LOCKED) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.locked = 1; + } else if (type == IFLA_BRPORT_MAB) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mab = 1; + } else if (type == IFLA_BRPORT_MCAST_N_GROUPS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_n_groups = 1; + dst->mcast_n_groups = ynl_attr_get_u32(attr); + } else if (type == IFLA_BRPORT_MCAST_MAX_GROUPS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_max_groups = 1; + dst->mcast_max_groups = ynl_attr_get_u32(attr); + } else if (type == IFLA_BRPORT_NEIGH_VLAN_SUPPRESS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.neigh_vlan_suppress = 1; + } else if (type == IFLA_BRPORT_BACKUP_NHID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.backup_nhid = 1; + dst->backup_nhid = ynl_attr_get_u32(attr); + } + } + + return 0; +} + +void rt_link_bond_slave_attrs_free(struct rt_link_bond_slave_attrs *obj) +{ + free(obj->perm_hwaddr); +} + +int rt_link_bond_slave_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_bond_slave_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.state) + ynl_attr_put_u8(nlh, IFLA_BOND_SLAVE_STATE, obj->state); + if (obj->_present.mii_status) + ynl_attr_put_u8(nlh, IFLA_BOND_SLAVE_MII_STATUS, obj->mii_status); + if (obj->_present.link_failure_count) + ynl_attr_put_u32(nlh, IFLA_BOND_SLAVE_LINK_FAILURE_COUNT, obj->link_failure_count); + if (obj->_len.perm_hwaddr) + ynl_attr_put(nlh, IFLA_BOND_SLAVE_PERM_HWADDR, obj->perm_hwaddr, obj->_len.perm_hwaddr); + if (obj->_present.queue_id) + ynl_attr_put_u16(nlh, IFLA_BOND_SLAVE_QUEUE_ID, obj->queue_id); + if (obj->_present.ad_aggregator_id) + ynl_attr_put_u16(nlh, IFLA_BOND_SLAVE_AD_AGGREGATOR_ID, obj->ad_aggregator_id); + if (obj->_present.ad_actor_oper_port_state) + ynl_attr_put_u8(nlh, IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE, obj->ad_actor_oper_port_state); + if (obj->_present.ad_partner_oper_port_state) + ynl_attr_put_u16(nlh, IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE, obj->ad_partner_oper_port_state); + if (obj->_present.prio) + ynl_attr_put_u32(nlh, IFLA_BOND_SLAVE_PRIO, obj->prio); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_bond_slave_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_bond_slave_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_BOND_SLAVE_STATE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.state = 1; + dst->state = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_SLAVE_MII_STATUS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mii_status = 1; + dst->mii_status = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_SLAVE_LINK_FAILURE_COUNT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.link_failure_count = 1; + dst->link_failure_count = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_SLAVE_PERM_HWADDR) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.perm_hwaddr = len; + dst->perm_hwaddr = malloc(len); + memcpy(dst->perm_hwaddr, ynl_attr_data(attr), len); + } else if (type == IFLA_BOND_SLAVE_QUEUE_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.queue_id = 1; + dst->queue_id = ynl_attr_get_u16(attr); + } else if (type == IFLA_BOND_SLAVE_AD_AGGREGATOR_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ad_aggregator_id = 1; + dst->ad_aggregator_id = ynl_attr_get_u16(attr); + } else if (type == IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ad_actor_oper_port_state = 1; + dst->ad_actor_oper_port_state = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ad_partner_oper_port_state = 1; + dst->ad_partner_oper_port_state = ynl_attr_get_u16(attr); + } else if (type == IFLA_BOND_SLAVE_PRIO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.prio = 1; + dst->prio = ynl_attr_get_u32(attr); + } + } + + return 0; +} + +void rt_link_vf_stats_attrs_free(struct rt_link_vf_stats_attrs *obj) +{ +} + +int rt_link_vf_stats_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_vf_stats_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.rx_packets) + ynl_attr_put_u64(nlh, IFLA_VF_STATS_RX_PACKETS, obj->rx_packets); + if (obj->_present.tx_packets) + ynl_attr_put_u64(nlh, IFLA_VF_STATS_TX_PACKETS, obj->tx_packets); + if (obj->_present.rx_bytes) + ynl_attr_put_u64(nlh, IFLA_VF_STATS_RX_BYTES, obj->rx_bytes); + if (obj->_present.tx_bytes) + ynl_attr_put_u64(nlh, IFLA_VF_STATS_TX_BYTES, obj->tx_bytes); + if (obj->_present.broadcast) + ynl_attr_put_u64(nlh, IFLA_VF_STATS_BROADCAST, obj->broadcast); + if (obj->_present.multicast) + ynl_attr_put_u64(nlh, IFLA_VF_STATS_MULTICAST, obj->multicast); + if (obj->_present.rx_dropped) + ynl_attr_put_u64(nlh, IFLA_VF_STATS_RX_DROPPED, obj->rx_dropped); + if (obj->_present.tx_dropped) + ynl_attr_put_u64(nlh, IFLA_VF_STATS_TX_DROPPED, obj->tx_dropped); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_vf_stats_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_vf_stats_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_VF_STATS_RX_PACKETS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.rx_packets = 1; + dst->rx_packets = ynl_attr_get_u64(attr); + } else if (type == IFLA_VF_STATS_TX_PACKETS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tx_packets = 1; + dst->tx_packets = ynl_attr_get_u64(attr); + } else if (type == IFLA_VF_STATS_RX_BYTES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.rx_bytes = 1; + dst->rx_bytes = ynl_attr_get_u64(attr); + } else if (type == IFLA_VF_STATS_TX_BYTES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tx_bytes = 1; + dst->tx_bytes = ynl_attr_get_u64(attr); + } else if (type == IFLA_VF_STATS_BROADCAST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.broadcast = 1; + dst->broadcast = ynl_attr_get_u64(attr); + } else if (type == IFLA_VF_STATS_MULTICAST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.multicast = 1; + dst->multicast = ynl_attr_get_u64(attr); + } else if (type == IFLA_VF_STATS_RX_DROPPED) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.rx_dropped = 1; + dst->rx_dropped = ynl_attr_get_u64(attr); + } else if (type == IFLA_VF_STATS_TX_DROPPED) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tx_dropped = 1; + dst->tx_dropped = ynl_attr_get_u64(attr); + } + } + + return 0; +} + +void rt_link_vf_vlan_attrs_free(struct rt_link_vf_vlan_attrs *obj) +{ + free(obj->info); +} + +int rt_link_vf_vlan_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_vf_vlan_attrs *obj) +{ + struct nlattr *nest; + unsigned int i; + + nest = ynl_attr_nest_start(nlh, attr_type); + for (i = 0; i < obj->_count.info; i++) + ynl_attr_put(nlh, IFLA_VF_VLAN_INFO, &obj->info[i], sizeof(struct ifla_vf_vlan_info)); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_vf_vlan_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_vf_vlan_attrs *dst = yarg->data; + const struct nlattr *attr; + unsigned int n_info = 0; + int i; + + if (dst->info) + return ynl_error_parse(yarg, "attribute already present (vf-vlan-attrs.info)"); + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_VF_VLAN_INFO) { + n_info++; + } + } + + if (n_info) { + dst->info = calloc(n_info, sizeof(*dst->info)); + dst->_count.info = n_info; + i = 0; + ynl_attr_for_each_nested(attr, nested) { + if (ynl_attr_type(attr) == IFLA_VF_VLAN_INFO) { + size_t len = ynl_attr_data_len(attr); + + if (len > sizeof(dst->info[0])) + len = sizeof(dst->info[0]); + memcpy(&dst->info[i], ynl_attr_data(attr), len); + i++; + } + } + } + + return 0; +} + +void rt_link_bond_ad_info_attrs_free(struct rt_link_bond_ad_info_attrs *obj) +{ + free(obj->partner_mac); +} + +int rt_link_bond_ad_info_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_bond_ad_info_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.aggregator) + ynl_attr_put_u16(nlh, IFLA_BOND_AD_INFO_AGGREGATOR, obj->aggregator); + if (obj->_present.num_ports) + ynl_attr_put_u16(nlh, IFLA_BOND_AD_INFO_NUM_PORTS, obj->num_ports); + if (obj->_present.actor_key) + ynl_attr_put_u16(nlh, IFLA_BOND_AD_INFO_ACTOR_KEY, obj->actor_key); + if (obj->_present.partner_key) + ynl_attr_put_u16(nlh, IFLA_BOND_AD_INFO_PARTNER_KEY, obj->partner_key); + if (obj->_len.partner_mac) + ynl_attr_put(nlh, IFLA_BOND_AD_INFO_PARTNER_MAC, obj->partner_mac, obj->_len.partner_mac); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_bond_ad_info_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_bond_ad_info_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_BOND_AD_INFO_AGGREGATOR) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.aggregator = 1; + dst->aggregator = ynl_attr_get_u16(attr); + } else if (type == IFLA_BOND_AD_INFO_NUM_PORTS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.num_ports = 1; + dst->num_ports = ynl_attr_get_u16(attr); + } else if (type == IFLA_BOND_AD_INFO_ACTOR_KEY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.actor_key = 1; + dst->actor_key = ynl_attr_get_u16(attr); + } else if (type == IFLA_BOND_AD_INFO_PARTNER_KEY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.partner_key = 1; + dst->partner_key = ynl_attr_get_u16(attr); + } else if (type == IFLA_BOND_AD_INFO_PARTNER_MAC) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.partner_mac = len; + dst->partner_mac = malloc(len); + memcpy(dst->partner_mac, ynl_attr_data(attr), len); + } + } + + return 0; +} + +void rt_link_ifla_vlan_qos_free(struct rt_link_ifla_vlan_qos *obj) +{ + free(obj->mapping); +} + +int rt_link_ifla_vlan_qos_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_ifla_vlan_qos *obj) +{ + struct nlattr *nest; + unsigned int i; + + nest = ynl_attr_nest_start(nlh, attr_type); + for (i = 0; i < obj->_count.mapping; i++) + ynl_attr_put(nlh, IFLA_VLAN_QOS_MAPPING, &obj->mapping[i], sizeof(struct ifla_vlan_qos_mapping)); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_ifla_vlan_qos_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_ifla_vlan_qos *dst = yarg->data; + unsigned int n_mapping = 0; + const struct nlattr *attr; + int i; + + if (dst->mapping) + return ynl_error_parse(yarg, "attribute already present (ifla-vlan-qos.mapping)"); + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_VLAN_QOS_MAPPING) { + n_mapping++; + } + } + + if (n_mapping) { + dst->mapping = calloc(n_mapping, sizeof(*dst->mapping)); + dst->_count.mapping = n_mapping; + i = 0; + ynl_attr_for_each_nested(attr, nested) { + if (ynl_attr_type(attr) == IFLA_VLAN_QOS_MAPPING) { + size_t len = ynl_attr_data_len(attr); + + if (len > sizeof(dst->mapping[0])) + len = sizeof(dst->mapping[0]); + memcpy(&dst->mapping[i], ynl_attr_data(attr), len); + i++; + } + } + } + + return 0; +} + +void rt_link_af_spec_attrs_free(struct rt_link_af_spec_attrs *obj) +{ + rt_link_ifla_attrs_free(&obj->inet); + rt_link_ifla6_attrs_free(&obj->inet6); + rt_link_mctp_attrs_free(&obj->mctp); +} + +int rt_link_af_spec_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_af_spec_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.inet) + rt_link_ifla_attrs_put(nlh, AF_INET, &obj->inet); + if (obj->_present.inet6) + rt_link_ifla6_attrs_put(nlh, AF_INET6, &obj->inet6); + if (obj->_present.mctp) + rt_link_mctp_attrs_put(nlh, AF_MCTP, &obj->mctp); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_af_spec_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_af_spec_attrs *dst = yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == AF_INET) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.inet = 1; + + parg.rsp_policy = &rt_link_ifla_attrs_nest; + parg.data = &dst->inet; + if (rt_link_ifla_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == AF_INET6) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.inet6 = 1; + + parg.rsp_policy = &rt_link_ifla6_attrs_nest; + parg.data = &dst->inet6; + if (rt_link_ifla6_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == AF_MCTP) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mctp = 1; + + parg.rsp_policy = &rt_link_mctp_attrs_nest; + parg.data = &dst->mctp; + if (rt_link_mctp_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } + } + + return 0; +} + +void rt_link_link_offload_xstats_free(struct rt_link_link_offload_xstats *obj) +{ + free(obj->cpu_hit); + free(obj->hw_s_info); + free(obj->l3_stats); +} + +int rt_link_link_offload_xstats_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_link_offload_xstats *dst = yarg->data; + const struct nlattr *attr_hw_s_info; + unsigned int n_hw_s_info = 0; + const struct nlattr *attr; + struct ynl_parse_arg parg; + int i; + + parg.ys = yarg->ys; + + if (dst->hw_s_info) + return ynl_error_parse(yarg, "attribute already present (link-offload-xstats.hw-s-info)"); + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_OFFLOAD_XSTATS_CPU_HIT) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.cpu_hit = len; + dst->cpu_hit = malloc(len); + memcpy(dst->cpu_hit, ynl_attr_data(attr), len); + } else if (type == IFLA_OFFLOAD_XSTATS_HW_S_INFO) { + const struct nlattr *attr2; + + attr_hw_s_info = attr; + ynl_attr_for_each_nested(attr2, attr) { + if (ynl_attr_validate(yarg, attr2)) + return YNL_PARSE_CB_ERROR; + dst->_count.hw_s_info++; + } + } else if (type == IFLA_OFFLOAD_XSTATS_L3_STATS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.l3_stats = len; + dst->l3_stats = malloc(len); + memcpy(dst->l3_stats, ynl_attr_data(attr), len); + } + } + + if (n_hw_s_info) { + dst->hw_s_info = calloc(n_hw_s_info, sizeof(*dst->hw_s_info)); + dst->_count.hw_s_info = n_hw_s_info; + i = 0; + parg.rsp_policy = &rt_link_hw_s_info_one_nest; + ynl_attr_for_each_nested(attr, attr_hw_s_info) { + parg.data = &dst->hw_s_info[i]; + if (rt_link_hw_s_info_one_parse(&parg, attr, ynl_attr_type(attr))) + return YNL_PARSE_CB_ERROR; + i++; + } + } + + return 0; +} + +void +rt_link_linkinfo_member_data_msg_free(struct rt_link_linkinfo_member_data_msg *obj) +{ + rt_link_linkinfo_brport_attrs_free(&obj->bridge); + rt_link_bond_slave_attrs_free(&obj->bond); +} + +int rt_link_linkinfo_member_data_msg_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_member_data_msg *obj) +{ + if (obj->_present.bridge) + rt_link_linkinfo_brport_attrs_put(nlh, IFLA_INFO_SLAVE_DATA, &obj->bridge); + if (obj->_present.bond) + rt_link_bond_slave_attrs_put(nlh, IFLA_INFO_SLAVE_DATA, &obj->bond); + + return 0; +} + +int rt_link_linkinfo_member_data_msg_parse(struct ynl_parse_arg *yarg, + const char *sel, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_member_data_msg *dst = yarg->data; + const struct nlattr *attr = nested; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + if (!strcmp(sel, "bridge")) { + parg.rsp_policy = &rt_link_linkinfo_brport_attrs_nest; + parg.data = &dst->bridge; + if (rt_link_linkinfo_brport_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.bridge = 1; + } else if (!strcmp(sel, "bond")) { + parg.rsp_policy = &rt_link_bond_slave_attrs_nest; + parg.data = &dst->bond; + if (rt_link_bond_slave_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.bond = 1; + } + return 0; +} + +void rt_link_vfinfo_attrs_free(struct rt_link_vfinfo_attrs *obj) +{ + free(obj->mac); + free(obj->vlan); + free(obj->tx_rate); + free(obj->spoofchk); + free(obj->link_state); + free(obj->rate); + free(obj->rss_query_en); + rt_link_vf_stats_attrs_free(&obj->stats); + free(obj->trust); + free(obj->ib_node_guid); + free(obj->ib_port_guid); + rt_link_vf_vlan_attrs_free(&obj->vlan_list); + free(obj->broadcast); +} + +int rt_link_vfinfo_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_vfinfo_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_len.mac) + ynl_attr_put(nlh, IFLA_VF_MAC, obj->mac, obj->_len.mac); + if (obj->_len.vlan) + ynl_attr_put(nlh, IFLA_VF_VLAN, obj->vlan, obj->_len.vlan); + if (obj->_len.tx_rate) + ynl_attr_put(nlh, IFLA_VF_TX_RATE, obj->tx_rate, obj->_len.tx_rate); + if (obj->_len.spoofchk) + ynl_attr_put(nlh, IFLA_VF_SPOOFCHK, obj->spoofchk, obj->_len.spoofchk); + if (obj->_len.link_state) + ynl_attr_put(nlh, IFLA_VF_LINK_STATE, obj->link_state, obj->_len.link_state); + if (obj->_len.rate) + ynl_attr_put(nlh, IFLA_VF_RATE, obj->rate, obj->_len.rate); + if (obj->_len.rss_query_en) + ynl_attr_put(nlh, IFLA_VF_RSS_QUERY_EN, obj->rss_query_en, obj->_len.rss_query_en); + if (obj->_present.stats) + rt_link_vf_stats_attrs_put(nlh, IFLA_VF_STATS, &obj->stats); + if (obj->_len.trust) + ynl_attr_put(nlh, IFLA_VF_TRUST, obj->trust, obj->_len.trust); + if (obj->_len.ib_node_guid) + ynl_attr_put(nlh, IFLA_VF_IB_NODE_GUID, obj->ib_node_guid, obj->_len.ib_node_guid); + if (obj->_len.ib_port_guid) + ynl_attr_put(nlh, IFLA_VF_IB_PORT_GUID, obj->ib_port_guid, obj->_len.ib_port_guid); + if (obj->_present.vlan_list) + rt_link_vf_vlan_attrs_put(nlh, IFLA_VF_VLAN_LIST, &obj->vlan_list); + if (obj->_len.broadcast) + ynl_attr_put(nlh, IFLA_VF_BROADCAST, obj->broadcast, obj->_len.broadcast); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_vfinfo_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_vfinfo_attrs *dst = yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_VF_MAC) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.mac = len; + if (len < sizeof(struct ifla_vf_mac)) + dst->mac = calloc(1, sizeof(struct ifla_vf_mac)); + else + dst->mac = malloc(len); + memcpy(dst->mac, ynl_attr_data(attr), len); + } else if (type == IFLA_VF_VLAN) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.vlan = len; + if (len < sizeof(struct ifla_vf_vlan)) + dst->vlan = calloc(1, sizeof(struct ifla_vf_vlan)); + else + dst->vlan = malloc(len); + memcpy(dst->vlan, ynl_attr_data(attr), len); + } else if (type == IFLA_VF_TX_RATE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.tx_rate = len; + if (len < sizeof(struct ifla_vf_tx_rate)) + dst->tx_rate = calloc(1, sizeof(struct ifla_vf_tx_rate)); + else + dst->tx_rate = malloc(len); + memcpy(dst->tx_rate, ynl_attr_data(attr), len); + } else if (type == IFLA_VF_SPOOFCHK) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.spoofchk = len; + if (len < sizeof(struct ifla_vf_spoofchk)) + dst->spoofchk = calloc(1, sizeof(struct ifla_vf_spoofchk)); + else + dst->spoofchk = malloc(len); + memcpy(dst->spoofchk, ynl_attr_data(attr), len); + } else if (type == IFLA_VF_LINK_STATE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.link_state = len; + if (len < sizeof(struct ifla_vf_link_state)) + dst->link_state = calloc(1, sizeof(struct ifla_vf_link_state)); + else + dst->link_state = malloc(len); + memcpy(dst->link_state, ynl_attr_data(attr), len); + } else if (type == IFLA_VF_RATE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.rate = len; + if (len < sizeof(struct ifla_vf_rate)) + dst->rate = calloc(1, sizeof(struct ifla_vf_rate)); + else + dst->rate = malloc(len); + memcpy(dst->rate, ynl_attr_data(attr), len); + } else if (type == IFLA_VF_RSS_QUERY_EN) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.rss_query_en = len; + if (len < sizeof(struct ifla_vf_rss_query_en)) + dst->rss_query_en = calloc(1, sizeof(struct ifla_vf_rss_query_en)); + else + dst->rss_query_en = malloc(len); + memcpy(dst->rss_query_en, ynl_attr_data(attr), len); + } else if (type == IFLA_VF_STATS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.stats = 1; + + parg.rsp_policy = &rt_link_vf_stats_attrs_nest; + parg.data = &dst->stats; + if (rt_link_vf_stats_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_VF_TRUST) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.trust = len; + if (len < sizeof(struct ifla_vf_trust)) + dst->trust = calloc(1, sizeof(struct ifla_vf_trust)); + else + dst->trust = malloc(len); + memcpy(dst->trust, ynl_attr_data(attr), len); + } else if (type == IFLA_VF_IB_NODE_GUID) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.ib_node_guid = len; + if (len < sizeof(struct ifla_vf_guid)) + dst->ib_node_guid = calloc(1, sizeof(struct ifla_vf_guid)); + else + dst->ib_node_guid = malloc(len); + memcpy(dst->ib_node_guid, ynl_attr_data(attr), len); + } else if (type == IFLA_VF_IB_PORT_GUID) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.ib_port_guid = len; + if (len < sizeof(struct ifla_vf_guid)) + dst->ib_port_guid = calloc(1, sizeof(struct ifla_vf_guid)); + else + dst->ib_port_guid = malloc(len); + memcpy(dst->ib_port_guid, ynl_attr_data(attr), len); + } else if (type == IFLA_VF_VLAN_LIST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vlan_list = 1; + + parg.rsp_policy = &rt_link_vf_vlan_attrs_nest; + parg.data = &dst->vlan_list; + if (rt_link_vf_vlan_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_VF_BROADCAST) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.broadcast = len; + dst->broadcast = malloc(len); + memcpy(dst->broadcast, ynl_attr_data(attr), len); + } + } + + return 0; +} + +void rt_link_linkinfo_bond_attrs_free(struct rt_link_linkinfo_bond_attrs *obj) +{ + free(obj->arp_ip_target); + rt_link_bond_ad_info_attrs_free(&obj->ad_info); + free(obj->ad_actor_system); + free(obj->ns_ip6_target); +} + +int rt_link_linkinfo_bond_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_bond_attrs *obj) +{ + struct nlattr *array; + struct nlattr *nest; + unsigned int i; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.mode) + ynl_attr_put_u8(nlh, IFLA_BOND_MODE, obj->mode); + if (obj->_present.active_slave) + ynl_attr_put_u32(nlh, IFLA_BOND_ACTIVE_SLAVE, obj->active_slave); + if (obj->_present.miimon) + ynl_attr_put_u32(nlh, IFLA_BOND_MIIMON, obj->miimon); + if (obj->_present.updelay) + ynl_attr_put_u32(nlh, IFLA_BOND_UPDELAY, obj->updelay); + if (obj->_present.downdelay) + ynl_attr_put_u32(nlh, IFLA_BOND_DOWNDELAY, obj->downdelay); + if (obj->_present.use_carrier) + ynl_attr_put_u8(nlh, IFLA_BOND_USE_CARRIER, obj->use_carrier); + if (obj->_present.arp_interval) + ynl_attr_put_u32(nlh, IFLA_BOND_ARP_INTERVAL, obj->arp_interval); + array = ynl_attr_nest_start(nlh, IFLA_BOND_ARP_IP_TARGET); + for (i = 0; i < obj->_count.arp_ip_target; i++) { + ynl_attr_put_u32(nlh, i, obj->arp_ip_target[i]); + } + ynl_attr_nest_end(nlh, array); + if (obj->_present.arp_validate) + ynl_attr_put_u32(nlh, IFLA_BOND_ARP_VALIDATE, obj->arp_validate); + if (obj->_present.arp_all_targets) + ynl_attr_put_u32(nlh, IFLA_BOND_ARP_ALL_TARGETS, obj->arp_all_targets); + if (obj->_present.primary) + ynl_attr_put_u32(nlh, IFLA_BOND_PRIMARY, obj->primary); + if (obj->_present.primary_reselect) + ynl_attr_put_u8(nlh, IFLA_BOND_PRIMARY_RESELECT, obj->primary_reselect); + if (obj->_present.fail_over_mac) + ynl_attr_put_u8(nlh, IFLA_BOND_FAIL_OVER_MAC, obj->fail_over_mac); + if (obj->_present.xmit_hash_policy) + ynl_attr_put_u8(nlh, IFLA_BOND_XMIT_HASH_POLICY, obj->xmit_hash_policy); + if (obj->_present.resend_igmp) + ynl_attr_put_u32(nlh, IFLA_BOND_RESEND_IGMP, obj->resend_igmp); + if (obj->_present.num_peer_notif) + ynl_attr_put_u8(nlh, IFLA_BOND_NUM_PEER_NOTIF, obj->num_peer_notif); + if (obj->_present.all_slaves_active) + ynl_attr_put_u8(nlh, IFLA_BOND_ALL_SLAVES_ACTIVE, obj->all_slaves_active); + if (obj->_present.min_links) + ynl_attr_put_u32(nlh, IFLA_BOND_MIN_LINKS, obj->min_links); + if (obj->_present.lp_interval) + ynl_attr_put_u32(nlh, IFLA_BOND_LP_INTERVAL, obj->lp_interval); + if (obj->_present.packets_per_slave) + ynl_attr_put_u32(nlh, IFLA_BOND_PACKETS_PER_SLAVE, obj->packets_per_slave); + if (obj->_present.ad_lacp_rate) + ynl_attr_put_u8(nlh, IFLA_BOND_AD_LACP_RATE, obj->ad_lacp_rate); + if (obj->_present.ad_select) + ynl_attr_put_u8(nlh, IFLA_BOND_AD_SELECT, obj->ad_select); + if (obj->_present.ad_info) + rt_link_bond_ad_info_attrs_put(nlh, IFLA_BOND_AD_INFO, &obj->ad_info); + if (obj->_present.ad_actor_sys_prio) + ynl_attr_put_u16(nlh, IFLA_BOND_AD_ACTOR_SYS_PRIO, obj->ad_actor_sys_prio); + if (obj->_present.ad_user_port_key) + ynl_attr_put_u16(nlh, IFLA_BOND_AD_USER_PORT_KEY, obj->ad_user_port_key); + if (obj->_len.ad_actor_system) + ynl_attr_put(nlh, IFLA_BOND_AD_ACTOR_SYSTEM, obj->ad_actor_system, obj->_len.ad_actor_system); + if (obj->_present.tlb_dynamic_lb) + ynl_attr_put_u8(nlh, IFLA_BOND_TLB_DYNAMIC_LB, obj->tlb_dynamic_lb); + if (obj->_present.peer_notif_delay) + ynl_attr_put_u32(nlh, IFLA_BOND_PEER_NOTIF_DELAY, obj->peer_notif_delay); + if (obj->_present.ad_lacp_active) + ynl_attr_put_u8(nlh, IFLA_BOND_AD_LACP_ACTIVE, obj->ad_lacp_active); + if (obj->_present.missed_max) + ynl_attr_put_u8(nlh, IFLA_BOND_MISSED_MAX, obj->missed_max); + array = ynl_attr_nest_start(nlh, IFLA_BOND_NS_IP6_TARGET); + for (i = 0; i < obj->_count.ns_ip6_target; i++) + ynl_attr_put(nlh, i, obj->ns_ip6_target[i], 16); + ynl_attr_nest_end(nlh, array); + if (obj->_present.coupled_control) + ynl_attr_put_u8(nlh, IFLA_BOND_COUPLED_CONTROL, obj->coupled_control); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_bond_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_bond_attrs *dst = yarg->data; + const struct nlattr *attr_arp_ip_target; + const struct nlattr *attr_ns_ip6_target; + unsigned int n_arp_ip_target = 0; + unsigned int n_ns_ip6_target = 0; + const struct nlattr *attr; + struct ynl_parse_arg parg; + int i; + + parg.ys = yarg->ys; + + if (dst->arp_ip_target) + return ynl_error_parse(yarg, "attribute already present (linkinfo-bond-attrs.arp-ip-target)"); + if (dst->ns_ip6_target) + return ynl_error_parse(yarg, "attribute already present (linkinfo-bond-attrs.ns-ip6-target)"); + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_BOND_MODE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mode = 1; + dst->mode = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_ACTIVE_SLAVE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.active_slave = 1; + dst->active_slave = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_MIIMON) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.miimon = 1; + dst->miimon = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_UPDELAY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.updelay = 1; + dst->updelay = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_DOWNDELAY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.downdelay = 1; + dst->downdelay = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_USE_CARRIER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.use_carrier = 1; + dst->use_carrier = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_ARP_INTERVAL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.arp_interval = 1; + dst->arp_interval = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_ARP_IP_TARGET) { + const struct nlattr *attr2; + + attr_arp_ip_target = attr; + ynl_attr_for_each_nested(attr2, attr) { + if (ynl_attr_validate(yarg, attr2)) + return YNL_PARSE_CB_ERROR; + dst->_count.arp_ip_target++; + } + } else if (type == IFLA_BOND_ARP_VALIDATE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.arp_validate = 1; + dst->arp_validate = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_ARP_ALL_TARGETS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.arp_all_targets = 1; + dst->arp_all_targets = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_PRIMARY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.primary = 1; + dst->primary = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_PRIMARY_RESELECT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.primary_reselect = 1; + dst->primary_reselect = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_FAIL_OVER_MAC) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fail_over_mac = 1; + dst->fail_over_mac = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_XMIT_HASH_POLICY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.xmit_hash_policy = 1; + dst->xmit_hash_policy = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_RESEND_IGMP) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.resend_igmp = 1; + dst->resend_igmp = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_NUM_PEER_NOTIF) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.num_peer_notif = 1; + dst->num_peer_notif = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_ALL_SLAVES_ACTIVE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.all_slaves_active = 1; + dst->all_slaves_active = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_MIN_LINKS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.min_links = 1; + dst->min_links = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_LP_INTERVAL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.lp_interval = 1; + dst->lp_interval = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_PACKETS_PER_SLAVE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.packets_per_slave = 1; + dst->packets_per_slave = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_AD_LACP_RATE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ad_lacp_rate = 1; + dst->ad_lacp_rate = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_AD_SELECT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ad_select = 1; + dst->ad_select = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_AD_INFO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ad_info = 1; + + parg.rsp_policy = &rt_link_bond_ad_info_attrs_nest; + parg.data = &dst->ad_info; + if (rt_link_bond_ad_info_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_BOND_AD_ACTOR_SYS_PRIO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ad_actor_sys_prio = 1; + dst->ad_actor_sys_prio = ynl_attr_get_u16(attr); + } else if (type == IFLA_BOND_AD_USER_PORT_KEY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ad_user_port_key = 1; + dst->ad_user_port_key = ynl_attr_get_u16(attr); + } else if (type == IFLA_BOND_AD_ACTOR_SYSTEM) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.ad_actor_system = len; + dst->ad_actor_system = malloc(len); + memcpy(dst->ad_actor_system, ynl_attr_data(attr), len); + } else if (type == IFLA_BOND_TLB_DYNAMIC_LB) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tlb_dynamic_lb = 1; + dst->tlb_dynamic_lb = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_PEER_NOTIF_DELAY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.peer_notif_delay = 1; + dst->peer_notif_delay = ynl_attr_get_u32(attr); + } else if (type == IFLA_BOND_AD_LACP_ACTIVE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ad_lacp_active = 1; + dst->ad_lacp_active = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_MISSED_MAX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.missed_max = 1; + dst->missed_max = ynl_attr_get_u8(attr); + } else if (type == IFLA_BOND_NS_IP6_TARGET) { + const struct nlattr *attr2; + + attr_ns_ip6_target = attr; + ynl_attr_for_each_nested(attr2, attr) { + if (ynl_attr_validate(yarg, attr2)) + return YNL_PARSE_CB_ERROR; + dst->_count.ns_ip6_target++; + } + } else if (type == IFLA_BOND_COUPLED_CONTROL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.coupled_control = 1; + dst->coupled_control = ynl_attr_get_u8(attr); + } + } + + if (n_arp_ip_target) { + dst->arp_ip_target = calloc(n_arp_ip_target, sizeof(*dst->arp_ip_target)); + dst->_count.arp_ip_target = n_arp_ip_target; + i = 0; + ynl_attr_for_each_nested(attr, attr_arp_ip_target) { + dst->arp_ip_target[i] = ynl_attr_get_u32(attr); + i++; + } + } + if (n_ns_ip6_target) { + dst->ns_ip6_target = calloc(n_ns_ip6_target, sizeof(*dst->ns_ip6_target)); + dst->_count.ns_ip6_target = n_ns_ip6_target; + i = 0; + ynl_attr_for_each_nested(attr, attr_ns_ip6_target) { + memcpy(dst->ns_ip6_target[i], ynl_attr_data(attr), 16); + i++; + } + } + + return 0; +} + +void rt_link_linkinfo_vlan_attrs_free(struct rt_link_linkinfo_vlan_attrs *obj) +{ + free(obj->flags); + rt_link_ifla_vlan_qos_free(&obj->egress_qos); + rt_link_ifla_vlan_qos_free(&obj->ingress_qos); +} + +int rt_link_linkinfo_vlan_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + struct rt_link_linkinfo_vlan_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.id) + ynl_attr_put_u16(nlh, IFLA_VLAN_ID, obj->id); + if (obj->_len.flags) + ynl_attr_put(nlh, IFLA_VLAN_FLAGS, obj->flags, obj->_len.flags); + if (obj->_present.egress_qos) + rt_link_ifla_vlan_qos_put(nlh, IFLA_VLAN_EGRESS_QOS, &obj->egress_qos); + if (obj->_present.ingress_qos) + rt_link_ifla_vlan_qos_put(nlh, IFLA_VLAN_INGRESS_QOS, &obj->ingress_qos); + if (obj->_present.protocol) + ynl_attr_put_u16(nlh, IFLA_VLAN_PROTOCOL, obj->protocol); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_vlan_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_vlan_attrs *dst = yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_VLAN_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.id = 1; + dst->id = ynl_attr_get_u16(attr); + } else if (type == IFLA_VLAN_FLAGS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.flags = len; + if (len < sizeof(struct ifla_vlan_flags)) + dst->flags = calloc(1, sizeof(struct ifla_vlan_flags)); + else + dst->flags = malloc(len); + memcpy(dst->flags, ynl_attr_data(attr), len); + } else if (type == IFLA_VLAN_EGRESS_QOS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.egress_qos = 1; + + parg.rsp_policy = &rt_link_ifla_vlan_qos_nest; + parg.data = &dst->egress_qos; + if (rt_link_ifla_vlan_qos_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_VLAN_INGRESS_QOS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ingress_qos = 1; + + parg.rsp_policy = &rt_link_ifla_vlan_qos_nest; + parg.data = &dst->ingress_qos; + if (rt_link_ifla_vlan_qos_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_VLAN_PROTOCOL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.protocol = 1; + dst->protocol = ynl_attr_get_u16(attr); + } + } + + return 0; +} + +void rt_link_vfinfo_list_attrs_free(struct rt_link_vfinfo_list_attrs *obj) +{ + unsigned int i; + + for (i = 0; i < obj->_count.info; i++) + rt_link_vfinfo_attrs_free(&obj->info[i]); + free(obj->info); +} + +int rt_link_vfinfo_list_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_vfinfo_list_attrs *obj) +{ + struct nlattr *nest; + unsigned int i; + + nest = ynl_attr_nest_start(nlh, attr_type); + for (i = 0; i < obj->_count.info; i++) + rt_link_vfinfo_attrs_put(nlh, IFLA_VF_INFO, &obj->info[i]); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_vfinfo_list_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_vfinfo_list_attrs *dst = yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + unsigned int n_info = 0; + int i; + + parg.ys = yarg->ys; + + if (dst->info) + return ynl_error_parse(yarg, "attribute already present (vfinfo-list-attrs.info)"); + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_VF_INFO) { + n_info++; + } + } + + if (n_info) { + dst->info = calloc(n_info, sizeof(*dst->info)); + dst->_count.info = n_info; + i = 0; + parg.rsp_policy = &rt_link_vfinfo_attrs_nest; + ynl_attr_for_each_nested(attr, nested) { + if (ynl_attr_type(attr) == IFLA_VF_INFO) { + parg.data = &dst->info[i]; + if (rt_link_vfinfo_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + i++; + } + } + } + + return 0; +} + +void rt_link_linkinfo_data_msg_free(struct rt_link_linkinfo_data_msg *obj) +{ + rt_link_linkinfo_bond_attrs_free(&obj->bond); + rt_link_linkinfo_bridge_attrs_free(&obj->bridge); + rt_link_linkinfo_gre_attrs_free(&obj->erspan); + rt_link_linkinfo_gre_attrs_free(&obj->gre); + rt_link_linkinfo_gre_attrs_free(&obj->gretap); + rt_link_linkinfo_geneve_attrs_free(&obj->geneve); + rt_link_linkinfo_iptun_attrs_free(&obj->ipip); + rt_link_linkinfo_ip6tnl_attrs_free(&obj->ip6tnl); + rt_link_linkinfo_iptun_attrs_free(&obj->sit); + rt_link_linkinfo_tun_attrs_free(&obj->tun); + rt_link_linkinfo_vlan_attrs_free(&obj->vlan); + rt_link_linkinfo_vrf_attrs_free(&obj->vrf); + rt_link_linkinfo_vti_attrs_free(&obj->vti); + rt_link_linkinfo_vti6_attrs_free(&obj->vti6); + rt_link_linkinfo_netkit_attrs_free(&obj->netkit); + rt_link_linkinfo_ovpn_attrs_free(&obj->ovpn); +} + +int rt_link_linkinfo_data_msg_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_linkinfo_data_msg *obj) +{ + if (obj->_present.bond) + rt_link_linkinfo_bond_attrs_put(nlh, IFLA_INFO_DATA, &obj->bond); + if (obj->_present.bridge) + rt_link_linkinfo_bridge_attrs_put(nlh, IFLA_INFO_DATA, &obj->bridge); + if (obj->_present.erspan) + rt_link_linkinfo_gre_attrs_put(nlh, IFLA_INFO_DATA, &obj->erspan); + if (obj->_present.gre) + rt_link_linkinfo_gre_attrs_put(nlh, IFLA_INFO_DATA, &obj->gre); + if (obj->_present.gretap) + rt_link_linkinfo_gre_attrs_put(nlh, IFLA_INFO_DATA, &obj->gretap); + if (obj->_present.geneve) + rt_link_linkinfo_geneve_attrs_put(nlh, IFLA_INFO_DATA, &obj->geneve); + if (obj->_present.ipip) + rt_link_linkinfo_iptun_attrs_put(nlh, IFLA_INFO_DATA, &obj->ipip); + if (obj->_present.ip6tnl) + rt_link_linkinfo_ip6tnl_attrs_put(nlh, IFLA_INFO_DATA, &obj->ip6tnl); + if (obj->_present.sit) + rt_link_linkinfo_iptun_attrs_put(nlh, IFLA_INFO_DATA, &obj->sit); + if (obj->_present.tun) + rt_link_linkinfo_tun_attrs_put(nlh, IFLA_INFO_DATA, &obj->tun); + if (obj->_present.vlan) + rt_link_linkinfo_vlan_attrs_put(nlh, IFLA_INFO_DATA, &obj->vlan); + if (obj->_present.vrf) + rt_link_linkinfo_vrf_attrs_put(nlh, IFLA_INFO_DATA, &obj->vrf); + if (obj->_present.vti) + rt_link_linkinfo_vti_attrs_put(nlh, IFLA_INFO_DATA, &obj->vti); + if (obj->_present.vti6) + rt_link_linkinfo_vti6_attrs_put(nlh, IFLA_INFO_DATA, &obj->vti6); + if (obj->_present.netkit) + rt_link_linkinfo_netkit_attrs_put(nlh, IFLA_INFO_DATA, &obj->netkit); + if (obj->_present.ovpn) + rt_link_linkinfo_ovpn_attrs_put(nlh, IFLA_INFO_DATA, &obj->ovpn); + + return 0; +} + +int rt_link_linkinfo_data_msg_parse(struct ynl_parse_arg *yarg, + const char *sel, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_data_msg *dst = yarg->data; + const struct nlattr *attr = nested; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + if (!strcmp(sel, "bond")) { + parg.rsp_policy = &rt_link_linkinfo_bond_attrs_nest; + parg.data = &dst->bond; + if (rt_link_linkinfo_bond_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.bond = 1; + } else if (!strcmp(sel, "bridge")) { + parg.rsp_policy = &rt_link_linkinfo_bridge_attrs_nest; + parg.data = &dst->bridge; + if (rt_link_linkinfo_bridge_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.bridge = 1; + } else if (!strcmp(sel, "erspan")) { + parg.rsp_policy = &rt_link_linkinfo_gre_attrs_nest; + parg.data = &dst->erspan; + if (rt_link_linkinfo_gre_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.erspan = 1; + } else if (!strcmp(sel, "gre")) { + parg.rsp_policy = &rt_link_linkinfo_gre_attrs_nest; + parg.data = &dst->gre; + if (rt_link_linkinfo_gre_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.gre = 1; + } else if (!strcmp(sel, "gretap")) { + parg.rsp_policy = &rt_link_linkinfo_gre_attrs_nest; + parg.data = &dst->gretap; + if (rt_link_linkinfo_gre_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.gretap = 1; + } else if (!strcmp(sel, "geneve")) { + parg.rsp_policy = &rt_link_linkinfo_geneve_attrs_nest; + parg.data = &dst->geneve; + if (rt_link_linkinfo_geneve_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.geneve = 1; + } else if (!strcmp(sel, "ipip")) { + parg.rsp_policy = &rt_link_linkinfo_iptun_attrs_nest; + parg.data = &dst->ipip; + if (rt_link_linkinfo_iptun_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ipip = 1; + } else if (!strcmp(sel, "ip6tnl")) { + parg.rsp_policy = &rt_link_linkinfo_ip6tnl_attrs_nest; + parg.data = &dst->ip6tnl; + if (rt_link_linkinfo_ip6tnl_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ip6tnl = 1; + } else if (!strcmp(sel, "sit")) { + parg.rsp_policy = &rt_link_linkinfo_iptun_attrs_nest; + parg.data = &dst->sit; + if (rt_link_linkinfo_iptun_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.sit = 1; + } else if (!strcmp(sel, "tun")) { + parg.rsp_policy = &rt_link_linkinfo_tun_attrs_nest; + parg.data = &dst->tun; + if (rt_link_linkinfo_tun_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tun = 1; + } else if (!strcmp(sel, "vlan")) { + parg.rsp_policy = &rt_link_linkinfo_vlan_attrs_nest; + parg.data = &dst->vlan; + if (rt_link_linkinfo_vlan_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vlan = 1; + } else if (!strcmp(sel, "vrf")) { + parg.rsp_policy = &rt_link_linkinfo_vrf_attrs_nest; + parg.data = &dst->vrf; + if (rt_link_linkinfo_vrf_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vrf = 1; + } else if (!strcmp(sel, "vti")) { + parg.rsp_policy = &rt_link_linkinfo_vti_attrs_nest; + parg.data = &dst->vti; + if (rt_link_linkinfo_vti_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vti = 1; + } else if (!strcmp(sel, "vti6")) { + parg.rsp_policy = &rt_link_linkinfo_vti6_attrs_nest; + parg.data = &dst->vti6; + if (rt_link_linkinfo_vti6_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vti6 = 1; + } else if (!strcmp(sel, "netkit")) { + parg.rsp_policy = &rt_link_linkinfo_netkit_attrs_nest; + parg.data = &dst->netkit; + if (rt_link_linkinfo_netkit_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.netkit = 1; + } else if (!strcmp(sel, "ovpn")) { + parg.rsp_policy = &rt_link_linkinfo_ovpn_attrs_nest; + parg.data = &dst->ovpn; + if (rt_link_linkinfo_ovpn_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ovpn = 1; + } + return 0; +} + +void rt_link_linkinfo_attrs_free(struct rt_link_linkinfo_attrs *obj) +{ + free(obj->kind); + rt_link_linkinfo_data_msg_free(&obj->data); + free(obj->xstats); + free(obj->slave_kind); + rt_link_linkinfo_member_data_msg_free(&obj->slave_data); +} + +int rt_link_linkinfo_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_link_linkinfo_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_len.kind) + ynl_attr_put_str(nlh, IFLA_INFO_KIND, obj->kind); + if (obj->_present.data) + rt_link_linkinfo_data_msg_put(nlh, IFLA_INFO_DATA, &obj->data); + if (obj->_len.xstats) + ynl_attr_put(nlh, IFLA_INFO_XSTATS, obj->xstats, obj->_len.xstats); + if (obj->_len.slave_kind) + ynl_attr_put_str(nlh, IFLA_INFO_SLAVE_KIND, obj->slave_kind); + if (obj->_present.slave_data) + rt_link_linkinfo_member_data_msg_put(nlh, IFLA_INFO_SLAVE_DATA, &obj->slave_data); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_link_linkinfo_attrs *dst = yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_INFO_KIND) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.kind = len; + dst->kind = malloc(len + 1); + memcpy(dst->kind, ynl_attr_get_str(attr), len); + dst->kind[len] = 0; + } else if (type == IFLA_INFO_DATA) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.data = 1; + + parg.rsp_policy = &rt_link_linkinfo_data_msg_nest; + parg.data = &dst->data; + if (!dst->kind) + return ynl_submsg_failed(yarg, "data", "kind"); + if (rt_link_linkinfo_data_msg_parse(&parg, dst->kind, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_INFO_XSTATS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.xstats = len; + dst->xstats = malloc(len); + memcpy(dst->xstats, ynl_attr_data(attr), len); + } else if (type == IFLA_INFO_SLAVE_KIND) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.slave_kind = len; + dst->slave_kind = malloc(len + 1); + memcpy(dst->slave_kind, ynl_attr_get_str(attr), len); + dst->slave_kind[len] = 0; + } else if (type == IFLA_INFO_SLAVE_DATA) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.slave_data = 1; + + parg.rsp_policy = &rt_link_linkinfo_member_data_msg_nest; + parg.data = &dst->slave_data; + if (!dst->slave_kind) + return ynl_submsg_failed(yarg, "slave-data", "slave-kind"); + if (rt_link_linkinfo_member_data_msg_parse(&parg, dst->slave_kind, attr)) + return YNL_PARSE_CB_ERROR; + } + } + + return 0; +} + +/* ============== RTM_NEWLINK ============== */ +/* RTM_NEWLINK - do */ +void rt_link_newlink_req_free(struct rt_link_newlink_req *req) +{ + free(req->ifname); + rt_link_linkinfo_attrs_free(&req->linkinfo); + free(req->address); + free(req->broadcast); + rt_link_af_spec_attrs_free(&req->af_spec); + free(req); +} + +int rt_link_newlink(struct ynl_sock *ys, struct rt_link_newlink_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_msg_start_req(ys, RTM_NEWLINK, req->_nlmsg_flags); + ys->req_policy = &rt_link_link_attrs_nest; + ys->req_hdr_len = sizeof(struct ifinfomsg); + + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + if (req->_len.ifname) + ynl_attr_put_str(nlh, IFLA_IFNAME, req->ifname); + if (req->_present.net_ns_pid) + ynl_attr_put_u32(nlh, IFLA_NET_NS_PID, req->net_ns_pid); + if (req->_present.net_ns_fd) + ynl_attr_put_u32(nlh, IFLA_NET_NS_FD, req->net_ns_fd); + if (req->_present.target_netnsid) + ynl_attr_put_s32(nlh, IFLA_TARGET_NETNSID, req->target_netnsid); + if (req->_present.link_netnsid) + ynl_attr_put_s32(nlh, IFLA_LINK_NETNSID, req->link_netnsid); + if (req->_present.linkinfo) + rt_link_linkinfo_attrs_put(nlh, IFLA_LINKINFO, &req->linkinfo); + if (req->_present.group) + ynl_attr_put_u32(nlh, IFLA_GROUP, req->group); + if (req->_present.num_tx_queues) + ynl_attr_put_u32(nlh, IFLA_NUM_TX_QUEUES, req->num_tx_queues); + if (req->_present.num_rx_queues) + ynl_attr_put_u32(nlh, IFLA_NUM_RX_QUEUES, req->num_rx_queues); + if (req->_len.address) + ynl_attr_put(nlh, IFLA_ADDRESS, req->address, req->_len.address); + if (req->_len.broadcast) + ynl_attr_put(nlh, IFLA_BROADCAST, req->broadcast, req->_len.broadcast); + if (req->_present.mtu) + ynl_attr_put_u32(nlh, IFLA_MTU, req->mtu); + if (req->_present.txqlen) + ynl_attr_put_u32(nlh, IFLA_TXQLEN, req->txqlen); + if (req->_present.operstate) + ynl_attr_put_u8(nlh, IFLA_OPERSTATE, req->operstate); + if (req->_present.linkmode) + ynl_attr_put_u8(nlh, IFLA_LINKMODE, req->linkmode); + if (req->_present.gso_max_size) + ynl_attr_put_u32(nlh, IFLA_GSO_MAX_SIZE, req->gso_max_size); + if (req->_present.gso_max_segs) + ynl_attr_put_u32(nlh, IFLA_GSO_MAX_SEGS, req->gso_max_segs); + if (req->_present.gro_max_size) + ynl_attr_put_u32(nlh, IFLA_GRO_MAX_SIZE, req->gro_max_size); + if (req->_present.gso_ipv4_max_size) + ynl_attr_put_u32(nlh, IFLA_GSO_IPV4_MAX_SIZE, req->gso_ipv4_max_size); + if (req->_present.gro_ipv4_max_size) + ynl_attr_put_u32(nlh, IFLA_GRO_IPV4_MAX_SIZE, req->gro_ipv4_max_size); + if (req->_present.af_spec) + rt_link_af_spec_attrs_put(nlh, IFLA_AF_SPEC, &req->af_spec); + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + return -1; + + return 0; +} + +/* ============== RTM_DELLINK ============== */ +/* RTM_DELLINK - do */ +void rt_link_dellink_req_free(struct rt_link_dellink_req *req) +{ + free(req->ifname); + free(req); +} + +int rt_link_dellink(struct ynl_sock *ys, struct rt_link_dellink_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_msg_start_req(ys, RTM_DELLINK, req->_nlmsg_flags); + ys->req_policy = &rt_link_link_attrs_nest; + ys->req_hdr_len = sizeof(struct ifinfomsg); + + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + if (req->_len.ifname) + ynl_attr_put_str(nlh, IFLA_IFNAME, req->ifname); + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + return -1; + + return 0; +} + +/* ============== RTM_GETLINK ============== */ +/* RTM_GETLINK - do */ +void rt_link_getlink_req_free(struct rt_link_getlink_req *req) +{ + free(req->ifname); + free(req->alt_ifname); + free(req); +} + +void rt_link_getlink_rsp_free(struct rt_link_getlink_rsp *rsp) +{ + free(rsp->address); + free(rsp->broadcast); + free(rsp->ifname); + free(rsp->qdisc); + free(rsp->stats); + free(rsp->cost); + free(rsp->priority); + free(rsp->wireless); + free(rsp->protinfo); + free(rsp->map); + rt_link_linkinfo_attrs_free(&rsp->linkinfo); + free(rsp->ifalias); + rt_link_vfinfo_list_attrs_free(&rsp->vfinfo_list); + free(rsp->stats64); + rt_link_vf_ports_attrs_free(&rsp->vf_ports); + rt_link_port_self_attrs_free(&rsp->port_self); + rt_link_af_spec_attrs_free(&rsp->af_spec); + free(rsp->phys_port_id); + free(rsp->phys_switch_id); + free(rsp->phys_port_name); + rt_link_xdp_attrs_free(&rsp->xdp); + rt_link_prop_list_link_attrs_free(&rsp->prop_list); + free(rsp->perm_address); + free(rsp->proto_down_reason); + free(rsp->parent_dev_name); + free(rsp->parent_dev_bus_name); + free(rsp->devlink_port); + free(rsp); +} + +int rt_link_getlink_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + struct rt_link_getlink_rsp *dst; + const struct nlattr *attr; + struct ynl_parse_arg parg; + void *hdr; + + dst = yarg->data; + parg.ys = yarg->ys; + + hdr = ynl_nlmsg_data(nlh); + memcpy(&dst->_hdr, hdr, sizeof(struct ifinfomsg)); + + ynl_attr_for_each(attr, nlh, sizeof(struct ifinfomsg)) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_ADDRESS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.address = len; + dst->address = malloc(len); + memcpy(dst->address, ynl_attr_data(attr), len); + } else if (type == IFLA_BROADCAST) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.broadcast = len; + dst->broadcast = malloc(len); + memcpy(dst->broadcast, ynl_attr_data(attr), len); + } else if (type == IFLA_IFNAME) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.ifname = len; + dst->ifname = malloc(len + 1); + memcpy(dst->ifname, ynl_attr_get_str(attr), len); + dst->ifname[len] = 0; + } else if (type == IFLA_MTU) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mtu = 1; + dst->mtu = ynl_attr_get_u32(attr); + } else if (type == IFLA_LINK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.link = 1; + dst->link = ynl_attr_get_u32(attr); + } else if (type == IFLA_QDISC) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.qdisc = len; + dst->qdisc = malloc(len + 1); + memcpy(dst->qdisc, ynl_attr_get_str(attr), len); + dst->qdisc[len] = 0; + } else if (type == IFLA_STATS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.stats = len; + if (len < sizeof(struct rtnl_link_stats)) + dst->stats = calloc(1, sizeof(struct rtnl_link_stats)); + else + dst->stats = malloc(len); + memcpy(dst->stats, ynl_attr_data(attr), len); + } else if (type == IFLA_COST) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.cost = len; + dst->cost = malloc(len + 1); + memcpy(dst->cost, ynl_attr_get_str(attr), len); + dst->cost[len] = 0; + } else if (type == IFLA_PRIORITY) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.priority = len; + dst->priority = malloc(len + 1); + memcpy(dst->priority, ynl_attr_get_str(attr), len); + dst->priority[len] = 0; + } else if (type == IFLA_MASTER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.master = 1; + dst->master = ynl_attr_get_u32(attr); + } else if (type == IFLA_WIRELESS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.wireless = len; + dst->wireless = malloc(len + 1); + memcpy(dst->wireless, ynl_attr_get_str(attr), len); + dst->wireless[len] = 0; + } else if (type == IFLA_PROTINFO) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.protinfo = len; + dst->protinfo = malloc(len + 1); + memcpy(dst->protinfo, ynl_attr_get_str(attr), len); + dst->protinfo[len] = 0; + } else if (type == IFLA_TXQLEN) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.txqlen = 1; + dst->txqlen = ynl_attr_get_u32(attr); + } else if (type == IFLA_MAP) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.map = len; + if (len < sizeof(struct rtnl_link_ifmap)) + dst->map = calloc(1, sizeof(struct rtnl_link_ifmap)); + else + dst->map = malloc(len); + memcpy(dst->map, ynl_attr_data(attr), len); + } else if (type == IFLA_WEIGHT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.weight = 1; + dst->weight = ynl_attr_get_u32(attr); + } else if (type == IFLA_OPERSTATE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.operstate = 1; + dst->operstate = ynl_attr_get_u8(attr); + } else if (type == IFLA_LINKMODE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.linkmode = 1; + dst->linkmode = ynl_attr_get_u8(attr); + } else if (type == IFLA_LINKINFO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.linkinfo = 1; + + parg.rsp_policy = &rt_link_linkinfo_attrs_nest; + parg.data = &dst->linkinfo; + if (rt_link_linkinfo_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_NET_NS_PID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.net_ns_pid = 1; + dst->net_ns_pid = ynl_attr_get_u32(attr); + } else if (type == IFLA_IFALIAS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.ifalias = len; + dst->ifalias = malloc(len + 1); + memcpy(dst->ifalias, ynl_attr_get_str(attr), len); + dst->ifalias[len] = 0; + } else if (type == IFLA_NUM_VF) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.num_vf = 1; + dst->num_vf = ynl_attr_get_u32(attr); + } else if (type == IFLA_VFINFO_LIST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vfinfo_list = 1; + + parg.rsp_policy = &rt_link_vfinfo_list_attrs_nest; + parg.data = &dst->vfinfo_list; + if (rt_link_vfinfo_list_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_STATS64) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.stats64 = len; + if (len < sizeof(struct rtnl_link_stats64)) + dst->stats64 = calloc(1, sizeof(struct rtnl_link_stats64)); + else + dst->stats64 = malloc(len); + memcpy(dst->stats64, ynl_attr_data(attr), len); + } else if (type == IFLA_VF_PORTS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vf_ports = 1; + + parg.rsp_policy = &rt_link_vf_ports_attrs_nest; + parg.data = &dst->vf_ports; + if (rt_link_vf_ports_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_PORT_SELF) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.port_self = 1; + + parg.rsp_policy = &rt_link_port_self_attrs_nest; + parg.data = &dst->port_self; + if (rt_link_port_self_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_AF_SPEC) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.af_spec = 1; + + parg.rsp_policy = &rt_link_af_spec_attrs_nest; + parg.data = &dst->af_spec; + if (rt_link_af_spec_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_GROUP) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.group = 1; + dst->group = ynl_attr_get_u32(attr); + } else if (type == IFLA_NET_NS_FD) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.net_ns_fd = 1; + dst->net_ns_fd = ynl_attr_get_u32(attr); + } else if (type == IFLA_EXT_MASK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ext_mask = 1; + dst->ext_mask = ynl_attr_get_u32(attr); + } else if (type == IFLA_PROMISCUITY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.promiscuity = 1; + dst->promiscuity = ynl_attr_get_u32(attr); + } else if (type == IFLA_NUM_TX_QUEUES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.num_tx_queues = 1; + dst->num_tx_queues = ynl_attr_get_u32(attr); + } else if (type == IFLA_NUM_RX_QUEUES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.num_rx_queues = 1; + dst->num_rx_queues = ynl_attr_get_u32(attr); + } else if (type == IFLA_CARRIER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.carrier = 1; + dst->carrier = ynl_attr_get_u8(attr); + } else if (type == IFLA_PHYS_PORT_ID) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.phys_port_id = len; + dst->phys_port_id = malloc(len); + memcpy(dst->phys_port_id, ynl_attr_data(attr), len); + } else if (type == IFLA_CARRIER_CHANGES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.carrier_changes = 1; + dst->carrier_changes = ynl_attr_get_u32(attr); + } else if (type == IFLA_PHYS_SWITCH_ID) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.phys_switch_id = len; + dst->phys_switch_id = malloc(len); + memcpy(dst->phys_switch_id, ynl_attr_data(attr), len); + } else if (type == IFLA_LINK_NETNSID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.link_netnsid = 1; + dst->link_netnsid = ynl_attr_get_s32(attr); + } else if (type == IFLA_PHYS_PORT_NAME) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.phys_port_name = len; + dst->phys_port_name = malloc(len + 1); + memcpy(dst->phys_port_name, ynl_attr_get_str(attr), len); + dst->phys_port_name[len] = 0; + } else if (type == IFLA_PROTO_DOWN) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.proto_down = 1; + dst->proto_down = ynl_attr_get_u8(attr); + } else if (type == IFLA_GSO_MAX_SEGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.gso_max_segs = 1; + dst->gso_max_segs = ynl_attr_get_u32(attr); + } else if (type == IFLA_GSO_MAX_SIZE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.gso_max_size = 1; + dst->gso_max_size = ynl_attr_get_u32(attr); + } else if (type == IFLA_XDP) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.xdp = 1; + + parg.rsp_policy = &rt_link_xdp_attrs_nest; + parg.data = &dst->xdp; + if (rt_link_xdp_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_EVENT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.event = 1; + dst->event = ynl_attr_get_u32(attr); + } else if (type == IFLA_NEW_NETNSID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.new_netnsid = 1; + dst->new_netnsid = ynl_attr_get_s32(attr); + } else if (type == IFLA_TARGET_NETNSID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.target_netnsid = 1; + dst->target_netnsid = ynl_attr_get_s32(attr); + } else if (type == IFLA_CARRIER_UP_COUNT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.carrier_up_count = 1; + dst->carrier_up_count = ynl_attr_get_u32(attr); + } else if (type == IFLA_CARRIER_DOWN_COUNT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.carrier_down_count = 1; + dst->carrier_down_count = ynl_attr_get_u32(attr); + } else if (type == IFLA_NEW_IFINDEX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.new_ifindex = 1; + dst->new_ifindex = ynl_attr_get_s32(attr); + } else if (type == IFLA_MIN_MTU) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.min_mtu = 1; + dst->min_mtu = ynl_attr_get_u32(attr); + } else if (type == IFLA_MAX_MTU) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.max_mtu = 1; + dst->max_mtu = ynl_attr_get_u32(attr); + } else if (type == IFLA_PROP_LIST) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.prop_list = 1; + + parg.rsp_policy = &rt_link_prop_list_link_attrs_nest; + parg.data = &dst->prop_list; + if (rt_link_prop_list_link_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_PERM_ADDRESS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.perm_address = len; + dst->perm_address = malloc(len); + memcpy(dst->perm_address, ynl_attr_data(attr), len); + } else if (type == IFLA_PROTO_DOWN_REASON) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.proto_down_reason = len; + dst->proto_down_reason = malloc(len + 1); + memcpy(dst->proto_down_reason, ynl_attr_get_str(attr), len); + dst->proto_down_reason[len] = 0; + } else if (type == IFLA_PARENT_DEV_NAME) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.parent_dev_name = len; + dst->parent_dev_name = malloc(len + 1); + memcpy(dst->parent_dev_name, ynl_attr_get_str(attr), len); + dst->parent_dev_name[len] = 0; + } else if (type == IFLA_PARENT_DEV_BUS_NAME) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.parent_dev_bus_name = len; + dst->parent_dev_bus_name = malloc(len + 1); + memcpy(dst->parent_dev_bus_name, ynl_attr_get_str(attr), len); + dst->parent_dev_bus_name[len] = 0; + } else if (type == IFLA_GRO_MAX_SIZE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.gro_max_size = 1; + dst->gro_max_size = ynl_attr_get_u32(attr); + } else if (type == IFLA_TSO_MAX_SIZE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tso_max_size = 1; + dst->tso_max_size = ynl_attr_get_u32(attr); + } else if (type == IFLA_TSO_MAX_SEGS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tso_max_segs = 1; + dst->tso_max_segs = ynl_attr_get_u32(attr); + } else if (type == IFLA_ALLMULTI) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.allmulti = 1; + dst->allmulti = ynl_attr_get_u32(attr); + } else if (type == IFLA_DEVLINK_PORT) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.devlink_port = len; + dst->devlink_port = malloc(len); + memcpy(dst->devlink_port, ynl_attr_data(attr), len); + } else if (type == IFLA_GSO_IPV4_MAX_SIZE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.gso_ipv4_max_size = 1; + dst->gso_ipv4_max_size = ynl_attr_get_u32(attr); + } else if (type == IFLA_GRO_IPV4_MAX_SIZE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.gro_ipv4_max_size = 1; + dst->gro_ipv4_max_size = ynl_attr_get_u32(attr); + } + } + + return YNL_PARSE_CB_OK; +} + +struct rt_link_getlink_rsp * +rt_link_getlink(struct ynl_sock *ys, struct rt_link_getlink_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct rt_link_getlink_rsp *rsp; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_msg_start_req(ys, RTM_GETLINK, req->_nlmsg_flags); + ys->req_policy = &rt_link_link_attrs_nest; + ys->req_hdr_len = sizeof(struct ifinfomsg); + yrs.yarg.rsp_policy = &rt_link_link_attrs_nest; + + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + if (req->_len.ifname) + ynl_attr_put_str(nlh, IFLA_IFNAME, req->ifname); + if (req->_len.alt_ifname) + ynl_attr_put_str(nlh, IFLA_ALT_IFNAME, req->alt_ifname); + if (req->_present.ext_mask) + ynl_attr_put_u32(nlh, IFLA_EXT_MASK, req->ext_mask); + if (req->_present.target_netnsid) + ynl_attr_put_s32(nlh, IFLA_TARGET_NETNSID, req->target_netnsid); + + rsp = calloc(1, sizeof(*rsp)); + yrs.yarg.data = rsp; + yrs.cb = rt_link_getlink_rsp_parse; + yrs.rsp_cmd = 16; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + goto err_free; + + return rsp; + +err_free: + rt_link_getlink_rsp_free(rsp); + return NULL; +} + +/* RTM_GETLINK - dump */ +void rt_link_getlink_req_dump_free(struct rt_link_getlink_req_dump *req) +{ + rt_link_linkinfo_attrs_free(&req->linkinfo); + free(req); +} + +void rt_link_getlink_list_free(struct rt_link_getlink_list *rsp) +{ + struct rt_link_getlink_list *next = rsp; + + while ((void *)next != YNL_LIST_END) { + rsp = next; + next = rsp->next; + + free(rsp->obj.address); + free(rsp->obj.broadcast); + free(rsp->obj.ifname); + free(rsp->obj.qdisc); + free(rsp->obj.stats); + free(rsp->obj.cost); + free(rsp->obj.priority); + free(rsp->obj.wireless); + free(rsp->obj.protinfo); + free(rsp->obj.map); + rt_link_linkinfo_attrs_free(&rsp->obj.linkinfo); + free(rsp->obj.ifalias); + rt_link_vfinfo_list_attrs_free(&rsp->obj.vfinfo_list); + free(rsp->obj.stats64); + rt_link_vf_ports_attrs_free(&rsp->obj.vf_ports); + rt_link_port_self_attrs_free(&rsp->obj.port_self); + rt_link_af_spec_attrs_free(&rsp->obj.af_spec); + free(rsp->obj.phys_port_id); + free(rsp->obj.phys_switch_id); + free(rsp->obj.phys_port_name); + rt_link_xdp_attrs_free(&rsp->obj.xdp); + rt_link_prop_list_link_attrs_free(&rsp->obj.prop_list); + free(rsp->obj.perm_address); + free(rsp->obj.proto_down_reason); + free(rsp->obj.parent_dev_name); + free(rsp->obj.parent_dev_bus_name); + free(rsp->obj.devlink_port); + free(rsp); + } +} + +struct rt_link_getlink_list * +rt_link_getlink_dump(struct ynl_sock *ys, struct rt_link_getlink_req_dump *req) +{ + struct ynl_dump_state yds = {}; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &rt_link_link_attrs_nest; + yds.yarg.data = NULL; + yds.alloc_sz = sizeof(struct rt_link_getlink_list); + yds.cb = rt_link_getlink_rsp_parse; + yds.rsp_cmd = 16; + + nlh = ynl_msg_start_dump(ys, RTM_GETLINK); + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + ys->req_policy = &rt_link_link_attrs_nest; + ys->req_hdr_len = sizeof(struct ifinfomsg); + + if (req->_present.target_netnsid) + ynl_attr_put_s32(nlh, IFLA_TARGET_NETNSID, req->target_netnsid); + if (req->_present.ext_mask) + ynl_attr_put_u32(nlh, IFLA_EXT_MASK, req->ext_mask); + if (req->_present.master) + ynl_attr_put_u32(nlh, IFLA_MASTER, req->master); + if (req->_present.linkinfo) + rt_link_linkinfo_attrs_put(nlh, IFLA_LINKINFO, &req->linkinfo); + + err = ynl_exec_dump(ys, nlh, &yds); + if (err < 0) + goto free_list; + + return yds.first; + +free_list: + rt_link_getlink_list_free(yds.first); + return NULL; +} + +/* RTM_GETLINK - notify */ +void rt_link_getlink_ntf_free(struct rt_link_getlink_ntf *rsp) +{ + free(rsp->obj.address); + free(rsp->obj.broadcast); + free(rsp->obj.ifname); + free(rsp->obj.qdisc); + free(rsp->obj.stats); + free(rsp->obj.cost); + free(rsp->obj.priority); + free(rsp->obj.wireless); + free(rsp->obj.protinfo); + free(rsp->obj.map); + rt_link_linkinfo_attrs_free(&rsp->obj.linkinfo); + free(rsp->obj.ifalias); + rt_link_vfinfo_list_attrs_free(&rsp->obj.vfinfo_list); + free(rsp->obj.stats64); + rt_link_vf_ports_attrs_free(&rsp->obj.vf_ports); + rt_link_port_self_attrs_free(&rsp->obj.port_self); + rt_link_af_spec_attrs_free(&rsp->obj.af_spec); + free(rsp->obj.phys_port_id); + free(rsp->obj.phys_switch_id); + free(rsp->obj.phys_port_name); + rt_link_xdp_attrs_free(&rsp->obj.xdp); + rt_link_prop_list_link_attrs_free(&rsp->obj.prop_list); + free(rsp->obj.perm_address); + free(rsp->obj.proto_down_reason); + free(rsp->obj.parent_dev_name); + free(rsp->obj.parent_dev_bus_name); + free(rsp->obj.devlink_port); + free(rsp); +} + +/* ============== RTM_SETLINK ============== */ +/* RTM_SETLINK - do */ +void rt_link_setlink_req_free(struct rt_link_setlink_req *req) +{ + free(req->address); + free(req->broadcast); + free(req->ifname); + free(req->qdisc); + free(req->stats); + free(req->cost); + free(req->priority); + free(req->wireless); + free(req->protinfo); + free(req->map); + rt_link_linkinfo_attrs_free(&req->linkinfo); + free(req->ifalias); + rt_link_vfinfo_list_attrs_free(&req->vfinfo_list); + free(req->stats64); + rt_link_vf_ports_attrs_free(&req->vf_ports); + rt_link_port_self_attrs_free(&req->port_self); + rt_link_af_spec_attrs_free(&req->af_spec); + free(req->phys_port_id); + free(req->phys_switch_id); + free(req->phys_port_name); + rt_link_xdp_attrs_free(&req->xdp); + rt_link_prop_list_link_attrs_free(&req->prop_list); + free(req->perm_address); + free(req->proto_down_reason); + free(req->parent_dev_name); + free(req->parent_dev_bus_name); + free(req->devlink_port); + free(req); +} + +int rt_link_setlink(struct ynl_sock *ys, struct rt_link_setlink_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_msg_start_req(ys, RTM_SETLINK, req->_nlmsg_flags); + ys->req_policy = &rt_link_link_attrs_nest; + ys->req_hdr_len = sizeof(struct ifinfomsg); + + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + if (req->_len.address) + ynl_attr_put(nlh, IFLA_ADDRESS, req->address, req->_len.address); + if (req->_len.broadcast) + ynl_attr_put(nlh, IFLA_BROADCAST, req->broadcast, req->_len.broadcast); + if (req->_len.ifname) + ynl_attr_put_str(nlh, IFLA_IFNAME, req->ifname); + if (req->_present.mtu) + ynl_attr_put_u32(nlh, IFLA_MTU, req->mtu); + if (req->_present.link) + ynl_attr_put_u32(nlh, IFLA_LINK, req->link); + if (req->_len.qdisc) + ynl_attr_put_str(nlh, IFLA_QDISC, req->qdisc); + if (req->_len.stats) + ynl_attr_put(nlh, IFLA_STATS, req->stats, req->_len.stats); + if (req->_len.cost) + ynl_attr_put_str(nlh, IFLA_COST, req->cost); + if (req->_len.priority) + ynl_attr_put_str(nlh, IFLA_PRIORITY, req->priority); + if (req->_present.master) + ynl_attr_put_u32(nlh, IFLA_MASTER, req->master); + if (req->_len.wireless) + ynl_attr_put_str(nlh, IFLA_WIRELESS, req->wireless); + if (req->_len.protinfo) + ynl_attr_put_str(nlh, IFLA_PROTINFO, req->protinfo); + if (req->_present.txqlen) + ynl_attr_put_u32(nlh, IFLA_TXQLEN, req->txqlen); + if (req->_len.map) + ynl_attr_put(nlh, IFLA_MAP, req->map, req->_len.map); + if (req->_present.weight) + ynl_attr_put_u32(nlh, IFLA_WEIGHT, req->weight); + if (req->_present.operstate) + ynl_attr_put_u8(nlh, IFLA_OPERSTATE, req->operstate); + if (req->_present.linkmode) + ynl_attr_put_u8(nlh, IFLA_LINKMODE, req->linkmode); + if (req->_present.linkinfo) + rt_link_linkinfo_attrs_put(nlh, IFLA_LINKINFO, &req->linkinfo); + if (req->_present.net_ns_pid) + ynl_attr_put_u32(nlh, IFLA_NET_NS_PID, req->net_ns_pid); + if (req->_len.ifalias) + ynl_attr_put_str(nlh, IFLA_IFALIAS, req->ifalias); + if (req->_present.num_vf) + ynl_attr_put_u32(nlh, IFLA_NUM_VF, req->num_vf); + if (req->_present.vfinfo_list) + rt_link_vfinfo_list_attrs_put(nlh, IFLA_VFINFO_LIST, &req->vfinfo_list); + if (req->_len.stats64) + ynl_attr_put(nlh, IFLA_STATS64, req->stats64, req->_len.stats64); + if (req->_present.vf_ports) + rt_link_vf_ports_attrs_put(nlh, IFLA_VF_PORTS, &req->vf_ports); + if (req->_present.port_self) + rt_link_port_self_attrs_put(nlh, IFLA_PORT_SELF, &req->port_self); + if (req->_present.af_spec) + rt_link_af_spec_attrs_put(nlh, IFLA_AF_SPEC, &req->af_spec); + if (req->_present.group) + ynl_attr_put_u32(nlh, IFLA_GROUP, req->group); + if (req->_present.net_ns_fd) + ynl_attr_put_u32(nlh, IFLA_NET_NS_FD, req->net_ns_fd); + if (req->_present.ext_mask) + ynl_attr_put_u32(nlh, IFLA_EXT_MASK, req->ext_mask); + if (req->_present.promiscuity) + ynl_attr_put_u32(nlh, IFLA_PROMISCUITY, req->promiscuity); + if (req->_present.num_tx_queues) + ynl_attr_put_u32(nlh, IFLA_NUM_TX_QUEUES, req->num_tx_queues); + if (req->_present.num_rx_queues) + ynl_attr_put_u32(nlh, IFLA_NUM_RX_QUEUES, req->num_rx_queues); + if (req->_present.carrier) + ynl_attr_put_u8(nlh, IFLA_CARRIER, req->carrier); + if (req->_len.phys_port_id) + ynl_attr_put(nlh, IFLA_PHYS_PORT_ID, req->phys_port_id, req->_len.phys_port_id); + if (req->_present.carrier_changes) + ynl_attr_put_u32(nlh, IFLA_CARRIER_CHANGES, req->carrier_changes); + if (req->_len.phys_switch_id) + ynl_attr_put(nlh, IFLA_PHYS_SWITCH_ID, req->phys_switch_id, req->_len.phys_switch_id); + if (req->_present.link_netnsid) + ynl_attr_put_s32(nlh, IFLA_LINK_NETNSID, req->link_netnsid); + if (req->_len.phys_port_name) + ynl_attr_put_str(nlh, IFLA_PHYS_PORT_NAME, req->phys_port_name); + if (req->_present.proto_down) + ynl_attr_put_u8(nlh, IFLA_PROTO_DOWN, req->proto_down); + if (req->_present.gso_max_segs) + ynl_attr_put_u32(nlh, IFLA_GSO_MAX_SEGS, req->gso_max_segs); + if (req->_present.gso_max_size) + ynl_attr_put_u32(nlh, IFLA_GSO_MAX_SIZE, req->gso_max_size); + if (req->_present.xdp) + rt_link_xdp_attrs_put(nlh, IFLA_XDP, &req->xdp); + if (req->_present.event) + ynl_attr_put_u32(nlh, IFLA_EVENT, req->event); + if (req->_present.new_netnsid) + ynl_attr_put_s32(nlh, IFLA_NEW_NETNSID, req->new_netnsid); + if (req->_present.target_netnsid) + ynl_attr_put_s32(nlh, IFLA_TARGET_NETNSID, req->target_netnsid); + if (req->_present.carrier_up_count) + ynl_attr_put_u32(nlh, IFLA_CARRIER_UP_COUNT, req->carrier_up_count); + if (req->_present.carrier_down_count) + ynl_attr_put_u32(nlh, IFLA_CARRIER_DOWN_COUNT, req->carrier_down_count); + if (req->_present.new_ifindex) + ynl_attr_put_s32(nlh, IFLA_NEW_IFINDEX, req->new_ifindex); + if (req->_present.min_mtu) + ynl_attr_put_u32(nlh, IFLA_MIN_MTU, req->min_mtu); + if (req->_present.max_mtu) + ynl_attr_put_u32(nlh, IFLA_MAX_MTU, req->max_mtu); + if (req->_present.prop_list) + rt_link_prop_list_link_attrs_put(nlh, IFLA_PROP_LIST, &req->prop_list); + if (req->_len.perm_address) + ynl_attr_put(nlh, IFLA_PERM_ADDRESS, req->perm_address, req->_len.perm_address); + if (req->_len.proto_down_reason) + ynl_attr_put_str(nlh, IFLA_PROTO_DOWN_REASON, req->proto_down_reason); + if (req->_len.parent_dev_name) + ynl_attr_put_str(nlh, IFLA_PARENT_DEV_NAME, req->parent_dev_name); + if (req->_len.parent_dev_bus_name) + ynl_attr_put_str(nlh, IFLA_PARENT_DEV_BUS_NAME, req->parent_dev_bus_name); + if (req->_present.gro_max_size) + ynl_attr_put_u32(nlh, IFLA_GRO_MAX_SIZE, req->gro_max_size); + if (req->_present.tso_max_size) + ynl_attr_put_u32(nlh, IFLA_TSO_MAX_SIZE, req->tso_max_size); + if (req->_present.tso_max_segs) + ynl_attr_put_u32(nlh, IFLA_TSO_MAX_SEGS, req->tso_max_segs); + if (req->_present.allmulti) + ynl_attr_put_u32(nlh, IFLA_ALLMULTI, req->allmulti); + if (req->_len.devlink_port) + ynl_attr_put(nlh, IFLA_DEVLINK_PORT, req->devlink_port, req->_len.devlink_port); + if (req->_present.gso_ipv4_max_size) + ynl_attr_put_u32(nlh, IFLA_GSO_IPV4_MAX_SIZE, req->gso_ipv4_max_size); + if (req->_present.gro_ipv4_max_size) + ynl_attr_put_u32(nlh, IFLA_GRO_IPV4_MAX_SIZE, req->gro_ipv4_max_size); + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + return -1; + + return 0; +} + +/* ============== RTM_GETSTATS ============== */ +/* RTM_GETSTATS - do */ +void rt_link_getstats_req_free(struct rt_link_getstats_req *req) +{ + free(req); +} + +void rt_link_getstats_rsp_free(struct rt_link_getstats_rsp *rsp) +{ + free(rsp->link_64); + free(rsp->link_xstats); + free(rsp->link_xstats_slave); + rt_link_link_offload_xstats_free(&rsp->link_offload_xstats); + free(rsp->af_spec); + free(rsp); +} + +int rt_link_getstats_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + struct rt_link_getstats_rsp *dst; + const struct nlattr *attr; + struct ynl_parse_arg parg; + void *hdr; + + dst = yarg->data; + parg.ys = yarg->ys; + + hdr = ynl_nlmsg_data(nlh); + memcpy(&dst->_hdr, hdr, sizeof(struct if_stats_msg)); + + ynl_attr_for_each(attr, nlh, sizeof(struct if_stats_msg)) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_STATS_LINK_64) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.link_64 = len; + if (len < sizeof(struct rtnl_link_stats64)) + dst->link_64 = calloc(1, sizeof(struct rtnl_link_stats64)); + else + dst->link_64 = malloc(len); + memcpy(dst->link_64, ynl_attr_data(attr), len); + } else if (type == IFLA_STATS_LINK_XSTATS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.link_xstats = len; + dst->link_xstats = malloc(len); + memcpy(dst->link_xstats, ynl_attr_data(attr), len); + } else if (type == IFLA_STATS_LINK_XSTATS_SLAVE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.link_xstats_slave = len; + dst->link_xstats_slave = malloc(len); + memcpy(dst->link_xstats_slave, ynl_attr_data(attr), len); + } else if (type == IFLA_STATS_LINK_OFFLOAD_XSTATS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.link_offload_xstats = 1; + + parg.rsp_policy = &rt_link_link_offload_xstats_nest; + parg.data = &dst->link_offload_xstats; + if (rt_link_link_offload_xstats_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == IFLA_STATS_AF_SPEC) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.af_spec = len; + dst->af_spec = malloc(len); + memcpy(dst->af_spec, ynl_attr_data(attr), len); + } + } + + return YNL_PARSE_CB_OK; +} + +struct rt_link_getstats_rsp * +rt_link_getstats(struct ynl_sock *ys, struct rt_link_getstats_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct rt_link_getstats_rsp *rsp; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_msg_start_req(ys, RTM_GETSTATS, req->_nlmsg_flags); + ys->req_policy = &rt_link_stats_attrs_nest; + ys->req_hdr_len = sizeof(struct if_stats_msg); + yrs.yarg.rsp_policy = &rt_link_stats_attrs_nest; + + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + rsp = calloc(1, sizeof(*rsp)); + yrs.yarg.data = rsp; + yrs.cb = rt_link_getstats_rsp_parse; + yrs.rsp_cmd = 92; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + goto err_free; + + return rsp; + +err_free: + rt_link_getstats_rsp_free(rsp); + return NULL; +} + +/* RTM_GETSTATS - dump */ +void rt_link_getstats_req_dump_free(struct rt_link_getstats_req_dump *req) +{ + free(req); +} + +void rt_link_getstats_list_free(struct rt_link_getstats_list *rsp) +{ + struct rt_link_getstats_list *next = rsp; + + while ((void *)next != YNL_LIST_END) { + rsp = next; + next = rsp->next; + + free(rsp->obj.link_64); + free(rsp->obj.link_xstats); + free(rsp->obj.link_xstats_slave); + rt_link_link_offload_xstats_free(&rsp->obj.link_offload_xstats); + free(rsp->obj.af_spec); + free(rsp); + } +} + +struct rt_link_getstats_list * +rt_link_getstats_dump(struct ynl_sock *ys, + struct rt_link_getstats_req_dump *req) +{ + struct ynl_dump_state yds = {}; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &rt_link_stats_attrs_nest; + yds.yarg.data = NULL; + yds.alloc_sz = sizeof(struct rt_link_getstats_list); + yds.cb = rt_link_getstats_rsp_parse; + yds.rsp_cmd = 92; + + nlh = ynl_msg_start_dump(ys, RTM_GETSTATS); + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + ys->req_policy = &rt_link_stats_attrs_nest; + ys->req_hdr_len = sizeof(struct if_stats_msg); + + err = ynl_exec_dump(ys, nlh, &yds); + if (err < 0) + goto free_list; + + return yds.first; + +free_list: + rt_link_getstats_list_free(yds.first); + return NULL; +} + +static const struct ynl_ntf_info rt_link_ntf_info[] = { + [RTM_NEWLINK] = { + .alloc_sz = sizeof(struct rt_link_getlink_ntf), + .cb = rt_link_getlink_rsp_parse, + .policy = &rt_link_link_attrs_nest, + .free = (void *)rt_link_getlink_ntf_free, + }, +}; + +const struct ynl_family ynl_rt_link_family = { + .name = "rt_link", + .is_classic = true, + .classic_id = 0, + .ntf_info = rt_link_ntf_info, + .ntf_info_size = YNL_ARRAY_SIZE(rt_link_ntf_info), +}; diff --git a/home/nipa/nipa_out/963409/ynl/new-code/rt-link-user.h b/home/nipa/nipa_out/963409/ynl/new-code/rt-link-user.h new file mode 100644 index 000000000000..3d2f815b7390 --- /dev/null +++ b/home/nipa/nipa_out/963409/ynl/new-code/rt-link-user.h @@ -0,0 +1,12141 @@ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* Do not edit directly, auto-generated from: */ +/* Documentation/netlink/specs/rt-link.yaml */ +/* YNL-GEN user header */ + +#ifndef _LINUX_RT_LINK_GEN_H +#define _LINUX_RT_LINK_GEN_H + +#include +#include +#include +#include +#include +#include +#include +#include + +struct ynl_sock; + +extern const struct ynl_family ynl_rt_link_family; + +/* Enums */ +const char *rt_link_op_str(int op); +const char *rt_link_ifinfo_flags_str(enum net_device_flags value); +const char *rt_link_vlan_protocols_str(int value); +const char *rt_link_ipv4_devconf_str(int value); +const char *rt_link_ipv6_devconf_str(int value); +const char *rt_link_ifla_icmp6_stats_str(int value); +const char *rt_link_ifla_inet6_stats_str(int value); +const char *rt_link_vlan_flags_str(int value); +const char *rt_link_ifla_vf_link_state_enum_str(int value); +const char *rt_link_rtext_filter_str(int value); +const char *rt_link_netkit_policy_str(int value); +const char *rt_link_netkit_mode_str(enum netkit_mode value); +const char *rt_link_netkit_scrub_str(int value); +const char *rt_link_ovpn_mode_str(enum ovpn_mode value); + +/* Common nested types */ +struct rt_link_vf_ports_attrs { +}; + +struct rt_link_port_self_attrs { +}; + +struct rt_link_xdp_attrs { + struct { + __u32 fd:1; + __u32 attached:1; + __u32 flags:1; + __u32 prog_id:1; + __u32 drv_prog_id:1; + __u32 skb_prog_id:1; + __u32 hw_prog_id:1; + __u32 expected_fd:1; + } _present; + + __s32 fd; + __u8 attached; + __u32 flags; + __u32 prog_id; + __u32 drv_prog_id; + __u32 skb_prog_id; + __u32 hw_prog_id; + __s32 expected_fd; +}; + +struct rt_link_prop_list_link_attrs { + struct { + __u32 alt_ifname; + } _count; + + struct ynl_string **alt_ifname; +}; + +struct rt_link_link_dpll_pin_attrs { + struct { + __u32 id:1; + } _present; + + __u32 id; +}; + +struct rt_link_ifla_attrs { + struct { + __u32 conf; + } _count; + + __u32 *conf; +}; + +struct rt_link_ifla6_attrs { + struct { + __u32 flags:1; + __u32 addr_gen_mode:1; + __u32 ra_mtu:1; + } _present; + struct { + __u32 mcast; + __u32 cacheinfo; + __u32 token; + } _len; + struct { + __u32 conf; + __u32 stats; + __u32 icmp6stats; + } _count; + + __u32 flags; + __u32 *conf; + __u64 *stats; + void *mcast; + struct ifla_cacheinfo *cacheinfo; + __u64 *icmp6stats; + void *token; + __u8 addr_gen_mode; + __u32 ra_mtu; +}; + +struct rt_link_mctp_attrs { + struct { + __u32 net:1; + __u32 phys_binding:1; + } _present; + + __u32 net; + __u8 phys_binding; +}; + +struct rt_link_hw_s_info_one { + struct { + __u32 request:1; + __u32 used:1; + } _present; + + __u32 idx; + __u8 request; + __u8 used; +}; + +struct rt_link_linkinfo_bridge_attrs { + struct { + __u32 forward_delay:1; + __u32 hello_time:1; + __u32 max_age:1; + __u32 ageing_time:1; + __u32 stp_state:1; + __u32 priority:1; + __u32 vlan_filtering:1; + __u32 vlan_protocol:1; + __u32 group_fwd_mask:1; + __u32 root_port:1; + __u32 root_path_cost:1; + __u32 topology_change:1; + __u32 topology_change_detected:1; + __u32 hello_timer:1; + __u32 tcn_timer:1; + __u32 topology_change_timer:1; + __u32 gc_timer:1; + __u32 mcast_router:1; + __u32 mcast_snooping:1; + __u32 mcast_query_use_ifaddr:1; + __u32 mcast_querier:1; + __u32 mcast_hash_elasticity:1; + __u32 mcast_hash_max:1; + __u32 mcast_last_member_cnt:1; + __u32 mcast_startup_query_cnt:1; + __u32 mcast_last_member_intvl:1; + __u32 mcast_membership_intvl:1; + __u32 mcast_querier_intvl:1; + __u32 mcast_query_intvl:1; + __u32 mcast_query_response_intvl:1; + __u32 mcast_startup_query_intvl:1; + __u32 nf_call_iptables:1; + __u32 nf_call_ip6tables:1; + __u32 nf_call_arptables:1; + __u32 vlan_default_pvid:1; + __u32 vlan_stats_enabled:1; + __u32 mcast_stats_enabled:1; + __u32 mcast_igmp_version:1; + __u32 mcast_mld_version:1; + __u32 vlan_stats_per_port:1; + __u32 fdb_n_learned:1; + __u32 fdb_max_learned:1; + } _present; + struct { + __u32 root_id; + __u32 bridge_id; + __u32 group_addr; + __u32 fdb_flush; + __u32 multi_boolopt; + __u32 mcast_querier_state; + } _len; + + __u32 forward_delay; + __u32 hello_time; + __u32 max_age; + __u32 ageing_time; + __u32 stp_state; + __u16 priority; + __u8 vlan_filtering; + __u16 vlan_protocol; + __u16 group_fwd_mask; + struct ifla_bridge_id *root_id; + struct ifla_bridge_id *bridge_id; + __u16 root_port; + __u32 root_path_cost; + __u8 topology_change; + __u8 topology_change_detected; + __u64 hello_timer; + __u64 tcn_timer; + __u64 topology_change_timer; + __u64 gc_timer; + void *group_addr; + void *fdb_flush; + __u8 mcast_router; + __u8 mcast_snooping; + __u8 mcast_query_use_ifaddr; + __u8 mcast_querier; + __u32 mcast_hash_elasticity; + __u32 mcast_hash_max; + __u32 mcast_last_member_cnt; + __u32 mcast_startup_query_cnt; + __u64 mcast_last_member_intvl; + __u64 mcast_membership_intvl; + __u64 mcast_querier_intvl; + __u64 mcast_query_intvl; + __u64 mcast_query_response_intvl; + __u64 mcast_startup_query_intvl; + __u8 nf_call_iptables; + __u8 nf_call_ip6tables; + __u8 nf_call_arptables; + __u16 vlan_default_pvid; + __u8 vlan_stats_enabled; + __u8 mcast_stats_enabled; + __u8 mcast_igmp_version; + __u8 mcast_mld_version; + __u8 vlan_stats_per_port; + struct br_boolopt_multi *multi_boolopt; + void *mcast_querier_state; + __u32 fdb_n_learned; + __u32 fdb_max_learned; +}; + +struct rt_link_linkinfo_gre_attrs { + struct { + __u32 link:1; + __u32 iflags:1; + __u32 oflags:1; + __u32 ikey:1; + __u32 okey:1; + __u32 ttl:1; + __u32 tos:1; + __u32 pmtudisc:1; + __u32 encap_limit:1; + __u32 flowinfo:1; + __u32 flags:1; + __u32 encap_type:1; + __u32 encap_flags:1; + __u32 encap_sport:1; + __u32 encap_dport:1; + __u32 collect_metadata:1; + __u32 ignore_df:1; + __u32 fwmark:1; + __u32 erspan_index:1; + __u32 erspan_ver:1; + __u32 erspan_dir:1; + __u32 erspan_hwid:1; + } _present; + struct { + __u32 local; + __u32 remote; + } _len; + + __u32 link; + __u16 iflags; + __u16 oflags; + __u32 ikey; + __u32 okey; + void *local; + void *remote; + __u8 ttl; + __u8 tos; + __u8 pmtudisc; + __u32 encap_limit; + __u32 flowinfo; + __u32 flags; + __u16 encap_type; + __u16 encap_flags; + __u16 encap_sport; + __u16 encap_dport; + __u8 ignore_df; + __u32 fwmark; + __u32 erspan_index; + __u8 erspan_ver; + __u8 erspan_dir; + __u16 erspan_hwid; +}; + +struct rt_link_linkinfo_geneve_attrs { + struct { + __u32 id:1; + __u32 ttl:1; + __u32 tos:1; + __u32 port:1; + __u32 collect_metadata:1; + __u32 udp_csum:1; + __u32 udp_zero_csum6_tx:1; + __u32 udp_zero_csum6_rx:1; + __u32 label:1; + __u32 ttl_inherit:1; + __u32 df:1; + __u32 inner_proto_inherit:1; + } _present; + struct { + __u32 remote; + __u32 remote6; + __u32 port_range; + } _len; + + __u32 id; + void *remote; + __u8 ttl; + __u8 tos; + __u16 port; + void *remote6; + __u8 udp_csum; + __u8 udp_zero_csum6_tx; + __u8 udp_zero_csum6_rx; + __u32 label; + __u8 ttl_inherit; + __u8 df; + struct ifla_geneve_port_range *port_range; +}; + +struct rt_link_linkinfo_iptun_attrs { + struct { + __u32 link:1; + __u32 ttl:1; + __u32 tos:1; + __u32 encap_limit:1; + __u32 flowinfo:1; + __u32 flags:1; + __u32 proto:1; + __u32 pmtudisc:1; + __u32 _6rd_prefixlen:1; + __u32 _6rd_relay_prefixlen:1; + __u32 encap_type:1; + __u32 encap_flags:1; + __u32 encap_sport:1; + __u32 encap_dport:1; + __u32 collect_metadata:1; + __u32 fwmark:1; + } _present; + struct { + __u32 local; + __u32 remote; + __u32 _6rd_prefix; + __u32 _6rd_relay_prefix; + } _len; + + __u32 link; + void *local; + void *remote; + __u8 ttl; + __u8 tos; + __u8 encap_limit; + __u32 flowinfo; + __u16 flags; + __u8 proto; + __u8 pmtudisc; + void *_6rd_prefix; + void *_6rd_relay_prefix; + __u16 _6rd_prefixlen; + __u16 _6rd_relay_prefixlen; + __u16 encap_type; + __u16 encap_flags; + __u16 encap_sport; + __u16 encap_dport; + __u32 fwmark; +}; + +struct rt_link_linkinfo_ip6tnl_attrs { + struct { + __u32 link:1; + __u32 ttl:1; + __u32 encap_limit:1; + __u32 flowinfo:1; + __u32 flags:1; + __u32 proto:1; + __u32 encap_type:1; + __u32 encap_flags:1; + __u32 encap_sport:1; + __u32 encap_dport:1; + __u32 collect_metadata:1; + __u32 fwmark:1; + } _present; + struct { + __u32 local; + __u32 remote; + } _len; + + __u32 link; + void *local; + void *remote; + __u8 ttl; + __u8 encap_limit; + __u32 flowinfo; + __u32 flags; + __u8 proto; + __u16 encap_type; + __u16 encap_flags; + __u16 encap_sport; + __u16 encap_dport; + __u32 fwmark; +}; + +struct rt_link_linkinfo_tun_attrs { + struct { + __u32 owner:1; + __u32 group:1; + __u32 type:1; + __u32 pi:1; + __u32 vnet_hdr:1; + __u32 persist:1; + __u32 multi_queue:1; + __u32 num_queues:1; + __u32 num_disabled_queues:1; + } _present; + + __u32 owner; + __u32 group; + __u8 type; + __u8 pi; + __u8 vnet_hdr; + __u8 persist; + __u8 multi_queue; + __u32 num_queues; + __u32 num_disabled_queues; +}; + +struct rt_link_linkinfo_vrf_attrs { + struct { + __u32 table:1; + } _present; + + __u32 table; +}; + +struct rt_link_linkinfo_vti_attrs { + struct { + __u32 link:1; + __u32 ikey:1; + __u32 okey:1; + __u32 fwmark:1; + } _present; + struct { + __u32 local; + __u32 remote; + } _len; + + __u32 link; + __u32 ikey; + __u32 okey; + void *local; + void *remote; + __u32 fwmark; +}; + +struct rt_link_linkinfo_vti6_attrs { + struct { + __u32 link:1; + __u32 ikey:1; + __u32 okey:1; + __u32 fwmark:1; + } _present; + struct { + __u32 local; + __u32 remote; + } _len; + + __u32 link; + __u32 ikey; + __u32 okey; + void *local; + void *remote; + __u32 fwmark; +}; + +struct rt_link_linkinfo_netkit_attrs { + struct { + __u32 primary:1; + __u32 policy:1; + __u32 peer_policy:1; + __u32 mode:1; + __u32 scrub:1; + __u32 peer_scrub:1; + __u32 headroom:1; + __u32 tailroom:1; + } _present; + struct { + __u32 peer_info; + } _len; + + void *peer_info; + __u8 primary; + int policy; + int peer_policy; + enum netkit_mode mode; + int scrub; + int peer_scrub; + __u16 headroom; + __u16 tailroom; +}; + +struct rt_link_linkinfo_ovpn_attrs { + struct { + __u32 mode:1; + } _present; + + enum ovpn_mode mode; +}; + +struct rt_link_linkinfo_brport_attrs { + struct { + __u32 state:1; + __u32 priority:1; + __u32 cost:1; + __u32 mode:1; + __u32 guard:1; + __u32 protect:1; + __u32 fast_leave:1; + __u32 learning:1; + __u32 unicast_flood:1; + __u32 proxyarp:1; + __u32 learning_sync:1; + __u32 proxyarp_wifi:1; + __u32 designated_port:1; + __u32 designated_cost:1; + __u32 id:1; + __u32 no:1; + __u32 topology_change_ack:1; + __u32 config_pending:1; + __u32 message_age_timer:1; + __u32 forward_delay_timer:1; + __u32 hold_timer:1; + __u32 flush:1; + __u32 multicast_router:1; + __u32 mcast_flood:1; + __u32 mcast_to_ucast:1; + __u32 vlan_tunnel:1; + __u32 bcast_flood:1; + __u32 group_fwd_mask:1; + __u32 neigh_suppress:1; + __u32 isolated:1; + __u32 backup_port:1; + __u32 mrp_ring_open:1; + __u32 mrp_in_open:1; + __u32 mcast_eht_hosts_limit:1; + __u32 mcast_eht_hosts_cnt:1; + __u32 locked:1; + __u32 mab:1; + __u32 mcast_n_groups:1; + __u32 mcast_max_groups:1; + __u32 neigh_vlan_suppress:1; + __u32 backup_nhid:1; + } _present; + struct { + __u32 root_id; + __u32 bridge_id; + } _len; + + __u8 state; + __u16 priority; + __u32 cost; + struct ifla_bridge_id *root_id; + struct ifla_bridge_id *bridge_id; + __u16 designated_port; + __u16 designated_cost; + __u16 id; + __u16 no; + __u8 topology_change_ack; + __u8 config_pending; + __u64 message_age_timer; + __u64 forward_delay_timer; + __u64 hold_timer; + __u8 multicast_router; + __u16 group_fwd_mask; + __u32 backup_port; + __u32 mcast_eht_hosts_limit; + __u32 mcast_eht_hosts_cnt; + __u32 mcast_n_groups; + __u32 mcast_max_groups; + __u32 backup_nhid; +}; + +struct rt_link_bond_slave_attrs { + struct { + __u32 state:1; + __u32 mii_status:1; + __u32 link_failure_count:1; + __u32 queue_id:1; + __u32 ad_aggregator_id:1; + __u32 ad_actor_oper_port_state:1; + __u32 ad_partner_oper_port_state:1; + __u32 prio:1; + } _present; + struct { + __u32 perm_hwaddr; + } _len; + + __u8 state; + __u8 mii_status; + __u32 link_failure_count; + void *perm_hwaddr; + __u16 queue_id; + __u16 ad_aggregator_id; + __u8 ad_actor_oper_port_state; + __u16 ad_partner_oper_port_state; + __u32 prio; +}; + +struct rt_link_vf_stats_attrs { + struct { + __u32 rx_packets:1; + __u32 tx_packets:1; + __u32 rx_bytes:1; + __u32 tx_bytes:1; + __u32 broadcast:1; + __u32 multicast:1; + __u32 rx_dropped:1; + __u32 tx_dropped:1; + } _present; + + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 broadcast; + __u64 multicast; + __u64 rx_dropped; + __u64 tx_dropped; +}; + +struct rt_link_vf_vlan_attrs { + struct { + __u32 info; + } _count; + + struct ifla_vf_vlan_info *info; + unsigned int n_info; +}; + +struct rt_link_bond_ad_info_attrs { + struct { + __u32 aggregator:1; + __u32 num_ports:1; + __u32 actor_key:1; + __u32 partner_key:1; + } _present; + struct { + __u32 partner_mac; + } _len; + + __u16 aggregator; + __u16 num_ports; + __u16 actor_key; + __u16 partner_key; + void *partner_mac; +}; + +struct rt_link_ifla_vlan_qos { + struct { + __u32 mapping; + } _count; + + struct ifla_vlan_qos_mapping *mapping; + unsigned int n_mapping; +}; + +struct rt_link_af_spec_attrs { + struct { + __u32 inet:1; + __u32 inet6:1; + __u32 mctp:1; + } _present; + + struct rt_link_ifla_attrs inet; + struct rt_link_ifla6_attrs inet6; + struct rt_link_mctp_attrs mctp; +}; + +struct rt_link_link_offload_xstats { + struct { + __u32 cpu_hit; + __u32 l3_stats; + } _len; + struct { + __u32 hw_s_info; + } _count; + + void *cpu_hit; + struct rt_link_hw_s_info_one *hw_s_info; + void *l3_stats; +}; + +struct rt_link_linkinfo_member_data_msg { + struct { + __u32 bridge:1; + __u32 bond:1; + } _present; + + struct rt_link_linkinfo_brport_attrs bridge; + struct rt_link_bond_slave_attrs bond; +}; + +struct rt_link_vfinfo_attrs { + struct { + __u32 stats:1; + __u32 vlan_list:1; + } _present; + struct { + __u32 mac; + __u32 vlan; + __u32 tx_rate; + __u32 spoofchk; + __u32 link_state; + __u32 rate; + __u32 rss_query_en; + __u32 trust; + __u32 ib_node_guid; + __u32 ib_port_guid; + __u32 broadcast; + } _len; + + struct ifla_vf_mac *mac; + struct ifla_vf_vlan *vlan; + struct ifla_vf_tx_rate *tx_rate; + struct ifla_vf_spoofchk *spoofchk; + struct ifla_vf_link_state *link_state; + struct ifla_vf_rate *rate; + struct ifla_vf_rss_query_en *rss_query_en; + struct rt_link_vf_stats_attrs stats; + struct ifla_vf_trust *trust; + struct ifla_vf_guid *ib_node_guid; + struct ifla_vf_guid *ib_port_guid; + struct rt_link_vf_vlan_attrs vlan_list; + void *broadcast; +}; + +void rt_link_vfinfo_attrs_free(struct rt_link_vfinfo_attrs *obj); + +struct rt_link_linkinfo_bond_attrs { + struct { + __u32 mode:1; + __u32 active_slave:1; + __u32 miimon:1; + __u32 updelay:1; + __u32 downdelay:1; + __u32 use_carrier:1; + __u32 arp_interval:1; + __u32 arp_validate:1; + __u32 arp_all_targets:1; + __u32 primary:1; + __u32 primary_reselect:1; + __u32 fail_over_mac:1; + __u32 xmit_hash_policy:1; + __u32 resend_igmp:1; + __u32 num_peer_notif:1; + __u32 all_slaves_active:1; + __u32 min_links:1; + __u32 lp_interval:1; + __u32 packets_per_slave:1; + __u32 ad_lacp_rate:1; + __u32 ad_select:1; + __u32 ad_info:1; + __u32 ad_actor_sys_prio:1; + __u32 ad_user_port_key:1; + __u32 tlb_dynamic_lb:1; + __u32 peer_notif_delay:1; + __u32 ad_lacp_active:1; + __u32 missed_max:1; + __u32 coupled_control:1; + } _present; + struct { + __u32 ad_actor_system; + } _len; + struct { + __u32 arp_ip_target; + __u32 ns_ip6_target; + } _count; + + __u8 mode; + __u32 active_slave; + __u32 miimon; + __u32 updelay; + __u32 downdelay; + __u8 use_carrier; + __u32 arp_interval; + __u32 *arp_ip_target; + __u32 arp_validate; + __u32 arp_all_targets; + __u32 primary; + __u8 primary_reselect; + __u8 fail_over_mac; + __u8 xmit_hash_policy; + __u32 resend_igmp; + __u8 num_peer_notif; + __u8 all_slaves_active; + __u32 min_links; + __u32 lp_interval; + __u32 packets_per_slave; + __u8 ad_lacp_rate; + __u8 ad_select; + struct rt_link_bond_ad_info_attrs ad_info; + __u16 ad_actor_sys_prio; + __u16 ad_user_port_key; + void *ad_actor_system; + __u8 tlb_dynamic_lb; + __u32 peer_notif_delay; + __u8 ad_lacp_active; + __u8 missed_max; + unsigned char (*ns_ip6_target)[16]; + unsigned int n_ns_ip6_target; + __u8 coupled_control; +}; + +struct rt_link_linkinfo_vlan_attrs { + struct { + __u32 id:1; + __u32 egress_qos:1; + __u32 ingress_qos:1; + __u32 protocol:1; + } _present; + struct { + __u32 flags; + } _len; + + __u16 id; + struct ifla_vlan_flags *flags; + struct rt_link_ifla_vlan_qos egress_qos; + struct rt_link_ifla_vlan_qos ingress_qos; + int protocol /* big-endian */; +}; + +struct rt_link_vfinfo_list_attrs { + struct { + __u32 info; + } _count; + + struct rt_link_vfinfo_attrs *info; +}; + +struct rt_link_linkinfo_data_msg { + struct { + __u32 bond:1; + __u32 bridge:1; + __u32 erspan:1; + __u32 gre:1; + __u32 gretap:1; + __u32 geneve:1; + __u32 ipip:1; + __u32 ip6tnl:1; + __u32 sit:1; + __u32 tun:1; + __u32 vlan:1; + __u32 vrf:1; + __u32 vti:1; + __u32 vti6:1; + __u32 netkit:1; + __u32 ovpn:1; + } _present; + + struct rt_link_linkinfo_bond_attrs bond; + struct rt_link_linkinfo_bridge_attrs bridge; + struct rt_link_linkinfo_gre_attrs erspan; + struct rt_link_linkinfo_gre_attrs gre; + struct rt_link_linkinfo_gre_attrs gretap; + struct rt_link_linkinfo_geneve_attrs geneve; + struct rt_link_linkinfo_iptun_attrs ipip; + struct rt_link_linkinfo_ip6tnl_attrs ip6tnl; + struct rt_link_linkinfo_iptun_attrs sit; + struct rt_link_linkinfo_tun_attrs tun; + struct rt_link_linkinfo_vlan_attrs vlan; + struct rt_link_linkinfo_vrf_attrs vrf; + struct rt_link_linkinfo_vti_attrs vti; + struct rt_link_linkinfo_vti6_attrs vti6; + struct rt_link_linkinfo_netkit_attrs netkit; + struct rt_link_linkinfo_ovpn_attrs ovpn; +}; + +struct rt_link_linkinfo_attrs { + struct { + __u32 data:1; + __u32 slave_data:1; + } _present; + struct { + __u32 kind; + __u32 xstats; + __u32 slave_kind; + } _len; + + char *kind; + struct rt_link_linkinfo_data_msg data; + void *xstats; + char *slave_kind; + struct rt_link_linkinfo_member_data_msg slave_data; +}; + +/* ============== RTM_NEWLINK ============== */ +/* RTM_NEWLINK - do */ +struct rt_link_newlink_req { + __u16 _nlmsg_flags; + + struct ifinfomsg _hdr; + + struct { + __u32 net_ns_pid:1; + __u32 net_ns_fd:1; + __u32 target_netnsid:1; + __u32 link_netnsid:1; + __u32 linkinfo:1; + __u32 group:1; + __u32 num_tx_queues:1; + __u32 num_rx_queues:1; + __u32 mtu:1; + __u32 txqlen:1; + __u32 operstate:1; + __u32 linkmode:1; + __u32 gso_max_size:1; + __u32 gso_max_segs:1; + __u32 gro_max_size:1; + __u32 gso_ipv4_max_size:1; + __u32 gro_ipv4_max_size:1; + __u32 af_spec:1; + } _present; + struct { + __u32 ifname; + __u32 address; + __u32 broadcast; + } _len; + + char *ifname; + __u32 net_ns_pid; + __u32 net_ns_fd; + __s32 target_netnsid; + __s32 link_netnsid; + struct rt_link_linkinfo_attrs linkinfo; + __u32 group; + __u32 num_tx_queues; + __u32 num_rx_queues; + void *address; + void *broadcast; + __u32 mtu; + __u32 txqlen; + __u8 operstate; + __u8 linkmode; + __u32 gso_max_size; + __u32 gso_max_segs; + __u32 gro_max_size; + __u32 gso_ipv4_max_size; + __u32 gro_ipv4_max_size; + struct rt_link_af_spec_attrs af_spec; +}; + +static inline struct rt_link_newlink_req *rt_link_newlink_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_link_newlink_req)); +} +void rt_link_newlink_req_free(struct rt_link_newlink_req *req); + +static inline void +rt_link_newlink_req_set_nlflags(struct rt_link_newlink_req *req, + __u16 nl_flags) +{ + req->_nlmsg_flags = nl_flags; +} + +static inline void +rt_link_newlink_req_set_ifname(struct rt_link_newlink_req *req, + const char *ifname) +{ + free(req->ifname); + req->_len.ifname = strlen(ifname); + req->ifname = malloc(req->_len.ifname + 1); + memcpy(req->ifname, ifname, req->_len.ifname); + req->ifname[req->_len.ifname] = 0; +} +static inline void +rt_link_newlink_req_set_net_ns_pid(struct rt_link_newlink_req *req, + __u32 net_ns_pid) +{ + req->_present.net_ns_pid = 1; + req->net_ns_pid = net_ns_pid; +} +static inline void +rt_link_newlink_req_set_net_ns_fd(struct rt_link_newlink_req *req, + __u32 net_ns_fd) +{ + req->_present.net_ns_fd = 1; + req->net_ns_fd = net_ns_fd; +} +static inline void +rt_link_newlink_req_set_target_netnsid(struct rt_link_newlink_req *req, + __s32 target_netnsid) +{ + req->_present.target_netnsid = 1; + req->target_netnsid = target_netnsid; +} +static inline void +rt_link_newlink_req_set_link_netnsid(struct rt_link_newlink_req *req, + __s32 link_netnsid) +{ + req->_present.link_netnsid = 1; + req->link_netnsid = link_netnsid; +} +static inline void +rt_link_newlink_req_set_linkinfo_kind(struct rt_link_newlink_req *req, + const char *kind) +{ + req->_present.linkinfo = 1; + free(req->linkinfo.kind); + req->linkinfo._len.kind = strlen(kind); + req->linkinfo.kind = malloc(req->linkinfo._len.kind + 1); + memcpy(req->linkinfo.kind, kind, req->linkinfo._len.kind); + req->linkinfo.kind[req->linkinfo._len.kind] = 0; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_mode(struct rt_link_newlink_req *req, + __u8 mode) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.mode = 1; + req->linkinfo.data.bond.mode = mode; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_active_slave(struct rt_link_newlink_req *req, + __u32 active_slave) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.active_slave = 1; + req->linkinfo.data.bond.active_slave = active_slave; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_miimon(struct rt_link_newlink_req *req, + __u32 miimon) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.miimon = 1; + req->linkinfo.data.bond.miimon = miimon; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_updelay(struct rt_link_newlink_req *req, + __u32 updelay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.updelay = 1; + req->linkinfo.data.bond.updelay = updelay; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_downdelay(struct rt_link_newlink_req *req, + __u32 downdelay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.downdelay = 1; + req->linkinfo.data.bond.downdelay = downdelay; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_use_carrier(struct rt_link_newlink_req *req, + __u8 use_carrier) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.use_carrier = 1; + req->linkinfo.data.bond.use_carrier = use_carrier; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_arp_interval(struct rt_link_newlink_req *req, + __u32 arp_interval) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.arp_interval = 1; + req->linkinfo.data.bond.arp_interval = arp_interval; +} +static inline void +__rt_link_newlink_req_set_linkinfo_data_bond_arp_ip_target(struct rt_link_newlink_req *req, + __u32 *arp_ip_target, + unsigned int n_arp_ip_target) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + free(req->linkinfo.data.bond.arp_ip_target); + req->linkinfo.data.bond.arp_ip_target = arp_ip_target; + req->linkinfo.data.bond._count.arp_ip_target = n_arp_ip_target; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_arp_validate(struct rt_link_newlink_req *req, + __u32 arp_validate) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.arp_validate = 1; + req->linkinfo.data.bond.arp_validate = arp_validate; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_arp_all_targets(struct rt_link_newlink_req *req, + __u32 arp_all_targets) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.arp_all_targets = 1; + req->linkinfo.data.bond.arp_all_targets = arp_all_targets; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_primary(struct rt_link_newlink_req *req, + __u32 primary) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.primary = 1; + req->linkinfo.data.bond.primary = primary; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_primary_reselect(struct rt_link_newlink_req *req, + __u8 primary_reselect) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.primary_reselect = 1; + req->linkinfo.data.bond.primary_reselect = primary_reselect; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_fail_over_mac(struct rt_link_newlink_req *req, + __u8 fail_over_mac) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.fail_over_mac = 1; + req->linkinfo.data.bond.fail_over_mac = fail_over_mac; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_xmit_hash_policy(struct rt_link_newlink_req *req, + __u8 xmit_hash_policy) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.xmit_hash_policy = 1; + req->linkinfo.data.bond.xmit_hash_policy = xmit_hash_policy; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_resend_igmp(struct rt_link_newlink_req *req, + __u32 resend_igmp) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.resend_igmp = 1; + req->linkinfo.data.bond.resend_igmp = resend_igmp; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_num_peer_notif(struct rt_link_newlink_req *req, + __u8 num_peer_notif) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.num_peer_notif = 1; + req->linkinfo.data.bond.num_peer_notif = num_peer_notif; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_all_slaves_active(struct rt_link_newlink_req *req, + __u8 all_slaves_active) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.all_slaves_active = 1; + req->linkinfo.data.bond.all_slaves_active = all_slaves_active; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_min_links(struct rt_link_newlink_req *req, + __u32 min_links) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.min_links = 1; + req->linkinfo.data.bond.min_links = min_links; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_lp_interval(struct rt_link_newlink_req *req, + __u32 lp_interval) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.lp_interval = 1; + req->linkinfo.data.bond.lp_interval = lp_interval; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_packets_per_slave(struct rt_link_newlink_req *req, + __u32 packets_per_slave) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.packets_per_slave = 1; + req->linkinfo.data.bond.packets_per_slave = packets_per_slave; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_ad_lacp_rate(struct rt_link_newlink_req *req, + __u8 ad_lacp_rate) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_lacp_rate = 1; + req->linkinfo.data.bond.ad_lacp_rate = ad_lacp_rate; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_ad_select(struct rt_link_newlink_req *req, + __u8 ad_select) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_select = 1; + req->linkinfo.data.bond.ad_select = ad_select; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_ad_info_aggregator(struct rt_link_newlink_req *req, + __u16 aggregator) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.aggregator = 1; + req->linkinfo.data.bond.ad_info.aggregator = aggregator; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_ad_info_num_ports(struct rt_link_newlink_req *req, + __u16 num_ports) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.num_ports = 1; + req->linkinfo.data.bond.ad_info.num_ports = num_ports; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_ad_info_actor_key(struct rt_link_newlink_req *req, + __u16 actor_key) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.actor_key = 1; + req->linkinfo.data.bond.ad_info.actor_key = actor_key; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_ad_info_partner_key(struct rt_link_newlink_req *req, + __u16 partner_key) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.partner_key = 1; + req->linkinfo.data.bond.ad_info.partner_key = partner_key; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_ad_info_partner_mac(struct rt_link_newlink_req *req, + const void *partner_mac, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + free(req->linkinfo.data.bond.ad_info.partner_mac); + req->linkinfo.data.bond.ad_info._len.partner_mac = len; + req->linkinfo.data.bond.ad_info.partner_mac = malloc(req->linkinfo.data.bond.ad_info._len.partner_mac); + memcpy(req->linkinfo.data.bond.ad_info.partner_mac, partner_mac, req->linkinfo.data.bond.ad_info._len.partner_mac); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_ad_actor_sys_prio(struct rt_link_newlink_req *req, + __u16 ad_actor_sys_prio) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_actor_sys_prio = 1; + req->linkinfo.data.bond.ad_actor_sys_prio = ad_actor_sys_prio; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_ad_user_port_key(struct rt_link_newlink_req *req, + __u16 ad_user_port_key) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_user_port_key = 1; + req->linkinfo.data.bond.ad_user_port_key = ad_user_port_key; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_ad_actor_system(struct rt_link_newlink_req *req, + const void *ad_actor_system, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + free(req->linkinfo.data.bond.ad_actor_system); + req->linkinfo.data.bond._len.ad_actor_system = len; + req->linkinfo.data.bond.ad_actor_system = malloc(req->linkinfo.data.bond._len.ad_actor_system); + memcpy(req->linkinfo.data.bond.ad_actor_system, ad_actor_system, req->linkinfo.data.bond._len.ad_actor_system); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_tlb_dynamic_lb(struct rt_link_newlink_req *req, + __u8 tlb_dynamic_lb) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.tlb_dynamic_lb = 1; + req->linkinfo.data.bond.tlb_dynamic_lb = tlb_dynamic_lb; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_peer_notif_delay(struct rt_link_newlink_req *req, + __u32 peer_notif_delay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.peer_notif_delay = 1; + req->linkinfo.data.bond.peer_notif_delay = peer_notif_delay; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_ad_lacp_active(struct rt_link_newlink_req *req, + __u8 ad_lacp_active) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_lacp_active = 1; + req->linkinfo.data.bond.ad_lacp_active = ad_lacp_active; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_missed_max(struct rt_link_newlink_req *req, + __u8 missed_max) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.missed_max = 1; + req->linkinfo.data.bond.missed_max = missed_max; +} +static inline void +__rt_link_newlink_req_set_linkinfo_data_bond_ns_ip6_target(struct rt_link_newlink_req *req, + unsigned char (*ns_ip6_target)[16], + unsigned int n_ns_ip6_target) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + free(req->linkinfo.data.bond.ns_ip6_target); + req->linkinfo.data.bond.ns_ip6_target = ns_ip6_target; + req->linkinfo.data.bond._count.ns_ip6_target = n_ns_ip6_target; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bond_coupled_control(struct rt_link_newlink_req *req, + __u8 coupled_control) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.coupled_control = 1; + req->linkinfo.data.bond.coupled_control = coupled_control; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_forward_delay(struct rt_link_newlink_req *req, + __u32 forward_delay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.forward_delay = 1; + req->linkinfo.data.bridge.forward_delay = forward_delay; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_hello_time(struct rt_link_newlink_req *req, + __u32 hello_time) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.hello_time = 1; + req->linkinfo.data.bridge.hello_time = hello_time; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_max_age(struct rt_link_newlink_req *req, + __u32 max_age) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.max_age = 1; + req->linkinfo.data.bridge.max_age = max_age; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_ageing_time(struct rt_link_newlink_req *req, + __u32 ageing_time) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.ageing_time = 1; + req->linkinfo.data.bridge.ageing_time = ageing_time; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_stp_state(struct rt_link_newlink_req *req, + __u32 stp_state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.stp_state = 1; + req->linkinfo.data.bridge.stp_state = stp_state; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_priority(struct rt_link_newlink_req *req, + __u16 priority) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.priority = 1; + req->linkinfo.data.bridge.priority = priority; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_vlan_filtering(struct rt_link_newlink_req *req, + __u8 vlan_filtering) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_filtering = 1; + req->linkinfo.data.bridge.vlan_filtering = vlan_filtering; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_vlan_protocol(struct rt_link_newlink_req *req, + __u16 vlan_protocol) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_protocol = 1; + req->linkinfo.data.bridge.vlan_protocol = vlan_protocol; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_group_fwd_mask(struct rt_link_newlink_req *req, + __u16 group_fwd_mask) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.group_fwd_mask = 1; + req->linkinfo.data.bridge.group_fwd_mask = group_fwd_mask; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_root_id(struct rt_link_newlink_req *req, + const void *root_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.root_id); + req->linkinfo.data.bridge._len.root_id = len; + req->linkinfo.data.bridge.root_id = malloc(req->linkinfo.data.bridge._len.root_id); + memcpy(req->linkinfo.data.bridge.root_id, root_id, req->linkinfo.data.bridge._len.root_id); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_bridge_id(struct rt_link_newlink_req *req, + const void *bridge_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.bridge_id); + req->linkinfo.data.bridge._len.bridge_id = len; + req->linkinfo.data.bridge.bridge_id = malloc(req->linkinfo.data.bridge._len.bridge_id); + memcpy(req->linkinfo.data.bridge.bridge_id, bridge_id, req->linkinfo.data.bridge._len.bridge_id); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_root_port(struct rt_link_newlink_req *req, + __u16 root_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.root_port = 1; + req->linkinfo.data.bridge.root_port = root_port; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_root_path_cost(struct rt_link_newlink_req *req, + __u32 root_path_cost) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.root_path_cost = 1; + req->linkinfo.data.bridge.root_path_cost = root_path_cost; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_topology_change(struct rt_link_newlink_req *req, + __u8 topology_change) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.topology_change = 1; + req->linkinfo.data.bridge.topology_change = topology_change; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_topology_change_detected(struct rt_link_newlink_req *req, + __u8 topology_change_detected) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.topology_change_detected = 1; + req->linkinfo.data.bridge.topology_change_detected = topology_change_detected; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_hello_timer(struct rt_link_newlink_req *req, + __u64 hello_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.hello_timer = 1; + req->linkinfo.data.bridge.hello_timer = hello_timer; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_tcn_timer(struct rt_link_newlink_req *req, + __u64 tcn_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.tcn_timer = 1; + req->linkinfo.data.bridge.tcn_timer = tcn_timer; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_topology_change_timer(struct rt_link_newlink_req *req, + __u64 topology_change_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.topology_change_timer = 1; + req->linkinfo.data.bridge.topology_change_timer = topology_change_timer; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_gc_timer(struct rt_link_newlink_req *req, + __u64 gc_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.gc_timer = 1; + req->linkinfo.data.bridge.gc_timer = gc_timer; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_group_addr(struct rt_link_newlink_req *req, + const void *group_addr, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.group_addr); + req->linkinfo.data.bridge._len.group_addr = len; + req->linkinfo.data.bridge.group_addr = malloc(req->linkinfo.data.bridge._len.group_addr); + memcpy(req->linkinfo.data.bridge.group_addr, group_addr, req->linkinfo.data.bridge._len.group_addr); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_fdb_flush(struct rt_link_newlink_req *req, + const void *fdb_flush, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.fdb_flush); + req->linkinfo.data.bridge._len.fdb_flush = len; + req->linkinfo.data.bridge.fdb_flush = malloc(req->linkinfo.data.bridge._len.fdb_flush); + memcpy(req->linkinfo.data.bridge.fdb_flush, fdb_flush, req->linkinfo.data.bridge._len.fdb_flush); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_router(struct rt_link_newlink_req *req, + __u8 mcast_router) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_router = 1; + req->linkinfo.data.bridge.mcast_router = mcast_router; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_snooping(struct rt_link_newlink_req *req, + __u8 mcast_snooping) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_snooping = 1; + req->linkinfo.data.bridge.mcast_snooping = mcast_snooping; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_query_use_ifaddr(struct rt_link_newlink_req *req, + __u8 mcast_query_use_ifaddr) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_query_use_ifaddr = 1; + req->linkinfo.data.bridge.mcast_query_use_ifaddr = mcast_query_use_ifaddr; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_querier(struct rt_link_newlink_req *req, + __u8 mcast_querier) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_querier = 1; + req->linkinfo.data.bridge.mcast_querier = mcast_querier; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_hash_elasticity(struct rt_link_newlink_req *req, + __u32 mcast_hash_elasticity) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_hash_elasticity = 1; + req->linkinfo.data.bridge.mcast_hash_elasticity = mcast_hash_elasticity; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_hash_max(struct rt_link_newlink_req *req, + __u32 mcast_hash_max) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_hash_max = 1; + req->linkinfo.data.bridge.mcast_hash_max = mcast_hash_max; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_last_member_cnt(struct rt_link_newlink_req *req, + __u32 mcast_last_member_cnt) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_last_member_cnt = 1; + req->linkinfo.data.bridge.mcast_last_member_cnt = mcast_last_member_cnt; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_startup_query_cnt(struct rt_link_newlink_req *req, + __u32 mcast_startup_query_cnt) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_startup_query_cnt = 1; + req->linkinfo.data.bridge.mcast_startup_query_cnt = mcast_startup_query_cnt; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_last_member_intvl(struct rt_link_newlink_req *req, + __u64 mcast_last_member_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_last_member_intvl = 1; + req->linkinfo.data.bridge.mcast_last_member_intvl = mcast_last_member_intvl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_membership_intvl(struct rt_link_newlink_req *req, + __u64 mcast_membership_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_membership_intvl = 1; + req->linkinfo.data.bridge.mcast_membership_intvl = mcast_membership_intvl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_querier_intvl(struct rt_link_newlink_req *req, + __u64 mcast_querier_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_querier_intvl = 1; + req->linkinfo.data.bridge.mcast_querier_intvl = mcast_querier_intvl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_query_intvl(struct rt_link_newlink_req *req, + __u64 mcast_query_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_query_intvl = 1; + req->linkinfo.data.bridge.mcast_query_intvl = mcast_query_intvl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_query_response_intvl(struct rt_link_newlink_req *req, + __u64 mcast_query_response_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_query_response_intvl = 1; + req->linkinfo.data.bridge.mcast_query_response_intvl = mcast_query_response_intvl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_startup_query_intvl(struct rt_link_newlink_req *req, + __u64 mcast_startup_query_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_startup_query_intvl = 1; + req->linkinfo.data.bridge.mcast_startup_query_intvl = mcast_startup_query_intvl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_nf_call_iptables(struct rt_link_newlink_req *req, + __u8 nf_call_iptables) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.nf_call_iptables = 1; + req->linkinfo.data.bridge.nf_call_iptables = nf_call_iptables; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_nf_call_ip6tables(struct rt_link_newlink_req *req, + __u8 nf_call_ip6tables) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.nf_call_ip6tables = 1; + req->linkinfo.data.bridge.nf_call_ip6tables = nf_call_ip6tables; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_nf_call_arptables(struct rt_link_newlink_req *req, + __u8 nf_call_arptables) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.nf_call_arptables = 1; + req->linkinfo.data.bridge.nf_call_arptables = nf_call_arptables; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_vlan_default_pvid(struct rt_link_newlink_req *req, + __u16 vlan_default_pvid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_default_pvid = 1; + req->linkinfo.data.bridge.vlan_default_pvid = vlan_default_pvid; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_vlan_stats_enabled(struct rt_link_newlink_req *req, + __u8 vlan_stats_enabled) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_stats_enabled = 1; + req->linkinfo.data.bridge.vlan_stats_enabled = vlan_stats_enabled; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_stats_enabled(struct rt_link_newlink_req *req, + __u8 mcast_stats_enabled) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_stats_enabled = 1; + req->linkinfo.data.bridge.mcast_stats_enabled = mcast_stats_enabled; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_igmp_version(struct rt_link_newlink_req *req, + __u8 mcast_igmp_version) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_igmp_version = 1; + req->linkinfo.data.bridge.mcast_igmp_version = mcast_igmp_version; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_mld_version(struct rt_link_newlink_req *req, + __u8 mcast_mld_version) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_mld_version = 1; + req->linkinfo.data.bridge.mcast_mld_version = mcast_mld_version; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_vlan_stats_per_port(struct rt_link_newlink_req *req, + __u8 vlan_stats_per_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_stats_per_port = 1; + req->linkinfo.data.bridge.vlan_stats_per_port = vlan_stats_per_port; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_multi_boolopt(struct rt_link_newlink_req *req, + const void *multi_boolopt, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.multi_boolopt); + req->linkinfo.data.bridge._len.multi_boolopt = len; + req->linkinfo.data.bridge.multi_boolopt = malloc(req->linkinfo.data.bridge._len.multi_boolopt); + memcpy(req->linkinfo.data.bridge.multi_boolopt, multi_boolopt, req->linkinfo.data.bridge._len.multi_boolopt); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_mcast_querier_state(struct rt_link_newlink_req *req, + const void *mcast_querier_state, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.mcast_querier_state); + req->linkinfo.data.bridge._len.mcast_querier_state = len; + req->linkinfo.data.bridge.mcast_querier_state = malloc(req->linkinfo.data.bridge._len.mcast_querier_state); + memcpy(req->linkinfo.data.bridge.mcast_querier_state, mcast_querier_state, req->linkinfo.data.bridge._len.mcast_querier_state); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_fdb_n_learned(struct rt_link_newlink_req *req, + __u32 fdb_n_learned) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.fdb_n_learned = 1; + req->linkinfo.data.bridge.fdb_n_learned = fdb_n_learned; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_bridge_fdb_max_learned(struct rt_link_newlink_req *req, + __u32 fdb_max_learned) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.fdb_max_learned = 1; + req->linkinfo.data.bridge.fdb_max_learned = fdb_max_learned; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_link(struct rt_link_newlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.link = 1; + req->linkinfo.data.erspan.link = link; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_iflags(struct rt_link_newlink_req *req, + __u16 iflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.iflags = 1; + req->linkinfo.data.erspan.iflags = iflags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_oflags(struct rt_link_newlink_req *req, + __u16 oflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.oflags = 1; + req->linkinfo.data.erspan.oflags = oflags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_ikey(struct rt_link_newlink_req *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.ikey = 1; + req->linkinfo.data.erspan.ikey = ikey; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_okey(struct rt_link_newlink_req *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.okey = 1; + req->linkinfo.data.erspan.okey = okey; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_local(struct rt_link_newlink_req *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + free(req->linkinfo.data.erspan.local); + req->linkinfo.data.erspan._len.local = len; + req->linkinfo.data.erspan.local = malloc(req->linkinfo.data.erspan._len.local); + memcpy(req->linkinfo.data.erspan.local, local, req->linkinfo.data.erspan._len.local); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_remote(struct rt_link_newlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + free(req->linkinfo.data.erspan.remote); + req->linkinfo.data.erspan._len.remote = len; + req->linkinfo.data.erspan.remote = malloc(req->linkinfo.data.erspan._len.remote); + memcpy(req->linkinfo.data.erspan.remote, remote, req->linkinfo.data.erspan._len.remote); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_ttl(struct rt_link_newlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.ttl = 1; + req->linkinfo.data.erspan.ttl = ttl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_tos(struct rt_link_newlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.tos = 1; + req->linkinfo.data.erspan.tos = tos; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_pmtudisc(struct rt_link_newlink_req *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.pmtudisc = 1; + req->linkinfo.data.erspan.pmtudisc = pmtudisc; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_encap_limit(struct rt_link_newlink_req *req, + __u32 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_limit = 1; + req->linkinfo.data.erspan.encap_limit = encap_limit; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_flowinfo(struct rt_link_newlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.flowinfo = 1; + req->linkinfo.data.erspan.flowinfo = flowinfo; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_flags(struct rt_link_newlink_req *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.flags = 1; + req->linkinfo.data.erspan.flags = flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_encap_type(struct rt_link_newlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_type = 1; + req->linkinfo.data.erspan.encap_type = encap_type; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_encap_flags(struct rt_link_newlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_flags = 1; + req->linkinfo.data.erspan.encap_flags = encap_flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_encap_sport(struct rt_link_newlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_sport = 1; + req->linkinfo.data.erspan.encap_sport = encap_sport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_encap_dport(struct rt_link_newlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_dport = 1; + req->linkinfo.data.erspan.encap_dport = encap_dport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_collect_metadata(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.collect_metadata = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_ignore_df(struct rt_link_newlink_req *req, + __u8 ignore_df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.ignore_df = 1; + req->linkinfo.data.erspan.ignore_df = ignore_df; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_fwmark(struct rt_link_newlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.fwmark = 1; + req->linkinfo.data.erspan.fwmark = fwmark; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_erspan_index(struct rt_link_newlink_req *req, + __u32 erspan_index) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_index = 1; + req->linkinfo.data.erspan.erspan_index = erspan_index; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_erspan_ver(struct rt_link_newlink_req *req, + __u8 erspan_ver) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_ver = 1; + req->linkinfo.data.erspan.erspan_ver = erspan_ver; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_erspan_dir(struct rt_link_newlink_req *req, + __u8 erspan_dir) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_dir = 1; + req->linkinfo.data.erspan.erspan_dir = erspan_dir; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_erspan_erspan_hwid(struct rt_link_newlink_req *req, + __u16 erspan_hwid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_hwid = 1; + req->linkinfo.data.erspan.erspan_hwid = erspan_hwid; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_link(struct rt_link_newlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.link = 1; + req->linkinfo.data.gre.link = link; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_iflags(struct rt_link_newlink_req *req, + __u16 iflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.iflags = 1; + req->linkinfo.data.gre.iflags = iflags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_oflags(struct rt_link_newlink_req *req, + __u16 oflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.oflags = 1; + req->linkinfo.data.gre.oflags = oflags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_ikey(struct rt_link_newlink_req *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.ikey = 1; + req->linkinfo.data.gre.ikey = ikey; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_okey(struct rt_link_newlink_req *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.okey = 1; + req->linkinfo.data.gre.okey = okey; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_local(struct rt_link_newlink_req *req, + const void *local, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + free(req->linkinfo.data.gre.local); + req->linkinfo.data.gre._len.local = len; + req->linkinfo.data.gre.local = malloc(req->linkinfo.data.gre._len.local); + memcpy(req->linkinfo.data.gre.local, local, req->linkinfo.data.gre._len.local); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_remote(struct rt_link_newlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + free(req->linkinfo.data.gre.remote); + req->linkinfo.data.gre._len.remote = len; + req->linkinfo.data.gre.remote = malloc(req->linkinfo.data.gre._len.remote); + memcpy(req->linkinfo.data.gre.remote, remote, req->linkinfo.data.gre._len.remote); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_ttl(struct rt_link_newlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.ttl = 1; + req->linkinfo.data.gre.ttl = ttl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_tos(struct rt_link_newlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.tos = 1; + req->linkinfo.data.gre.tos = tos; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_pmtudisc(struct rt_link_newlink_req *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.pmtudisc = 1; + req->linkinfo.data.gre.pmtudisc = pmtudisc; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_encap_limit(struct rt_link_newlink_req *req, + __u32 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_limit = 1; + req->linkinfo.data.gre.encap_limit = encap_limit; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_flowinfo(struct rt_link_newlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.flowinfo = 1; + req->linkinfo.data.gre.flowinfo = flowinfo; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_flags(struct rt_link_newlink_req *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.flags = 1; + req->linkinfo.data.gre.flags = flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_encap_type(struct rt_link_newlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_type = 1; + req->linkinfo.data.gre.encap_type = encap_type; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_encap_flags(struct rt_link_newlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_flags = 1; + req->linkinfo.data.gre.encap_flags = encap_flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_encap_sport(struct rt_link_newlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_sport = 1; + req->linkinfo.data.gre.encap_sport = encap_sport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_encap_dport(struct rt_link_newlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_dport = 1; + req->linkinfo.data.gre.encap_dport = encap_dport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_collect_metadata(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.collect_metadata = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_ignore_df(struct rt_link_newlink_req *req, + __u8 ignore_df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.ignore_df = 1; + req->linkinfo.data.gre.ignore_df = ignore_df; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_fwmark(struct rt_link_newlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.fwmark = 1; + req->linkinfo.data.gre.fwmark = fwmark; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_erspan_index(struct rt_link_newlink_req *req, + __u32 erspan_index) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_index = 1; + req->linkinfo.data.gre.erspan_index = erspan_index; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_erspan_ver(struct rt_link_newlink_req *req, + __u8 erspan_ver) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_ver = 1; + req->linkinfo.data.gre.erspan_ver = erspan_ver; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_erspan_dir(struct rt_link_newlink_req *req, + __u8 erspan_dir) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_dir = 1; + req->linkinfo.data.gre.erspan_dir = erspan_dir; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gre_erspan_hwid(struct rt_link_newlink_req *req, + __u16 erspan_hwid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_hwid = 1; + req->linkinfo.data.gre.erspan_hwid = erspan_hwid; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_link(struct rt_link_newlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.link = 1; + req->linkinfo.data.gretap.link = link; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_iflags(struct rt_link_newlink_req *req, + __u16 iflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.iflags = 1; + req->linkinfo.data.gretap.iflags = iflags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_oflags(struct rt_link_newlink_req *req, + __u16 oflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.oflags = 1; + req->linkinfo.data.gretap.oflags = oflags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_ikey(struct rt_link_newlink_req *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.ikey = 1; + req->linkinfo.data.gretap.ikey = ikey; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_okey(struct rt_link_newlink_req *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.okey = 1; + req->linkinfo.data.gretap.okey = okey; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_local(struct rt_link_newlink_req *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + free(req->linkinfo.data.gretap.local); + req->linkinfo.data.gretap._len.local = len; + req->linkinfo.data.gretap.local = malloc(req->linkinfo.data.gretap._len.local); + memcpy(req->linkinfo.data.gretap.local, local, req->linkinfo.data.gretap._len.local); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_remote(struct rt_link_newlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + free(req->linkinfo.data.gretap.remote); + req->linkinfo.data.gretap._len.remote = len; + req->linkinfo.data.gretap.remote = malloc(req->linkinfo.data.gretap._len.remote); + memcpy(req->linkinfo.data.gretap.remote, remote, req->linkinfo.data.gretap._len.remote); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_ttl(struct rt_link_newlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.ttl = 1; + req->linkinfo.data.gretap.ttl = ttl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_tos(struct rt_link_newlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.tos = 1; + req->linkinfo.data.gretap.tos = tos; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_pmtudisc(struct rt_link_newlink_req *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.pmtudisc = 1; + req->linkinfo.data.gretap.pmtudisc = pmtudisc; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_encap_limit(struct rt_link_newlink_req *req, + __u32 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_limit = 1; + req->linkinfo.data.gretap.encap_limit = encap_limit; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_flowinfo(struct rt_link_newlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.flowinfo = 1; + req->linkinfo.data.gretap.flowinfo = flowinfo; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_flags(struct rt_link_newlink_req *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.flags = 1; + req->linkinfo.data.gretap.flags = flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_encap_type(struct rt_link_newlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_type = 1; + req->linkinfo.data.gretap.encap_type = encap_type; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_encap_flags(struct rt_link_newlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_flags = 1; + req->linkinfo.data.gretap.encap_flags = encap_flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_encap_sport(struct rt_link_newlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_sport = 1; + req->linkinfo.data.gretap.encap_sport = encap_sport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_encap_dport(struct rt_link_newlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_dport = 1; + req->linkinfo.data.gretap.encap_dport = encap_dport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_collect_metadata(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.collect_metadata = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_ignore_df(struct rt_link_newlink_req *req, + __u8 ignore_df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.ignore_df = 1; + req->linkinfo.data.gretap.ignore_df = ignore_df; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_fwmark(struct rt_link_newlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.fwmark = 1; + req->linkinfo.data.gretap.fwmark = fwmark; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_erspan_index(struct rt_link_newlink_req *req, + __u32 erspan_index) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_index = 1; + req->linkinfo.data.gretap.erspan_index = erspan_index; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_erspan_ver(struct rt_link_newlink_req *req, + __u8 erspan_ver) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_ver = 1; + req->linkinfo.data.gretap.erspan_ver = erspan_ver; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_erspan_dir(struct rt_link_newlink_req *req, + __u8 erspan_dir) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_dir = 1; + req->linkinfo.data.gretap.erspan_dir = erspan_dir; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_gretap_erspan_hwid(struct rt_link_newlink_req *req, + __u16 erspan_hwid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_hwid = 1; + req->linkinfo.data.gretap.erspan_hwid = erspan_hwid; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_id(struct rt_link_newlink_req *req, + __u32 id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.id = 1; + req->linkinfo.data.geneve.id = id; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_remote(struct rt_link_newlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + free(req->linkinfo.data.geneve.remote); + req->linkinfo.data.geneve._len.remote = len; + req->linkinfo.data.geneve.remote = malloc(req->linkinfo.data.geneve._len.remote); + memcpy(req->linkinfo.data.geneve.remote, remote, req->linkinfo.data.geneve._len.remote); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_ttl(struct rt_link_newlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.ttl = 1; + req->linkinfo.data.geneve.ttl = ttl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_tos(struct rt_link_newlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.tos = 1; + req->linkinfo.data.geneve.tos = tos; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_port(struct rt_link_newlink_req *req, + __u16 port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.port = 1; + req->linkinfo.data.geneve.port = port; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_collect_metadata(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.collect_metadata = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_remote6(struct rt_link_newlink_req *req, + const void *remote6, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + free(req->linkinfo.data.geneve.remote6); + req->linkinfo.data.geneve._len.remote6 = len; + req->linkinfo.data.geneve.remote6 = malloc(req->linkinfo.data.geneve._len.remote6); + memcpy(req->linkinfo.data.geneve.remote6, remote6, req->linkinfo.data.geneve._len.remote6); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_udp_csum(struct rt_link_newlink_req *req, + __u8 udp_csum) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.udp_csum = 1; + req->linkinfo.data.geneve.udp_csum = udp_csum; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_udp_zero_csum6_tx(struct rt_link_newlink_req *req, + __u8 udp_zero_csum6_tx) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.udp_zero_csum6_tx = 1; + req->linkinfo.data.geneve.udp_zero_csum6_tx = udp_zero_csum6_tx; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_udp_zero_csum6_rx(struct rt_link_newlink_req *req, + __u8 udp_zero_csum6_rx) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.udp_zero_csum6_rx = 1; + req->linkinfo.data.geneve.udp_zero_csum6_rx = udp_zero_csum6_rx; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_label(struct rt_link_newlink_req *req, + __u32 label) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.label = 1; + req->linkinfo.data.geneve.label = label; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_ttl_inherit(struct rt_link_newlink_req *req, + __u8 ttl_inherit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.ttl_inherit = 1; + req->linkinfo.data.geneve.ttl_inherit = ttl_inherit; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_df(struct rt_link_newlink_req *req, + __u8 df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.df = 1; + req->linkinfo.data.geneve.df = df; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_inner_proto_inherit(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.inner_proto_inherit = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_geneve_port_range(struct rt_link_newlink_req *req, + const void *port_range, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + free(req->linkinfo.data.geneve.port_range); + req->linkinfo.data.geneve._len.port_range = len; + req->linkinfo.data.geneve.port_range = malloc(req->linkinfo.data.geneve._len.port_range); + memcpy(req->linkinfo.data.geneve.port_range, port_range, req->linkinfo.data.geneve._len.port_range); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_link(struct rt_link_newlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.link = 1; + req->linkinfo.data.ipip.link = link; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_local(struct rt_link_newlink_req *req, + const void *local, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip.local); + req->linkinfo.data.ipip._len.local = len; + req->linkinfo.data.ipip.local = malloc(req->linkinfo.data.ipip._len.local); + memcpy(req->linkinfo.data.ipip.local, local, req->linkinfo.data.ipip._len.local); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_remote(struct rt_link_newlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip.remote); + req->linkinfo.data.ipip._len.remote = len; + req->linkinfo.data.ipip.remote = malloc(req->linkinfo.data.ipip._len.remote); + memcpy(req->linkinfo.data.ipip.remote, remote, req->linkinfo.data.ipip._len.remote); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_ttl(struct rt_link_newlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.ttl = 1; + req->linkinfo.data.ipip.ttl = ttl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_tos(struct rt_link_newlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.tos = 1; + req->linkinfo.data.ipip.tos = tos; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_encap_limit(struct rt_link_newlink_req *req, + __u8 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_limit = 1; + req->linkinfo.data.ipip.encap_limit = encap_limit; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_flowinfo(struct rt_link_newlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.flowinfo = 1; + req->linkinfo.data.ipip.flowinfo = flowinfo; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_flags(struct rt_link_newlink_req *req, + __u16 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.flags = 1; + req->linkinfo.data.ipip.flags = flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_proto(struct rt_link_newlink_req *req, + __u8 proto) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.proto = 1; + req->linkinfo.data.ipip.proto = proto; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_pmtudisc(struct rt_link_newlink_req *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.pmtudisc = 1; + req->linkinfo.data.ipip.pmtudisc = pmtudisc; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip__6rd_prefix(struct rt_link_newlink_req *req, + const void *_6rd_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip._6rd_prefix); + req->linkinfo.data.ipip._len._6rd_prefix = len; + req->linkinfo.data.ipip._6rd_prefix = malloc(req->linkinfo.data.ipip._len._6rd_prefix); + memcpy(req->linkinfo.data.ipip._6rd_prefix, _6rd_prefix, req->linkinfo.data.ipip._len._6rd_prefix); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip__6rd_relay_prefix(struct rt_link_newlink_req *req, + const void *_6rd_relay_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip._6rd_relay_prefix); + req->linkinfo.data.ipip._len._6rd_relay_prefix = len; + req->linkinfo.data.ipip._6rd_relay_prefix = malloc(req->linkinfo.data.ipip._len._6rd_relay_prefix); + memcpy(req->linkinfo.data.ipip._6rd_relay_prefix, _6rd_relay_prefix, req->linkinfo.data.ipip._len._6rd_relay_prefix); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip__6rd_prefixlen(struct rt_link_newlink_req *req, + __u16 _6rd_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present._6rd_prefixlen = 1; + req->linkinfo.data.ipip._6rd_prefixlen = _6rd_prefixlen; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip__6rd_relay_prefixlen(struct rt_link_newlink_req *req, + __u16 _6rd_relay_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present._6rd_relay_prefixlen = 1; + req->linkinfo.data.ipip._6rd_relay_prefixlen = _6rd_relay_prefixlen; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_encap_type(struct rt_link_newlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_type = 1; + req->linkinfo.data.ipip.encap_type = encap_type; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_encap_flags(struct rt_link_newlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_flags = 1; + req->linkinfo.data.ipip.encap_flags = encap_flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_encap_sport(struct rt_link_newlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_sport = 1; + req->linkinfo.data.ipip.encap_sport = encap_sport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_encap_dport(struct rt_link_newlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_dport = 1; + req->linkinfo.data.ipip.encap_dport = encap_dport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_collect_metadata(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.collect_metadata = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ipip_fwmark(struct rt_link_newlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.fwmark = 1; + req->linkinfo.data.ipip.fwmark = fwmark; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_link(struct rt_link_newlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.link = 1; + req->linkinfo.data.ip6tnl.link = link; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_local(struct rt_link_newlink_req *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + free(req->linkinfo.data.ip6tnl.local); + req->linkinfo.data.ip6tnl._len.local = len; + req->linkinfo.data.ip6tnl.local = malloc(req->linkinfo.data.ip6tnl._len.local); + memcpy(req->linkinfo.data.ip6tnl.local, local, req->linkinfo.data.ip6tnl._len.local); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_remote(struct rt_link_newlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + free(req->linkinfo.data.ip6tnl.remote); + req->linkinfo.data.ip6tnl._len.remote = len; + req->linkinfo.data.ip6tnl.remote = malloc(req->linkinfo.data.ip6tnl._len.remote); + memcpy(req->linkinfo.data.ip6tnl.remote, remote, req->linkinfo.data.ip6tnl._len.remote); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_ttl(struct rt_link_newlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.ttl = 1; + req->linkinfo.data.ip6tnl.ttl = ttl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_encap_limit(struct rt_link_newlink_req *req, + __u8 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_limit = 1; + req->linkinfo.data.ip6tnl.encap_limit = encap_limit; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_flowinfo(struct rt_link_newlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.flowinfo = 1; + req->linkinfo.data.ip6tnl.flowinfo = flowinfo; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_flags(struct rt_link_newlink_req *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.flags = 1; + req->linkinfo.data.ip6tnl.flags = flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_proto(struct rt_link_newlink_req *req, + __u8 proto) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.proto = 1; + req->linkinfo.data.ip6tnl.proto = proto; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_encap_type(struct rt_link_newlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_type = 1; + req->linkinfo.data.ip6tnl.encap_type = encap_type; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_encap_flags(struct rt_link_newlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_flags = 1; + req->linkinfo.data.ip6tnl.encap_flags = encap_flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_encap_sport(struct rt_link_newlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_sport = 1; + req->linkinfo.data.ip6tnl.encap_sport = encap_sport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_encap_dport(struct rt_link_newlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_dport = 1; + req->linkinfo.data.ip6tnl.encap_dport = encap_dport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_collect_metadata(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.collect_metadata = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ip6tnl_fwmark(struct rt_link_newlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.fwmark = 1; + req->linkinfo.data.ip6tnl.fwmark = fwmark; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_link(struct rt_link_newlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.link = 1; + req->linkinfo.data.sit.link = link; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_local(struct rt_link_newlink_req *req, + const void *local, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit.local); + req->linkinfo.data.sit._len.local = len; + req->linkinfo.data.sit.local = malloc(req->linkinfo.data.sit._len.local); + memcpy(req->linkinfo.data.sit.local, local, req->linkinfo.data.sit._len.local); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_remote(struct rt_link_newlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit.remote); + req->linkinfo.data.sit._len.remote = len; + req->linkinfo.data.sit.remote = malloc(req->linkinfo.data.sit._len.remote); + memcpy(req->linkinfo.data.sit.remote, remote, req->linkinfo.data.sit._len.remote); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_ttl(struct rt_link_newlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.ttl = 1; + req->linkinfo.data.sit.ttl = ttl; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_tos(struct rt_link_newlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.tos = 1; + req->linkinfo.data.sit.tos = tos; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_encap_limit(struct rt_link_newlink_req *req, + __u8 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_limit = 1; + req->linkinfo.data.sit.encap_limit = encap_limit; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_flowinfo(struct rt_link_newlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.flowinfo = 1; + req->linkinfo.data.sit.flowinfo = flowinfo; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_flags(struct rt_link_newlink_req *req, + __u16 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.flags = 1; + req->linkinfo.data.sit.flags = flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_proto(struct rt_link_newlink_req *req, + __u8 proto) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.proto = 1; + req->linkinfo.data.sit.proto = proto; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_pmtudisc(struct rt_link_newlink_req *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.pmtudisc = 1; + req->linkinfo.data.sit.pmtudisc = pmtudisc; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit__6rd_prefix(struct rt_link_newlink_req *req, + const void *_6rd_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit._6rd_prefix); + req->linkinfo.data.sit._len._6rd_prefix = len; + req->linkinfo.data.sit._6rd_prefix = malloc(req->linkinfo.data.sit._len._6rd_prefix); + memcpy(req->linkinfo.data.sit._6rd_prefix, _6rd_prefix, req->linkinfo.data.sit._len._6rd_prefix); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit__6rd_relay_prefix(struct rt_link_newlink_req *req, + const void *_6rd_relay_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit._6rd_relay_prefix); + req->linkinfo.data.sit._len._6rd_relay_prefix = len; + req->linkinfo.data.sit._6rd_relay_prefix = malloc(req->linkinfo.data.sit._len._6rd_relay_prefix); + memcpy(req->linkinfo.data.sit._6rd_relay_prefix, _6rd_relay_prefix, req->linkinfo.data.sit._len._6rd_relay_prefix); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit__6rd_prefixlen(struct rt_link_newlink_req *req, + __u16 _6rd_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present._6rd_prefixlen = 1; + req->linkinfo.data.sit._6rd_prefixlen = _6rd_prefixlen; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit__6rd_relay_prefixlen(struct rt_link_newlink_req *req, + __u16 _6rd_relay_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present._6rd_relay_prefixlen = 1; + req->linkinfo.data.sit._6rd_relay_prefixlen = _6rd_relay_prefixlen; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_encap_type(struct rt_link_newlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_type = 1; + req->linkinfo.data.sit.encap_type = encap_type; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_encap_flags(struct rt_link_newlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_flags = 1; + req->linkinfo.data.sit.encap_flags = encap_flags; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_encap_sport(struct rt_link_newlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_sport = 1; + req->linkinfo.data.sit.encap_sport = encap_sport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_encap_dport(struct rt_link_newlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_dport = 1; + req->linkinfo.data.sit.encap_dport = encap_dport; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_collect_metadata(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.collect_metadata = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_sit_fwmark(struct rt_link_newlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.fwmark = 1; + req->linkinfo.data.sit.fwmark = fwmark; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_tun_owner(struct rt_link_newlink_req *req, + __u32 owner) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.owner = 1; + req->linkinfo.data.tun.owner = owner; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_tun_group(struct rt_link_newlink_req *req, + __u32 group) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.group = 1; + req->linkinfo.data.tun.group = group; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_tun_type(struct rt_link_newlink_req *req, + __u8 type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.type = 1; + req->linkinfo.data.tun.type = type; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_tun_pi(struct rt_link_newlink_req *req, + __u8 pi) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.pi = 1; + req->linkinfo.data.tun.pi = pi; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_tun_vnet_hdr(struct rt_link_newlink_req *req, + __u8 vnet_hdr) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.vnet_hdr = 1; + req->linkinfo.data.tun.vnet_hdr = vnet_hdr; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_tun_persist(struct rt_link_newlink_req *req, + __u8 persist) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.persist = 1; + req->linkinfo.data.tun.persist = persist; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_tun_multi_queue(struct rt_link_newlink_req *req, + __u8 multi_queue) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.multi_queue = 1; + req->linkinfo.data.tun.multi_queue = multi_queue; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_tun_num_queues(struct rt_link_newlink_req *req, + __u32 num_queues) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.num_queues = 1; + req->linkinfo.data.tun.num_queues = num_queues; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_tun_num_disabled_queues(struct rt_link_newlink_req *req, + __u32 num_disabled_queues) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.num_disabled_queues = 1; + req->linkinfo.data.tun.num_disabled_queues = num_disabled_queues; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vlan_id(struct rt_link_newlink_req *req, + __u16 id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.id = 1; + req->linkinfo.data.vlan.id = id; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vlan_flags(struct rt_link_newlink_req *req, + const void *flags, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + free(req->linkinfo.data.vlan.flags); + req->linkinfo.data.vlan._len.flags = len; + req->linkinfo.data.vlan.flags = malloc(req->linkinfo.data.vlan._len.flags); + memcpy(req->linkinfo.data.vlan.flags, flags, req->linkinfo.data.vlan._len.flags); +} +static inline void +__rt_link_newlink_req_set_linkinfo_data_vlan_egress_qos_mapping(struct rt_link_newlink_req *req, + struct ifla_vlan_qos_mapping *mapping, + unsigned int n_mapping) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.egress_qos = 1; + free(req->linkinfo.data.vlan.egress_qos.mapping); + req->linkinfo.data.vlan.egress_qos.mapping = mapping; + req->linkinfo.data.vlan.egress_qos._count.mapping = n_mapping; +} +static inline void +__rt_link_newlink_req_set_linkinfo_data_vlan_ingress_qos_mapping(struct rt_link_newlink_req *req, + struct ifla_vlan_qos_mapping *mapping, + unsigned int n_mapping) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.ingress_qos = 1; + free(req->linkinfo.data.vlan.ingress_qos.mapping); + req->linkinfo.data.vlan.ingress_qos.mapping = mapping; + req->linkinfo.data.vlan.ingress_qos._count.mapping = n_mapping; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vlan_protocol(struct rt_link_newlink_req *req, + int protocol /* big-endian */) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.protocol = 1; + req->linkinfo.data.vlan.protocol = protocol; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vrf_table(struct rt_link_newlink_req *req, + __u32 table) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vrf = 1; + req->linkinfo.data.vrf._present.table = 1; + req->linkinfo.data.vrf.table = table; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti_link(struct rt_link_newlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.link = 1; + req->linkinfo.data.vti.link = link; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti_ikey(struct rt_link_newlink_req *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.ikey = 1; + req->linkinfo.data.vti.ikey = ikey; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti_okey(struct rt_link_newlink_req *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.okey = 1; + req->linkinfo.data.vti.okey = okey; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti_local(struct rt_link_newlink_req *req, + const void *local, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + free(req->linkinfo.data.vti.local); + req->linkinfo.data.vti._len.local = len; + req->linkinfo.data.vti.local = malloc(req->linkinfo.data.vti._len.local); + memcpy(req->linkinfo.data.vti.local, local, req->linkinfo.data.vti._len.local); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti_remote(struct rt_link_newlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + free(req->linkinfo.data.vti.remote); + req->linkinfo.data.vti._len.remote = len; + req->linkinfo.data.vti.remote = malloc(req->linkinfo.data.vti._len.remote); + memcpy(req->linkinfo.data.vti.remote, remote, req->linkinfo.data.vti._len.remote); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti_fwmark(struct rt_link_newlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.fwmark = 1; + req->linkinfo.data.vti.fwmark = fwmark; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti6_link(struct rt_link_newlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.link = 1; + req->linkinfo.data.vti6.link = link; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti6_ikey(struct rt_link_newlink_req *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.ikey = 1; + req->linkinfo.data.vti6.ikey = ikey; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti6_okey(struct rt_link_newlink_req *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.okey = 1; + req->linkinfo.data.vti6.okey = okey; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti6_local(struct rt_link_newlink_req *req, + const void *local, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + free(req->linkinfo.data.vti6.local); + req->linkinfo.data.vti6._len.local = len; + req->linkinfo.data.vti6.local = malloc(req->linkinfo.data.vti6._len.local); + memcpy(req->linkinfo.data.vti6.local, local, req->linkinfo.data.vti6._len.local); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti6_remote(struct rt_link_newlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + free(req->linkinfo.data.vti6.remote); + req->linkinfo.data.vti6._len.remote = len; + req->linkinfo.data.vti6.remote = malloc(req->linkinfo.data.vti6._len.remote); + memcpy(req->linkinfo.data.vti6.remote, remote, req->linkinfo.data.vti6._len.remote); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_vti6_fwmark(struct rt_link_newlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.fwmark = 1; + req->linkinfo.data.vti6.fwmark = fwmark; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_netkit_peer_info(struct rt_link_newlink_req *req, + const void *peer_info, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + free(req->linkinfo.data.netkit.peer_info); + req->linkinfo.data.netkit._len.peer_info = len; + req->linkinfo.data.netkit.peer_info = malloc(req->linkinfo.data.netkit._len.peer_info); + memcpy(req->linkinfo.data.netkit.peer_info, peer_info, req->linkinfo.data.netkit._len.peer_info); +} +static inline void +rt_link_newlink_req_set_linkinfo_data_netkit_primary(struct rt_link_newlink_req *req, + __u8 primary) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.primary = 1; + req->linkinfo.data.netkit.primary = primary; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_netkit_policy(struct rt_link_newlink_req *req, + int policy) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.policy = 1; + req->linkinfo.data.netkit.policy = policy; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_netkit_peer_policy(struct rt_link_newlink_req *req, + int peer_policy) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.peer_policy = 1; + req->linkinfo.data.netkit.peer_policy = peer_policy; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_netkit_mode(struct rt_link_newlink_req *req, + enum netkit_mode mode) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.mode = 1; + req->linkinfo.data.netkit.mode = mode; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_netkit_scrub(struct rt_link_newlink_req *req, + int scrub) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.scrub = 1; + req->linkinfo.data.netkit.scrub = scrub; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_netkit_peer_scrub(struct rt_link_newlink_req *req, + int peer_scrub) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.peer_scrub = 1; + req->linkinfo.data.netkit.peer_scrub = peer_scrub; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_netkit_headroom(struct rt_link_newlink_req *req, + __u16 headroom) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.headroom = 1; + req->linkinfo.data.netkit.headroom = headroom; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_netkit_tailroom(struct rt_link_newlink_req *req, + __u16 tailroom) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.tailroom = 1; + req->linkinfo.data.netkit.tailroom = tailroom; +} +static inline void +rt_link_newlink_req_set_linkinfo_data_ovpn_mode(struct rt_link_newlink_req *req, + enum ovpn_mode mode) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ovpn = 1; + req->linkinfo.data.ovpn._present.mode = 1; + req->linkinfo.data.ovpn.mode = mode; +} +static inline void +rt_link_newlink_req_set_linkinfo_xstats(struct rt_link_newlink_req *req, + const void *xstats, size_t len) +{ + req->_present.linkinfo = 1; + free(req->linkinfo.xstats); + req->linkinfo._len.xstats = len; + req->linkinfo.xstats = malloc(req->linkinfo._len.xstats); + memcpy(req->linkinfo.xstats, xstats, req->linkinfo._len.xstats); +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_kind(struct rt_link_newlink_req *req, + const char *slave_kind) +{ + req->_present.linkinfo = 1; + free(req->linkinfo.slave_kind); + req->linkinfo._len.slave_kind = strlen(slave_kind); + req->linkinfo.slave_kind = malloc(req->linkinfo._len.slave_kind + 1); + memcpy(req->linkinfo.slave_kind, slave_kind, req->linkinfo._len.slave_kind); + req->linkinfo.slave_kind[req->linkinfo._len.slave_kind] = 0; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_state(struct rt_link_newlink_req *req, + __u8 state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.state = 1; + req->linkinfo.slave_data.bridge.state = state; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_priority(struct rt_link_newlink_req *req, + __u16 priority) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.priority = 1; + req->linkinfo.slave_data.bridge.priority = priority; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_cost(struct rt_link_newlink_req *req, + __u32 cost) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.cost = 1; + req->linkinfo.slave_data.bridge.cost = cost; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_mode(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mode = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_guard(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.guard = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_protect(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.protect = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_fast_leave(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.fast_leave = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_learning(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.learning = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_unicast_flood(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.unicast_flood = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_proxyarp(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.proxyarp = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_learning_sync(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.learning_sync = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_proxyarp_wifi(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.proxyarp_wifi = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_root_id(struct rt_link_newlink_req *req, + const void *root_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + free(req->linkinfo.slave_data.bridge.root_id); + req->linkinfo.slave_data.bridge._len.root_id = len; + req->linkinfo.slave_data.bridge.root_id = malloc(req->linkinfo.slave_data.bridge._len.root_id); + memcpy(req->linkinfo.slave_data.bridge.root_id, root_id, req->linkinfo.slave_data.bridge._len.root_id); +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_bridge_id(struct rt_link_newlink_req *req, + const void *bridge_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + free(req->linkinfo.slave_data.bridge.bridge_id); + req->linkinfo.slave_data.bridge._len.bridge_id = len; + req->linkinfo.slave_data.bridge.bridge_id = malloc(req->linkinfo.slave_data.bridge._len.bridge_id); + memcpy(req->linkinfo.slave_data.bridge.bridge_id, bridge_id, req->linkinfo.slave_data.bridge._len.bridge_id); +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_designated_port(struct rt_link_newlink_req *req, + __u16 designated_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.designated_port = 1; + req->linkinfo.slave_data.bridge.designated_port = designated_port; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_designated_cost(struct rt_link_newlink_req *req, + __u16 designated_cost) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.designated_cost = 1; + req->linkinfo.slave_data.bridge.designated_cost = designated_cost; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_id(struct rt_link_newlink_req *req, + __u16 id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.id = 1; + req->linkinfo.slave_data.bridge.id = id; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_no(struct rt_link_newlink_req *req, + __u16 no) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.no = 1; + req->linkinfo.slave_data.bridge.no = no; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_topology_change_ack(struct rt_link_newlink_req *req, + __u8 topology_change_ack) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.topology_change_ack = 1; + req->linkinfo.slave_data.bridge.topology_change_ack = topology_change_ack; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_config_pending(struct rt_link_newlink_req *req, + __u8 config_pending) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.config_pending = 1; + req->linkinfo.slave_data.bridge.config_pending = config_pending; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_message_age_timer(struct rt_link_newlink_req *req, + __u64 message_age_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.message_age_timer = 1; + req->linkinfo.slave_data.bridge.message_age_timer = message_age_timer; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_forward_delay_timer(struct rt_link_newlink_req *req, + __u64 forward_delay_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.forward_delay_timer = 1; + req->linkinfo.slave_data.bridge.forward_delay_timer = forward_delay_timer; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_hold_timer(struct rt_link_newlink_req *req, + __u64 hold_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.hold_timer = 1; + req->linkinfo.slave_data.bridge.hold_timer = hold_timer; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_flush(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.flush = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_multicast_router(struct rt_link_newlink_req *req, + __u8 multicast_router) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.multicast_router = 1; + req->linkinfo.slave_data.bridge.multicast_router = multicast_router; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_mcast_flood(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_flood = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_mcast_to_ucast(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_to_ucast = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_vlan_tunnel(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.vlan_tunnel = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_bcast_flood(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.bcast_flood = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_group_fwd_mask(struct rt_link_newlink_req *req, + __u16 group_fwd_mask) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.group_fwd_mask = 1; + req->linkinfo.slave_data.bridge.group_fwd_mask = group_fwd_mask; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_neigh_suppress(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.neigh_suppress = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_isolated(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.isolated = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_backup_port(struct rt_link_newlink_req *req, + __u32 backup_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.backup_port = 1; + req->linkinfo.slave_data.bridge.backup_port = backup_port; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_mrp_ring_open(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mrp_ring_open = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_mrp_in_open(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mrp_in_open = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_mcast_eht_hosts_limit(struct rt_link_newlink_req *req, + __u32 mcast_eht_hosts_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_eht_hosts_limit = 1; + req->linkinfo.slave_data.bridge.mcast_eht_hosts_limit = mcast_eht_hosts_limit; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_mcast_eht_hosts_cnt(struct rt_link_newlink_req *req, + __u32 mcast_eht_hosts_cnt) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_eht_hosts_cnt = 1; + req->linkinfo.slave_data.bridge.mcast_eht_hosts_cnt = mcast_eht_hosts_cnt; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_locked(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.locked = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_mab(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mab = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_mcast_n_groups(struct rt_link_newlink_req *req, + __u32 mcast_n_groups) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_n_groups = 1; + req->linkinfo.slave_data.bridge.mcast_n_groups = mcast_n_groups; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_mcast_max_groups(struct rt_link_newlink_req *req, + __u32 mcast_max_groups) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_max_groups = 1; + req->linkinfo.slave_data.bridge.mcast_max_groups = mcast_max_groups; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_neigh_vlan_suppress(struct rt_link_newlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.neigh_vlan_suppress = 1; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bridge_backup_nhid(struct rt_link_newlink_req *req, + __u32 backup_nhid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.backup_nhid = 1; + req->linkinfo.slave_data.bridge.backup_nhid = backup_nhid; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bond_state(struct rt_link_newlink_req *req, + __u8 state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.state = 1; + req->linkinfo.slave_data.bond.state = state; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bond_mii_status(struct rt_link_newlink_req *req, + __u8 mii_status) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.mii_status = 1; + req->linkinfo.slave_data.bond.mii_status = mii_status; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bond_link_failure_count(struct rt_link_newlink_req *req, + __u32 link_failure_count) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.link_failure_count = 1; + req->linkinfo.slave_data.bond.link_failure_count = link_failure_count; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bond_perm_hwaddr(struct rt_link_newlink_req *req, + const void *perm_hwaddr, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + free(req->linkinfo.slave_data.bond.perm_hwaddr); + req->linkinfo.slave_data.bond._len.perm_hwaddr = len; + req->linkinfo.slave_data.bond.perm_hwaddr = malloc(req->linkinfo.slave_data.bond._len.perm_hwaddr); + memcpy(req->linkinfo.slave_data.bond.perm_hwaddr, perm_hwaddr, req->linkinfo.slave_data.bond._len.perm_hwaddr); +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bond_queue_id(struct rt_link_newlink_req *req, + __u16 queue_id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.queue_id = 1; + req->linkinfo.slave_data.bond.queue_id = queue_id; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bond_ad_aggregator_id(struct rt_link_newlink_req *req, + __u16 ad_aggregator_id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.ad_aggregator_id = 1; + req->linkinfo.slave_data.bond.ad_aggregator_id = ad_aggregator_id; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bond_ad_actor_oper_port_state(struct rt_link_newlink_req *req, + __u8 ad_actor_oper_port_state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.ad_actor_oper_port_state = 1; + req->linkinfo.slave_data.bond.ad_actor_oper_port_state = ad_actor_oper_port_state; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bond_ad_partner_oper_port_state(struct rt_link_newlink_req *req, + __u16 ad_partner_oper_port_state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.ad_partner_oper_port_state = 1; + req->linkinfo.slave_data.bond.ad_partner_oper_port_state = ad_partner_oper_port_state; +} +static inline void +rt_link_newlink_req_set_linkinfo_slave_data_bond_prio(struct rt_link_newlink_req *req, + __u32 prio) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.prio = 1; + req->linkinfo.slave_data.bond.prio = prio; +} +static inline void +rt_link_newlink_req_set_group(struct rt_link_newlink_req *req, __u32 group) +{ + req->_present.group = 1; + req->group = group; +} +static inline void +rt_link_newlink_req_set_num_tx_queues(struct rt_link_newlink_req *req, + __u32 num_tx_queues) +{ + req->_present.num_tx_queues = 1; + req->num_tx_queues = num_tx_queues; +} +static inline void +rt_link_newlink_req_set_num_rx_queues(struct rt_link_newlink_req *req, + __u32 num_rx_queues) +{ + req->_present.num_rx_queues = 1; + req->num_rx_queues = num_rx_queues; +} +static inline void +rt_link_newlink_req_set_address(struct rt_link_newlink_req *req, + const void *address, size_t len) +{ + free(req->address); + req->_len.address = len; + req->address = malloc(req->_len.address); + memcpy(req->address, address, req->_len.address); +} +static inline void +rt_link_newlink_req_set_broadcast(struct rt_link_newlink_req *req, + const void *broadcast, size_t len) +{ + free(req->broadcast); + req->_len.broadcast = len; + req->broadcast = malloc(req->_len.broadcast); + memcpy(req->broadcast, broadcast, req->_len.broadcast); +} +static inline void +rt_link_newlink_req_set_mtu(struct rt_link_newlink_req *req, __u32 mtu) +{ + req->_present.mtu = 1; + req->mtu = mtu; +} +static inline void +rt_link_newlink_req_set_txqlen(struct rt_link_newlink_req *req, __u32 txqlen) +{ + req->_present.txqlen = 1; + req->txqlen = txqlen; +} +static inline void +rt_link_newlink_req_set_operstate(struct rt_link_newlink_req *req, + __u8 operstate) +{ + req->_present.operstate = 1; + req->operstate = operstate; +} +static inline void +rt_link_newlink_req_set_linkmode(struct rt_link_newlink_req *req, + __u8 linkmode) +{ + req->_present.linkmode = 1; + req->linkmode = linkmode; +} +static inline void +rt_link_newlink_req_set_gso_max_size(struct rt_link_newlink_req *req, + __u32 gso_max_size) +{ + req->_present.gso_max_size = 1; + req->gso_max_size = gso_max_size; +} +static inline void +rt_link_newlink_req_set_gso_max_segs(struct rt_link_newlink_req *req, + __u32 gso_max_segs) +{ + req->_present.gso_max_segs = 1; + req->gso_max_segs = gso_max_segs; +} +static inline void +rt_link_newlink_req_set_gro_max_size(struct rt_link_newlink_req *req, + __u32 gro_max_size) +{ + req->_present.gro_max_size = 1; + req->gro_max_size = gro_max_size; +} +static inline void +rt_link_newlink_req_set_gso_ipv4_max_size(struct rt_link_newlink_req *req, + __u32 gso_ipv4_max_size) +{ + req->_present.gso_ipv4_max_size = 1; + req->gso_ipv4_max_size = gso_ipv4_max_size; +} +static inline void +rt_link_newlink_req_set_gro_ipv4_max_size(struct rt_link_newlink_req *req, + __u32 gro_ipv4_max_size) +{ + req->_present.gro_ipv4_max_size = 1; + req->gro_ipv4_max_size = gro_ipv4_max_size; +} +static inline void +rt_link_newlink_req_set_af_spec_inet_conf(struct rt_link_newlink_req *req, + __u32 *conf, size_t count) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet = 1; + free(req->af_spec.inet.conf); + req->af_spec.inet._count.conf = count; + count *= sizeof(__u32); + req->af_spec.inet.conf = malloc(count); + memcpy(req->af_spec.inet.conf, conf, count); +} +static inline void +rt_link_newlink_req_set_af_spec_inet6_flags(struct rt_link_newlink_req *req, + __u32 flags) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + req->af_spec.inet6._present.flags = 1; + req->af_spec.inet6.flags = flags; +} +static inline void +rt_link_newlink_req_set_af_spec_inet6_conf(struct rt_link_newlink_req *req, + __u32 *conf, size_t count) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.conf); + req->af_spec.inet6._count.conf = count; + count *= sizeof(__u32); + req->af_spec.inet6.conf = malloc(count); + memcpy(req->af_spec.inet6.conf, conf, count); +} +static inline void +rt_link_newlink_req_set_af_spec_inet6_stats(struct rt_link_newlink_req *req, + __u64 *stats, size_t count) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.stats); + req->af_spec.inet6._count.stats = count; + count *= sizeof(__u64); + req->af_spec.inet6.stats = malloc(count); + memcpy(req->af_spec.inet6.stats, stats, count); +} +static inline void +rt_link_newlink_req_set_af_spec_inet6_mcast(struct rt_link_newlink_req *req, + const void *mcast, size_t len) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.mcast); + req->af_spec.inet6._len.mcast = len; + req->af_spec.inet6.mcast = malloc(req->af_spec.inet6._len.mcast); + memcpy(req->af_spec.inet6.mcast, mcast, req->af_spec.inet6._len.mcast); +} +static inline void +rt_link_newlink_req_set_af_spec_inet6_cacheinfo(struct rt_link_newlink_req *req, + const void *cacheinfo, + size_t len) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.cacheinfo); + req->af_spec.inet6._len.cacheinfo = len; + req->af_spec.inet6.cacheinfo = malloc(req->af_spec.inet6._len.cacheinfo); + memcpy(req->af_spec.inet6.cacheinfo, cacheinfo, req->af_spec.inet6._len.cacheinfo); +} +static inline void +rt_link_newlink_req_set_af_spec_inet6_icmp6stats(struct rt_link_newlink_req *req, + __u64 *icmp6stats, + size_t count) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.icmp6stats); + req->af_spec.inet6._count.icmp6stats = count; + count *= sizeof(__u64); + req->af_spec.inet6.icmp6stats = malloc(count); + memcpy(req->af_spec.inet6.icmp6stats, icmp6stats, count); +} +static inline void +rt_link_newlink_req_set_af_spec_inet6_token(struct rt_link_newlink_req *req, + const void *token, size_t len) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.token); + req->af_spec.inet6._len.token = len; + req->af_spec.inet6.token = malloc(req->af_spec.inet6._len.token); + memcpy(req->af_spec.inet6.token, token, req->af_spec.inet6._len.token); +} +static inline void +rt_link_newlink_req_set_af_spec_inet6_addr_gen_mode(struct rt_link_newlink_req *req, + __u8 addr_gen_mode) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + req->af_spec.inet6._present.addr_gen_mode = 1; + req->af_spec.inet6.addr_gen_mode = addr_gen_mode; +} +static inline void +rt_link_newlink_req_set_af_spec_inet6_ra_mtu(struct rt_link_newlink_req *req, + __u32 ra_mtu) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + req->af_spec.inet6._present.ra_mtu = 1; + req->af_spec.inet6.ra_mtu = ra_mtu; +} +static inline void +rt_link_newlink_req_set_af_spec_mctp_net(struct rt_link_newlink_req *req, + __u32 net) +{ + req->_present.af_spec = 1; + req->af_spec._present.mctp = 1; + req->af_spec.mctp._present.net = 1; + req->af_spec.mctp.net = net; +} +static inline void +rt_link_newlink_req_set_af_spec_mctp_phys_binding(struct rt_link_newlink_req *req, + __u8 phys_binding) +{ + req->_present.af_spec = 1; + req->af_spec._present.mctp = 1; + req->af_spec.mctp._present.phys_binding = 1; + req->af_spec.mctp.phys_binding = phys_binding; +} + +/* + * Create a new link. + */ +int rt_link_newlink(struct ynl_sock *ys, struct rt_link_newlink_req *req); + +/* ============== RTM_DELLINK ============== */ +/* RTM_DELLINK - do */ +struct rt_link_dellink_req { + __u16 _nlmsg_flags; + + struct ifinfomsg _hdr; + + struct { + __u32 ifname; + } _len; + + char *ifname; +}; + +static inline struct rt_link_dellink_req *rt_link_dellink_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_link_dellink_req)); +} +void rt_link_dellink_req_free(struct rt_link_dellink_req *req); + +static inline void +rt_link_dellink_req_set_nlflags(struct rt_link_dellink_req *req, + __u16 nl_flags) +{ + req->_nlmsg_flags = nl_flags; +} + +static inline void +rt_link_dellink_req_set_ifname(struct rt_link_dellink_req *req, + const char *ifname) +{ + free(req->ifname); + req->_len.ifname = strlen(ifname); + req->ifname = malloc(req->_len.ifname + 1); + memcpy(req->ifname, ifname, req->_len.ifname); + req->ifname[req->_len.ifname] = 0; +} + +/* + * Delete an existing link. + */ +int rt_link_dellink(struct ynl_sock *ys, struct rt_link_dellink_req *req); + +/* ============== RTM_GETLINK ============== */ +/* RTM_GETLINK - do */ +struct rt_link_getlink_req { + __u16 _nlmsg_flags; + + struct ifinfomsg _hdr; + + struct { + __u32 ext_mask:1; + __u32 target_netnsid:1; + } _present; + struct { + __u32 ifname; + __u32 alt_ifname; + } _len; + + char *ifname; + char *alt_ifname; + __u32 ext_mask; + __s32 target_netnsid; +}; + +static inline struct rt_link_getlink_req *rt_link_getlink_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_link_getlink_req)); +} +void rt_link_getlink_req_free(struct rt_link_getlink_req *req); + +static inline void +rt_link_getlink_req_set_nlflags(struct rt_link_getlink_req *req, + __u16 nl_flags) +{ + req->_nlmsg_flags = nl_flags; +} + +static inline void +rt_link_getlink_req_set_ifname(struct rt_link_getlink_req *req, + const char *ifname) +{ + free(req->ifname); + req->_len.ifname = strlen(ifname); + req->ifname = malloc(req->_len.ifname + 1); + memcpy(req->ifname, ifname, req->_len.ifname); + req->ifname[req->_len.ifname] = 0; +} +static inline void +rt_link_getlink_req_set_alt_ifname(struct rt_link_getlink_req *req, + const char *alt_ifname) +{ + free(req->alt_ifname); + req->_len.alt_ifname = strlen(alt_ifname); + req->alt_ifname = malloc(req->_len.alt_ifname + 1); + memcpy(req->alt_ifname, alt_ifname, req->_len.alt_ifname); + req->alt_ifname[req->_len.alt_ifname] = 0; +} +static inline void +rt_link_getlink_req_set_ext_mask(struct rt_link_getlink_req *req, + __u32 ext_mask) +{ + req->_present.ext_mask = 1; + req->ext_mask = ext_mask; +} +static inline void +rt_link_getlink_req_set_target_netnsid(struct rt_link_getlink_req *req, + __s32 target_netnsid) +{ + req->_present.target_netnsid = 1; + req->target_netnsid = target_netnsid; +} + +struct rt_link_getlink_rsp { + struct ifinfomsg _hdr; + + struct { + __u32 mtu:1; + __u32 link:1; + __u32 master:1; + __u32 txqlen:1; + __u32 weight:1; + __u32 operstate:1; + __u32 linkmode:1; + __u32 linkinfo:1; + __u32 net_ns_pid:1; + __u32 num_vf:1; + __u32 vfinfo_list:1; + __u32 vf_ports:1; + __u32 port_self:1; + __u32 af_spec:1; + __u32 group:1; + __u32 net_ns_fd:1; + __u32 ext_mask:1; + __u32 promiscuity:1; + __u32 num_tx_queues:1; + __u32 num_rx_queues:1; + __u32 carrier:1; + __u32 carrier_changes:1; + __u32 link_netnsid:1; + __u32 proto_down:1; + __u32 gso_max_segs:1; + __u32 gso_max_size:1; + __u32 xdp:1; + __u32 event:1; + __u32 new_netnsid:1; + __u32 target_netnsid:1; + __u32 carrier_up_count:1; + __u32 carrier_down_count:1; + __u32 new_ifindex:1; + __u32 min_mtu:1; + __u32 max_mtu:1; + __u32 prop_list:1; + __u32 gro_max_size:1; + __u32 tso_max_size:1; + __u32 tso_max_segs:1; + __u32 allmulti:1; + __u32 gso_ipv4_max_size:1; + __u32 gro_ipv4_max_size:1; + } _present; + struct { + __u32 address; + __u32 broadcast; + __u32 ifname; + __u32 qdisc; + __u32 stats; + __u32 cost; + __u32 priority; + __u32 wireless; + __u32 protinfo; + __u32 map; + __u32 ifalias; + __u32 stats64; + __u32 phys_port_id; + __u32 phys_switch_id; + __u32 phys_port_name; + __u32 perm_address; + __u32 proto_down_reason; + __u32 parent_dev_name; + __u32 parent_dev_bus_name; + __u32 devlink_port; + } _len; + + void *address; + void *broadcast; + char *ifname; + __u32 mtu; + __u32 link; + char *qdisc; + struct rtnl_link_stats *stats; + char *cost; + char *priority; + __u32 master; + char *wireless; + char *protinfo; + __u32 txqlen; + struct rtnl_link_ifmap *map; + __u32 weight; + __u8 operstate; + __u8 linkmode; + struct rt_link_linkinfo_attrs linkinfo; + __u32 net_ns_pid; + char *ifalias; + __u32 num_vf; + struct rt_link_vfinfo_list_attrs vfinfo_list; + struct rtnl_link_stats64 *stats64; + struct rt_link_vf_ports_attrs vf_ports; + struct rt_link_port_self_attrs port_self; + struct rt_link_af_spec_attrs af_spec; + __u32 group; + __u32 net_ns_fd; + __u32 ext_mask; + __u32 promiscuity; + __u32 num_tx_queues; + __u32 num_rx_queues; + __u8 carrier; + void *phys_port_id; + __u32 carrier_changes; + void *phys_switch_id; + __s32 link_netnsid; + char *phys_port_name; + __u8 proto_down; + __u32 gso_max_segs; + __u32 gso_max_size; + struct rt_link_xdp_attrs xdp; + __u32 event; + __s32 new_netnsid; + __s32 target_netnsid; + __u32 carrier_up_count; + __u32 carrier_down_count; + __s32 new_ifindex; + __u32 min_mtu; + __u32 max_mtu; + struct rt_link_prop_list_link_attrs prop_list; + void *perm_address; + char *proto_down_reason; + char *parent_dev_name; + char *parent_dev_bus_name; + __u32 gro_max_size; + __u32 tso_max_size; + __u32 tso_max_segs; + __u32 allmulti; + void *devlink_port; + __u32 gso_ipv4_max_size; + __u32 gro_ipv4_max_size; +}; + +void rt_link_getlink_rsp_free(struct rt_link_getlink_rsp *rsp); + +/* + * Get / dump information about a link. + */ +struct rt_link_getlink_rsp * +rt_link_getlink(struct ynl_sock *ys, struct rt_link_getlink_req *req); + +/* RTM_GETLINK - dump */ +struct rt_link_getlink_req_dump { + struct ifinfomsg _hdr; + + struct { + __u32 target_netnsid:1; + __u32 ext_mask:1; + __u32 master:1; + __u32 linkinfo:1; + } _present; + + __s32 target_netnsid; + __u32 ext_mask; + __u32 master; + struct rt_link_linkinfo_attrs linkinfo; +}; + +static inline struct rt_link_getlink_req_dump * +rt_link_getlink_req_dump_alloc(void) +{ + return calloc(1, sizeof(struct rt_link_getlink_req_dump)); +} +void rt_link_getlink_req_dump_free(struct rt_link_getlink_req_dump *req); + +static inline void +rt_link_getlink_req_dump_set_target_netnsid(struct rt_link_getlink_req_dump *req, + __s32 target_netnsid) +{ + req->_present.target_netnsid = 1; + req->target_netnsid = target_netnsid; +} +static inline void +rt_link_getlink_req_dump_set_ext_mask(struct rt_link_getlink_req_dump *req, + __u32 ext_mask) +{ + req->_present.ext_mask = 1; + req->ext_mask = ext_mask; +} +static inline void +rt_link_getlink_req_dump_set_master(struct rt_link_getlink_req_dump *req, + __u32 master) +{ + req->_present.master = 1; + req->master = master; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_kind(struct rt_link_getlink_req_dump *req, + const char *kind) +{ + req->_present.linkinfo = 1; + free(req->linkinfo.kind); + req->linkinfo._len.kind = strlen(kind); + req->linkinfo.kind = malloc(req->linkinfo._len.kind + 1); + memcpy(req->linkinfo.kind, kind, req->linkinfo._len.kind); + req->linkinfo.kind[req->linkinfo._len.kind] = 0; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_mode(struct rt_link_getlink_req_dump *req, + __u8 mode) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.mode = 1; + req->linkinfo.data.bond.mode = mode; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_active_slave(struct rt_link_getlink_req_dump *req, + __u32 active_slave) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.active_slave = 1; + req->linkinfo.data.bond.active_slave = active_slave; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_miimon(struct rt_link_getlink_req_dump *req, + __u32 miimon) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.miimon = 1; + req->linkinfo.data.bond.miimon = miimon; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_updelay(struct rt_link_getlink_req_dump *req, + __u32 updelay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.updelay = 1; + req->linkinfo.data.bond.updelay = updelay; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_downdelay(struct rt_link_getlink_req_dump *req, + __u32 downdelay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.downdelay = 1; + req->linkinfo.data.bond.downdelay = downdelay; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_use_carrier(struct rt_link_getlink_req_dump *req, + __u8 use_carrier) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.use_carrier = 1; + req->linkinfo.data.bond.use_carrier = use_carrier; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_arp_interval(struct rt_link_getlink_req_dump *req, + __u32 arp_interval) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.arp_interval = 1; + req->linkinfo.data.bond.arp_interval = arp_interval; +} +static inline void +__rt_link_getlink_req_dump_set_linkinfo_data_bond_arp_ip_target(struct rt_link_getlink_req_dump *req, + __u32 *arp_ip_target, + unsigned int n_arp_ip_target) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + free(req->linkinfo.data.bond.arp_ip_target); + req->linkinfo.data.bond.arp_ip_target = arp_ip_target; + req->linkinfo.data.bond._count.arp_ip_target = n_arp_ip_target; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_arp_validate(struct rt_link_getlink_req_dump *req, + __u32 arp_validate) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.arp_validate = 1; + req->linkinfo.data.bond.arp_validate = arp_validate; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_arp_all_targets(struct rt_link_getlink_req_dump *req, + __u32 arp_all_targets) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.arp_all_targets = 1; + req->linkinfo.data.bond.arp_all_targets = arp_all_targets; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_primary(struct rt_link_getlink_req_dump *req, + __u32 primary) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.primary = 1; + req->linkinfo.data.bond.primary = primary; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_primary_reselect(struct rt_link_getlink_req_dump *req, + __u8 primary_reselect) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.primary_reselect = 1; + req->linkinfo.data.bond.primary_reselect = primary_reselect; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_fail_over_mac(struct rt_link_getlink_req_dump *req, + __u8 fail_over_mac) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.fail_over_mac = 1; + req->linkinfo.data.bond.fail_over_mac = fail_over_mac; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_xmit_hash_policy(struct rt_link_getlink_req_dump *req, + __u8 xmit_hash_policy) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.xmit_hash_policy = 1; + req->linkinfo.data.bond.xmit_hash_policy = xmit_hash_policy; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_resend_igmp(struct rt_link_getlink_req_dump *req, + __u32 resend_igmp) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.resend_igmp = 1; + req->linkinfo.data.bond.resend_igmp = resend_igmp; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_num_peer_notif(struct rt_link_getlink_req_dump *req, + __u8 num_peer_notif) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.num_peer_notif = 1; + req->linkinfo.data.bond.num_peer_notif = num_peer_notif; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_all_slaves_active(struct rt_link_getlink_req_dump *req, + __u8 all_slaves_active) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.all_slaves_active = 1; + req->linkinfo.data.bond.all_slaves_active = all_slaves_active; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_min_links(struct rt_link_getlink_req_dump *req, + __u32 min_links) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.min_links = 1; + req->linkinfo.data.bond.min_links = min_links; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_lp_interval(struct rt_link_getlink_req_dump *req, + __u32 lp_interval) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.lp_interval = 1; + req->linkinfo.data.bond.lp_interval = lp_interval; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_packets_per_slave(struct rt_link_getlink_req_dump *req, + __u32 packets_per_slave) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.packets_per_slave = 1; + req->linkinfo.data.bond.packets_per_slave = packets_per_slave; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_ad_lacp_rate(struct rt_link_getlink_req_dump *req, + __u8 ad_lacp_rate) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_lacp_rate = 1; + req->linkinfo.data.bond.ad_lacp_rate = ad_lacp_rate; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_ad_select(struct rt_link_getlink_req_dump *req, + __u8 ad_select) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_select = 1; + req->linkinfo.data.bond.ad_select = ad_select; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_ad_info_aggregator(struct rt_link_getlink_req_dump *req, + __u16 aggregator) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.aggregator = 1; + req->linkinfo.data.bond.ad_info.aggregator = aggregator; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_ad_info_num_ports(struct rt_link_getlink_req_dump *req, + __u16 num_ports) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.num_ports = 1; + req->linkinfo.data.bond.ad_info.num_ports = num_ports; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_ad_info_actor_key(struct rt_link_getlink_req_dump *req, + __u16 actor_key) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.actor_key = 1; + req->linkinfo.data.bond.ad_info.actor_key = actor_key; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_ad_info_partner_key(struct rt_link_getlink_req_dump *req, + __u16 partner_key) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.partner_key = 1; + req->linkinfo.data.bond.ad_info.partner_key = partner_key; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_ad_info_partner_mac(struct rt_link_getlink_req_dump *req, + const void *partner_mac, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + free(req->linkinfo.data.bond.ad_info.partner_mac); + req->linkinfo.data.bond.ad_info._len.partner_mac = len; + req->linkinfo.data.bond.ad_info.partner_mac = malloc(req->linkinfo.data.bond.ad_info._len.partner_mac); + memcpy(req->linkinfo.data.bond.ad_info.partner_mac, partner_mac, req->linkinfo.data.bond.ad_info._len.partner_mac); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_ad_actor_sys_prio(struct rt_link_getlink_req_dump *req, + __u16 ad_actor_sys_prio) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_actor_sys_prio = 1; + req->linkinfo.data.bond.ad_actor_sys_prio = ad_actor_sys_prio; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_ad_user_port_key(struct rt_link_getlink_req_dump *req, + __u16 ad_user_port_key) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_user_port_key = 1; + req->linkinfo.data.bond.ad_user_port_key = ad_user_port_key; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_ad_actor_system(struct rt_link_getlink_req_dump *req, + const void *ad_actor_system, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + free(req->linkinfo.data.bond.ad_actor_system); + req->linkinfo.data.bond._len.ad_actor_system = len; + req->linkinfo.data.bond.ad_actor_system = malloc(req->linkinfo.data.bond._len.ad_actor_system); + memcpy(req->linkinfo.data.bond.ad_actor_system, ad_actor_system, req->linkinfo.data.bond._len.ad_actor_system); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_tlb_dynamic_lb(struct rt_link_getlink_req_dump *req, + __u8 tlb_dynamic_lb) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.tlb_dynamic_lb = 1; + req->linkinfo.data.bond.tlb_dynamic_lb = tlb_dynamic_lb; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_peer_notif_delay(struct rt_link_getlink_req_dump *req, + __u32 peer_notif_delay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.peer_notif_delay = 1; + req->linkinfo.data.bond.peer_notif_delay = peer_notif_delay; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_ad_lacp_active(struct rt_link_getlink_req_dump *req, + __u8 ad_lacp_active) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_lacp_active = 1; + req->linkinfo.data.bond.ad_lacp_active = ad_lacp_active; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_missed_max(struct rt_link_getlink_req_dump *req, + __u8 missed_max) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.missed_max = 1; + req->linkinfo.data.bond.missed_max = missed_max; +} +static inline void +__rt_link_getlink_req_dump_set_linkinfo_data_bond_ns_ip6_target(struct rt_link_getlink_req_dump *req, + unsigned char (*ns_ip6_target)[16], + unsigned int n_ns_ip6_target) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + free(req->linkinfo.data.bond.ns_ip6_target); + req->linkinfo.data.bond.ns_ip6_target = ns_ip6_target; + req->linkinfo.data.bond._count.ns_ip6_target = n_ns_ip6_target; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bond_coupled_control(struct rt_link_getlink_req_dump *req, + __u8 coupled_control) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.coupled_control = 1; + req->linkinfo.data.bond.coupled_control = coupled_control; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_forward_delay(struct rt_link_getlink_req_dump *req, + __u32 forward_delay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.forward_delay = 1; + req->linkinfo.data.bridge.forward_delay = forward_delay; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_hello_time(struct rt_link_getlink_req_dump *req, + __u32 hello_time) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.hello_time = 1; + req->linkinfo.data.bridge.hello_time = hello_time; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_max_age(struct rt_link_getlink_req_dump *req, + __u32 max_age) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.max_age = 1; + req->linkinfo.data.bridge.max_age = max_age; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_ageing_time(struct rt_link_getlink_req_dump *req, + __u32 ageing_time) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.ageing_time = 1; + req->linkinfo.data.bridge.ageing_time = ageing_time; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_stp_state(struct rt_link_getlink_req_dump *req, + __u32 stp_state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.stp_state = 1; + req->linkinfo.data.bridge.stp_state = stp_state; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_priority(struct rt_link_getlink_req_dump *req, + __u16 priority) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.priority = 1; + req->linkinfo.data.bridge.priority = priority; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_vlan_filtering(struct rt_link_getlink_req_dump *req, + __u8 vlan_filtering) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_filtering = 1; + req->linkinfo.data.bridge.vlan_filtering = vlan_filtering; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_vlan_protocol(struct rt_link_getlink_req_dump *req, + __u16 vlan_protocol) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_protocol = 1; + req->linkinfo.data.bridge.vlan_protocol = vlan_protocol; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_group_fwd_mask(struct rt_link_getlink_req_dump *req, + __u16 group_fwd_mask) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.group_fwd_mask = 1; + req->linkinfo.data.bridge.group_fwd_mask = group_fwd_mask; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_root_id(struct rt_link_getlink_req_dump *req, + const void *root_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.root_id); + req->linkinfo.data.bridge._len.root_id = len; + req->linkinfo.data.bridge.root_id = malloc(req->linkinfo.data.bridge._len.root_id); + memcpy(req->linkinfo.data.bridge.root_id, root_id, req->linkinfo.data.bridge._len.root_id); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_bridge_id(struct rt_link_getlink_req_dump *req, + const void *bridge_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.bridge_id); + req->linkinfo.data.bridge._len.bridge_id = len; + req->linkinfo.data.bridge.bridge_id = malloc(req->linkinfo.data.bridge._len.bridge_id); + memcpy(req->linkinfo.data.bridge.bridge_id, bridge_id, req->linkinfo.data.bridge._len.bridge_id); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_root_port(struct rt_link_getlink_req_dump *req, + __u16 root_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.root_port = 1; + req->linkinfo.data.bridge.root_port = root_port; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_root_path_cost(struct rt_link_getlink_req_dump *req, + __u32 root_path_cost) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.root_path_cost = 1; + req->linkinfo.data.bridge.root_path_cost = root_path_cost; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_topology_change(struct rt_link_getlink_req_dump *req, + __u8 topology_change) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.topology_change = 1; + req->linkinfo.data.bridge.topology_change = topology_change; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_topology_change_detected(struct rt_link_getlink_req_dump *req, + __u8 topology_change_detected) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.topology_change_detected = 1; + req->linkinfo.data.bridge.topology_change_detected = topology_change_detected; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_hello_timer(struct rt_link_getlink_req_dump *req, + __u64 hello_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.hello_timer = 1; + req->linkinfo.data.bridge.hello_timer = hello_timer; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_tcn_timer(struct rt_link_getlink_req_dump *req, + __u64 tcn_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.tcn_timer = 1; + req->linkinfo.data.bridge.tcn_timer = tcn_timer; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_topology_change_timer(struct rt_link_getlink_req_dump *req, + __u64 topology_change_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.topology_change_timer = 1; + req->linkinfo.data.bridge.topology_change_timer = topology_change_timer; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_gc_timer(struct rt_link_getlink_req_dump *req, + __u64 gc_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.gc_timer = 1; + req->linkinfo.data.bridge.gc_timer = gc_timer; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_group_addr(struct rt_link_getlink_req_dump *req, + const void *group_addr, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.group_addr); + req->linkinfo.data.bridge._len.group_addr = len; + req->linkinfo.data.bridge.group_addr = malloc(req->linkinfo.data.bridge._len.group_addr); + memcpy(req->linkinfo.data.bridge.group_addr, group_addr, req->linkinfo.data.bridge._len.group_addr); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_fdb_flush(struct rt_link_getlink_req_dump *req, + const void *fdb_flush, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.fdb_flush); + req->linkinfo.data.bridge._len.fdb_flush = len; + req->linkinfo.data.bridge.fdb_flush = malloc(req->linkinfo.data.bridge._len.fdb_flush); + memcpy(req->linkinfo.data.bridge.fdb_flush, fdb_flush, req->linkinfo.data.bridge._len.fdb_flush); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_router(struct rt_link_getlink_req_dump *req, + __u8 mcast_router) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_router = 1; + req->linkinfo.data.bridge.mcast_router = mcast_router; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_snooping(struct rt_link_getlink_req_dump *req, + __u8 mcast_snooping) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_snooping = 1; + req->linkinfo.data.bridge.mcast_snooping = mcast_snooping; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_query_use_ifaddr(struct rt_link_getlink_req_dump *req, + __u8 mcast_query_use_ifaddr) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_query_use_ifaddr = 1; + req->linkinfo.data.bridge.mcast_query_use_ifaddr = mcast_query_use_ifaddr; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_querier(struct rt_link_getlink_req_dump *req, + __u8 mcast_querier) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_querier = 1; + req->linkinfo.data.bridge.mcast_querier = mcast_querier; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_hash_elasticity(struct rt_link_getlink_req_dump *req, + __u32 mcast_hash_elasticity) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_hash_elasticity = 1; + req->linkinfo.data.bridge.mcast_hash_elasticity = mcast_hash_elasticity; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_hash_max(struct rt_link_getlink_req_dump *req, + __u32 mcast_hash_max) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_hash_max = 1; + req->linkinfo.data.bridge.mcast_hash_max = mcast_hash_max; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_last_member_cnt(struct rt_link_getlink_req_dump *req, + __u32 mcast_last_member_cnt) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_last_member_cnt = 1; + req->linkinfo.data.bridge.mcast_last_member_cnt = mcast_last_member_cnt; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_startup_query_cnt(struct rt_link_getlink_req_dump *req, + __u32 mcast_startup_query_cnt) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_startup_query_cnt = 1; + req->linkinfo.data.bridge.mcast_startup_query_cnt = mcast_startup_query_cnt; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_last_member_intvl(struct rt_link_getlink_req_dump *req, + __u64 mcast_last_member_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_last_member_intvl = 1; + req->linkinfo.data.bridge.mcast_last_member_intvl = mcast_last_member_intvl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_membership_intvl(struct rt_link_getlink_req_dump *req, + __u64 mcast_membership_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_membership_intvl = 1; + req->linkinfo.data.bridge.mcast_membership_intvl = mcast_membership_intvl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_querier_intvl(struct rt_link_getlink_req_dump *req, + __u64 mcast_querier_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_querier_intvl = 1; + req->linkinfo.data.bridge.mcast_querier_intvl = mcast_querier_intvl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_query_intvl(struct rt_link_getlink_req_dump *req, + __u64 mcast_query_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_query_intvl = 1; + req->linkinfo.data.bridge.mcast_query_intvl = mcast_query_intvl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_query_response_intvl(struct rt_link_getlink_req_dump *req, + __u64 mcast_query_response_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_query_response_intvl = 1; + req->linkinfo.data.bridge.mcast_query_response_intvl = mcast_query_response_intvl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_startup_query_intvl(struct rt_link_getlink_req_dump *req, + __u64 mcast_startup_query_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_startup_query_intvl = 1; + req->linkinfo.data.bridge.mcast_startup_query_intvl = mcast_startup_query_intvl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_nf_call_iptables(struct rt_link_getlink_req_dump *req, + __u8 nf_call_iptables) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.nf_call_iptables = 1; + req->linkinfo.data.bridge.nf_call_iptables = nf_call_iptables; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_nf_call_ip6tables(struct rt_link_getlink_req_dump *req, + __u8 nf_call_ip6tables) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.nf_call_ip6tables = 1; + req->linkinfo.data.bridge.nf_call_ip6tables = nf_call_ip6tables; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_nf_call_arptables(struct rt_link_getlink_req_dump *req, + __u8 nf_call_arptables) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.nf_call_arptables = 1; + req->linkinfo.data.bridge.nf_call_arptables = nf_call_arptables; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_vlan_default_pvid(struct rt_link_getlink_req_dump *req, + __u16 vlan_default_pvid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_default_pvid = 1; + req->linkinfo.data.bridge.vlan_default_pvid = vlan_default_pvid; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_vlan_stats_enabled(struct rt_link_getlink_req_dump *req, + __u8 vlan_stats_enabled) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_stats_enabled = 1; + req->linkinfo.data.bridge.vlan_stats_enabled = vlan_stats_enabled; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_stats_enabled(struct rt_link_getlink_req_dump *req, + __u8 mcast_stats_enabled) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_stats_enabled = 1; + req->linkinfo.data.bridge.mcast_stats_enabled = mcast_stats_enabled; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_igmp_version(struct rt_link_getlink_req_dump *req, + __u8 mcast_igmp_version) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_igmp_version = 1; + req->linkinfo.data.bridge.mcast_igmp_version = mcast_igmp_version; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_mld_version(struct rt_link_getlink_req_dump *req, + __u8 mcast_mld_version) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_mld_version = 1; + req->linkinfo.data.bridge.mcast_mld_version = mcast_mld_version; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_vlan_stats_per_port(struct rt_link_getlink_req_dump *req, + __u8 vlan_stats_per_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_stats_per_port = 1; + req->linkinfo.data.bridge.vlan_stats_per_port = vlan_stats_per_port; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_multi_boolopt(struct rt_link_getlink_req_dump *req, + const void *multi_boolopt, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.multi_boolopt); + req->linkinfo.data.bridge._len.multi_boolopt = len; + req->linkinfo.data.bridge.multi_boolopt = malloc(req->linkinfo.data.bridge._len.multi_boolopt); + memcpy(req->linkinfo.data.bridge.multi_boolopt, multi_boolopt, req->linkinfo.data.bridge._len.multi_boolopt); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_mcast_querier_state(struct rt_link_getlink_req_dump *req, + const void *mcast_querier_state, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.mcast_querier_state); + req->linkinfo.data.bridge._len.mcast_querier_state = len; + req->linkinfo.data.bridge.mcast_querier_state = malloc(req->linkinfo.data.bridge._len.mcast_querier_state); + memcpy(req->linkinfo.data.bridge.mcast_querier_state, mcast_querier_state, req->linkinfo.data.bridge._len.mcast_querier_state); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_fdb_n_learned(struct rt_link_getlink_req_dump *req, + __u32 fdb_n_learned) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.fdb_n_learned = 1; + req->linkinfo.data.bridge.fdb_n_learned = fdb_n_learned; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_bridge_fdb_max_learned(struct rt_link_getlink_req_dump *req, + __u32 fdb_max_learned) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.fdb_max_learned = 1; + req->linkinfo.data.bridge.fdb_max_learned = fdb_max_learned; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_link(struct rt_link_getlink_req_dump *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.link = 1; + req->linkinfo.data.erspan.link = link; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_iflags(struct rt_link_getlink_req_dump *req, + __u16 iflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.iflags = 1; + req->linkinfo.data.erspan.iflags = iflags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_oflags(struct rt_link_getlink_req_dump *req, + __u16 oflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.oflags = 1; + req->linkinfo.data.erspan.oflags = oflags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_ikey(struct rt_link_getlink_req_dump *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.ikey = 1; + req->linkinfo.data.erspan.ikey = ikey; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_okey(struct rt_link_getlink_req_dump *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.okey = 1; + req->linkinfo.data.erspan.okey = okey; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_local(struct rt_link_getlink_req_dump *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + free(req->linkinfo.data.erspan.local); + req->linkinfo.data.erspan._len.local = len; + req->linkinfo.data.erspan.local = malloc(req->linkinfo.data.erspan._len.local); + memcpy(req->linkinfo.data.erspan.local, local, req->linkinfo.data.erspan._len.local); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_remote(struct rt_link_getlink_req_dump *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + free(req->linkinfo.data.erspan.remote); + req->linkinfo.data.erspan._len.remote = len; + req->linkinfo.data.erspan.remote = malloc(req->linkinfo.data.erspan._len.remote); + memcpy(req->linkinfo.data.erspan.remote, remote, req->linkinfo.data.erspan._len.remote); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_ttl(struct rt_link_getlink_req_dump *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.ttl = 1; + req->linkinfo.data.erspan.ttl = ttl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_tos(struct rt_link_getlink_req_dump *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.tos = 1; + req->linkinfo.data.erspan.tos = tos; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_pmtudisc(struct rt_link_getlink_req_dump *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.pmtudisc = 1; + req->linkinfo.data.erspan.pmtudisc = pmtudisc; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_encap_limit(struct rt_link_getlink_req_dump *req, + __u32 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_limit = 1; + req->linkinfo.data.erspan.encap_limit = encap_limit; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_flowinfo(struct rt_link_getlink_req_dump *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.flowinfo = 1; + req->linkinfo.data.erspan.flowinfo = flowinfo; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_flags(struct rt_link_getlink_req_dump *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.flags = 1; + req->linkinfo.data.erspan.flags = flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_encap_type(struct rt_link_getlink_req_dump *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_type = 1; + req->linkinfo.data.erspan.encap_type = encap_type; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_encap_flags(struct rt_link_getlink_req_dump *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_flags = 1; + req->linkinfo.data.erspan.encap_flags = encap_flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_encap_sport(struct rt_link_getlink_req_dump *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_sport = 1; + req->linkinfo.data.erspan.encap_sport = encap_sport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_encap_dport(struct rt_link_getlink_req_dump *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_dport = 1; + req->linkinfo.data.erspan.encap_dport = encap_dport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_collect_metadata(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.collect_metadata = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_ignore_df(struct rt_link_getlink_req_dump *req, + __u8 ignore_df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.ignore_df = 1; + req->linkinfo.data.erspan.ignore_df = ignore_df; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_fwmark(struct rt_link_getlink_req_dump *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.fwmark = 1; + req->linkinfo.data.erspan.fwmark = fwmark; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_erspan_index(struct rt_link_getlink_req_dump *req, + __u32 erspan_index) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_index = 1; + req->linkinfo.data.erspan.erspan_index = erspan_index; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_erspan_ver(struct rt_link_getlink_req_dump *req, + __u8 erspan_ver) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_ver = 1; + req->linkinfo.data.erspan.erspan_ver = erspan_ver; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_erspan_dir(struct rt_link_getlink_req_dump *req, + __u8 erspan_dir) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_dir = 1; + req->linkinfo.data.erspan.erspan_dir = erspan_dir; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_erspan_erspan_hwid(struct rt_link_getlink_req_dump *req, + __u16 erspan_hwid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_hwid = 1; + req->linkinfo.data.erspan.erspan_hwid = erspan_hwid; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_link(struct rt_link_getlink_req_dump *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.link = 1; + req->linkinfo.data.gre.link = link; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_iflags(struct rt_link_getlink_req_dump *req, + __u16 iflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.iflags = 1; + req->linkinfo.data.gre.iflags = iflags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_oflags(struct rt_link_getlink_req_dump *req, + __u16 oflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.oflags = 1; + req->linkinfo.data.gre.oflags = oflags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_ikey(struct rt_link_getlink_req_dump *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.ikey = 1; + req->linkinfo.data.gre.ikey = ikey; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_okey(struct rt_link_getlink_req_dump *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.okey = 1; + req->linkinfo.data.gre.okey = okey; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_local(struct rt_link_getlink_req_dump *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + free(req->linkinfo.data.gre.local); + req->linkinfo.data.gre._len.local = len; + req->linkinfo.data.gre.local = malloc(req->linkinfo.data.gre._len.local); + memcpy(req->linkinfo.data.gre.local, local, req->linkinfo.data.gre._len.local); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_remote(struct rt_link_getlink_req_dump *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + free(req->linkinfo.data.gre.remote); + req->linkinfo.data.gre._len.remote = len; + req->linkinfo.data.gre.remote = malloc(req->linkinfo.data.gre._len.remote); + memcpy(req->linkinfo.data.gre.remote, remote, req->linkinfo.data.gre._len.remote); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_ttl(struct rt_link_getlink_req_dump *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.ttl = 1; + req->linkinfo.data.gre.ttl = ttl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_tos(struct rt_link_getlink_req_dump *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.tos = 1; + req->linkinfo.data.gre.tos = tos; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_pmtudisc(struct rt_link_getlink_req_dump *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.pmtudisc = 1; + req->linkinfo.data.gre.pmtudisc = pmtudisc; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_encap_limit(struct rt_link_getlink_req_dump *req, + __u32 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_limit = 1; + req->linkinfo.data.gre.encap_limit = encap_limit; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_flowinfo(struct rt_link_getlink_req_dump *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.flowinfo = 1; + req->linkinfo.data.gre.flowinfo = flowinfo; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_flags(struct rt_link_getlink_req_dump *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.flags = 1; + req->linkinfo.data.gre.flags = flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_encap_type(struct rt_link_getlink_req_dump *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_type = 1; + req->linkinfo.data.gre.encap_type = encap_type; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_encap_flags(struct rt_link_getlink_req_dump *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_flags = 1; + req->linkinfo.data.gre.encap_flags = encap_flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_encap_sport(struct rt_link_getlink_req_dump *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_sport = 1; + req->linkinfo.data.gre.encap_sport = encap_sport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_encap_dport(struct rt_link_getlink_req_dump *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_dport = 1; + req->linkinfo.data.gre.encap_dport = encap_dport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_collect_metadata(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.collect_metadata = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_ignore_df(struct rt_link_getlink_req_dump *req, + __u8 ignore_df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.ignore_df = 1; + req->linkinfo.data.gre.ignore_df = ignore_df; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_fwmark(struct rt_link_getlink_req_dump *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.fwmark = 1; + req->linkinfo.data.gre.fwmark = fwmark; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_erspan_index(struct rt_link_getlink_req_dump *req, + __u32 erspan_index) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_index = 1; + req->linkinfo.data.gre.erspan_index = erspan_index; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_erspan_ver(struct rt_link_getlink_req_dump *req, + __u8 erspan_ver) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_ver = 1; + req->linkinfo.data.gre.erspan_ver = erspan_ver; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_erspan_dir(struct rt_link_getlink_req_dump *req, + __u8 erspan_dir) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_dir = 1; + req->linkinfo.data.gre.erspan_dir = erspan_dir; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gre_erspan_hwid(struct rt_link_getlink_req_dump *req, + __u16 erspan_hwid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_hwid = 1; + req->linkinfo.data.gre.erspan_hwid = erspan_hwid; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_link(struct rt_link_getlink_req_dump *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.link = 1; + req->linkinfo.data.gretap.link = link; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_iflags(struct rt_link_getlink_req_dump *req, + __u16 iflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.iflags = 1; + req->linkinfo.data.gretap.iflags = iflags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_oflags(struct rt_link_getlink_req_dump *req, + __u16 oflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.oflags = 1; + req->linkinfo.data.gretap.oflags = oflags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_ikey(struct rt_link_getlink_req_dump *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.ikey = 1; + req->linkinfo.data.gretap.ikey = ikey; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_okey(struct rt_link_getlink_req_dump *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.okey = 1; + req->linkinfo.data.gretap.okey = okey; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_local(struct rt_link_getlink_req_dump *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + free(req->linkinfo.data.gretap.local); + req->linkinfo.data.gretap._len.local = len; + req->linkinfo.data.gretap.local = malloc(req->linkinfo.data.gretap._len.local); + memcpy(req->linkinfo.data.gretap.local, local, req->linkinfo.data.gretap._len.local); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_remote(struct rt_link_getlink_req_dump *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + free(req->linkinfo.data.gretap.remote); + req->linkinfo.data.gretap._len.remote = len; + req->linkinfo.data.gretap.remote = malloc(req->linkinfo.data.gretap._len.remote); + memcpy(req->linkinfo.data.gretap.remote, remote, req->linkinfo.data.gretap._len.remote); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_ttl(struct rt_link_getlink_req_dump *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.ttl = 1; + req->linkinfo.data.gretap.ttl = ttl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_tos(struct rt_link_getlink_req_dump *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.tos = 1; + req->linkinfo.data.gretap.tos = tos; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_pmtudisc(struct rt_link_getlink_req_dump *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.pmtudisc = 1; + req->linkinfo.data.gretap.pmtudisc = pmtudisc; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_encap_limit(struct rt_link_getlink_req_dump *req, + __u32 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_limit = 1; + req->linkinfo.data.gretap.encap_limit = encap_limit; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_flowinfo(struct rt_link_getlink_req_dump *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.flowinfo = 1; + req->linkinfo.data.gretap.flowinfo = flowinfo; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_flags(struct rt_link_getlink_req_dump *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.flags = 1; + req->linkinfo.data.gretap.flags = flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_encap_type(struct rt_link_getlink_req_dump *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_type = 1; + req->linkinfo.data.gretap.encap_type = encap_type; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_encap_flags(struct rt_link_getlink_req_dump *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_flags = 1; + req->linkinfo.data.gretap.encap_flags = encap_flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_encap_sport(struct rt_link_getlink_req_dump *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_sport = 1; + req->linkinfo.data.gretap.encap_sport = encap_sport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_encap_dport(struct rt_link_getlink_req_dump *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_dport = 1; + req->linkinfo.data.gretap.encap_dport = encap_dport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_collect_metadata(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.collect_metadata = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_ignore_df(struct rt_link_getlink_req_dump *req, + __u8 ignore_df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.ignore_df = 1; + req->linkinfo.data.gretap.ignore_df = ignore_df; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_fwmark(struct rt_link_getlink_req_dump *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.fwmark = 1; + req->linkinfo.data.gretap.fwmark = fwmark; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_erspan_index(struct rt_link_getlink_req_dump *req, + __u32 erspan_index) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_index = 1; + req->linkinfo.data.gretap.erspan_index = erspan_index; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_erspan_ver(struct rt_link_getlink_req_dump *req, + __u8 erspan_ver) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_ver = 1; + req->linkinfo.data.gretap.erspan_ver = erspan_ver; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_erspan_dir(struct rt_link_getlink_req_dump *req, + __u8 erspan_dir) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_dir = 1; + req->linkinfo.data.gretap.erspan_dir = erspan_dir; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_gretap_erspan_hwid(struct rt_link_getlink_req_dump *req, + __u16 erspan_hwid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_hwid = 1; + req->linkinfo.data.gretap.erspan_hwid = erspan_hwid; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_id(struct rt_link_getlink_req_dump *req, + __u32 id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.id = 1; + req->linkinfo.data.geneve.id = id; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_remote(struct rt_link_getlink_req_dump *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + free(req->linkinfo.data.geneve.remote); + req->linkinfo.data.geneve._len.remote = len; + req->linkinfo.data.geneve.remote = malloc(req->linkinfo.data.geneve._len.remote); + memcpy(req->linkinfo.data.geneve.remote, remote, req->linkinfo.data.geneve._len.remote); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_ttl(struct rt_link_getlink_req_dump *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.ttl = 1; + req->linkinfo.data.geneve.ttl = ttl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_tos(struct rt_link_getlink_req_dump *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.tos = 1; + req->linkinfo.data.geneve.tos = tos; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_port(struct rt_link_getlink_req_dump *req, + __u16 port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.port = 1; + req->linkinfo.data.geneve.port = port; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_collect_metadata(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.collect_metadata = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_remote6(struct rt_link_getlink_req_dump *req, + const void *remote6, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + free(req->linkinfo.data.geneve.remote6); + req->linkinfo.data.geneve._len.remote6 = len; + req->linkinfo.data.geneve.remote6 = malloc(req->linkinfo.data.geneve._len.remote6); + memcpy(req->linkinfo.data.geneve.remote6, remote6, req->linkinfo.data.geneve._len.remote6); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_udp_csum(struct rt_link_getlink_req_dump *req, + __u8 udp_csum) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.udp_csum = 1; + req->linkinfo.data.geneve.udp_csum = udp_csum; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_udp_zero_csum6_tx(struct rt_link_getlink_req_dump *req, + __u8 udp_zero_csum6_tx) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.udp_zero_csum6_tx = 1; + req->linkinfo.data.geneve.udp_zero_csum6_tx = udp_zero_csum6_tx; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_udp_zero_csum6_rx(struct rt_link_getlink_req_dump *req, + __u8 udp_zero_csum6_rx) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.udp_zero_csum6_rx = 1; + req->linkinfo.data.geneve.udp_zero_csum6_rx = udp_zero_csum6_rx; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_label(struct rt_link_getlink_req_dump *req, + __u32 label) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.label = 1; + req->linkinfo.data.geneve.label = label; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_ttl_inherit(struct rt_link_getlink_req_dump *req, + __u8 ttl_inherit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.ttl_inherit = 1; + req->linkinfo.data.geneve.ttl_inherit = ttl_inherit; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_df(struct rt_link_getlink_req_dump *req, + __u8 df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.df = 1; + req->linkinfo.data.geneve.df = df; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_inner_proto_inherit(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.inner_proto_inherit = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_geneve_port_range(struct rt_link_getlink_req_dump *req, + const void *port_range, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + free(req->linkinfo.data.geneve.port_range); + req->linkinfo.data.geneve._len.port_range = len; + req->linkinfo.data.geneve.port_range = malloc(req->linkinfo.data.geneve._len.port_range); + memcpy(req->linkinfo.data.geneve.port_range, port_range, req->linkinfo.data.geneve._len.port_range); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_link(struct rt_link_getlink_req_dump *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.link = 1; + req->linkinfo.data.ipip.link = link; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_local(struct rt_link_getlink_req_dump *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip.local); + req->linkinfo.data.ipip._len.local = len; + req->linkinfo.data.ipip.local = malloc(req->linkinfo.data.ipip._len.local); + memcpy(req->linkinfo.data.ipip.local, local, req->linkinfo.data.ipip._len.local); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_remote(struct rt_link_getlink_req_dump *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip.remote); + req->linkinfo.data.ipip._len.remote = len; + req->linkinfo.data.ipip.remote = malloc(req->linkinfo.data.ipip._len.remote); + memcpy(req->linkinfo.data.ipip.remote, remote, req->linkinfo.data.ipip._len.remote); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_ttl(struct rt_link_getlink_req_dump *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.ttl = 1; + req->linkinfo.data.ipip.ttl = ttl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_tos(struct rt_link_getlink_req_dump *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.tos = 1; + req->linkinfo.data.ipip.tos = tos; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_encap_limit(struct rt_link_getlink_req_dump *req, + __u8 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_limit = 1; + req->linkinfo.data.ipip.encap_limit = encap_limit; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_flowinfo(struct rt_link_getlink_req_dump *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.flowinfo = 1; + req->linkinfo.data.ipip.flowinfo = flowinfo; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_flags(struct rt_link_getlink_req_dump *req, + __u16 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.flags = 1; + req->linkinfo.data.ipip.flags = flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_proto(struct rt_link_getlink_req_dump *req, + __u8 proto) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.proto = 1; + req->linkinfo.data.ipip.proto = proto; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_pmtudisc(struct rt_link_getlink_req_dump *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.pmtudisc = 1; + req->linkinfo.data.ipip.pmtudisc = pmtudisc; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip__6rd_prefix(struct rt_link_getlink_req_dump *req, + const void *_6rd_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip._6rd_prefix); + req->linkinfo.data.ipip._len._6rd_prefix = len; + req->linkinfo.data.ipip._6rd_prefix = malloc(req->linkinfo.data.ipip._len._6rd_prefix); + memcpy(req->linkinfo.data.ipip._6rd_prefix, _6rd_prefix, req->linkinfo.data.ipip._len._6rd_prefix); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip__6rd_relay_prefix(struct rt_link_getlink_req_dump *req, + const void *_6rd_relay_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip._6rd_relay_prefix); + req->linkinfo.data.ipip._len._6rd_relay_prefix = len; + req->linkinfo.data.ipip._6rd_relay_prefix = malloc(req->linkinfo.data.ipip._len._6rd_relay_prefix); + memcpy(req->linkinfo.data.ipip._6rd_relay_prefix, _6rd_relay_prefix, req->linkinfo.data.ipip._len._6rd_relay_prefix); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip__6rd_prefixlen(struct rt_link_getlink_req_dump *req, + __u16 _6rd_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present._6rd_prefixlen = 1; + req->linkinfo.data.ipip._6rd_prefixlen = _6rd_prefixlen; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip__6rd_relay_prefixlen(struct rt_link_getlink_req_dump *req, + __u16 _6rd_relay_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present._6rd_relay_prefixlen = 1; + req->linkinfo.data.ipip._6rd_relay_prefixlen = _6rd_relay_prefixlen; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_encap_type(struct rt_link_getlink_req_dump *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_type = 1; + req->linkinfo.data.ipip.encap_type = encap_type; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_encap_flags(struct rt_link_getlink_req_dump *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_flags = 1; + req->linkinfo.data.ipip.encap_flags = encap_flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_encap_sport(struct rt_link_getlink_req_dump *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_sport = 1; + req->linkinfo.data.ipip.encap_sport = encap_sport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_encap_dport(struct rt_link_getlink_req_dump *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_dport = 1; + req->linkinfo.data.ipip.encap_dport = encap_dport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_collect_metadata(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.collect_metadata = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ipip_fwmark(struct rt_link_getlink_req_dump *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.fwmark = 1; + req->linkinfo.data.ipip.fwmark = fwmark; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_link(struct rt_link_getlink_req_dump *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.link = 1; + req->linkinfo.data.ip6tnl.link = link; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_local(struct rt_link_getlink_req_dump *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + free(req->linkinfo.data.ip6tnl.local); + req->linkinfo.data.ip6tnl._len.local = len; + req->linkinfo.data.ip6tnl.local = malloc(req->linkinfo.data.ip6tnl._len.local); + memcpy(req->linkinfo.data.ip6tnl.local, local, req->linkinfo.data.ip6tnl._len.local); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_remote(struct rt_link_getlink_req_dump *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + free(req->linkinfo.data.ip6tnl.remote); + req->linkinfo.data.ip6tnl._len.remote = len; + req->linkinfo.data.ip6tnl.remote = malloc(req->linkinfo.data.ip6tnl._len.remote); + memcpy(req->linkinfo.data.ip6tnl.remote, remote, req->linkinfo.data.ip6tnl._len.remote); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_ttl(struct rt_link_getlink_req_dump *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.ttl = 1; + req->linkinfo.data.ip6tnl.ttl = ttl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_encap_limit(struct rt_link_getlink_req_dump *req, + __u8 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_limit = 1; + req->linkinfo.data.ip6tnl.encap_limit = encap_limit; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_flowinfo(struct rt_link_getlink_req_dump *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.flowinfo = 1; + req->linkinfo.data.ip6tnl.flowinfo = flowinfo; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_flags(struct rt_link_getlink_req_dump *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.flags = 1; + req->linkinfo.data.ip6tnl.flags = flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_proto(struct rt_link_getlink_req_dump *req, + __u8 proto) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.proto = 1; + req->linkinfo.data.ip6tnl.proto = proto; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_encap_type(struct rt_link_getlink_req_dump *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_type = 1; + req->linkinfo.data.ip6tnl.encap_type = encap_type; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_encap_flags(struct rt_link_getlink_req_dump *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_flags = 1; + req->linkinfo.data.ip6tnl.encap_flags = encap_flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_encap_sport(struct rt_link_getlink_req_dump *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_sport = 1; + req->linkinfo.data.ip6tnl.encap_sport = encap_sport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_encap_dport(struct rt_link_getlink_req_dump *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_dport = 1; + req->linkinfo.data.ip6tnl.encap_dport = encap_dport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_collect_metadata(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.collect_metadata = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ip6tnl_fwmark(struct rt_link_getlink_req_dump *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.fwmark = 1; + req->linkinfo.data.ip6tnl.fwmark = fwmark; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_link(struct rt_link_getlink_req_dump *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.link = 1; + req->linkinfo.data.sit.link = link; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_local(struct rt_link_getlink_req_dump *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit.local); + req->linkinfo.data.sit._len.local = len; + req->linkinfo.data.sit.local = malloc(req->linkinfo.data.sit._len.local); + memcpy(req->linkinfo.data.sit.local, local, req->linkinfo.data.sit._len.local); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_remote(struct rt_link_getlink_req_dump *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit.remote); + req->linkinfo.data.sit._len.remote = len; + req->linkinfo.data.sit.remote = malloc(req->linkinfo.data.sit._len.remote); + memcpy(req->linkinfo.data.sit.remote, remote, req->linkinfo.data.sit._len.remote); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_ttl(struct rt_link_getlink_req_dump *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.ttl = 1; + req->linkinfo.data.sit.ttl = ttl; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_tos(struct rt_link_getlink_req_dump *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.tos = 1; + req->linkinfo.data.sit.tos = tos; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_encap_limit(struct rt_link_getlink_req_dump *req, + __u8 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_limit = 1; + req->linkinfo.data.sit.encap_limit = encap_limit; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_flowinfo(struct rt_link_getlink_req_dump *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.flowinfo = 1; + req->linkinfo.data.sit.flowinfo = flowinfo; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_flags(struct rt_link_getlink_req_dump *req, + __u16 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.flags = 1; + req->linkinfo.data.sit.flags = flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_proto(struct rt_link_getlink_req_dump *req, + __u8 proto) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.proto = 1; + req->linkinfo.data.sit.proto = proto; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_pmtudisc(struct rt_link_getlink_req_dump *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.pmtudisc = 1; + req->linkinfo.data.sit.pmtudisc = pmtudisc; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit__6rd_prefix(struct rt_link_getlink_req_dump *req, + const void *_6rd_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit._6rd_prefix); + req->linkinfo.data.sit._len._6rd_prefix = len; + req->linkinfo.data.sit._6rd_prefix = malloc(req->linkinfo.data.sit._len._6rd_prefix); + memcpy(req->linkinfo.data.sit._6rd_prefix, _6rd_prefix, req->linkinfo.data.sit._len._6rd_prefix); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit__6rd_relay_prefix(struct rt_link_getlink_req_dump *req, + const void *_6rd_relay_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit._6rd_relay_prefix); + req->linkinfo.data.sit._len._6rd_relay_prefix = len; + req->linkinfo.data.sit._6rd_relay_prefix = malloc(req->linkinfo.data.sit._len._6rd_relay_prefix); + memcpy(req->linkinfo.data.sit._6rd_relay_prefix, _6rd_relay_prefix, req->linkinfo.data.sit._len._6rd_relay_prefix); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit__6rd_prefixlen(struct rt_link_getlink_req_dump *req, + __u16 _6rd_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present._6rd_prefixlen = 1; + req->linkinfo.data.sit._6rd_prefixlen = _6rd_prefixlen; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit__6rd_relay_prefixlen(struct rt_link_getlink_req_dump *req, + __u16 _6rd_relay_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present._6rd_relay_prefixlen = 1; + req->linkinfo.data.sit._6rd_relay_prefixlen = _6rd_relay_prefixlen; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_encap_type(struct rt_link_getlink_req_dump *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_type = 1; + req->linkinfo.data.sit.encap_type = encap_type; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_encap_flags(struct rt_link_getlink_req_dump *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_flags = 1; + req->linkinfo.data.sit.encap_flags = encap_flags; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_encap_sport(struct rt_link_getlink_req_dump *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_sport = 1; + req->linkinfo.data.sit.encap_sport = encap_sport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_encap_dport(struct rt_link_getlink_req_dump *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_dport = 1; + req->linkinfo.data.sit.encap_dport = encap_dport; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_collect_metadata(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.collect_metadata = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_sit_fwmark(struct rt_link_getlink_req_dump *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.fwmark = 1; + req->linkinfo.data.sit.fwmark = fwmark; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_tun_owner(struct rt_link_getlink_req_dump *req, + __u32 owner) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.owner = 1; + req->linkinfo.data.tun.owner = owner; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_tun_group(struct rt_link_getlink_req_dump *req, + __u32 group) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.group = 1; + req->linkinfo.data.tun.group = group; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_tun_type(struct rt_link_getlink_req_dump *req, + __u8 type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.type = 1; + req->linkinfo.data.tun.type = type; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_tun_pi(struct rt_link_getlink_req_dump *req, + __u8 pi) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.pi = 1; + req->linkinfo.data.tun.pi = pi; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_tun_vnet_hdr(struct rt_link_getlink_req_dump *req, + __u8 vnet_hdr) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.vnet_hdr = 1; + req->linkinfo.data.tun.vnet_hdr = vnet_hdr; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_tun_persist(struct rt_link_getlink_req_dump *req, + __u8 persist) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.persist = 1; + req->linkinfo.data.tun.persist = persist; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_tun_multi_queue(struct rt_link_getlink_req_dump *req, + __u8 multi_queue) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.multi_queue = 1; + req->linkinfo.data.tun.multi_queue = multi_queue; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_tun_num_queues(struct rt_link_getlink_req_dump *req, + __u32 num_queues) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.num_queues = 1; + req->linkinfo.data.tun.num_queues = num_queues; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_tun_num_disabled_queues(struct rt_link_getlink_req_dump *req, + __u32 num_disabled_queues) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.num_disabled_queues = 1; + req->linkinfo.data.tun.num_disabled_queues = num_disabled_queues; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vlan_id(struct rt_link_getlink_req_dump *req, + __u16 id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.id = 1; + req->linkinfo.data.vlan.id = id; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vlan_flags(struct rt_link_getlink_req_dump *req, + const void *flags, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + free(req->linkinfo.data.vlan.flags); + req->linkinfo.data.vlan._len.flags = len; + req->linkinfo.data.vlan.flags = malloc(req->linkinfo.data.vlan._len.flags); + memcpy(req->linkinfo.data.vlan.flags, flags, req->linkinfo.data.vlan._len.flags); +} +static inline void +__rt_link_getlink_req_dump_set_linkinfo_data_vlan_egress_qos_mapping(struct rt_link_getlink_req_dump *req, + struct ifla_vlan_qos_mapping *mapping, + unsigned int n_mapping) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.egress_qos = 1; + free(req->linkinfo.data.vlan.egress_qos.mapping); + req->linkinfo.data.vlan.egress_qos.mapping = mapping; + req->linkinfo.data.vlan.egress_qos._count.mapping = n_mapping; +} +static inline void +__rt_link_getlink_req_dump_set_linkinfo_data_vlan_ingress_qos_mapping(struct rt_link_getlink_req_dump *req, + struct ifla_vlan_qos_mapping *mapping, + unsigned int n_mapping) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.ingress_qos = 1; + free(req->linkinfo.data.vlan.ingress_qos.mapping); + req->linkinfo.data.vlan.ingress_qos.mapping = mapping; + req->linkinfo.data.vlan.ingress_qos._count.mapping = n_mapping; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vlan_protocol(struct rt_link_getlink_req_dump *req, + int protocol /* big-endian */) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.protocol = 1; + req->linkinfo.data.vlan.protocol = protocol; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vrf_table(struct rt_link_getlink_req_dump *req, + __u32 table) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vrf = 1; + req->linkinfo.data.vrf._present.table = 1; + req->linkinfo.data.vrf.table = table; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti_link(struct rt_link_getlink_req_dump *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.link = 1; + req->linkinfo.data.vti.link = link; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti_ikey(struct rt_link_getlink_req_dump *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.ikey = 1; + req->linkinfo.data.vti.ikey = ikey; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti_okey(struct rt_link_getlink_req_dump *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.okey = 1; + req->linkinfo.data.vti.okey = okey; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti_local(struct rt_link_getlink_req_dump *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + free(req->linkinfo.data.vti.local); + req->linkinfo.data.vti._len.local = len; + req->linkinfo.data.vti.local = malloc(req->linkinfo.data.vti._len.local); + memcpy(req->linkinfo.data.vti.local, local, req->linkinfo.data.vti._len.local); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti_remote(struct rt_link_getlink_req_dump *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + free(req->linkinfo.data.vti.remote); + req->linkinfo.data.vti._len.remote = len; + req->linkinfo.data.vti.remote = malloc(req->linkinfo.data.vti._len.remote); + memcpy(req->linkinfo.data.vti.remote, remote, req->linkinfo.data.vti._len.remote); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti_fwmark(struct rt_link_getlink_req_dump *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.fwmark = 1; + req->linkinfo.data.vti.fwmark = fwmark; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti6_link(struct rt_link_getlink_req_dump *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.link = 1; + req->linkinfo.data.vti6.link = link; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti6_ikey(struct rt_link_getlink_req_dump *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.ikey = 1; + req->linkinfo.data.vti6.ikey = ikey; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti6_okey(struct rt_link_getlink_req_dump *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.okey = 1; + req->linkinfo.data.vti6.okey = okey; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti6_local(struct rt_link_getlink_req_dump *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + free(req->linkinfo.data.vti6.local); + req->linkinfo.data.vti6._len.local = len; + req->linkinfo.data.vti6.local = malloc(req->linkinfo.data.vti6._len.local); + memcpy(req->linkinfo.data.vti6.local, local, req->linkinfo.data.vti6._len.local); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti6_remote(struct rt_link_getlink_req_dump *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + free(req->linkinfo.data.vti6.remote); + req->linkinfo.data.vti6._len.remote = len; + req->linkinfo.data.vti6.remote = malloc(req->linkinfo.data.vti6._len.remote); + memcpy(req->linkinfo.data.vti6.remote, remote, req->linkinfo.data.vti6._len.remote); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_vti6_fwmark(struct rt_link_getlink_req_dump *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.fwmark = 1; + req->linkinfo.data.vti6.fwmark = fwmark; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_netkit_peer_info(struct rt_link_getlink_req_dump *req, + const void *peer_info, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + free(req->linkinfo.data.netkit.peer_info); + req->linkinfo.data.netkit._len.peer_info = len; + req->linkinfo.data.netkit.peer_info = malloc(req->linkinfo.data.netkit._len.peer_info); + memcpy(req->linkinfo.data.netkit.peer_info, peer_info, req->linkinfo.data.netkit._len.peer_info); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_netkit_primary(struct rt_link_getlink_req_dump *req, + __u8 primary) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.primary = 1; + req->linkinfo.data.netkit.primary = primary; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_netkit_policy(struct rt_link_getlink_req_dump *req, + int policy) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.policy = 1; + req->linkinfo.data.netkit.policy = policy; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_netkit_peer_policy(struct rt_link_getlink_req_dump *req, + int peer_policy) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.peer_policy = 1; + req->linkinfo.data.netkit.peer_policy = peer_policy; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_netkit_mode(struct rt_link_getlink_req_dump *req, + enum netkit_mode mode) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.mode = 1; + req->linkinfo.data.netkit.mode = mode; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_netkit_scrub(struct rt_link_getlink_req_dump *req, + int scrub) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.scrub = 1; + req->linkinfo.data.netkit.scrub = scrub; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_netkit_peer_scrub(struct rt_link_getlink_req_dump *req, + int peer_scrub) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.peer_scrub = 1; + req->linkinfo.data.netkit.peer_scrub = peer_scrub; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_netkit_headroom(struct rt_link_getlink_req_dump *req, + __u16 headroom) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.headroom = 1; + req->linkinfo.data.netkit.headroom = headroom; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_netkit_tailroom(struct rt_link_getlink_req_dump *req, + __u16 tailroom) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.tailroom = 1; + req->linkinfo.data.netkit.tailroom = tailroom; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_data_ovpn_mode(struct rt_link_getlink_req_dump *req, + enum ovpn_mode mode) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ovpn = 1; + req->linkinfo.data.ovpn._present.mode = 1; + req->linkinfo.data.ovpn.mode = mode; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_xstats(struct rt_link_getlink_req_dump *req, + const void *xstats, size_t len) +{ + req->_present.linkinfo = 1; + free(req->linkinfo.xstats); + req->linkinfo._len.xstats = len; + req->linkinfo.xstats = malloc(req->linkinfo._len.xstats); + memcpy(req->linkinfo.xstats, xstats, req->linkinfo._len.xstats); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_kind(struct rt_link_getlink_req_dump *req, + const char *slave_kind) +{ + req->_present.linkinfo = 1; + free(req->linkinfo.slave_kind); + req->linkinfo._len.slave_kind = strlen(slave_kind); + req->linkinfo.slave_kind = malloc(req->linkinfo._len.slave_kind + 1); + memcpy(req->linkinfo.slave_kind, slave_kind, req->linkinfo._len.slave_kind); + req->linkinfo.slave_kind[req->linkinfo._len.slave_kind] = 0; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_state(struct rt_link_getlink_req_dump *req, + __u8 state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.state = 1; + req->linkinfo.slave_data.bridge.state = state; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_priority(struct rt_link_getlink_req_dump *req, + __u16 priority) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.priority = 1; + req->linkinfo.slave_data.bridge.priority = priority; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_cost(struct rt_link_getlink_req_dump *req, + __u32 cost) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.cost = 1; + req->linkinfo.slave_data.bridge.cost = cost; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_mode(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mode = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_guard(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.guard = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_protect(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.protect = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_fast_leave(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.fast_leave = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_learning(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.learning = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_unicast_flood(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.unicast_flood = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_proxyarp(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.proxyarp = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_learning_sync(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.learning_sync = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_proxyarp_wifi(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.proxyarp_wifi = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_root_id(struct rt_link_getlink_req_dump *req, + const void *root_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + free(req->linkinfo.slave_data.bridge.root_id); + req->linkinfo.slave_data.bridge._len.root_id = len; + req->linkinfo.slave_data.bridge.root_id = malloc(req->linkinfo.slave_data.bridge._len.root_id); + memcpy(req->linkinfo.slave_data.bridge.root_id, root_id, req->linkinfo.slave_data.bridge._len.root_id); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_bridge_id(struct rt_link_getlink_req_dump *req, + const void *bridge_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + free(req->linkinfo.slave_data.bridge.bridge_id); + req->linkinfo.slave_data.bridge._len.bridge_id = len; + req->linkinfo.slave_data.bridge.bridge_id = malloc(req->linkinfo.slave_data.bridge._len.bridge_id); + memcpy(req->linkinfo.slave_data.bridge.bridge_id, bridge_id, req->linkinfo.slave_data.bridge._len.bridge_id); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_designated_port(struct rt_link_getlink_req_dump *req, + __u16 designated_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.designated_port = 1; + req->linkinfo.slave_data.bridge.designated_port = designated_port; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_designated_cost(struct rt_link_getlink_req_dump *req, + __u16 designated_cost) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.designated_cost = 1; + req->linkinfo.slave_data.bridge.designated_cost = designated_cost; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_id(struct rt_link_getlink_req_dump *req, + __u16 id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.id = 1; + req->linkinfo.slave_data.bridge.id = id; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_no(struct rt_link_getlink_req_dump *req, + __u16 no) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.no = 1; + req->linkinfo.slave_data.bridge.no = no; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_topology_change_ack(struct rt_link_getlink_req_dump *req, + __u8 topology_change_ack) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.topology_change_ack = 1; + req->linkinfo.slave_data.bridge.topology_change_ack = topology_change_ack; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_config_pending(struct rt_link_getlink_req_dump *req, + __u8 config_pending) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.config_pending = 1; + req->linkinfo.slave_data.bridge.config_pending = config_pending; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_message_age_timer(struct rt_link_getlink_req_dump *req, + __u64 message_age_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.message_age_timer = 1; + req->linkinfo.slave_data.bridge.message_age_timer = message_age_timer; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_forward_delay_timer(struct rt_link_getlink_req_dump *req, + __u64 forward_delay_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.forward_delay_timer = 1; + req->linkinfo.slave_data.bridge.forward_delay_timer = forward_delay_timer; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_hold_timer(struct rt_link_getlink_req_dump *req, + __u64 hold_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.hold_timer = 1; + req->linkinfo.slave_data.bridge.hold_timer = hold_timer; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_flush(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.flush = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_multicast_router(struct rt_link_getlink_req_dump *req, + __u8 multicast_router) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.multicast_router = 1; + req->linkinfo.slave_data.bridge.multicast_router = multicast_router; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_mcast_flood(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_flood = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_mcast_to_ucast(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_to_ucast = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_vlan_tunnel(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.vlan_tunnel = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_bcast_flood(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.bcast_flood = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_group_fwd_mask(struct rt_link_getlink_req_dump *req, + __u16 group_fwd_mask) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.group_fwd_mask = 1; + req->linkinfo.slave_data.bridge.group_fwd_mask = group_fwd_mask; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_neigh_suppress(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.neigh_suppress = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_isolated(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.isolated = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_backup_port(struct rt_link_getlink_req_dump *req, + __u32 backup_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.backup_port = 1; + req->linkinfo.slave_data.bridge.backup_port = backup_port; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_mrp_ring_open(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mrp_ring_open = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_mrp_in_open(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mrp_in_open = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_mcast_eht_hosts_limit(struct rt_link_getlink_req_dump *req, + __u32 mcast_eht_hosts_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_eht_hosts_limit = 1; + req->linkinfo.slave_data.bridge.mcast_eht_hosts_limit = mcast_eht_hosts_limit; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_mcast_eht_hosts_cnt(struct rt_link_getlink_req_dump *req, + __u32 mcast_eht_hosts_cnt) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_eht_hosts_cnt = 1; + req->linkinfo.slave_data.bridge.mcast_eht_hosts_cnt = mcast_eht_hosts_cnt; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_locked(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.locked = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_mab(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mab = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_mcast_n_groups(struct rt_link_getlink_req_dump *req, + __u32 mcast_n_groups) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_n_groups = 1; + req->linkinfo.slave_data.bridge.mcast_n_groups = mcast_n_groups; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_mcast_max_groups(struct rt_link_getlink_req_dump *req, + __u32 mcast_max_groups) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_max_groups = 1; + req->linkinfo.slave_data.bridge.mcast_max_groups = mcast_max_groups; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_neigh_vlan_suppress(struct rt_link_getlink_req_dump *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.neigh_vlan_suppress = 1; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bridge_backup_nhid(struct rt_link_getlink_req_dump *req, + __u32 backup_nhid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.backup_nhid = 1; + req->linkinfo.slave_data.bridge.backup_nhid = backup_nhid; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bond_state(struct rt_link_getlink_req_dump *req, + __u8 state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.state = 1; + req->linkinfo.slave_data.bond.state = state; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bond_mii_status(struct rt_link_getlink_req_dump *req, + __u8 mii_status) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.mii_status = 1; + req->linkinfo.slave_data.bond.mii_status = mii_status; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bond_link_failure_count(struct rt_link_getlink_req_dump *req, + __u32 link_failure_count) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.link_failure_count = 1; + req->linkinfo.slave_data.bond.link_failure_count = link_failure_count; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bond_perm_hwaddr(struct rt_link_getlink_req_dump *req, + const void *perm_hwaddr, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + free(req->linkinfo.slave_data.bond.perm_hwaddr); + req->linkinfo.slave_data.bond._len.perm_hwaddr = len; + req->linkinfo.slave_data.bond.perm_hwaddr = malloc(req->linkinfo.slave_data.bond._len.perm_hwaddr); + memcpy(req->linkinfo.slave_data.bond.perm_hwaddr, perm_hwaddr, req->linkinfo.slave_data.bond._len.perm_hwaddr); +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bond_queue_id(struct rt_link_getlink_req_dump *req, + __u16 queue_id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.queue_id = 1; + req->linkinfo.slave_data.bond.queue_id = queue_id; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bond_ad_aggregator_id(struct rt_link_getlink_req_dump *req, + __u16 ad_aggregator_id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.ad_aggregator_id = 1; + req->linkinfo.slave_data.bond.ad_aggregator_id = ad_aggregator_id; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bond_ad_actor_oper_port_state(struct rt_link_getlink_req_dump *req, + __u8 ad_actor_oper_port_state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.ad_actor_oper_port_state = 1; + req->linkinfo.slave_data.bond.ad_actor_oper_port_state = ad_actor_oper_port_state; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bond_ad_partner_oper_port_state(struct rt_link_getlink_req_dump *req, + __u16 ad_partner_oper_port_state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.ad_partner_oper_port_state = 1; + req->linkinfo.slave_data.bond.ad_partner_oper_port_state = ad_partner_oper_port_state; +} +static inline void +rt_link_getlink_req_dump_set_linkinfo_slave_data_bond_prio(struct rt_link_getlink_req_dump *req, + __u32 prio) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.prio = 1; + req->linkinfo.slave_data.bond.prio = prio; +} + +struct rt_link_getlink_list { + struct rt_link_getlink_list *next; + struct rt_link_getlink_rsp obj __attribute__((aligned(8))); +}; + +void rt_link_getlink_list_free(struct rt_link_getlink_list *rsp); + +struct rt_link_getlink_list * +rt_link_getlink_dump(struct ynl_sock *ys, struct rt_link_getlink_req_dump *req); + +/* RTM_GETLINK - notify */ +struct rt_link_getlink_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type *next; + void (*free)(struct rt_link_getlink_ntf *ntf); + struct rt_link_getlink_rsp obj __attribute__((aligned(8))); +}; + +void rt_link_getlink_ntf_free(struct rt_link_getlink_ntf *rsp); + +/* ============== RTM_SETLINK ============== */ +/* RTM_SETLINK - do */ +struct rt_link_setlink_req { + __u16 _nlmsg_flags; + + struct ifinfomsg _hdr; + + struct { + __u32 mtu:1; + __u32 link:1; + __u32 master:1; + __u32 txqlen:1; + __u32 weight:1; + __u32 operstate:1; + __u32 linkmode:1; + __u32 linkinfo:1; + __u32 net_ns_pid:1; + __u32 num_vf:1; + __u32 vfinfo_list:1; + __u32 vf_ports:1; + __u32 port_self:1; + __u32 af_spec:1; + __u32 group:1; + __u32 net_ns_fd:1; + __u32 ext_mask:1; + __u32 promiscuity:1; + __u32 num_tx_queues:1; + __u32 num_rx_queues:1; + __u32 carrier:1; + __u32 carrier_changes:1; + __u32 link_netnsid:1; + __u32 proto_down:1; + __u32 gso_max_segs:1; + __u32 gso_max_size:1; + __u32 xdp:1; + __u32 event:1; + __u32 new_netnsid:1; + __u32 target_netnsid:1; + __u32 carrier_up_count:1; + __u32 carrier_down_count:1; + __u32 new_ifindex:1; + __u32 min_mtu:1; + __u32 max_mtu:1; + __u32 prop_list:1; + __u32 gro_max_size:1; + __u32 tso_max_size:1; + __u32 tso_max_segs:1; + __u32 allmulti:1; + __u32 gso_ipv4_max_size:1; + __u32 gro_ipv4_max_size:1; + } _present; + struct { + __u32 address; + __u32 broadcast; + __u32 ifname; + __u32 qdisc; + __u32 stats; + __u32 cost; + __u32 priority; + __u32 wireless; + __u32 protinfo; + __u32 map; + __u32 ifalias; + __u32 stats64; + __u32 phys_port_id; + __u32 phys_switch_id; + __u32 phys_port_name; + __u32 perm_address; + __u32 proto_down_reason; + __u32 parent_dev_name; + __u32 parent_dev_bus_name; + __u32 devlink_port; + } _len; + + void *address; + void *broadcast; + char *ifname; + __u32 mtu; + __u32 link; + char *qdisc; + struct rtnl_link_stats *stats; + char *cost; + char *priority; + __u32 master; + char *wireless; + char *protinfo; + __u32 txqlen; + struct rtnl_link_ifmap *map; + __u32 weight; + __u8 operstate; + __u8 linkmode; + struct rt_link_linkinfo_attrs linkinfo; + __u32 net_ns_pid; + char *ifalias; + __u32 num_vf; + struct rt_link_vfinfo_list_attrs vfinfo_list; + struct rtnl_link_stats64 *stats64; + struct rt_link_vf_ports_attrs vf_ports; + struct rt_link_port_self_attrs port_self; + struct rt_link_af_spec_attrs af_spec; + __u32 group; + __u32 net_ns_fd; + __u32 ext_mask; + __u32 promiscuity; + __u32 num_tx_queues; + __u32 num_rx_queues; + __u8 carrier; + void *phys_port_id; + __u32 carrier_changes; + void *phys_switch_id; + __s32 link_netnsid; + char *phys_port_name; + __u8 proto_down; + __u32 gso_max_segs; + __u32 gso_max_size; + struct rt_link_xdp_attrs xdp; + __u32 event; + __s32 new_netnsid; + __s32 target_netnsid; + __u32 carrier_up_count; + __u32 carrier_down_count; + __s32 new_ifindex; + __u32 min_mtu; + __u32 max_mtu; + struct rt_link_prop_list_link_attrs prop_list; + void *perm_address; + char *proto_down_reason; + char *parent_dev_name; + char *parent_dev_bus_name; + __u32 gro_max_size; + __u32 tso_max_size; + __u32 tso_max_segs; + __u32 allmulti; + void *devlink_port; + __u32 gso_ipv4_max_size; + __u32 gro_ipv4_max_size; +}; + +static inline struct rt_link_setlink_req *rt_link_setlink_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_link_setlink_req)); +} +void rt_link_setlink_req_free(struct rt_link_setlink_req *req); + +static inline void +rt_link_setlink_req_set_nlflags(struct rt_link_setlink_req *req, + __u16 nl_flags) +{ + req->_nlmsg_flags = nl_flags; +} + +static inline void +rt_link_setlink_req_set_address(struct rt_link_setlink_req *req, + const void *address, size_t len) +{ + free(req->address); + req->_len.address = len; + req->address = malloc(req->_len.address); + memcpy(req->address, address, req->_len.address); +} +static inline void +rt_link_setlink_req_set_broadcast(struct rt_link_setlink_req *req, + const void *broadcast, size_t len) +{ + free(req->broadcast); + req->_len.broadcast = len; + req->broadcast = malloc(req->_len.broadcast); + memcpy(req->broadcast, broadcast, req->_len.broadcast); +} +static inline void +rt_link_setlink_req_set_ifname(struct rt_link_setlink_req *req, + const char *ifname) +{ + free(req->ifname); + req->_len.ifname = strlen(ifname); + req->ifname = malloc(req->_len.ifname + 1); + memcpy(req->ifname, ifname, req->_len.ifname); + req->ifname[req->_len.ifname] = 0; +} +static inline void +rt_link_setlink_req_set_mtu(struct rt_link_setlink_req *req, __u32 mtu) +{ + req->_present.mtu = 1; + req->mtu = mtu; +} +static inline void +rt_link_setlink_req_set_link(struct rt_link_setlink_req *req, __u32 link) +{ + req->_present.link = 1; + req->link = link; +} +static inline void +rt_link_setlink_req_set_qdisc(struct rt_link_setlink_req *req, + const char *qdisc) +{ + free(req->qdisc); + req->_len.qdisc = strlen(qdisc); + req->qdisc = malloc(req->_len.qdisc + 1); + memcpy(req->qdisc, qdisc, req->_len.qdisc); + req->qdisc[req->_len.qdisc] = 0; +} +static inline void +rt_link_setlink_req_set_stats(struct rt_link_setlink_req *req, + const void *stats, size_t len) +{ + free(req->stats); + req->_len.stats = len; + req->stats = malloc(req->_len.stats); + memcpy(req->stats, stats, req->_len.stats); +} +static inline void +rt_link_setlink_req_set_cost(struct rt_link_setlink_req *req, const char *cost) +{ + free(req->cost); + req->_len.cost = strlen(cost); + req->cost = malloc(req->_len.cost + 1); + memcpy(req->cost, cost, req->_len.cost); + req->cost[req->_len.cost] = 0; +} +static inline void +rt_link_setlink_req_set_priority(struct rt_link_setlink_req *req, + const char *priority) +{ + free(req->priority); + req->_len.priority = strlen(priority); + req->priority = malloc(req->_len.priority + 1); + memcpy(req->priority, priority, req->_len.priority); + req->priority[req->_len.priority] = 0; +} +static inline void +rt_link_setlink_req_set_master(struct rt_link_setlink_req *req, __u32 master) +{ + req->_present.master = 1; + req->master = master; +} +static inline void +rt_link_setlink_req_set_wireless(struct rt_link_setlink_req *req, + const char *wireless) +{ + free(req->wireless); + req->_len.wireless = strlen(wireless); + req->wireless = malloc(req->_len.wireless + 1); + memcpy(req->wireless, wireless, req->_len.wireless); + req->wireless[req->_len.wireless] = 0; +} +static inline void +rt_link_setlink_req_set_protinfo(struct rt_link_setlink_req *req, + const char *protinfo) +{ + free(req->protinfo); + req->_len.protinfo = strlen(protinfo); + req->protinfo = malloc(req->_len.protinfo + 1); + memcpy(req->protinfo, protinfo, req->_len.protinfo); + req->protinfo[req->_len.protinfo] = 0; +} +static inline void +rt_link_setlink_req_set_txqlen(struct rt_link_setlink_req *req, __u32 txqlen) +{ + req->_present.txqlen = 1; + req->txqlen = txqlen; +} +static inline void +rt_link_setlink_req_set_map(struct rt_link_setlink_req *req, const void *map, + size_t len) +{ + free(req->map); + req->_len.map = len; + req->map = malloc(req->_len.map); + memcpy(req->map, map, req->_len.map); +} +static inline void +rt_link_setlink_req_set_weight(struct rt_link_setlink_req *req, __u32 weight) +{ + req->_present.weight = 1; + req->weight = weight; +} +static inline void +rt_link_setlink_req_set_operstate(struct rt_link_setlink_req *req, + __u8 operstate) +{ + req->_present.operstate = 1; + req->operstate = operstate; +} +static inline void +rt_link_setlink_req_set_linkmode(struct rt_link_setlink_req *req, + __u8 linkmode) +{ + req->_present.linkmode = 1; + req->linkmode = linkmode; +} +static inline void +rt_link_setlink_req_set_linkinfo_kind(struct rt_link_setlink_req *req, + const char *kind) +{ + req->_present.linkinfo = 1; + free(req->linkinfo.kind); + req->linkinfo._len.kind = strlen(kind); + req->linkinfo.kind = malloc(req->linkinfo._len.kind + 1); + memcpy(req->linkinfo.kind, kind, req->linkinfo._len.kind); + req->linkinfo.kind[req->linkinfo._len.kind] = 0; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_mode(struct rt_link_setlink_req *req, + __u8 mode) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.mode = 1; + req->linkinfo.data.bond.mode = mode; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_active_slave(struct rt_link_setlink_req *req, + __u32 active_slave) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.active_slave = 1; + req->linkinfo.data.bond.active_slave = active_slave; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_miimon(struct rt_link_setlink_req *req, + __u32 miimon) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.miimon = 1; + req->linkinfo.data.bond.miimon = miimon; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_updelay(struct rt_link_setlink_req *req, + __u32 updelay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.updelay = 1; + req->linkinfo.data.bond.updelay = updelay; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_downdelay(struct rt_link_setlink_req *req, + __u32 downdelay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.downdelay = 1; + req->linkinfo.data.bond.downdelay = downdelay; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_use_carrier(struct rt_link_setlink_req *req, + __u8 use_carrier) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.use_carrier = 1; + req->linkinfo.data.bond.use_carrier = use_carrier; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_arp_interval(struct rt_link_setlink_req *req, + __u32 arp_interval) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.arp_interval = 1; + req->linkinfo.data.bond.arp_interval = arp_interval; +} +static inline void +__rt_link_setlink_req_set_linkinfo_data_bond_arp_ip_target(struct rt_link_setlink_req *req, + __u32 *arp_ip_target, + unsigned int n_arp_ip_target) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + free(req->linkinfo.data.bond.arp_ip_target); + req->linkinfo.data.bond.arp_ip_target = arp_ip_target; + req->linkinfo.data.bond._count.arp_ip_target = n_arp_ip_target; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_arp_validate(struct rt_link_setlink_req *req, + __u32 arp_validate) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.arp_validate = 1; + req->linkinfo.data.bond.arp_validate = arp_validate; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_arp_all_targets(struct rt_link_setlink_req *req, + __u32 arp_all_targets) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.arp_all_targets = 1; + req->linkinfo.data.bond.arp_all_targets = arp_all_targets; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_primary(struct rt_link_setlink_req *req, + __u32 primary) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.primary = 1; + req->linkinfo.data.bond.primary = primary; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_primary_reselect(struct rt_link_setlink_req *req, + __u8 primary_reselect) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.primary_reselect = 1; + req->linkinfo.data.bond.primary_reselect = primary_reselect; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_fail_over_mac(struct rt_link_setlink_req *req, + __u8 fail_over_mac) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.fail_over_mac = 1; + req->linkinfo.data.bond.fail_over_mac = fail_over_mac; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_xmit_hash_policy(struct rt_link_setlink_req *req, + __u8 xmit_hash_policy) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.xmit_hash_policy = 1; + req->linkinfo.data.bond.xmit_hash_policy = xmit_hash_policy; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_resend_igmp(struct rt_link_setlink_req *req, + __u32 resend_igmp) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.resend_igmp = 1; + req->linkinfo.data.bond.resend_igmp = resend_igmp; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_num_peer_notif(struct rt_link_setlink_req *req, + __u8 num_peer_notif) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.num_peer_notif = 1; + req->linkinfo.data.bond.num_peer_notif = num_peer_notif; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_all_slaves_active(struct rt_link_setlink_req *req, + __u8 all_slaves_active) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.all_slaves_active = 1; + req->linkinfo.data.bond.all_slaves_active = all_slaves_active; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_min_links(struct rt_link_setlink_req *req, + __u32 min_links) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.min_links = 1; + req->linkinfo.data.bond.min_links = min_links; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_lp_interval(struct rt_link_setlink_req *req, + __u32 lp_interval) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.lp_interval = 1; + req->linkinfo.data.bond.lp_interval = lp_interval; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_packets_per_slave(struct rt_link_setlink_req *req, + __u32 packets_per_slave) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.packets_per_slave = 1; + req->linkinfo.data.bond.packets_per_slave = packets_per_slave; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_ad_lacp_rate(struct rt_link_setlink_req *req, + __u8 ad_lacp_rate) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_lacp_rate = 1; + req->linkinfo.data.bond.ad_lacp_rate = ad_lacp_rate; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_ad_select(struct rt_link_setlink_req *req, + __u8 ad_select) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_select = 1; + req->linkinfo.data.bond.ad_select = ad_select; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_ad_info_aggregator(struct rt_link_setlink_req *req, + __u16 aggregator) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.aggregator = 1; + req->linkinfo.data.bond.ad_info.aggregator = aggregator; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_ad_info_num_ports(struct rt_link_setlink_req *req, + __u16 num_ports) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.num_ports = 1; + req->linkinfo.data.bond.ad_info.num_ports = num_ports; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_ad_info_actor_key(struct rt_link_setlink_req *req, + __u16 actor_key) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.actor_key = 1; + req->linkinfo.data.bond.ad_info.actor_key = actor_key; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_ad_info_partner_key(struct rt_link_setlink_req *req, + __u16 partner_key) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + req->linkinfo.data.bond.ad_info._present.partner_key = 1; + req->linkinfo.data.bond.ad_info.partner_key = partner_key; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_ad_info_partner_mac(struct rt_link_setlink_req *req, + const void *partner_mac, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_info = 1; + free(req->linkinfo.data.bond.ad_info.partner_mac); + req->linkinfo.data.bond.ad_info._len.partner_mac = len; + req->linkinfo.data.bond.ad_info.partner_mac = malloc(req->linkinfo.data.bond.ad_info._len.partner_mac); + memcpy(req->linkinfo.data.bond.ad_info.partner_mac, partner_mac, req->linkinfo.data.bond.ad_info._len.partner_mac); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_ad_actor_sys_prio(struct rt_link_setlink_req *req, + __u16 ad_actor_sys_prio) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_actor_sys_prio = 1; + req->linkinfo.data.bond.ad_actor_sys_prio = ad_actor_sys_prio; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_ad_user_port_key(struct rt_link_setlink_req *req, + __u16 ad_user_port_key) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_user_port_key = 1; + req->linkinfo.data.bond.ad_user_port_key = ad_user_port_key; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_ad_actor_system(struct rt_link_setlink_req *req, + const void *ad_actor_system, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + free(req->linkinfo.data.bond.ad_actor_system); + req->linkinfo.data.bond._len.ad_actor_system = len; + req->linkinfo.data.bond.ad_actor_system = malloc(req->linkinfo.data.bond._len.ad_actor_system); + memcpy(req->linkinfo.data.bond.ad_actor_system, ad_actor_system, req->linkinfo.data.bond._len.ad_actor_system); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_tlb_dynamic_lb(struct rt_link_setlink_req *req, + __u8 tlb_dynamic_lb) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.tlb_dynamic_lb = 1; + req->linkinfo.data.bond.tlb_dynamic_lb = tlb_dynamic_lb; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_peer_notif_delay(struct rt_link_setlink_req *req, + __u32 peer_notif_delay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.peer_notif_delay = 1; + req->linkinfo.data.bond.peer_notif_delay = peer_notif_delay; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_ad_lacp_active(struct rt_link_setlink_req *req, + __u8 ad_lacp_active) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.ad_lacp_active = 1; + req->linkinfo.data.bond.ad_lacp_active = ad_lacp_active; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_missed_max(struct rt_link_setlink_req *req, + __u8 missed_max) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.missed_max = 1; + req->linkinfo.data.bond.missed_max = missed_max; +} +static inline void +__rt_link_setlink_req_set_linkinfo_data_bond_ns_ip6_target(struct rt_link_setlink_req *req, + unsigned char (*ns_ip6_target)[16], + unsigned int n_ns_ip6_target) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + free(req->linkinfo.data.bond.ns_ip6_target); + req->linkinfo.data.bond.ns_ip6_target = ns_ip6_target; + req->linkinfo.data.bond._count.ns_ip6_target = n_ns_ip6_target; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bond_coupled_control(struct rt_link_setlink_req *req, + __u8 coupled_control) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bond = 1; + req->linkinfo.data.bond._present.coupled_control = 1; + req->linkinfo.data.bond.coupled_control = coupled_control; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_forward_delay(struct rt_link_setlink_req *req, + __u32 forward_delay) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.forward_delay = 1; + req->linkinfo.data.bridge.forward_delay = forward_delay; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_hello_time(struct rt_link_setlink_req *req, + __u32 hello_time) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.hello_time = 1; + req->linkinfo.data.bridge.hello_time = hello_time; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_max_age(struct rt_link_setlink_req *req, + __u32 max_age) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.max_age = 1; + req->linkinfo.data.bridge.max_age = max_age; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_ageing_time(struct rt_link_setlink_req *req, + __u32 ageing_time) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.ageing_time = 1; + req->linkinfo.data.bridge.ageing_time = ageing_time; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_stp_state(struct rt_link_setlink_req *req, + __u32 stp_state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.stp_state = 1; + req->linkinfo.data.bridge.stp_state = stp_state; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_priority(struct rt_link_setlink_req *req, + __u16 priority) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.priority = 1; + req->linkinfo.data.bridge.priority = priority; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_vlan_filtering(struct rt_link_setlink_req *req, + __u8 vlan_filtering) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_filtering = 1; + req->linkinfo.data.bridge.vlan_filtering = vlan_filtering; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_vlan_protocol(struct rt_link_setlink_req *req, + __u16 vlan_protocol) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_protocol = 1; + req->linkinfo.data.bridge.vlan_protocol = vlan_protocol; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_group_fwd_mask(struct rt_link_setlink_req *req, + __u16 group_fwd_mask) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.group_fwd_mask = 1; + req->linkinfo.data.bridge.group_fwd_mask = group_fwd_mask; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_root_id(struct rt_link_setlink_req *req, + const void *root_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.root_id); + req->linkinfo.data.bridge._len.root_id = len; + req->linkinfo.data.bridge.root_id = malloc(req->linkinfo.data.bridge._len.root_id); + memcpy(req->linkinfo.data.bridge.root_id, root_id, req->linkinfo.data.bridge._len.root_id); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_bridge_id(struct rt_link_setlink_req *req, + const void *bridge_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.bridge_id); + req->linkinfo.data.bridge._len.bridge_id = len; + req->linkinfo.data.bridge.bridge_id = malloc(req->linkinfo.data.bridge._len.bridge_id); + memcpy(req->linkinfo.data.bridge.bridge_id, bridge_id, req->linkinfo.data.bridge._len.bridge_id); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_root_port(struct rt_link_setlink_req *req, + __u16 root_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.root_port = 1; + req->linkinfo.data.bridge.root_port = root_port; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_root_path_cost(struct rt_link_setlink_req *req, + __u32 root_path_cost) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.root_path_cost = 1; + req->linkinfo.data.bridge.root_path_cost = root_path_cost; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_topology_change(struct rt_link_setlink_req *req, + __u8 topology_change) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.topology_change = 1; + req->linkinfo.data.bridge.topology_change = topology_change; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_topology_change_detected(struct rt_link_setlink_req *req, + __u8 topology_change_detected) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.topology_change_detected = 1; + req->linkinfo.data.bridge.topology_change_detected = topology_change_detected; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_hello_timer(struct rt_link_setlink_req *req, + __u64 hello_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.hello_timer = 1; + req->linkinfo.data.bridge.hello_timer = hello_timer; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_tcn_timer(struct rt_link_setlink_req *req, + __u64 tcn_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.tcn_timer = 1; + req->linkinfo.data.bridge.tcn_timer = tcn_timer; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_topology_change_timer(struct rt_link_setlink_req *req, + __u64 topology_change_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.topology_change_timer = 1; + req->linkinfo.data.bridge.topology_change_timer = topology_change_timer; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_gc_timer(struct rt_link_setlink_req *req, + __u64 gc_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.gc_timer = 1; + req->linkinfo.data.bridge.gc_timer = gc_timer; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_group_addr(struct rt_link_setlink_req *req, + const void *group_addr, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.group_addr); + req->linkinfo.data.bridge._len.group_addr = len; + req->linkinfo.data.bridge.group_addr = malloc(req->linkinfo.data.bridge._len.group_addr); + memcpy(req->linkinfo.data.bridge.group_addr, group_addr, req->linkinfo.data.bridge._len.group_addr); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_fdb_flush(struct rt_link_setlink_req *req, + const void *fdb_flush, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.fdb_flush); + req->linkinfo.data.bridge._len.fdb_flush = len; + req->linkinfo.data.bridge.fdb_flush = malloc(req->linkinfo.data.bridge._len.fdb_flush); + memcpy(req->linkinfo.data.bridge.fdb_flush, fdb_flush, req->linkinfo.data.bridge._len.fdb_flush); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_router(struct rt_link_setlink_req *req, + __u8 mcast_router) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_router = 1; + req->linkinfo.data.bridge.mcast_router = mcast_router; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_snooping(struct rt_link_setlink_req *req, + __u8 mcast_snooping) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_snooping = 1; + req->linkinfo.data.bridge.mcast_snooping = mcast_snooping; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_query_use_ifaddr(struct rt_link_setlink_req *req, + __u8 mcast_query_use_ifaddr) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_query_use_ifaddr = 1; + req->linkinfo.data.bridge.mcast_query_use_ifaddr = mcast_query_use_ifaddr; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_querier(struct rt_link_setlink_req *req, + __u8 mcast_querier) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_querier = 1; + req->linkinfo.data.bridge.mcast_querier = mcast_querier; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_hash_elasticity(struct rt_link_setlink_req *req, + __u32 mcast_hash_elasticity) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_hash_elasticity = 1; + req->linkinfo.data.bridge.mcast_hash_elasticity = mcast_hash_elasticity; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_hash_max(struct rt_link_setlink_req *req, + __u32 mcast_hash_max) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_hash_max = 1; + req->linkinfo.data.bridge.mcast_hash_max = mcast_hash_max; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_last_member_cnt(struct rt_link_setlink_req *req, + __u32 mcast_last_member_cnt) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_last_member_cnt = 1; + req->linkinfo.data.bridge.mcast_last_member_cnt = mcast_last_member_cnt; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_startup_query_cnt(struct rt_link_setlink_req *req, + __u32 mcast_startup_query_cnt) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_startup_query_cnt = 1; + req->linkinfo.data.bridge.mcast_startup_query_cnt = mcast_startup_query_cnt; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_last_member_intvl(struct rt_link_setlink_req *req, + __u64 mcast_last_member_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_last_member_intvl = 1; + req->linkinfo.data.bridge.mcast_last_member_intvl = mcast_last_member_intvl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_membership_intvl(struct rt_link_setlink_req *req, + __u64 mcast_membership_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_membership_intvl = 1; + req->linkinfo.data.bridge.mcast_membership_intvl = mcast_membership_intvl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_querier_intvl(struct rt_link_setlink_req *req, + __u64 mcast_querier_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_querier_intvl = 1; + req->linkinfo.data.bridge.mcast_querier_intvl = mcast_querier_intvl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_query_intvl(struct rt_link_setlink_req *req, + __u64 mcast_query_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_query_intvl = 1; + req->linkinfo.data.bridge.mcast_query_intvl = mcast_query_intvl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_query_response_intvl(struct rt_link_setlink_req *req, + __u64 mcast_query_response_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_query_response_intvl = 1; + req->linkinfo.data.bridge.mcast_query_response_intvl = mcast_query_response_intvl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_startup_query_intvl(struct rt_link_setlink_req *req, + __u64 mcast_startup_query_intvl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_startup_query_intvl = 1; + req->linkinfo.data.bridge.mcast_startup_query_intvl = mcast_startup_query_intvl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_nf_call_iptables(struct rt_link_setlink_req *req, + __u8 nf_call_iptables) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.nf_call_iptables = 1; + req->linkinfo.data.bridge.nf_call_iptables = nf_call_iptables; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_nf_call_ip6tables(struct rt_link_setlink_req *req, + __u8 nf_call_ip6tables) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.nf_call_ip6tables = 1; + req->linkinfo.data.bridge.nf_call_ip6tables = nf_call_ip6tables; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_nf_call_arptables(struct rt_link_setlink_req *req, + __u8 nf_call_arptables) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.nf_call_arptables = 1; + req->linkinfo.data.bridge.nf_call_arptables = nf_call_arptables; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_vlan_default_pvid(struct rt_link_setlink_req *req, + __u16 vlan_default_pvid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_default_pvid = 1; + req->linkinfo.data.bridge.vlan_default_pvid = vlan_default_pvid; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_vlan_stats_enabled(struct rt_link_setlink_req *req, + __u8 vlan_stats_enabled) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_stats_enabled = 1; + req->linkinfo.data.bridge.vlan_stats_enabled = vlan_stats_enabled; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_stats_enabled(struct rt_link_setlink_req *req, + __u8 mcast_stats_enabled) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_stats_enabled = 1; + req->linkinfo.data.bridge.mcast_stats_enabled = mcast_stats_enabled; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_igmp_version(struct rt_link_setlink_req *req, + __u8 mcast_igmp_version) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_igmp_version = 1; + req->linkinfo.data.bridge.mcast_igmp_version = mcast_igmp_version; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_mld_version(struct rt_link_setlink_req *req, + __u8 mcast_mld_version) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.mcast_mld_version = 1; + req->linkinfo.data.bridge.mcast_mld_version = mcast_mld_version; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_vlan_stats_per_port(struct rt_link_setlink_req *req, + __u8 vlan_stats_per_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.vlan_stats_per_port = 1; + req->linkinfo.data.bridge.vlan_stats_per_port = vlan_stats_per_port; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_multi_boolopt(struct rt_link_setlink_req *req, + const void *multi_boolopt, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.multi_boolopt); + req->linkinfo.data.bridge._len.multi_boolopt = len; + req->linkinfo.data.bridge.multi_boolopt = malloc(req->linkinfo.data.bridge._len.multi_boolopt); + memcpy(req->linkinfo.data.bridge.multi_boolopt, multi_boolopt, req->linkinfo.data.bridge._len.multi_boolopt); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_mcast_querier_state(struct rt_link_setlink_req *req, + const void *mcast_querier_state, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + free(req->linkinfo.data.bridge.mcast_querier_state); + req->linkinfo.data.bridge._len.mcast_querier_state = len; + req->linkinfo.data.bridge.mcast_querier_state = malloc(req->linkinfo.data.bridge._len.mcast_querier_state); + memcpy(req->linkinfo.data.bridge.mcast_querier_state, mcast_querier_state, req->linkinfo.data.bridge._len.mcast_querier_state); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_fdb_n_learned(struct rt_link_setlink_req *req, + __u32 fdb_n_learned) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.fdb_n_learned = 1; + req->linkinfo.data.bridge.fdb_n_learned = fdb_n_learned; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_bridge_fdb_max_learned(struct rt_link_setlink_req *req, + __u32 fdb_max_learned) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.bridge = 1; + req->linkinfo.data.bridge._present.fdb_max_learned = 1; + req->linkinfo.data.bridge.fdb_max_learned = fdb_max_learned; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_link(struct rt_link_setlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.link = 1; + req->linkinfo.data.erspan.link = link; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_iflags(struct rt_link_setlink_req *req, + __u16 iflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.iflags = 1; + req->linkinfo.data.erspan.iflags = iflags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_oflags(struct rt_link_setlink_req *req, + __u16 oflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.oflags = 1; + req->linkinfo.data.erspan.oflags = oflags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_ikey(struct rt_link_setlink_req *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.ikey = 1; + req->linkinfo.data.erspan.ikey = ikey; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_okey(struct rt_link_setlink_req *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.okey = 1; + req->linkinfo.data.erspan.okey = okey; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_local(struct rt_link_setlink_req *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + free(req->linkinfo.data.erspan.local); + req->linkinfo.data.erspan._len.local = len; + req->linkinfo.data.erspan.local = malloc(req->linkinfo.data.erspan._len.local); + memcpy(req->linkinfo.data.erspan.local, local, req->linkinfo.data.erspan._len.local); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_remote(struct rt_link_setlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + free(req->linkinfo.data.erspan.remote); + req->linkinfo.data.erspan._len.remote = len; + req->linkinfo.data.erspan.remote = malloc(req->linkinfo.data.erspan._len.remote); + memcpy(req->linkinfo.data.erspan.remote, remote, req->linkinfo.data.erspan._len.remote); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_ttl(struct rt_link_setlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.ttl = 1; + req->linkinfo.data.erspan.ttl = ttl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_tos(struct rt_link_setlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.tos = 1; + req->linkinfo.data.erspan.tos = tos; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_pmtudisc(struct rt_link_setlink_req *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.pmtudisc = 1; + req->linkinfo.data.erspan.pmtudisc = pmtudisc; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_encap_limit(struct rt_link_setlink_req *req, + __u32 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_limit = 1; + req->linkinfo.data.erspan.encap_limit = encap_limit; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_flowinfo(struct rt_link_setlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.flowinfo = 1; + req->linkinfo.data.erspan.flowinfo = flowinfo; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_flags(struct rt_link_setlink_req *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.flags = 1; + req->linkinfo.data.erspan.flags = flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_encap_type(struct rt_link_setlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_type = 1; + req->linkinfo.data.erspan.encap_type = encap_type; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_encap_flags(struct rt_link_setlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_flags = 1; + req->linkinfo.data.erspan.encap_flags = encap_flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_encap_sport(struct rt_link_setlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_sport = 1; + req->linkinfo.data.erspan.encap_sport = encap_sport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_encap_dport(struct rt_link_setlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.encap_dport = 1; + req->linkinfo.data.erspan.encap_dport = encap_dport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_collect_metadata(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.collect_metadata = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_ignore_df(struct rt_link_setlink_req *req, + __u8 ignore_df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.ignore_df = 1; + req->linkinfo.data.erspan.ignore_df = ignore_df; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_fwmark(struct rt_link_setlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.fwmark = 1; + req->linkinfo.data.erspan.fwmark = fwmark; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_erspan_index(struct rt_link_setlink_req *req, + __u32 erspan_index) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_index = 1; + req->linkinfo.data.erspan.erspan_index = erspan_index; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_erspan_ver(struct rt_link_setlink_req *req, + __u8 erspan_ver) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_ver = 1; + req->linkinfo.data.erspan.erspan_ver = erspan_ver; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_erspan_dir(struct rt_link_setlink_req *req, + __u8 erspan_dir) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_dir = 1; + req->linkinfo.data.erspan.erspan_dir = erspan_dir; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_erspan_erspan_hwid(struct rt_link_setlink_req *req, + __u16 erspan_hwid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.erspan = 1; + req->linkinfo.data.erspan._present.erspan_hwid = 1; + req->linkinfo.data.erspan.erspan_hwid = erspan_hwid; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_link(struct rt_link_setlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.link = 1; + req->linkinfo.data.gre.link = link; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_iflags(struct rt_link_setlink_req *req, + __u16 iflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.iflags = 1; + req->linkinfo.data.gre.iflags = iflags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_oflags(struct rt_link_setlink_req *req, + __u16 oflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.oflags = 1; + req->linkinfo.data.gre.oflags = oflags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_ikey(struct rt_link_setlink_req *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.ikey = 1; + req->linkinfo.data.gre.ikey = ikey; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_okey(struct rt_link_setlink_req *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.okey = 1; + req->linkinfo.data.gre.okey = okey; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_local(struct rt_link_setlink_req *req, + const void *local, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + free(req->linkinfo.data.gre.local); + req->linkinfo.data.gre._len.local = len; + req->linkinfo.data.gre.local = malloc(req->linkinfo.data.gre._len.local); + memcpy(req->linkinfo.data.gre.local, local, req->linkinfo.data.gre._len.local); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_remote(struct rt_link_setlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + free(req->linkinfo.data.gre.remote); + req->linkinfo.data.gre._len.remote = len; + req->linkinfo.data.gre.remote = malloc(req->linkinfo.data.gre._len.remote); + memcpy(req->linkinfo.data.gre.remote, remote, req->linkinfo.data.gre._len.remote); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_ttl(struct rt_link_setlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.ttl = 1; + req->linkinfo.data.gre.ttl = ttl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_tos(struct rt_link_setlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.tos = 1; + req->linkinfo.data.gre.tos = tos; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_pmtudisc(struct rt_link_setlink_req *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.pmtudisc = 1; + req->linkinfo.data.gre.pmtudisc = pmtudisc; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_encap_limit(struct rt_link_setlink_req *req, + __u32 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_limit = 1; + req->linkinfo.data.gre.encap_limit = encap_limit; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_flowinfo(struct rt_link_setlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.flowinfo = 1; + req->linkinfo.data.gre.flowinfo = flowinfo; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_flags(struct rt_link_setlink_req *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.flags = 1; + req->linkinfo.data.gre.flags = flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_encap_type(struct rt_link_setlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_type = 1; + req->linkinfo.data.gre.encap_type = encap_type; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_encap_flags(struct rt_link_setlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_flags = 1; + req->linkinfo.data.gre.encap_flags = encap_flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_encap_sport(struct rt_link_setlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_sport = 1; + req->linkinfo.data.gre.encap_sport = encap_sport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_encap_dport(struct rt_link_setlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.encap_dport = 1; + req->linkinfo.data.gre.encap_dport = encap_dport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_collect_metadata(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.collect_metadata = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_ignore_df(struct rt_link_setlink_req *req, + __u8 ignore_df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.ignore_df = 1; + req->linkinfo.data.gre.ignore_df = ignore_df; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_fwmark(struct rt_link_setlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.fwmark = 1; + req->linkinfo.data.gre.fwmark = fwmark; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_erspan_index(struct rt_link_setlink_req *req, + __u32 erspan_index) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_index = 1; + req->linkinfo.data.gre.erspan_index = erspan_index; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_erspan_ver(struct rt_link_setlink_req *req, + __u8 erspan_ver) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_ver = 1; + req->linkinfo.data.gre.erspan_ver = erspan_ver; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_erspan_dir(struct rt_link_setlink_req *req, + __u8 erspan_dir) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_dir = 1; + req->linkinfo.data.gre.erspan_dir = erspan_dir; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gre_erspan_hwid(struct rt_link_setlink_req *req, + __u16 erspan_hwid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gre = 1; + req->linkinfo.data.gre._present.erspan_hwid = 1; + req->linkinfo.data.gre.erspan_hwid = erspan_hwid; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_link(struct rt_link_setlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.link = 1; + req->linkinfo.data.gretap.link = link; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_iflags(struct rt_link_setlink_req *req, + __u16 iflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.iflags = 1; + req->linkinfo.data.gretap.iflags = iflags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_oflags(struct rt_link_setlink_req *req, + __u16 oflags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.oflags = 1; + req->linkinfo.data.gretap.oflags = oflags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_ikey(struct rt_link_setlink_req *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.ikey = 1; + req->linkinfo.data.gretap.ikey = ikey; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_okey(struct rt_link_setlink_req *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.okey = 1; + req->linkinfo.data.gretap.okey = okey; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_local(struct rt_link_setlink_req *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + free(req->linkinfo.data.gretap.local); + req->linkinfo.data.gretap._len.local = len; + req->linkinfo.data.gretap.local = malloc(req->linkinfo.data.gretap._len.local); + memcpy(req->linkinfo.data.gretap.local, local, req->linkinfo.data.gretap._len.local); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_remote(struct rt_link_setlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + free(req->linkinfo.data.gretap.remote); + req->linkinfo.data.gretap._len.remote = len; + req->linkinfo.data.gretap.remote = malloc(req->linkinfo.data.gretap._len.remote); + memcpy(req->linkinfo.data.gretap.remote, remote, req->linkinfo.data.gretap._len.remote); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_ttl(struct rt_link_setlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.ttl = 1; + req->linkinfo.data.gretap.ttl = ttl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_tos(struct rt_link_setlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.tos = 1; + req->linkinfo.data.gretap.tos = tos; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_pmtudisc(struct rt_link_setlink_req *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.pmtudisc = 1; + req->linkinfo.data.gretap.pmtudisc = pmtudisc; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_encap_limit(struct rt_link_setlink_req *req, + __u32 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_limit = 1; + req->linkinfo.data.gretap.encap_limit = encap_limit; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_flowinfo(struct rt_link_setlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.flowinfo = 1; + req->linkinfo.data.gretap.flowinfo = flowinfo; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_flags(struct rt_link_setlink_req *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.flags = 1; + req->linkinfo.data.gretap.flags = flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_encap_type(struct rt_link_setlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_type = 1; + req->linkinfo.data.gretap.encap_type = encap_type; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_encap_flags(struct rt_link_setlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_flags = 1; + req->linkinfo.data.gretap.encap_flags = encap_flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_encap_sport(struct rt_link_setlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_sport = 1; + req->linkinfo.data.gretap.encap_sport = encap_sport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_encap_dport(struct rt_link_setlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.encap_dport = 1; + req->linkinfo.data.gretap.encap_dport = encap_dport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_collect_metadata(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.collect_metadata = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_ignore_df(struct rt_link_setlink_req *req, + __u8 ignore_df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.ignore_df = 1; + req->linkinfo.data.gretap.ignore_df = ignore_df; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_fwmark(struct rt_link_setlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.fwmark = 1; + req->linkinfo.data.gretap.fwmark = fwmark; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_erspan_index(struct rt_link_setlink_req *req, + __u32 erspan_index) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_index = 1; + req->linkinfo.data.gretap.erspan_index = erspan_index; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_erspan_ver(struct rt_link_setlink_req *req, + __u8 erspan_ver) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_ver = 1; + req->linkinfo.data.gretap.erspan_ver = erspan_ver; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_erspan_dir(struct rt_link_setlink_req *req, + __u8 erspan_dir) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_dir = 1; + req->linkinfo.data.gretap.erspan_dir = erspan_dir; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_gretap_erspan_hwid(struct rt_link_setlink_req *req, + __u16 erspan_hwid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.gretap = 1; + req->linkinfo.data.gretap._present.erspan_hwid = 1; + req->linkinfo.data.gretap.erspan_hwid = erspan_hwid; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_id(struct rt_link_setlink_req *req, + __u32 id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.id = 1; + req->linkinfo.data.geneve.id = id; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_remote(struct rt_link_setlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + free(req->linkinfo.data.geneve.remote); + req->linkinfo.data.geneve._len.remote = len; + req->linkinfo.data.geneve.remote = malloc(req->linkinfo.data.geneve._len.remote); + memcpy(req->linkinfo.data.geneve.remote, remote, req->linkinfo.data.geneve._len.remote); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_ttl(struct rt_link_setlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.ttl = 1; + req->linkinfo.data.geneve.ttl = ttl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_tos(struct rt_link_setlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.tos = 1; + req->linkinfo.data.geneve.tos = tos; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_port(struct rt_link_setlink_req *req, + __u16 port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.port = 1; + req->linkinfo.data.geneve.port = port; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_collect_metadata(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.collect_metadata = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_remote6(struct rt_link_setlink_req *req, + const void *remote6, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + free(req->linkinfo.data.geneve.remote6); + req->linkinfo.data.geneve._len.remote6 = len; + req->linkinfo.data.geneve.remote6 = malloc(req->linkinfo.data.geneve._len.remote6); + memcpy(req->linkinfo.data.geneve.remote6, remote6, req->linkinfo.data.geneve._len.remote6); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_udp_csum(struct rt_link_setlink_req *req, + __u8 udp_csum) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.udp_csum = 1; + req->linkinfo.data.geneve.udp_csum = udp_csum; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_udp_zero_csum6_tx(struct rt_link_setlink_req *req, + __u8 udp_zero_csum6_tx) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.udp_zero_csum6_tx = 1; + req->linkinfo.data.geneve.udp_zero_csum6_tx = udp_zero_csum6_tx; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_udp_zero_csum6_rx(struct rt_link_setlink_req *req, + __u8 udp_zero_csum6_rx) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.udp_zero_csum6_rx = 1; + req->linkinfo.data.geneve.udp_zero_csum6_rx = udp_zero_csum6_rx; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_label(struct rt_link_setlink_req *req, + __u32 label) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.label = 1; + req->linkinfo.data.geneve.label = label; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_ttl_inherit(struct rt_link_setlink_req *req, + __u8 ttl_inherit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.ttl_inherit = 1; + req->linkinfo.data.geneve.ttl_inherit = ttl_inherit; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_df(struct rt_link_setlink_req *req, + __u8 df) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.df = 1; + req->linkinfo.data.geneve.df = df; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_inner_proto_inherit(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + req->linkinfo.data.geneve._present.inner_proto_inherit = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_geneve_port_range(struct rt_link_setlink_req *req, + const void *port_range, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.geneve = 1; + free(req->linkinfo.data.geneve.port_range); + req->linkinfo.data.geneve._len.port_range = len; + req->linkinfo.data.geneve.port_range = malloc(req->linkinfo.data.geneve._len.port_range); + memcpy(req->linkinfo.data.geneve.port_range, port_range, req->linkinfo.data.geneve._len.port_range); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_link(struct rt_link_setlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.link = 1; + req->linkinfo.data.ipip.link = link; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_local(struct rt_link_setlink_req *req, + const void *local, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip.local); + req->linkinfo.data.ipip._len.local = len; + req->linkinfo.data.ipip.local = malloc(req->linkinfo.data.ipip._len.local); + memcpy(req->linkinfo.data.ipip.local, local, req->linkinfo.data.ipip._len.local); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_remote(struct rt_link_setlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip.remote); + req->linkinfo.data.ipip._len.remote = len; + req->linkinfo.data.ipip.remote = malloc(req->linkinfo.data.ipip._len.remote); + memcpy(req->linkinfo.data.ipip.remote, remote, req->linkinfo.data.ipip._len.remote); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_ttl(struct rt_link_setlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.ttl = 1; + req->linkinfo.data.ipip.ttl = ttl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_tos(struct rt_link_setlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.tos = 1; + req->linkinfo.data.ipip.tos = tos; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_encap_limit(struct rt_link_setlink_req *req, + __u8 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_limit = 1; + req->linkinfo.data.ipip.encap_limit = encap_limit; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_flowinfo(struct rt_link_setlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.flowinfo = 1; + req->linkinfo.data.ipip.flowinfo = flowinfo; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_flags(struct rt_link_setlink_req *req, + __u16 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.flags = 1; + req->linkinfo.data.ipip.flags = flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_proto(struct rt_link_setlink_req *req, + __u8 proto) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.proto = 1; + req->linkinfo.data.ipip.proto = proto; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_pmtudisc(struct rt_link_setlink_req *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.pmtudisc = 1; + req->linkinfo.data.ipip.pmtudisc = pmtudisc; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip__6rd_prefix(struct rt_link_setlink_req *req, + const void *_6rd_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip._6rd_prefix); + req->linkinfo.data.ipip._len._6rd_prefix = len; + req->linkinfo.data.ipip._6rd_prefix = malloc(req->linkinfo.data.ipip._len._6rd_prefix); + memcpy(req->linkinfo.data.ipip._6rd_prefix, _6rd_prefix, req->linkinfo.data.ipip._len._6rd_prefix); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip__6rd_relay_prefix(struct rt_link_setlink_req *req, + const void *_6rd_relay_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + free(req->linkinfo.data.ipip._6rd_relay_prefix); + req->linkinfo.data.ipip._len._6rd_relay_prefix = len; + req->linkinfo.data.ipip._6rd_relay_prefix = malloc(req->linkinfo.data.ipip._len._6rd_relay_prefix); + memcpy(req->linkinfo.data.ipip._6rd_relay_prefix, _6rd_relay_prefix, req->linkinfo.data.ipip._len._6rd_relay_prefix); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip__6rd_prefixlen(struct rt_link_setlink_req *req, + __u16 _6rd_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present._6rd_prefixlen = 1; + req->linkinfo.data.ipip._6rd_prefixlen = _6rd_prefixlen; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip__6rd_relay_prefixlen(struct rt_link_setlink_req *req, + __u16 _6rd_relay_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present._6rd_relay_prefixlen = 1; + req->linkinfo.data.ipip._6rd_relay_prefixlen = _6rd_relay_prefixlen; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_encap_type(struct rt_link_setlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_type = 1; + req->linkinfo.data.ipip.encap_type = encap_type; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_encap_flags(struct rt_link_setlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_flags = 1; + req->linkinfo.data.ipip.encap_flags = encap_flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_encap_sport(struct rt_link_setlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_sport = 1; + req->linkinfo.data.ipip.encap_sport = encap_sport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_encap_dport(struct rt_link_setlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.encap_dport = 1; + req->linkinfo.data.ipip.encap_dport = encap_dport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_collect_metadata(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.collect_metadata = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ipip_fwmark(struct rt_link_setlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ipip = 1; + req->linkinfo.data.ipip._present.fwmark = 1; + req->linkinfo.data.ipip.fwmark = fwmark; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_link(struct rt_link_setlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.link = 1; + req->linkinfo.data.ip6tnl.link = link; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_local(struct rt_link_setlink_req *req, + const void *local, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + free(req->linkinfo.data.ip6tnl.local); + req->linkinfo.data.ip6tnl._len.local = len; + req->linkinfo.data.ip6tnl.local = malloc(req->linkinfo.data.ip6tnl._len.local); + memcpy(req->linkinfo.data.ip6tnl.local, local, req->linkinfo.data.ip6tnl._len.local); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_remote(struct rt_link_setlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + free(req->linkinfo.data.ip6tnl.remote); + req->linkinfo.data.ip6tnl._len.remote = len; + req->linkinfo.data.ip6tnl.remote = malloc(req->linkinfo.data.ip6tnl._len.remote); + memcpy(req->linkinfo.data.ip6tnl.remote, remote, req->linkinfo.data.ip6tnl._len.remote); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_ttl(struct rt_link_setlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.ttl = 1; + req->linkinfo.data.ip6tnl.ttl = ttl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_encap_limit(struct rt_link_setlink_req *req, + __u8 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_limit = 1; + req->linkinfo.data.ip6tnl.encap_limit = encap_limit; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_flowinfo(struct rt_link_setlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.flowinfo = 1; + req->linkinfo.data.ip6tnl.flowinfo = flowinfo; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_flags(struct rt_link_setlink_req *req, + __u32 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.flags = 1; + req->linkinfo.data.ip6tnl.flags = flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_proto(struct rt_link_setlink_req *req, + __u8 proto) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.proto = 1; + req->linkinfo.data.ip6tnl.proto = proto; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_encap_type(struct rt_link_setlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_type = 1; + req->linkinfo.data.ip6tnl.encap_type = encap_type; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_encap_flags(struct rt_link_setlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_flags = 1; + req->linkinfo.data.ip6tnl.encap_flags = encap_flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_encap_sport(struct rt_link_setlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_sport = 1; + req->linkinfo.data.ip6tnl.encap_sport = encap_sport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_encap_dport(struct rt_link_setlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.encap_dport = 1; + req->linkinfo.data.ip6tnl.encap_dport = encap_dport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_collect_metadata(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.collect_metadata = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ip6tnl_fwmark(struct rt_link_setlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ip6tnl = 1; + req->linkinfo.data.ip6tnl._present.fwmark = 1; + req->linkinfo.data.ip6tnl.fwmark = fwmark; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_link(struct rt_link_setlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.link = 1; + req->linkinfo.data.sit.link = link; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_local(struct rt_link_setlink_req *req, + const void *local, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit.local); + req->linkinfo.data.sit._len.local = len; + req->linkinfo.data.sit.local = malloc(req->linkinfo.data.sit._len.local); + memcpy(req->linkinfo.data.sit.local, local, req->linkinfo.data.sit._len.local); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_remote(struct rt_link_setlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit.remote); + req->linkinfo.data.sit._len.remote = len; + req->linkinfo.data.sit.remote = malloc(req->linkinfo.data.sit._len.remote); + memcpy(req->linkinfo.data.sit.remote, remote, req->linkinfo.data.sit._len.remote); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_ttl(struct rt_link_setlink_req *req, + __u8 ttl) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.ttl = 1; + req->linkinfo.data.sit.ttl = ttl; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_tos(struct rt_link_setlink_req *req, + __u8 tos) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.tos = 1; + req->linkinfo.data.sit.tos = tos; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_encap_limit(struct rt_link_setlink_req *req, + __u8 encap_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_limit = 1; + req->linkinfo.data.sit.encap_limit = encap_limit; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_flowinfo(struct rt_link_setlink_req *req, + __u32 flowinfo) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.flowinfo = 1; + req->linkinfo.data.sit.flowinfo = flowinfo; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_flags(struct rt_link_setlink_req *req, + __u16 flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.flags = 1; + req->linkinfo.data.sit.flags = flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_proto(struct rt_link_setlink_req *req, + __u8 proto) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.proto = 1; + req->linkinfo.data.sit.proto = proto; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_pmtudisc(struct rt_link_setlink_req *req, + __u8 pmtudisc) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.pmtudisc = 1; + req->linkinfo.data.sit.pmtudisc = pmtudisc; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit__6rd_prefix(struct rt_link_setlink_req *req, + const void *_6rd_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit._6rd_prefix); + req->linkinfo.data.sit._len._6rd_prefix = len; + req->linkinfo.data.sit._6rd_prefix = malloc(req->linkinfo.data.sit._len._6rd_prefix); + memcpy(req->linkinfo.data.sit._6rd_prefix, _6rd_prefix, req->linkinfo.data.sit._len._6rd_prefix); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit__6rd_relay_prefix(struct rt_link_setlink_req *req, + const void *_6rd_relay_prefix, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + free(req->linkinfo.data.sit._6rd_relay_prefix); + req->linkinfo.data.sit._len._6rd_relay_prefix = len; + req->linkinfo.data.sit._6rd_relay_prefix = malloc(req->linkinfo.data.sit._len._6rd_relay_prefix); + memcpy(req->linkinfo.data.sit._6rd_relay_prefix, _6rd_relay_prefix, req->linkinfo.data.sit._len._6rd_relay_prefix); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit__6rd_prefixlen(struct rt_link_setlink_req *req, + __u16 _6rd_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present._6rd_prefixlen = 1; + req->linkinfo.data.sit._6rd_prefixlen = _6rd_prefixlen; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit__6rd_relay_prefixlen(struct rt_link_setlink_req *req, + __u16 _6rd_relay_prefixlen) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present._6rd_relay_prefixlen = 1; + req->linkinfo.data.sit._6rd_relay_prefixlen = _6rd_relay_prefixlen; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_encap_type(struct rt_link_setlink_req *req, + __u16 encap_type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_type = 1; + req->linkinfo.data.sit.encap_type = encap_type; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_encap_flags(struct rt_link_setlink_req *req, + __u16 encap_flags) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_flags = 1; + req->linkinfo.data.sit.encap_flags = encap_flags; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_encap_sport(struct rt_link_setlink_req *req, + __u16 encap_sport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_sport = 1; + req->linkinfo.data.sit.encap_sport = encap_sport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_encap_dport(struct rt_link_setlink_req *req, + __u16 encap_dport) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.encap_dport = 1; + req->linkinfo.data.sit.encap_dport = encap_dport; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_collect_metadata(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.collect_metadata = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_sit_fwmark(struct rt_link_setlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.sit = 1; + req->linkinfo.data.sit._present.fwmark = 1; + req->linkinfo.data.sit.fwmark = fwmark; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_tun_owner(struct rt_link_setlink_req *req, + __u32 owner) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.owner = 1; + req->linkinfo.data.tun.owner = owner; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_tun_group(struct rt_link_setlink_req *req, + __u32 group) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.group = 1; + req->linkinfo.data.tun.group = group; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_tun_type(struct rt_link_setlink_req *req, + __u8 type) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.type = 1; + req->linkinfo.data.tun.type = type; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_tun_pi(struct rt_link_setlink_req *req, + __u8 pi) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.pi = 1; + req->linkinfo.data.tun.pi = pi; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_tun_vnet_hdr(struct rt_link_setlink_req *req, + __u8 vnet_hdr) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.vnet_hdr = 1; + req->linkinfo.data.tun.vnet_hdr = vnet_hdr; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_tun_persist(struct rt_link_setlink_req *req, + __u8 persist) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.persist = 1; + req->linkinfo.data.tun.persist = persist; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_tun_multi_queue(struct rt_link_setlink_req *req, + __u8 multi_queue) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.multi_queue = 1; + req->linkinfo.data.tun.multi_queue = multi_queue; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_tun_num_queues(struct rt_link_setlink_req *req, + __u32 num_queues) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.num_queues = 1; + req->linkinfo.data.tun.num_queues = num_queues; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_tun_num_disabled_queues(struct rt_link_setlink_req *req, + __u32 num_disabled_queues) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.tun = 1; + req->linkinfo.data.tun._present.num_disabled_queues = 1; + req->linkinfo.data.tun.num_disabled_queues = num_disabled_queues; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vlan_id(struct rt_link_setlink_req *req, + __u16 id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.id = 1; + req->linkinfo.data.vlan.id = id; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vlan_flags(struct rt_link_setlink_req *req, + const void *flags, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + free(req->linkinfo.data.vlan.flags); + req->linkinfo.data.vlan._len.flags = len; + req->linkinfo.data.vlan.flags = malloc(req->linkinfo.data.vlan._len.flags); + memcpy(req->linkinfo.data.vlan.flags, flags, req->linkinfo.data.vlan._len.flags); +} +static inline void +__rt_link_setlink_req_set_linkinfo_data_vlan_egress_qos_mapping(struct rt_link_setlink_req *req, + struct ifla_vlan_qos_mapping *mapping, + unsigned int n_mapping) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.egress_qos = 1; + free(req->linkinfo.data.vlan.egress_qos.mapping); + req->linkinfo.data.vlan.egress_qos.mapping = mapping; + req->linkinfo.data.vlan.egress_qos._count.mapping = n_mapping; +} +static inline void +__rt_link_setlink_req_set_linkinfo_data_vlan_ingress_qos_mapping(struct rt_link_setlink_req *req, + struct ifla_vlan_qos_mapping *mapping, + unsigned int n_mapping) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.ingress_qos = 1; + free(req->linkinfo.data.vlan.ingress_qos.mapping); + req->linkinfo.data.vlan.ingress_qos.mapping = mapping; + req->linkinfo.data.vlan.ingress_qos._count.mapping = n_mapping; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vlan_protocol(struct rt_link_setlink_req *req, + int protocol /* big-endian */) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vlan = 1; + req->linkinfo.data.vlan._present.protocol = 1; + req->linkinfo.data.vlan.protocol = protocol; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vrf_table(struct rt_link_setlink_req *req, + __u32 table) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vrf = 1; + req->linkinfo.data.vrf._present.table = 1; + req->linkinfo.data.vrf.table = table; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti_link(struct rt_link_setlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.link = 1; + req->linkinfo.data.vti.link = link; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti_ikey(struct rt_link_setlink_req *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.ikey = 1; + req->linkinfo.data.vti.ikey = ikey; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti_okey(struct rt_link_setlink_req *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.okey = 1; + req->linkinfo.data.vti.okey = okey; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti_local(struct rt_link_setlink_req *req, + const void *local, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + free(req->linkinfo.data.vti.local); + req->linkinfo.data.vti._len.local = len; + req->linkinfo.data.vti.local = malloc(req->linkinfo.data.vti._len.local); + memcpy(req->linkinfo.data.vti.local, local, req->linkinfo.data.vti._len.local); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti_remote(struct rt_link_setlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + free(req->linkinfo.data.vti.remote); + req->linkinfo.data.vti._len.remote = len; + req->linkinfo.data.vti.remote = malloc(req->linkinfo.data.vti._len.remote); + memcpy(req->linkinfo.data.vti.remote, remote, req->linkinfo.data.vti._len.remote); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti_fwmark(struct rt_link_setlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti = 1; + req->linkinfo.data.vti._present.fwmark = 1; + req->linkinfo.data.vti.fwmark = fwmark; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti6_link(struct rt_link_setlink_req *req, + __u32 link) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.link = 1; + req->linkinfo.data.vti6.link = link; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti6_ikey(struct rt_link_setlink_req *req, + __u32 ikey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.ikey = 1; + req->linkinfo.data.vti6.ikey = ikey; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti6_okey(struct rt_link_setlink_req *req, + __u32 okey) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.okey = 1; + req->linkinfo.data.vti6.okey = okey; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti6_local(struct rt_link_setlink_req *req, + const void *local, size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + free(req->linkinfo.data.vti6.local); + req->linkinfo.data.vti6._len.local = len; + req->linkinfo.data.vti6.local = malloc(req->linkinfo.data.vti6._len.local); + memcpy(req->linkinfo.data.vti6.local, local, req->linkinfo.data.vti6._len.local); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti6_remote(struct rt_link_setlink_req *req, + const void *remote, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + free(req->linkinfo.data.vti6.remote); + req->linkinfo.data.vti6._len.remote = len; + req->linkinfo.data.vti6.remote = malloc(req->linkinfo.data.vti6._len.remote); + memcpy(req->linkinfo.data.vti6.remote, remote, req->linkinfo.data.vti6._len.remote); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_vti6_fwmark(struct rt_link_setlink_req *req, + __u32 fwmark) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.vti6 = 1; + req->linkinfo.data.vti6._present.fwmark = 1; + req->linkinfo.data.vti6.fwmark = fwmark; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_netkit_peer_info(struct rt_link_setlink_req *req, + const void *peer_info, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + free(req->linkinfo.data.netkit.peer_info); + req->linkinfo.data.netkit._len.peer_info = len; + req->linkinfo.data.netkit.peer_info = malloc(req->linkinfo.data.netkit._len.peer_info); + memcpy(req->linkinfo.data.netkit.peer_info, peer_info, req->linkinfo.data.netkit._len.peer_info); +} +static inline void +rt_link_setlink_req_set_linkinfo_data_netkit_primary(struct rt_link_setlink_req *req, + __u8 primary) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.primary = 1; + req->linkinfo.data.netkit.primary = primary; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_netkit_policy(struct rt_link_setlink_req *req, + int policy) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.policy = 1; + req->linkinfo.data.netkit.policy = policy; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_netkit_peer_policy(struct rt_link_setlink_req *req, + int peer_policy) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.peer_policy = 1; + req->linkinfo.data.netkit.peer_policy = peer_policy; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_netkit_mode(struct rt_link_setlink_req *req, + enum netkit_mode mode) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.mode = 1; + req->linkinfo.data.netkit.mode = mode; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_netkit_scrub(struct rt_link_setlink_req *req, + int scrub) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.scrub = 1; + req->linkinfo.data.netkit.scrub = scrub; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_netkit_peer_scrub(struct rt_link_setlink_req *req, + int peer_scrub) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.peer_scrub = 1; + req->linkinfo.data.netkit.peer_scrub = peer_scrub; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_netkit_headroom(struct rt_link_setlink_req *req, + __u16 headroom) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.headroom = 1; + req->linkinfo.data.netkit.headroom = headroom; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_netkit_tailroom(struct rt_link_setlink_req *req, + __u16 tailroom) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.netkit = 1; + req->linkinfo.data.netkit._present.tailroom = 1; + req->linkinfo.data.netkit.tailroom = tailroom; +} +static inline void +rt_link_setlink_req_set_linkinfo_data_ovpn_mode(struct rt_link_setlink_req *req, + enum ovpn_mode mode) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.data = 1; + req->linkinfo.data._present.ovpn = 1; + req->linkinfo.data.ovpn._present.mode = 1; + req->linkinfo.data.ovpn.mode = mode; +} +static inline void +rt_link_setlink_req_set_linkinfo_xstats(struct rt_link_setlink_req *req, + const void *xstats, size_t len) +{ + req->_present.linkinfo = 1; + free(req->linkinfo.xstats); + req->linkinfo._len.xstats = len; + req->linkinfo.xstats = malloc(req->linkinfo._len.xstats); + memcpy(req->linkinfo.xstats, xstats, req->linkinfo._len.xstats); +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_kind(struct rt_link_setlink_req *req, + const char *slave_kind) +{ + req->_present.linkinfo = 1; + free(req->linkinfo.slave_kind); + req->linkinfo._len.slave_kind = strlen(slave_kind); + req->linkinfo.slave_kind = malloc(req->linkinfo._len.slave_kind + 1); + memcpy(req->linkinfo.slave_kind, slave_kind, req->linkinfo._len.slave_kind); + req->linkinfo.slave_kind[req->linkinfo._len.slave_kind] = 0; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_state(struct rt_link_setlink_req *req, + __u8 state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.state = 1; + req->linkinfo.slave_data.bridge.state = state; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_priority(struct rt_link_setlink_req *req, + __u16 priority) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.priority = 1; + req->linkinfo.slave_data.bridge.priority = priority; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_cost(struct rt_link_setlink_req *req, + __u32 cost) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.cost = 1; + req->linkinfo.slave_data.bridge.cost = cost; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_mode(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mode = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_guard(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.guard = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_protect(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.protect = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_fast_leave(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.fast_leave = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_learning(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.learning = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_unicast_flood(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.unicast_flood = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_proxyarp(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.proxyarp = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_learning_sync(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.learning_sync = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_proxyarp_wifi(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.proxyarp_wifi = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_root_id(struct rt_link_setlink_req *req, + const void *root_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + free(req->linkinfo.slave_data.bridge.root_id); + req->linkinfo.slave_data.bridge._len.root_id = len; + req->linkinfo.slave_data.bridge.root_id = malloc(req->linkinfo.slave_data.bridge._len.root_id); + memcpy(req->linkinfo.slave_data.bridge.root_id, root_id, req->linkinfo.slave_data.bridge._len.root_id); +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_bridge_id(struct rt_link_setlink_req *req, + const void *bridge_id, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + free(req->linkinfo.slave_data.bridge.bridge_id); + req->linkinfo.slave_data.bridge._len.bridge_id = len; + req->linkinfo.slave_data.bridge.bridge_id = malloc(req->linkinfo.slave_data.bridge._len.bridge_id); + memcpy(req->linkinfo.slave_data.bridge.bridge_id, bridge_id, req->linkinfo.slave_data.bridge._len.bridge_id); +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_designated_port(struct rt_link_setlink_req *req, + __u16 designated_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.designated_port = 1; + req->linkinfo.slave_data.bridge.designated_port = designated_port; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_designated_cost(struct rt_link_setlink_req *req, + __u16 designated_cost) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.designated_cost = 1; + req->linkinfo.slave_data.bridge.designated_cost = designated_cost; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_id(struct rt_link_setlink_req *req, + __u16 id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.id = 1; + req->linkinfo.slave_data.bridge.id = id; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_no(struct rt_link_setlink_req *req, + __u16 no) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.no = 1; + req->linkinfo.slave_data.bridge.no = no; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_topology_change_ack(struct rt_link_setlink_req *req, + __u8 topology_change_ack) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.topology_change_ack = 1; + req->linkinfo.slave_data.bridge.topology_change_ack = topology_change_ack; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_config_pending(struct rt_link_setlink_req *req, + __u8 config_pending) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.config_pending = 1; + req->linkinfo.slave_data.bridge.config_pending = config_pending; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_message_age_timer(struct rt_link_setlink_req *req, + __u64 message_age_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.message_age_timer = 1; + req->linkinfo.slave_data.bridge.message_age_timer = message_age_timer; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_forward_delay_timer(struct rt_link_setlink_req *req, + __u64 forward_delay_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.forward_delay_timer = 1; + req->linkinfo.slave_data.bridge.forward_delay_timer = forward_delay_timer; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_hold_timer(struct rt_link_setlink_req *req, + __u64 hold_timer) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.hold_timer = 1; + req->linkinfo.slave_data.bridge.hold_timer = hold_timer; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_flush(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.flush = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_multicast_router(struct rt_link_setlink_req *req, + __u8 multicast_router) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.multicast_router = 1; + req->linkinfo.slave_data.bridge.multicast_router = multicast_router; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_mcast_flood(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_flood = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_mcast_to_ucast(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_to_ucast = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_vlan_tunnel(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.vlan_tunnel = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_bcast_flood(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.bcast_flood = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_group_fwd_mask(struct rt_link_setlink_req *req, + __u16 group_fwd_mask) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.group_fwd_mask = 1; + req->linkinfo.slave_data.bridge.group_fwd_mask = group_fwd_mask; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_neigh_suppress(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.neigh_suppress = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_isolated(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.isolated = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_backup_port(struct rt_link_setlink_req *req, + __u32 backup_port) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.backup_port = 1; + req->linkinfo.slave_data.bridge.backup_port = backup_port; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_mrp_ring_open(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mrp_ring_open = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_mrp_in_open(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mrp_in_open = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_mcast_eht_hosts_limit(struct rt_link_setlink_req *req, + __u32 mcast_eht_hosts_limit) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_eht_hosts_limit = 1; + req->linkinfo.slave_data.bridge.mcast_eht_hosts_limit = mcast_eht_hosts_limit; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_mcast_eht_hosts_cnt(struct rt_link_setlink_req *req, + __u32 mcast_eht_hosts_cnt) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_eht_hosts_cnt = 1; + req->linkinfo.slave_data.bridge.mcast_eht_hosts_cnt = mcast_eht_hosts_cnt; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_locked(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.locked = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_mab(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mab = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_mcast_n_groups(struct rt_link_setlink_req *req, + __u32 mcast_n_groups) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_n_groups = 1; + req->linkinfo.slave_data.bridge.mcast_n_groups = mcast_n_groups; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_mcast_max_groups(struct rt_link_setlink_req *req, + __u32 mcast_max_groups) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.mcast_max_groups = 1; + req->linkinfo.slave_data.bridge.mcast_max_groups = mcast_max_groups; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_neigh_vlan_suppress(struct rt_link_setlink_req *req) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.neigh_vlan_suppress = 1; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bridge_backup_nhid(struct rt_link_setlink_req *req, + __u32 backup_nhid) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bridge = 1; + req->linkinfo.slave_data.bridge._present.backup_nhid = 1; + req->linkinfo.slave_data.bridge.backup_nhid = backup_nhid; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bond_state(struct rt_link_setlink_req *req, + __u8 state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.state = 1; + req->linkinfo.slave_data.bond.state = state; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bond_mii_status(struct rt_link_setlink_req *req, + __u8 mii_status) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.mii_status = 1; + req->linkinfo.slave_data.bond.mii_status = mii_status; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bond_link_failure_count(struct rt_link_setlink_req *req, + __u32 link_failure_count) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.link_failure_count = 1; + req->linkinfo.slave_data.bond.link_failure_count = link_failure_count; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bond_perm_hwaddr(struct rt_link_setlink_req *req, + const void *perm_hwaddr, + size_t len) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + free(req->linkinfo.slave_data.bond.perm_hwaddr); + req->linkinfo.slave_data.bond._len.perm_hwaddr = len; + req->linkinfo.slave_data.bond.perm_hwaddr = malloc(req->linkinfo.slave_data.bond._len.perm_hwaddr); + memcpy(req->linkinfo.slave_data.bond.perm_hwaddr, perm_hwaddr, req->linkinfo.slave_data.bond._len.perm_hwaddr); +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bond_queue_id(struct rt_link_setlink_req *req, + __u16 queue_id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.queue_id = 1; + req->linkinfo.slave_data.bond.queue_id = queue_id; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bond_ad_aggregator_id(struct rt_link_setlink_req *req, + __u16 ad_aggregator_id) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.ad_aggregator_id = 1; + req->linkinfo.slave_data.bond.ad_aggregator_id = ad_aggregator_id; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bond_ad_actor_oper_port_state(struct rt_link_setlink_req *req, + __u8 ad_actor_oper_port_state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.ad_actor_oper_port_state = 1; + req->linkinfo.slave_data.bond.ad_actor_oper_port_state = ad_actor_oper_port_state; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bond_ad_partner_oper_port_state(struct rt_link_setlink_req *req, + __u16 ad_partner_oper_port_state) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.ad_partner_oper_port_state = 1; + req->linkinfo.slave_data.bond.ad_partner_oper_port_state = ad_partner_oper_port_state; +} +static inline void +rt_link_setlink_req_set_linkinfo_slave_data_bond_prio(struct rt_link_setlink_req *req, + __u32 prio) +{ + req->_present.linkinfo = 1; + req->linkinfo._present.slave_data = 1; + req->linkinfo.slave_data._present.bond = 1; + req->linkinfo.slave_data.bond._present.prio = 1; + req->linkinfo.slave_data.bond.prio = prio; +} +static inline void +rt_link_setlink_req_set_net_ns_pid(struct rt_link_setlink_req *req, + __u32 net_ns_pid) +{ + req->_present.net_ns_pid = 1; + req->net_ns_pid = net_ns_pid; +} +static inline void +rt_link_setlink_req_set_ifalias(struct rt_link_setlink_req *req, + const char *ifalias) +{ + free(req->ifalias); + req->_len.ifalias = strlen(ifalias); + req->ifalias = malloc(req->_len.ifalias + 1); + memcpy(req->ifalias, ifalias, req->_len.ifalias); + req->ifalias[req->_len.ifalias] = 0; +} +static inline void +rt_link_setlink_req_set_num_vf(struct rt_link_setlink_req *req, __u32 num_vf) +{ + req->_present.num_vf = 1; + req->num_vf = num_vf; +} +static inline void +__rt_link_setlink_req_set_vfinfo_list_info(struct rt_link_setlink_req *req, + struct rt_link_vfinfo_attrs *info, + unsigned int n_info) +{ + unsigned int i; + + req->_present.vfinfo_list = 1; + for (i = 0; i < req->vfinfo_list._count.info; i++) + rt_link_vfinfo_attrs_free(&req->vfinfo_list.info[i]); + free(req->vfinfo_list.info); + req->vfinfo_list.info = info; + req->vfinfo_list._count.info = n_info; +} +static inline void +rt_link_setlink_req_set_stats64(struct rt_link_setlink_req *req, + const void *stats64, size_t len) +{ + free(req->stats64); + req->_len.stats64 = len; + req->stats64 = malloc(req->_len.stats64); + memcpy(req->stats64, stats64, req->_len.stats64); +} +static inline void +rt_link_setlink_req_set_af_spec_inet_conf(struct rt_link_setlink_req *req, + __u32 *conf, size_t count) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet = 1; + free(req->af_spec.inet.conf); + req->af_spec.inet._count.conf = count; + count *= sizeof(__u32); + req->af_spec.inet.conf = malloc(count); + memcpy(req->af_spec.inet.conf, conf, count); +} +static inline void +rt_link_setlink_req_set_af_spec_inet6_flags(struct rt_link_setlink_req *req, + __u32 flags) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + req->af_spec.inet6._present.flags = 1; + req->af_spec.inet6.flags = flags; +} +static inline void +rt_link_setlink_req_set_af_spec_inet6_conf(struct rt_link_setlink_req *req, + __u32 *conf, size_t count) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.conf); + req->af_spec.inet6._count.conf = count; + count *= sizeof(__u32); + req->af_spec.inet6.conf = malloc(count); + memcpy(req->af_spec.inet6.conf, conf, count); +} +static inline void +rt_link_setlink_req_set_af_spec_inet6_stats(struct rt_link_setlink_req *req, + __u64 *stats, size_t count) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.stats); + req->af_spec.inet6._count.stats = count; + count *= sizeof(__u64); + req->af_spec.inet6.stats = malloc(count); + memcpy(req->af_spec.inet6.stats, stats, count); +} +static inline void +rt_link_setlink_req_set_af_spec_inet6_mcast(struct rt_link_setlink_req *req, + const void *mcast, size_t len) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.mcast); + req->af_spec.inet6._len.mcast = len; + req->af_spec.inet6.mcast = malloc(req->af_spec.inet6._len.mcast); + memcpy(req->af_spec.inet6.mcast, mcast, req->af_spec.inet6._len.mcast); +} +static inline void +rt_link_setlink_req_set_af_spec_inet6_cacheinfo(struct rt_link_setlink_req *req, + const void *cacheinfo, + size_t len) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.cacheinfo); + req->af_spec.inet6._len.cacheinfo = len; + req->af_spec.inet6.cacheinfo = malloc(req->af_spec.inet6._len.cacheinfo); + memcpy(req->af_spec.inet6.cacheinfo, cacheinfo, req->af_spec.inet6._len.cacheinfo); +} +static inline void +rt_link_setlink_req_set_af_spec_inet6_icmp6stats(struct rt_link_setlink_req *req, + __u64 *icmp6stats, + size_t count) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.icmp6stats); + req->af_spec.inet6._count.icmp6stats = count; + count *= sizeof(__u64); + req->af_spec.inet6.icmp6stats = malloc(count); + memcpy(req->af_spec.inet6.icmp6stats, icmp6stats, count); +} +static inline void +rt_link_setlink_req_set_af_spec_inet6_token(struct rt_link_setlink_req *req, + const void *token, size_t len) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + free(req->af_spec.inet6.token); + req->af_spec.inet6._len.token = len; + req->af_spec.inet6.token = malloc(req->af_spec.inet6._len.token); + memcpy(req->af_spec.inet6.token, token, req->af_spec.inet6._len.token); +} +static inline void +rt_link_setlink_req_set_af_spec_inet6_addr_gen_mode(struct rt_link_setlink_req *req, + __u8 addr_gen_mode) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + req->af_spec.inet6._present.addr_gen_mode = 1; + req->af_spec.inet6.addr_gen_mode = addr_gen_mode; +} +static inline void +rt_link_setlink_req_set_af_spec_inet6_ra_mtu(struct rt_link_setlink_req *req, + __u32 ra_mtu) +{ + req->_present.af_spec = 1; + req->af_spec._present.inet6 = 1; + req->af_spec.inet6._present.ra_mtu = 1; + req->af_spec.inet6.ra_mtu = ra_mtu; +} +static inline void +rt_link_setlink_req_set_af_spec_mctp_net(struct rt_link_setlink_req *req, + __u32 net) +{ + req->_present.af_spec = 1; + req->af_spec._present.mctp = 1; + req->af_spec.mctp._present.net = 1; + req->af_spec.mctp.net = net; +} +static inline void +rt_link_setlink_req_set_af_spec_mctp_phys_binding(struct rt_link_setlink_req *req, + __u8 phys_binding) +{ + req->_present.af_spec = 1; + req->af_spec._present.mctp = 1; + req->af_spec.mctp._present.phys_binding = 1; + req->af_spec.mctp.phys_binding = phys_binding; +} +static inline void +rt_link_setlink_req_set_group(struct rt_link_setlink_req *req, __u32 group) +{ + req->_present.group = 1; + req->group = group; +} +static inline void +rt_link_setlink_req_set_net_ns_fd(struct rt_link_setlink_req *req, + __u32 net_ns_fd) +{ + req->_present.net_ns_fd = 1; + req->net_ns_fd = net_ns_fd; +} +static inline void +rt_link_setlink_req_set_ext_mask(struct rt_link_setlink_req *req, + __u32 ext_mask) +{ + req->_present.ext_mask = 1; + req->ext_mask = ext_mask; +} +static inline void +rt_link_setlink_req_set_promiscuity(struct rt_link_setlink_req *req, + __u32 promiscuity) +{ + req->_present.promiscuity = 1; + req->promiscuity = promiscuity; +} +static inline void +rt_link_setlink_req_set_num_tx_queues(struct rt_link_setlink_req *req, + __u32 num_tx_queues) +{ + req->_present.num_tx_queues = 1; + req->num_tx_queues = num_tx_queues; +} +static inline void +rt_link_setlink_req_set_num_rx_queues(struct rt_link_setlink_req *req, + __u32 num_rx_queues) +{ + req->_present.num_rx_queues = 1; + req->num_rx_queues = num_rx_queues; +} +static inline void +rt_link_setlink_req_set_carrier(struct rt_link_setlink_req *req, __u8 carrier) +{ + req->_present.carrier = 1; + req->carrier = carrier; +} +static inline void +rt_link_setlink_req_set_phys_port_id(struct rt_link_setlink_req *req, + const void *phys_port_id, size_t len) +{ + free(req->phys_port_id); + req->_len.phys_port_id = len; + req->phys_port_id = malloc(req->_len.phys_port_id); + memcpy(req->phys_port_id, phys_port_id, req->_len.phys_port_id); +} +static inline void +rt_link_setlink_req_set_carrier_changes(struct rt_link_setlink_req *req, + __u32 carrier_changes) +{ + req->_present.carrier_changes = 1; + req->carrier_changes = carrier_changes; +} +static inline void +rt_link_setlink_req_set_phys_switch_id(struct rt_link_setlink_req *req, + const void *phys_switch_id, size_t len) +{ + free(req->phys_switch_id); + req->_len.phys_switch_id = len; + req->phys_switch_id = malloc(req->_len.phys_switch_id); + memcpy(req->phys_switch_id, phys_switch_id, req->_len.phys_switch_id); +} +static inline void +rt_link_setlink_req_set_link_netnsid(struct rt_link_setlink_req *req, + __s32 link_netnsid) +{ + req->_present.link_netnsid = 1; + req->link_netnsid = link_netnsid; +} +static inline void +rt_link_setlink_req_set_phys_port_name(struct rt_link_setlink_req *req, + const char *phys_port_name) +{ + free(req->phys_port_name); + req->_len.phys_port_name = strlen(phys_port_name); + req->phys_port_name = malloc(req->_len.phys_port_name + 1); + memcpy(req->phys_port_name, phys_port_name, req->_len.phys_port_name); + req->phys_port_name[req->_len.phys_port_name] = 0; +} +static inline void +rt_link_setlink_req_set_proto_down(struct rt_link_setlink_req *req, + __u8 proto_down) +{ + req->_present.proto_down = 1; + req->proto_down = proto_down; +} +static inline void +rt_link_setlink_req_set_gso_max_segs(struct rt_link_setlink_req *req, + __u32 gso_max_segs) +{ + req->_present.gso_max_segs = 1; + req->gso_max_segs = gso_max_segs; +} +static inline void +rt_link_setlink_req_set_gso_max_size(struct rt_link_setlink_req *req, + __u32 gso_max_size) +{ + req->_present.gso_max_size = 1; + req->gso_max_size = gso_max_size; +} +static inline void +rt_link_setlink_req_set_xdp_fd(struct rt_link_setlink_req *req, __s32 fd) +{ + req->_present.xdp = 1; + req->xdp._present.fd = 1; + req->xdp.fd = fd; +} +static inline void +rt_link_setlink_req_set_xdp_attached(struct rt_link_setlink_req *req, + __u8 attached) +{ + req->_present.xdp = 1; + req->xdp._present.attached = 1; + req->xdp.attached = attached; +} +static inline void +rt_link_setlink_req_set_xdp_flags(struct rt_link_setlink_req *req, __u32 flags) +{ + req->_present.xdp = 1; + req->xdp._present.flags = 1; + req->xdp.flags = flags; +} +static inline void +rt_link_setlink_req_set_xdp_prog_id(struct rt_link_setlink_req *req, + __u32 prog_id) +{ + req->_present.xdp = 1; + req->xdp._present.prog_id = 1; + req->xdp.prog_id = prog_id; +} +static inline void +rt_link_setlink_req_set_xdp_drv_prog_id(struct rt_link_setlink_req *req, + __u32 drv_prog_id) +{ + req->_present.xdp = 1; + req->xdp._present.drv_prog_id = 1; + req->xdp.drv_prog_id = drv_prog_id; +} +static inline void +rt_link_setlink_req_set_xdp_skb_prog_id(struct rt_link_setlink_req *req, + __u32 skb_prog_id) +{ + req->_present.xdp = 1; + req->xdp._present.skb_prog_id = 1; + req->xdp.skb_prog_id = skb_prog_id; +} +static inline void +rt_link_setlink_req_set_xdp_hw_prog_id(struct rt_link_setlink_req *req, + __u32 hw_prog_id) +{ + req->_present.xdp = 1; + req->xdp._present.hw_prog_id = 1; + req->xdp.hw_prog_id = hw_prog_id; +} +static inline void +rt_link_setlink_req_set_xdp_expected_fd(struct rt_link_setlink_req *req, + __s32 expected_fd) +{ + req->_present.xdp = 1; + req->xdp._present.expected_fd = 1; + req->xdp.expected_fd = expected_fd; +} +static inline void +rt_link_setlink_req_set_event(struct rt_link_setlink_req *req, __u32 event) +{ + req->_present.event = 1; + req->event = event; +} +static inline void +rt_link_setlink_req_set_new_netnsid(struct rt_link_setlink_req *req, + __s32 new_netnsid) +{ + req->_present.new_netnsid = 1; + req->new_netnsid = new_netnsid; +} +static inline void +rt_link_setlink_req_set_target_netnsid(struct rt_link_setlink_req *req, + __s32 target_netnsid) +{ + req->_present.target_netnsid = 1; + req->target_netnsid = target_netnsid; +} +static inline void +rt_link_setlink_req_set_carrier_up_count(struct rt_link_setlink_req *req, + __u32 carrier_up_count) +{ + req->_present.carrier_up_count = 1; + req->carrier_up_count = carrier_up_count; +} +static inline void +rt_link_setlink_req_set_carrier_down_count(struct rt_link_setlink_req *req, + __u32 carrier_down_count) +{ + req->_present.carrier_down_count = 1; + req->carrier_down_count = carrier_down_count; +} +static inline void +rt_link_setlink_req_set_new_ifindex(struct rt_link_setlink_req *req, + __s32 new_ifindex) +{ + req->_present.new_ifindex = 1; + req->new_ifindex = new_ifindex; +} +static inline void +rt_link_setlink_req_set_min_mtu(struct rt_link_setlink_req *req, __u32 min_mtu) +{ + req->_present.min_mtu = 1; + req->min_mtu = min_mtu; +} +static inline void +rt_link_setlink_req_set_max_mtu(struct rt_link_setlink_req *req, __u32 max_mtu) +{ + req->_present.max_mtu = 1; + req->max_mtu = max_mtu; +} +static inline void +__rt_link_setlink_req_set_prop_list_alt_ifname(struct rt_link_setlink_req *req, + struct ynl_string **alt_ifname, + unsigned int n_alt_ifname) +{ + unsigned int i; + + req->_present.prop_list = 1; + for (i = 0; i < req->prop_list._count.alt_ifname; i++) + free(req->prop_list.alt_ifname[i]); + free(req->prop_list.alt_ifname); + req->prop_list.alt_ifname = alt_ifname; + req->prop_list._count.alt_ifname = n_alt_ifname; +} +static inline void +rt_link_setlink_req_set_perm_address(struct rt_link_setlink_req *req, + const void *perm_address, size_t len) +{ + free(req->perm_address); + req->_len.perm_address = len; + req->perm_address = malloc(req->_len.perm_address); + memcpy(req->perm_address, perm_address, req->_len.perm_address); +} +static inline void +rt_link_setlink_req_set_proto_down_reason(struct rt_link_setlink_req *req, + const char *proto_down_reason) +{ + free(req->proto_down_reason); + req->_len.proto_down_reason = strlen(proto_down_reason); + req->proto_down_reason = malloc(req->_len.proto_down_reason + 1); + memcpy(req->proto_down_reason, proto_down_reason, req->_len.proto_down_reason); + req->proto_down_reason[req->_len.proto_down_reason] = 0; +} +static inline void +rt_link_setlink_req_set_parent_dev_name(struct rt_link_setlink_req *req, + const char *parent_dev_name) +{ + free(req->parent_dev_name); + req->_len.parent_dev_name = strlen(parent_dev_name); + req->parent_dev_name = malloc(req->_len.parent_dev_name + 1); + memcpy(req->parent_dev_name, parent_dev_name, req->_len.parent_dev_name); + req->parent_dev_name[req->_len.parent_dev_name] = 0; +} +static inline void +rt_link_setlink_req_set_parent_dev_bus_name(struct rt_link_setlink_req *req, + const char *parent_dev_bus_name) +{ + free(req->parent_dev_bus_name); + req->_len.parent_dev_bus_name = strlen(parent_dev_bus_name); + req->parent_dev_bus_name = malloc(req->_len.parent_dev_bus_name + 1); + memcpy(req->parent_dev_bus_name, parent_dev_bus_name, req->_len.parent_dev_bus_name); + req->parent_dev_bus_name[req->_len.parent_dev_bus_name] = 0; +} +static inline void +rt_link_setlink_req_set_gro_max_size(struct rt_link_setlink_req *req, + __u32 gro_max_size) +{ + req->_present.gro_max_size = 1; + req->gro_max_size = gro_max_size; +} +static inline void +rt_link_setlink_req_set_tso_max_size(struct rt_link_setlink_req *req, + __u32 tso_max_size) +{ + req->_present.tso_max_size = 1; + req->tso_max_size = tso_max_size; +} +static inline void +rt_link_setlink_req_set_tso_max_segs(struct rt_link_setlink_req *req, + __u32 tso_max_segs) +{ + req->_present.tso_max_segs = 1; + req->tso_max_segs = tso_max_segs; +} +static inline void +rt_link_setlink_req_set_allmulti(struct rt_link_setlink_req *req, + __u32 allmulti) +{ + req->_present.allmulti = 1; + req->allmulti = allmulti; +} +static inline void +rt_link_setlink_req_set_devlink_port(struct rt_link_setlink_req *req, + const void *devlink_port, size_t len) +{ + free(req->devlink_port); + req->_len.devlink_port = len; + req->devlink_port = malloc(req->_len.devlink_port); + memcpy(req->devlink_port, devlink_port, req->_len.devlink_port); +} +static inline void +rt_link_setlink_req_set_gso_ipv4_max_size(struct rt_link_setlink_req *req, + __u32 gso_ipv4_max_size) +{ + req->_present.gso_ipv4_max_size = 1; + req->gso_ipv4_max_size = gso_ipv4_max_size; +} +static inline void +rt_link_setlink_req_set_gro_ipv4_max_size(struct rt_link_setlink_req *req, + __u32 gro_ipv4_max_size) +{ + req->_present.gro_ipv4_max_size = 1; + req->gro_ipv4_max_size = gro_ipv4_max_size; +} + +/* + * Set information about a link. + */ +int rt_link_setlink(struct ynl_sock *ys, struct rt_link_setlink_req *req); + +/* ============== RTM_GETSTATS ============== */ +/* RTM_GETSTATS - do */ +struct rt_link_getstats_req { + __u16 _nlmsg_flags; + + struct if_stats_msg _hdr; +}; + +static inline struct rt_link_getstats_req *rt_link_getstats_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_link_getstats_req)); +} +void rt_link_getstats_req_free(struct rt_link_getstats_req *req); + +static inline void +rt_link_getstats_req_set_nlflags(struct rt_link_getstats_req *req, + __u16 nl_flags) +{ + req->_nlmsg_flags = nl_flags; +} + +struct rt_link_getstats_rsp { + struct if_stats_msg _hdr; + + struct { + __u32 link_offload_xstats:1; + } _present; + struct { + __u32 link_64; + __u32 link_xstats; + __u32 link_xstats_slave; + __u32 af_spec; + } _len; + + struct rtnl_link_stats64 *link_64; + void *link_xstats; + void *link_xstats_slave; + struct rt_link_link_offload_xstats link_offload_xstats; + void *af_spec; +}; + +void rt_link_getstats_rsp_free(struct rt_link_getstats_rsp *rsp); + +/* + * Get / dump link stats. + */ +struct rt_link_getstats_rsp * +rt_link_getstats(struct ynl_sock *ys, struct rt_link_getstats_req *req); + +/* RTM_GETSTATS - dump */ +struct rt_link_getstats_req_dump { + struct if_stats_msg _hdr; +}; + +static inline struct rt_link_getstats_req_dump * +rt_link_getstats_req_dump_alloc(void) +{ + return calloc(1, sizeof(struct rt_link_getstats_req_dump)); +} +void rt_link_getstats_req_dump_free(struct rt_link_getstats_req_dump *req); + +struct rt_link_getstats_list { + struct rt_link_getstats_list *next; + struct rt_link_getstats_rsp obj __attribute__((aligned(8))); +}; + +void rt_link_getstats_list_free(struct rt_link_getstats_list *rsp); + +struct rt_link_getstats_list * +rt_link_getstats_dump(struct ynl_sock *ys, + struct rt_link_getstats_req_dump *req); + +#endif /* _LINUX_RT_LINK_GEN_H */ diff --git a/home/nipa/nipa_out/963409/ynl/new-code/rt-neigh-user.c b/home/nipa/nipa_out/963409/ynl/new-code/rt-neigh-user.c new file mode 100644 index 000000000000..474c9f1b6285 --- /dev/null +++ b/home/nipa/nipa_out/963409/ynl/new-code/rt-neigh-user.c @@ -0,0 +1,860 @@ +// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) +/* Do not edit directly, auto-generated from: */ +/* Documentation/netlink/specs/rt-neigh.yaml */ +/* YNL-GEN user source */ + +#include +#include +#include "rt-neigh-user.h" +#include "ynl.h" +#include + +#include + +/* Enums */ +static const char * const rt_neigh_op_strmap[] = { + [29] = "delneigh-ntf", + // skip "getneigh", duplicate reply value + [28] = "newneigh-ntf", + [64] = "getneightbl", +}; + +const char *rt_neigh_op_str(int op) +{ + if (op < 0 || op >= (int)YNL_ARRAY_SIZE(rt_neigh_op_strmap)) + return NULL; + return rt_neigh_op_strmap[op]; +} + +static const char * const rt_neigh_nud_state_strmap[] = { + [0] = "incomplete", + [1] = "reachable", + [2] = "stale", + [3] = "delay", + [4] = "probe", + [5] = "failed", + [6] = "noarp", + [7] = "permanent", +}; + +const char *rt_neigh_nud_state_str(int value) +{ + value = ffs(value) - 1; + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_neigh_nud_state_strmap)) + return NULL; + return rt_neigh_nud_state_strmap[value]; +} + +static const char * const rt_neigh_ntf_flags_strmap[] = { + [0] = "use", + [1] = "self", + [2] = "master", + [3] = "proxy", + [4] = "ext-learned", + [5] = "offloaded", + [6] = "sticky", + [7] = "router", +}; + +const char *rt_neigh_ntf_flags_str(int value) +{ + value = ffs(value) - 1; + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_neigh_ntf_flags_strmap)) + return NULL; + return rt_neigh_ntf_flags_strmap[value]; +} + +static const char * const rt_neigh_ntf_ext_flags_strmap[] = { + [0] = "managed", + [1] = "locked", +}; + +const char *rt_neigh_ntf_ext_flags_str(int value) +{ + value = ffs(value) - 1; + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_neigh_ntf_ext_flags_strmap)) + return NULL; + return rt_neigh_ntf_ext_flags_strmap[value]; +} + +static const char * const rt_neigh_rtm_type_strmap[] = { + [0] = "unspec", + [1] = "unicast", + [2] = "local", + [3] = "broadcast", + [4] = "anycast", + [5] = "multicast", + [6] = "blackhole", + [7] = "unreachable", + [8] = "prohibit", + [9] = "throw", + [10] = "nat", + [11] = "xresolve", +}; + +const char *rt_neigh_rtm_type_str(int value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_neigh_rtm_type_strmap)) + return NULL; + return rt_neigh_rtm_type_strmap[value]; +} + +/* Policies */ +const struct ynl_policy_attr rt_neigh_ndtpa_attrs_policy[NDTPA_MAX + 1] = { + [NDTPA_IFINDEX] = { .name = "ifindex", .type = YNL_PT_U32, }, + [NDTPA_REFCNT] = { .name = "refcnt", .type = YNL_PT_U32, }, + [NDTPA_REACHABLE_TIME] = { .name = "reachable-time", .type = YNL_PT_U64, }, + [NDTPA_BASE_REACHABLE_TIME] = { .name = "base-reachable-time", .type = YNL_PT_U64, }, + [NDTPA_RETRANS_TIME] = { .name = "retrans-time", .type = YNL_PT_U64, }, + [NDTPA_GC_STALETIME] = { .name = "gc-staletime", .type = YNL_PT_U64, }, + [NDTPA_DELAY_PROBE_TIME] = { .name = "delay-probe-time", .type = YNL_PT_U64, }, + [NDTPA_QUEUE_LEN] = { .name = "queue-len", .type = YNL_PT_U32, }, + [NDTPA_APP_PROBES] = { .name = "app-probes", .type = YNL_PT_U32, }, + [NDTPA_UCAST_PROBES] = { .name = "ucast-probes", .type = YNL_PT_U32, }, + [NDTPA_MCAST_PROBES] = { .name = "mcast-probes", .type = YNL_PT_U32, }, + [NDTPA_ANYCAST_DELAY] = { .name = "anycast-delay", .type = YNL_PT_U64, }, + [NDTPA_PROXY_DELAY] = { .name = "proxy-delay", .type = YNL_PT_U64, }, + [NDTPA_PROXY_QLEN] = { .name = "proxy-qlen", .type = YNL_PT_U32, }, + [NDTPA_LOCKTIME] = { .name = "locktime", .type = YNL_PT_U64, }, + [NDTPA_QUEUE_LENBYTES] = { .name = "queue-lenbytes", .type = YNL_PT_U32, }, + [NDTPA_MCAST_REPROBES] = { .name = "mcast-reprobes", .type = YNL_PT_U32, }, + [NDTPA_PAD] = { .name = "pad", .type = YNL_PT_IGNORE, }, + [NDTPA_INTERVAL_PROBE_TIME_MS] = { .name = "interval-probe-time-ms", .type = YNL_PT_U64, }, +}; + +const struct ynl_policy_nest rt_neigh_ndtpa_attrs_nest = { + .max_attr = NDTPA_MAX, + .table = rt_neigh_ndtpa_attrs_policy, +}; + +const struct ynl_policy_attr rt_neigh_neighbour_attrs_policy[NDA_MAX + 1] = { + [NDA_UNSPEC] = { .name = "unspec", .type = YNL_PT_BINARY,}, + [NDA_DST] = { .name = "dst", .type = YNL_PT_BINARY,}, + [NDA_LLADDR] = { .name = "lladdr", .type = YNL_PT_BINARY,}, + [NDA_CACHEINFO] = { .name = "cacheinfo", .type = YNL_PT_BINARY,}, + [NDA_PROBES] = { .name = "probes", .type = YNL_PT_U32, }, + [NDA_VLAN] = { .name = "vlan", .type = YNL_PT_U16, }, + [NDA_PORT] = { .name = "port", .type = YNL_PT_U16, }, + [NDA_VNI] = { .name = "vni", .type = YNL_PT_U32, }, + [NDA_IFINDEX] = { .name = "ifindex", .type = YNL_PT_U32, }, + [NDA_MASTER] = { .name = "master", .type = YNL_PT_U32, }, + [NDA_LINK_NETNSID] = { .name = "link-netnsid", .type = YNL_PT_U32, }, + [NDA_SRC_VNI] = { .name = "src-vni", .type = YNL_PT_U32, }, + [NDA_PROTOCOL] = { .name = "protocol", .type = YNL_PT_U8, }, + [NDA_NH_ID] = { .name = "nh-id", .type = YNL_PT_U32, }, + [NDA_FDB_EXT_ATTRS] = { .name = "fdb-ext-attrs", .type = YNL_PT_BINARY,}, + [NDA_FLAGS_EXT] = { .name = "flags-ext", .type = YNL_PT_U32, }, + [NDA_NDM_STATE_MASK] = { .name = "ndm-state-mask", .type = YNL_PT_U16, }, + [NDA_NDM_FLAGS_MASK] = { .name = "ndm-flags-mask", .type = YNL_PT_U8, }, +}; + +const struct ynl_policy_nest rt_neigh_neighbour_attrs_nest = { + .max_attr = NDA_MAX, + .table = rt_neigh_neighbour_attrs_policy, +}; + +const struct ynl_policy_attr rt_neigh_ndt_attrs_policy[NDTA_MAX + 1] = { + [NDTA_NAME] = { .name = "name", .type = YNL_PT_NUL_STR, }, + [NDTA_THRESH1] = { .name = "thresh1", .type = YNL_PT_U32, }, + [NDTA_THRESH2] = { .name = "thresh2", .type = YNL_PT_U32, }, + [NDTA_THRESH3] = { .name = "thresh3", .type = YNL_PT_U32, }, + [NDTA_CONFIG] = { .name = "config", .type = YNL_PT_BINARY,}, + [NDTA_PARMS] = { .name = "parms", .type = YNL_PT_NEST, .nest = &rt_neigh_ndtpa_attrs_nest, }, + [NDTA_STATS] = { .name = "stats", .type = YNL_PT_BINARY,}, + [NDTA_GC_INTERVAL] = { .name = "gc-interval", .type = YNL_PT_U64, }, + [NDTA_PAD] = { .name = "pad", .type = YNL_PT_IGNORE, }, +}; + +const struct ynl_policy_nest rt_neigh_ndt_attrs_nest = { + .max_attr = NDTA_MAX, + .table = rt_neigh_ndt_attrs_policy, +}; + +/* Common nested types */ +void rt_neigh_ndtpa_attrs_free(struct rt_neigh_ndtpa_attrs *obj) +{ +} + +int rt_neigh_ndtpa_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + struct rt_neigh_ndtpa_attrs *obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj->_present.ifindex) + ynl_attr_put_u32(nlh, NDTPA_IFINDEX, obj->ifindex); + if (obj->_present.refcnt) + ynl_attr_put_u32(nlh, NDTPA_REFCNT, obj->refcnt); + if (obj->_present.reachable_time) + ynl_attr_put_u64(nlh, NDTPA_REACHABLE_TIME, obj->reachable_time); + if (obj->_present.base_reachable_time) + ynl_attr_put_u64(nlh, NDTPA_BASE_REACHABLE_TIME, obj->base_reachable_time); + if (obj->_present.retrans_time) + ynl_attr_put_u64(nlh, NDTPA_RETRANS_TIME, obj->retrans_time); + if (obj->_present.gc_staletime) + ynl_attr_put_u64(nlh, NDTPA_GC_STALETIME, obj->gc_staletime); + if (obj->_present.delay_probe_time) + ynl_attr_put_u64(nlh, NDTPA_DELAY_PROBE_TIME, obj->delay_probe_time); + if (obj->_present.queue_len) + ynl_attr_put_u32(nlh, NDTPA_QUEUE_LEN, obj->queue_len); + if (obj->_present.app_probes) + ynl_attr_put_u32(nlh, NDTPA_APP_PROBES, obj->app_probes); + if (obj->_present.ucast_probes) + ynl_attr_put_u32(nlh, NDTPA_UCAST_PROBES, obj->ucast_probes); + if (obj->_present.mcast_probes) + ynl_attr_put_u32(nlh, NDTPA_MCAST_PROBES, obj->mcast_probes); + if (obj->_present.anycast_delay) + ynl_attr_put_u64(nlh, NDTPA_ANYCAST_DELAY, obj->anycast_delay); + if (obj->_present.proxy_delay) + ynl_attr_put_u64(nlh, NDTPA_PROXY_DELAY, obj->proxy_delay); + if (obj->_present.proxy_qlen) + ynl_attr_put_u32(nlh, NDTPA_PROXY_QLEN, obj->proxy_qlen); + if (obj->_present.locktime) + ynl_attr_put_u64(nlh, NDTPA_LOCKTIME, obj->locktime); + if (obj->_present.queue_lenbytes) + ynl_attr_put_u32(nlh, NDTPA_QUEUE_LENBYTES, obj->queue_lenbytes); + if (obj->_present.mcast_reprobes) + ynl_attr_put_u32(nlh, NDTPA_MCAST_REPROBES, obj->mcast_reprobes); + if (obj->_present.interval_probe_time_ms) + ynl_attr_put_u64(nlh, NDTPA_INTERVAL_PROBE_TIME_MS, obj->interval_probe_time_ms); + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_neigh_ndtpa_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + struct rt_neigh_ndtpa_attrs *dst = yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == NDTPA_IFINDEX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ifindex = 1; + dst->ifindex = ynl_attr_get_u32(attr); + } else if (type == NDTPA_REFCNT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.refcnt = 1; + dst->refcnt = ynl_attr_get_u32(attr); + } else if (type == NDTPA_REACHABLE_TIME) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.reachable_time = 1; + dst->reachable_time = ynl_attr_get_u64(attr); + } else if (type == NDTPA_BASE_REACHABLE_TIME) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.base_reachable_time = 1; + dst->base_reachable_time = ynl_attr_get_u64(attr); + } else if (type == NDTPA_RETRANS_TIME) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.retrans_time = 1; + dst->retrans_time = ynl_attr_get_u64(attr); + } else if (type == NDTPA_GC_STALETIME) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.gc_staletime = 1; + dst->gc_staletime = ynl_attr_get_u64(attr); + } else if (type == NDTPA_DELAY_PROBE_TIME) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.delay_probe_time = 1; + dst->delay_probe_time = ynl_attr_get_u64(attr); + } else if (type == NDTPA_QUEUE_LEN) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.queue_len = 1; + dst->queue_len = ynl_attr_get_u32(attr); + } else if (type == NDTPA_APP_PROBES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.app_probes = 1; + dst->app_probes = ynl_attr_get_u32(attr); + } else if (type == NDTPA_UCAST_PROBES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ucast_probes = 1; + dst->ucast_probes = ynl_attr_get_u32(attr); + } else if (type == NDTPA_MCAST_PROBES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_probes = 1; + dst->mcast_probes = ynl_attr_get_u32(attr); + } else if (type == NDTPA_ANYCAST_DELAY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.anycast_delay = 1; + dst->anycast_delay = ynl_attr_get_u64(attr); + } else if (type == NDTPA_PROXY_DELAY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.proxy_delay = 1; + dst->proxy_delay = ynl_attr_get_u64(attr); + } else if (type == NDTPA_PROXY_QLEN) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.proxy_qlen = 1; + dst->proxy_qlen = ynl_attr_get_u32(attr); + } else if (type == NDTPA_LOCKTIME) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.locktime = 1; + dst->locktime = ynl_attr_get_u64(attr); + } else if (type == NDTPA_QUEUE_LENBYTES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.queue_lenbytes = 1; + dst->queue_lenbytes = ynl_attr_get_u32(attr); + } else if (type == NDTPA_MCAST_REPROBES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.mcast_reprobes = 1; + dst->mcast_reprobes = ynl_attr_get_u32(attr); + } else if (type == NDTPA_INTERVAL_PROBE_TIME_MS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.interval_probe_time_ms = 1; + dst->interval_probe_time_ms = ynl_attr_get_u64(attr); + } + } + + return 0; +} + +/* ============== RTM_NEWNEIGH ============== */ +/* RTM_NEWNEIGH - do */ +void rt_neigh_newneigh_req_free(struct rt_neigh_newneigh_req *req) +{ + free(req->dst); + free(req->lladdr); + free(req->fdb_ext_attrs); + free(req); +} + +int rt_neigh_newneigh(struct ynl_sock *ys, struct rt_neigh_newneigh_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_msg_start_req(ys, RTM_NEWNEIGH, req->_nlmsg_flags); + ys->req_policy = &rt_neigh_neighbour_attrs_nest; + ys->req_hdr_len = sizeof(struct ndmsg); + + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + if (req->_len.dst) + ynl_attr_put(nlh, NDA_DST, req->dst, req->_len.dst); + if (req->_len.lladdr) + ynl_attr_put(nlh, NDA_LLADDR, req->lladdr, req->_len.lladdr); + if (req->_present.probes) + ynl_attr_put_u32(nlh, NDA_PROBES, req->probes); + if (req->_present.vlan) + ynl_attr_put_u16(nlh, NDA_VLAN, req->vlan); + if (req->_present.port) + ynl_attr_put_u16(nlh, NDA_PORT, req->port); + if (req->_present.vni) + ynl_attr_put_u32(nlh, NDA_VNI, req->vni); + if (req->_present.ifindex) + ynl_attr_put_u32(nlh, NDA_IFINDEX, req->ifindex); + if (req->_present.master) + ynl_attr_put_u32(nlh, NDA_MASTER, req->master); + if (req->_present.protocol) + ynl_attr_put_u8(nlh, NDA_PROTOCOL, req->protocol); + if (req->_present.nh_id) + ynl_attr_put_u32(nlh, NDA_NH_ID, req->nh_id); + if (req->_present.flags_ext) + ynl_attr_put_u32(nlh, NDA_FLAGS_EXT, req->flags_ext); + if (req->_len.fdb_ext_attrs) + ynl_attr_put(nlh, NDA_FDB_EXT_ATTRS, req->fdb_ext_attrs, req->_len.fdb_ext_attrs); + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + return -1; + + return 0; +} + +/* ============== RTM_DELNEIGH ============== */ +/* RTM_DELNEIGH - do */ +void rt_neigh_delneigh_req_free(struct rt_neigh_delneigh_req *req) +{ + free(req->dst); + free(req); +} + +int rt_neigh_delneigh(struct ynl_sock *ys, struct rt_neigh_delneigh_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_msg_start_req(ys, RTM_DELNEIGH, req->_nlmsg_flags); + ys->req_policy = &rt_neigh_neighbour_attrs_nest; + ys->req_hdr_len = sizeof(struct ndmsg); + + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + if (req->_len.dst) + ynl_attr_put(nlh, NDA_DST, req->dst, req->_len.dst); + if (req->_present.ifindex) + ynl_attr_put_u32(nlh, NDA_IFINDEX, req->ifindex); + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + return -1; + + return 0; +} + +/* ============== RTM_GETNEIGH ============== */ +/* RTM_GETNEIGH - do */ +void rt_neigh_getneigh_req_free(struct rt_neigh_getneigh_req *req) +{ + free(req->dst); + free(req); +} + +void rt_neigh_getneigh_rsp_free(struct rt_neigh_getneigh_rsp *rsp) +{ + free(rsp->dst); + free(rsp->lladdr); + free(rsp->fdb_ext_attrs); + free(rsp); +} + +int rt_neigh_getneigh_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + struct rt_neigh_getneigh_rsp *dst; + const struct nlattr *attr; + void *hdr; + + dst = yarg->data; + + hdr = ynl_nlmsg_data(nlh); + memcpy(&dst->_hdr, hdr, sizeof(struct ndmsg)); + + ynl_attr_for_each(attr, nlh, sizeof(struct ndmsg)) { + unsigned int type = ynl_attr_type(attr); + + if (type == NDA_DST) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.dst = len; + dst->dst = malloc(len); + memcpy(dst->dst, ynl_attr_data(attr), len); + } else if (type == NDA_LLADDR) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.lladdr = len; + dst->lladdr = malloc(len); + memcpy(dst->lladdr, ynl_attr_data(attr), len); + } else if (type == NDA_PROBES) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.probes = 1; + dst->probes = ynl_attr_get_u32(attr); + } else if (type == NDA_VLAN) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vlan = 1; + dst->vlan = ynl_attr_get_u16(attr); + } else if (type == NDA_PORT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.port = 1; + dst->port = ynl_attr_get_u16(attr); + } else if (type == NDA_VNI) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.vni = 1; + dst->vni = ynl_attr_get_u32(attr); + } else if (type == NDA_IFINDEX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ifindex = 1; + dst->ifindex = ynl_attr_get_u32(attr); + } else if (type == NDA_MASTER) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.master = 1; + dst->master = ynl_attr_get_u32(attr); + } else if (type == NDA_PROTOCOL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.protocol = 1; + dst->protocol = ynl_attr_get_u8(attr); + } else if (type == NDA_NH_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.nh_id = 1; + dst->nh_id = ynl_attr_get_u32(attr); + } else if (type == NDA_FLAGS_EXT) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flags_ext = 1; + dst->flags_ext = ynl_attr_get_u32(attr); + } else if (type == NDA_FDB_EXT_ATTRS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.fdb_ext_attrs = len; + dst->fdb_ext_attrs = malloc(len); + memcpy(dst->fdb_ext_attrs, ynl_attr_data(attr), len); + } + } + + return YNL_PARSE_CB_OK; +} + +struct rt_neigh_getneigh_rsp * +rt_neigh_getneigh(struct ynl_sock *ys, struct rt_neigh_getneigh_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct rt_neigh_getneigh_rsp *rsp; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_msg_start_req(ys, RTM_GETNEIGH, req->_nlmsg_flags); + ys->req_policy = &rt_neigh_neighbour_attrs_nest; + ys->req_hdr_len = sizeof(struct ndmsg); + yrs.yarg.rsp_policy = &rt_neigh_neighbour_attrs_nest; + + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + if (req->_len.dst) + ynl_attr_put(nlh, NDA_DST, req->dst, req->_len.dst); + + rsp = calloc(1, sizeof(*rsp)); + yrs.yarg.data = rsp; + yrs.cb = rt_neigh_getneigh_rsp_parse; + yrs.rsp_cmd = 28; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + goto err_free; + + return rsp; + +err_free: + rt_neigh_getneigh_rsp_free(rsp); + return NULL; +} + +/* RTM_GETNEIGH - dump */ +void rt_neigh_getneigh_req_dump_free(struct rt_neigh_getneigh_req_dump *req) +{ + free(req); +} + +void rt_neigh_getneigh_list_free(struct rt_neigh_getneigh_list *rsp) +{ + struct rt_neigh_getneigh_list *next = rsp; + + while ((void *)next != YNL_LIST_END) { + rsp = next; + next = rsp->next; + + free(rsp->obj.dst); + free(rsp->obj.lladdr); + free(rsp->obj.fdb_ext_attrs); + free(rsp); + } +} + +struct rt_neigh_getneigh_list * +rt_neigh_getneigh_dump(struct ynl_sock *ys, + struct rt_neigh_getneigh_req_dump *req) +{ + struct ynl_dump_state yds = {}; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &rt_neigh_neighbour_attrs_nest; + yds.yarg.data = NULL; + yds.alloc_sz = sizeof(struct rt_neigh_getneigh_list); + yds.cb = rt_neigh_getneigh_rsp_parse; + yds.rsp_cmd = 28; + + nlh = ynl_msg_start_dump(ys, RTM_GETNEIGH); + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + ys->req_policy = &rt_neigh_neighbour_attrs_nest; + ys->req_hdr_len = sizeof(struct ndmsg); + + if (req->_present.ifindex) + ynl_attr_put_u32(nlh, NDA_IFINDEX, req->ifindex); + if (req->_present.master) + ynl_attr_put_u32(nlh, NDA_MASTER, req->master); + + err = ynl_exec_dump(ys, nlh, &yds); + if (err < 0) + goto free_list; + + return yds.first; + +free_list: + rt_neigh_getneigh_list_free(yds.first); + return NULL; +} + +/* RTM_GETNEIGH - notify */ +void rt_neigh_getneigh_ntf_free(struct rt_neigh_getneigh_ntf *rsp) +{ + free(rsp->obj.dst); + free(rsp->obj.lladdr); + free(rsp->obj.fdb_ext_attrs); + free(rsp); +} + +/* ============== RTM_GETNEIGHTBL ============== */ +/* RTM_GETNEIGHTBL - dump */ +int rt_neigh_getneightbl_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + struct rt_neigh_getneightbl_rsp *dst; + const struct nlattr *attr; + struct ynl_parse_arg parg; + void *hdr; + + dst = yarg->data; + parg.ys = yarg->ys; + + hdr = ynl_nlmsg_data(nlh); + memcpy(&dst->_hdr, hdr, sizeof(struct ndtmsg)); + + ynl_attr_for_each(attr, nlh, sizeof(struct ndtmsg)) { + unsigned int type = ynl_attr_type(attr); + + if (type == NDTA_NAME) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.name = len; + dst->name = malloc(len + 1); + memcpy(dst->name, ynl_attr_get_str(attr), len); + dst->name[len] = 0; + } else if (type == NDTA_THRESH1) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.thresh1 = 1; + dst->thresh1 = ynl_attr_get_u32(attr); + } else if (type == NDTA_THRESH2) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.thresh2 = 1; + dst->thresh2 = ynl_attr_get_u32(attr); + } else if (type == NDTA_THRESH3) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.thresh3 = 1; + dst->thresh3 = ynl_attr_get_u32(attr); + } else if (type == NDTA_CONFIG) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.config = len; + if (len < sizeof(struct ndt_config)) + dst->config = calloc(1, sizeof(struct ndt_config)); + else + dst->config = malloc(len); + memcpy(dst->config, ynl_attr_data(attr), len); + } else if (type == NDTA_PARMS) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.parms = 1; + + parg.rsp_policy = &rt_neigh_ndtpa_attrs_nest; + parg.data = &dst->parms; + if (rt_neigh_ndtpa_attrs_parse(&parg, attr)) + return YNL_PARSE_CB_ERROR; + } else if (type == NDTA_STATS) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.stats = len; + if (len < sizeof(struct ndt_stats)) + dst->stats = calloc(1, sizeof(struct ndt_stats)); + else + dst->stats = malloc(len); + memcpy(dst->stats, ynl_attr_data(attr), len); + } else if (type == NDTA_GC_INTERVAL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.gc_interval = 1; + dst->gc_interval = ynl_attr_get_u64(attr); + } + } + + return YNL_PARSE_CB_OK; +} + +void rt_neigh_getneightbl_req_free(struct rt_neigh_getneightbl_req *req) +{ + free(req); +} + +void rt_neigh_getneightbl_list_free(struct rt_neigh_getneightbl_list *rsp) +{ + struct rt_neigh_getneightbl_list *next = rsp; + + while ((void *)next != YNL_LIST_END) { + rsp = next; + next = rsp->next; + + free(rsp->obj.name); + free(rsp->obj.config); + rt_neigh_ndtpa_attrs_free(&rsp->obj.parms); + free(rsp->obj.stats); + free(rsp); + } +} + +struct rt_neigh_getneightbl_list * +rt_neigh_getneightbl_dump(struct ynl_sock *ys, + struct rt_neigh_getneightbl_req *req) +{ + struct ynl_dump_state yds = {}; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &rt_neigh_ndt_attrs_nest; + yds.yarg.data = NULL; + yds.alloc_sz = sizeof(struct rt_neigh_getneightbl_list); + yds.cb = rt_neigh_getneightbl_rsp_parse; + yds.rsp_cmd = 64; + + nlh = ynl_msg_start_dump(ys, RTM_GETNEIGHTBL); + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + ys->req_policy = &rt_neigh_ndt_attrs_nest; + ys->req_hdr_len = sizeof(struct ndtmsg); + + err = ynl_exec_dump(ys, nlh, &yds); + if (err < 0) + goto free_list; + + return yds.first; + +free_list: + rt_neigh_getneightbl_list_free(yds.first); + return NULL; +} + +/* ============== RTM_SETNEIGHTBL ============== */ +/* RTM_SETNEIGHTBL - do */ +void rt_neigh_setneightbl_req_free(struct rt_neigh_setneightbl_req *req) +{ + free(req->name); + rt_neigh_ndtpa_attrs_free(&req->parms); + free(req); +} + +int rt_neigh_setneightbl(struct ynl_sock *ys, + struct rt_neigh_setneightbl_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_msg_start_req(ys, RTM_SETNEIGHTBL, req->_nlmsg_flags); + ys->req_policy = &rt_neigh_ndt_attrs_nest; + ys->req_hdr_len = sizeof(struct ndtmsg); + + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + if (req->_len.name) + ynl_attr_put_str(nlh, NDTA_NAME, req->name); + if (req->_present.thresh1) + ynl_attr_put_u32(nlh, NDTA_THRESH1, req->thresh1); + if (req->_present.thresh2) + ynl_attr_put_u32(nlh, NDTA_THRESH2, req->thresh2); + if (req->_present.thresh3) + ynl_attr_put_u32(nlh, NDTA_THRESH3, req->thresh3); + if (req->_present.parms) + rt_neigh_ndtpa_attrs_put(nlh, NDTA_PARMS, &req->parms); + if (req->_present.gc_interval) + ynl_attr_put_u64(nlh, NDTA_GC_INTERVAL, req->gc_interval); + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + return -1; + + return 0; +} + +static const struct ynl_ntf_info rt_neigh_ntf_info[] = { + [RTM_DELNEIGH] = { + .alloc_sz = sizeof(struct rt_neigh_getneigh_ntf), + .cb = rt_neigh_getneigh_rsp_parse, + .policy = &rt_neigh_neighbour_attrs_nest, + .free = (void *)rt_neigh_getneigh_ntf_free, + }, + [RTM_NEWNEIGH] = { + .alloc_sz = sizeof(struct rt_neigh_getneigh_ntf), + .cb = rt_neigh_getneigh_rsp_parse, + .policy = &rt_neigh_neighbour_attrs_nest, + .free = (void *)rt_neigh_getneigh_ntf_free, + }, +}; + +const struct ynl_family ynl_rt_neigh_family = { + .name = "rt_neigh", + .is_classic = true, + .classic_id = 0, + .ntf_info = rt_neigh_ntf_info, + .ntf_info_size = YNL_ARRAY_SIZE(rt_neigh_ntf_info), +}; diff --git a/home/nipa/nipa_out/963409/ynl/new-code/rt-neigh-user.h b/home/nipa/nipa_out/963409/ynl/new-code/rt-neigh-user.h new file mode 100644 index 000000000000..f682fea5a214 --- /dev/null +++ b/home/nipa/nipa_out/963409/ynl/new-code/rt-neigh-user.h @@ -0,0 +1,679 @@ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* Do not edit directly, auto-generated from: */ +/* Documentation/netlink/specs/rt-neigh.yaml */ +/* YNL-GEN user header */ + +#ifndef _LINUX_RT_NEIGH_GEN_H +#define _LINUX_RT_NEIGH_GEN_H + +#include +#include +#include +#include + +struct ynl_sock; + +extern const struct ynl_family ynl_rt_neigh_family; + +/* Enums */ +const char *rt_neigh_op_str(int op); +const char *rt_neigh_nud_state_str(int value); +const char *rt_neigh_ntf_flags_str(int value); +const char *rt_neigh_ntf_ext_flags_str(int value); +const char *rt_neigh_rtm_type_str(int value); + +/* Common nested types */ +struct rt_neigh_ndtpa_attrs { + struct { + __u32 ifindex:1; + __u32 refcnt:1; + __u32 reachable_time:1; + __u32 base_reachable_time:1; + __u32 retrans_time:1; + __u32 gc_staletime:1; + __u32 delay_probe_time:1; + __u32 queue_len:1; + __u32 app_probes:1; + __u32 ucast_probes:1; + __u32 mcast_probes:1; + __u32 anycast_delay:1; + __u32 proxy_delay:1; + __u32 proxy_qlen:1; + __u32 locktime:1; + __u32 queue_lenbytes:1; + __u32 mcast_reprobes:1; + __u32 interval_probe_time_ms:1; + } _present; + + __u32 ifindex; + __u32 refcnt; + __u64 reachable_time; + __u64 base_reachable_time; + __u64 retrans_time; + __u64 gc_staletime; + __u64 delay_probe_time; + __u32 queue_len; + __u32 app_probes; + __u32 ucast_probes; + __u32 mcast_probes; + __u64 anycast_delay; + __u64 proxy_delay; + __u32 proxy_qlen; + __u64 locktime; + __u32 queue_lenbytes; + __u32 mcast_reprobes; + __u64 interval_probe_time_ms; +}; + +/* ============== RTM_NEWNEIGH ============== */ +/* RTM_NEWNEIGH - do */ +struct rt_neigh_newneigh_req { + __u16 _nlmsg_flags; + + struct ndmsg _hdr; + + struct { + __u32 probes:1; + __u32 vlan:1; + __u32 port:1; + __u32 vni:1; + __u32 ifindex:1; + __u32 master:1; + __u32 protocol:1; + __u32 nh_id:1; + __u32 flags_ext:1; + } _present; + struct { + __u32 dst; + __u32 lladdr; + __u32 fdb_ext_attrs; + } _len; + + void *dst; + void *lladdr; + __u32 probes; + __u16 vlan; + __u16 port; + __u32 vni; + __u32 ifindex; + __u32 master; + __u8 protocol; + __u32 nh_id; + __u32 flags_ext; + void *fdb_ext_attrs; +}; + +static inline struct rt_neigh_newneigh_req *rt_neigh_newneigh_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_neigh_newneigh_req)); +} +void rt_neigh_newneigh_req_free(struct rt_neigh_newneigh_req *req); + +static inline void +rt_neigh_newneigh_req_set_nlflags(struct rt_neigh_newneigh_req *req, + __u16 nl_flags) +{ + req->_nlmsg_flags = nl_flags; +} + +static inline void +rt_neigh_newneigh_req_set_dst(struct rt_neigh_newneigh_req *req, + const void *dst, size_t len) +{ + free(req->dst); + req->_len.dst = len; + req->dst = malloc(req->_len.dst); + memcpy(req->dst, dst, req->_len.dst); +} +static inline void +rt_neigh_newneigh_req_set_lladdr(struct rt_neigh_newneigh_req *req, + const void *lladdr, size_t len) +{ + free(req->lladdr); + req->_len.lladdr = len; + req->lladdr = malloc(req->_len.lladdr); + memcpy(req->lladdr, lladdr, req->_len.lladdr); +} +static inline void +rt_neigh_newneigh_req_set_probes(struct rt_neigh_newneigh_req *req, + __u32 probes) +{ + req->_present.probes = 1; + req->probes = probes; +} +static inline void +rt_neigh_newneigh_req_set_vlan(struct rt_neigh_newneigh_req *req, __u16 vlan) +{ + req->_present.vlan = 1; + req->vlan = vlan; +} +static inline void +rt_neigh_newneigh_req_set_port(struct rt_neigh_newneigh_req *req, __u16 port) +{ + req->_present.port = 1; + req->port = port; +} +static inline void +rt_neigh_newneigh_req_set_vni(struct rt_neigh_newneigh_req *req, __u32 vni) +{ + req->_present.vni = 1; + req->vni = vni; +} +static inline void +rt_neigh_newneigh_req_set_ifindex(struct rt_neigh_newneigh_req *req, + __u32 ifindex) +{ + req->_present.ifindex = 1; + req->ifindex = ifindex; +} +static inline void +rt_neigh_newneigh_req_set_master(struct rt_neigh_newneigh_req *req, + __u32 master) +{ + req->_present.master = 1; + req->master = master; +} +static inline void +rt_neigh_newneigh_req_set_protocol(struct rt_neigh_newneigh_req *req, + __u8 protocol) +{ + req->_present.protocol = 1; + req->protocol = protocol; +} +static inline void +rt_neigh_newneigh_req_set_nh_id(struct rt_neigh_newneigh_req *req, __u32 nh_id) +{ + req->_present.nh_id = 1; + req->nh_id = nh_id; +} +static inline void +rt_neigh_newneigh_req_set_flags_ext(struct rt_neigh_newneigh_req *req, + __u32 flags_ext) +{ + req->_present.flags_ext = 1; + req->flags_ext = flags_ext; +} +static inline void +rt_neigh_newneigh_req_set_fdb_ext_attrs(struct rt_neigh_newneigh_req *req, + const void *fdb_ext_attrs, size_t len) +{ + free(req->fdb_ext_attrs); + req->_len.fdb_ext_attrs = len; + req->fdb_ext_attrs = malloc(req->_len.fdb_ext_attrs); + memcpy(req->fdb_ext_attrs, fdb_ext_attrs, req->_len.fdb_ext_attrs); +} + +/* + * Add new neighbour entry + */ +int rt_neigh_newneigh(struct ynl_sock *ys, struct rt_neigh_newneigh_req *req); + +/* ============== RTM_DELNEIGH ============== */ +/* RTM_DELNEIGH - do */ +struct rt_neigh_delneigh_req { + __u16 _nlmsg_flags; + + struct ndmsg _hdr; + + struct { + __u32 ifindex:1; + } _present; + struct { + __u32 dst; + } _len; + + void *dst; + __u32 ifindex; +}; + +static inline struct rt_neigh_delneigh_req *rt_neigh_delneigh_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_neigh_delneigh_req)); +} +void rt_neigh_delneigh_req_free(struct rt_neigh_delneigh_req *req); + +static inline void +rt_neigh_delneigh_req_set_nlflags(struct rt_neigh_delneigh_req *req, + __u16 nl_flags) +{ + req->_nlmsg_flags = nl_flags; +} + +static inline void +rt_neigh_delneigh_req_set_dst(struct rt_neigh_delneigh_req *req, + const void *dst, size_t len) +{ + free(req->dst); + req->_len.dst = len; + req->dst = malloc(req->_len.dst); + memcpy(req->dst, dst, req->_len.dst); +} +static inline void +rt_neigh_delneigh_req_set_ifindex(struct rt_neigh_delneigh_req *req, + __u32 ifindex) +{ + req->_present.ifindex = 1; + req->ifindex = ifindex; +} + +/* + * Remove an existing neighbour entry + */ +int rt_neigh_delneigh(struct ynl_sock *ys, struct rt_neigh_delneigh_req *req); + +/* ============== RTM_GETNEIGH ============== */ +/* RTM_GETNEIGH - do */ +struct rt_neigh_getneigh_req { + __u16 _nlmsg_flags; + + struct ndmsg _hdr; + + struct { + __u32 dst; + } _len; + + void *dst; +}; + +static inline struct rt_neigh_getneigh_req *rt_neigh_getneigh_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_neigh_getneigh_req)); +} +void rt_neigh_getneigh_req_free(struct rt_neigh_getneigh_req *req); + +static inline void +rt_neigh_getneigh_req_set_nlflags(struct rt_neigh_getneigh_req *req, + __u16 nl_flags) +{ + req->_nlmsg_flags = nl_flags; +} + +static inline void +rt_neigh_getneigh_req_set_dst(struct rt_neigh_getneigh_req *req, + const void *dst, size_t len) +{ + free(req->dst); + req->_len.dst = len; + req->dst = malloc(req->_len.dst); + memcpy(req->dst, dst, req->_len.dst); +} + +struct rt_neigh_getneigh_rsp { + struct ndmsg _hdr; + + struct { + __u32 probes:1; + __u32 vlan:1; + __u32 port:1; + __u32 vni:1; + __u32 ifindex:1; + __u32 master:1; + __u32 protocol:1; + __u32 nh_id:1; + __u32 flags_ext:1; + } _present; + struct { + __u32 dst; + __u32 lladdr; + __u32 fdb_ext_attrs; + } _len; + + void *dst; + void *lladdr; + __u32 probes; + __u16 vlan; + __u16 port; + __u32 vni; + __u32 ifindex; + __u32 master; + __u8 protocol; + __u32 nh_id; + __u32 flags_ext; + void *fdb_ext_attrs; +}; + +void rt_neigh_getneigh_rsp_free(struct rt_neigh_getneigh_rsp *rsp); + +/* + * Get or dump neighbour entries + */ +struct rt_neigh_getneigh_rsp * +rt_neigh_getneigh(struct ynl_sock *ys, struct rt_neigh_getneigh_req *req); + +/* RTM_GETNEIGH - dump */ +struct rt_neigh_getneigh_req_dump { + struct ndmsg _hdr; + + struct { + __u32 ifindex:1; + __u32 master:1; + } _present; + + __u32 ifindex; + __u32 master; +}; + +static inline struct rt_neigh_getneigh_req_dump * +rt_neigh_getneigh_req_dump_alloc(void) +{ + return calloc(1, sizeof(struct rt_neigh_getneigh_req_dump)); +} +void rt_neigh_getneigh_req_dump_free(struct rt_neigh_getneigh_req_dump *req); + +static inline void +rt_neigh_getneigh_req_dump_set_ifindex(struct rt_neigh_getneigh_req_dump *req, + __u32 ifindex) +{ + req->_present.ifindex = 1; + req->ifindex = ifindex; +} +static inline void +rt_neigh_getneigh_req_dump_set_master(struct rt_neigh_getneigh_req_dump *req, + __u32 master) +{ + req->_present.master = 1; + req->master = master; +} + +struct rt_neigh_getneigh_list { + struct rt_neigh_getneigh_list *next; + struct rt_neigh_getneigh_rsp obj __attribute__((aligned(8))); +}; + +void rt_neigh_getneigh_list_free(struct rt_neigh_getneigh_list *rsp); + +struct rt_neigh_getneigh_list * +rt_neigh_getneigh_dump(struct ynl_sock *ys, + struct rt_neigh_getneigh_req_dump *req); + +/* RTM_GETNEIGH - notify */ +struct rt_neigh_getneigh_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type *next; + void (*free)(struct rt_neigh_getneigh_ntf *ntf); + struct rt_neigh_getneigh_rsp obj __attribute__((aligned(8))); +}; + +void rt_neigh_getneigh_ntf_free(struct rt_neigh_getneigh_ntf *rsp); + +/* ============== RTM_GETNEIGHTBL ============== */ +/* RTM_GETNEIGHTBL - dump */ +struct rt_neigh_getneightbl_req { + struct ndtmsg _hdr; +}; + +static inline struct rt_neigh_getneightbl_req * +rt_neigh_getneightbl_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_neigh_getneightbl_req)); +} +void rt_neigh_getneightbl_req_free(struct rt_neigh_getneightbl_req *req); + +struct rt_neigh_getneightbl_rsp { + struct ndtmsg _hdr; + + struct { + __u32 thresh1:1; + __u32 thresh2:1; + __u32 thresh3:1; + __u32 parms:1; + __u32 gc_interval:1; + } _present; + struct { + __u32 name; + __u32 config; + __u32 stats; + } _len; + + char *name; + __u32 thresh1; + __u32 thresh2; + __u32 thresh3; + struct ndt_config *config; + struct rt_neigh_ndtpa_attrs parms; + struct ndt_stats *stats; + __u64 gc_interval; +}; + +struct rt_neigh_getneightbl_list { + struct rt_neigh_getneightbl_list *next; + struct rt_neigh_getneightbl_rsp obj __attribute__((aligned(8))); +}; + +void rt_neigh_getneightbl_list_free(struct rt_neigh_getneightbl_list *rsp); + +struct rt_neigh_getneightbl_list * +rt_neigh_getneightbl_dump(struct ynl_sock *ys, + struct rt_neigh_getneightbl_req *req); + +/* ============== RTM_SETNEIGHTBL ============== */ +/* RTM_SETNEIGHTBL - do */ +struct rt_neigh_setneightbl_req { + __u16 _nlmsg_flags; + + struct ndtmsg _hdr; + + struct { + __u32 thresh1:1; + __u32 thresh2:1; + __u32 thresh3:1; + __u32 parms:1; + __u32 gc_interval:1; + } _present; + struct { + __u32 name; + } _len; + + char *name; + __u32 thresh1; + __u32 thresh2; + __u32 thresh3; + struct rt_neigh_ndtpa_attrs parms; + __u64 gc_interval; +}; + +static inline struct rt_neigh_setneightbl_req * +rt_neigh_setneightbl_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_neigh_setneightbl_req)); +} +void rt_neigh_setneightbl_req_free(struct rt_neigh_setneightbl_req *req); + +static inline void +rt_neigh_setneightbl_req_set_nlflags(struct rt_neigh_setneightbl_req *req, + __u16 nl_flags) +{ + req->_nlmsg_flags = nl_flags; +} + +static inline void +rt_neigh_setneightbl_req_set_name(struct rt_neigh_setneightbl_req *req, + const char *name) +{ + free(req->name); + req->_len.name = strlen(name); + req->name = malloc(req->_len.name + 1); + memcpy(req->name, name, req->_len.name); + req->name[req->_len.name] = 0; +} +static inline void +rt_neigh_setneightbl_req_set_thresh1(struct rt_neigh_setneightbl_req *req, + __u32 thresh1) +{ + req->_present.thresh1 = 1; + req->thresh1 = thresh1; +} +static inline void +rt_neigh_setneightbl_req_set_thresh2(struct rt_neigh_setneightbl_req *req, + __u32 thresh2) +{ + req->_present.thresh2 = 1; + req->thresh2 = thresh2; +} +static inline void +rt_neigh_setneightbl_req_set_thresh3(struct rt_neigh_setneightbl_req *req, + __u32 thresh3) +{ + req->_present.thresh3 = 1; + req->thresh3 = thresh3; +} +static inline void +rt_neigh_setneightbl_req_set_parms_ifindex(struct rt_neigh_setneightbl_req *req, + __u32 ifindex) +{ + req->_present.parms = 1; + req->parms._present.ifindex = 1; + req->parms.ifindex = ifindex; +} +static inline void +rt_neigh_setneightbl_req_set_parms_refcnt(struct rt_neigh_setneightbl_req *req, + __u32 refcnt) +{ + req->_present.parms = 1; + req->parms._present.refcnt = 1; + req->parms.refcnt = refcnt; +} +static inline void +rt_neigh_setneightbl_req_set_parms_reachable_time(struct rt_neigh_setneightbl_req *req, + __u64 reachable_time) +{ + req->_present.parms = 1; + req->parms._present.reachable_time = 1; + req->parms.reachable_time = reachable_time; +} +static inline void +rt_neigh_setneightbl_req_set_parms_base_reachable_time(struct rt_neigh_setneightbl_req *req, + __u64 base_reachable_time) +{ + req->_present.parms = 1; + req->parms._present.base_reachable_time = 1; + req->parms.base_reachable_time = base_reachable_time; +} +static inline void +rt_neigh_setneightbl_req_set_parms_retrans_time(struct rt_neigh_setneightbl_req *req, + __u64 retrans_time) +{ + req->_present.parms = 1; + req->parms._present.retrans_time = 1; + req->parms.retrans_time = retrans_time; +} +static inline void +rt_neigh_setneightbl_req_set_parms_gc_staletime(struct rt_neigh_setneightbl_req *req, + __u64 gc_staletime) +{ + req->_present.parms = 1; + req->parms._present.gc_staletime = 1; + req->parms.gc_staletime = gc_staletime; +} +static inline void +rt_neigh_setneightbl_req_set_parms_delay_probe_time(struct rt_neigh_setneightbl_req *req, + __u64 delay_probe_time) +{ + req->_present.parms = 1; + req->parms._present.delay_probe_time = 1; + req->parms.delay_probe_time = delay_probe_time; +} +static inline void +rt_neigh_setneightbl_req_set_parms_queue_len(struct rt_neigh_setneightbl_req *req, + __u32 queue_len) +{ + req->_present.parms = 1; + req->parms._present.queue_len = 1; + req->parms.queue_len = queue_len; +} +static inline void +rt_neigh_setneightbl_req_set_parms_app_probes(struct rt_neigh_setneightbl_req *req, + __u32 app_probes) +{ + req->_present.parms = 1; + req->parms._present.app_probes = 1; + req->parms.app_probes = app_probes; +} +static inline void +rt_neigh_setneightbl_req_set_parms_ucast_probes(struct rt_neigh_setneightbl_req *req, + __u32 ucast_probes) +{ + req->_present.parms = 1; + req->parms._present.ucast_probes = 1; + req->parms.ucast_probes = ucast_probes; +} +static inline void +rt_neigh_setneightbl_req_set_parms_mcast_probes(struct rt_neigh_setneightbl_req *req, + __u32 mcast_probes) +{ + req->_present.parms = 1; + req->parms._present.mcast_probes = 1; + req->parms.mcast_probes = mcast_probes; +} +static inline void +rt_neigh_setneightbl_req_set_parms_anycast_delay(struct rt_neigh_setneightbl_req *req, + __u64 anycast_delay) +{ + req->_present.parms = 1; + req->parms._present.anycast_delay = 1; + req->parms.anycast_delay = anycast_delay; +} +static inline void +rt_neigh_setneightbl_req_set_parms_proxy_delay(struct rt_neigh_setneightbl_req *req, + __u64 proxy_delay) +{ + req->_present.parms = 1; + req->parms._present.proxy_delay = 1; + req->parms.proxy_delay = proxy_delay; +} +static inline void +rt_neigh_setneightbl_req_set_parms_proxy_qlen(struct rt_neigh_setneightbl_req *req, + __u32 proxy_qlen) +{ + req->_present.parms = 1; + req->parms._present.proxy_qlen = 1; + req->parms.proxy_qlen = proxy_qlen; +} +static inline void +rt_neigh_setneightbl_req_set_parms_locktime(struct rt_neigh_setneightbl_req *req, + __u64 locktime) +{ + req->_present.parms = 1; + req->parms._present.locktime = 1; + req->parms.locktime = locktime; +} +static inline void +rt_neigh_setneightbl_req_set_parms_queue_lenbytes(struct rt_neigh_setneightbl_req *req, + __u32 queue_lenbytes) +{ + req->_present.parms = 1; + req->parms._present.queue_lenbytes = 1; + req->parms.queue_lenbytes = queue_lenbytes; +} +static inline void +rt_neigh_setneightbl_req_set_parms_mcast_reprobes(struct rt_neigh_setneightbl_req *req, + __u32 mcast_reprobes) +{ + req->_present.parms = 1; + req->parms._present.mcast_reprobes = 1; + req->parms.mcast_reprobes = mcast_reprobes; +} +static inline void +rt_neigh_setneightbl_req_set_parms_interval_probe_time_ms(struct rt_neigh_setneightbl_req *req, + __u64 interval_probe_time_ms) +{ + req->_present.parms = 1; + req->parms._present.interval_probe_time_ms = 1; + req->parms.interval_probe_time_ms = interval_probe_time_ms; +} +static inline void +rt_neigh_setneightbl_req_set_gc_interval(struct rt_neigh_setneightbl_req *req, + __u64 gc_interval) +{ + req->_present.gc_interval = 1; + req->gc_interval = gc_interval; +} + +/* + * Set neighbour tables + */ +int rt_neigh_setneightbl(struct ynl_sock *ys, + struct rt_neigh_setneightbl_req *req); + +#endif /* _LINUX_RT_NEIGH_GEN_H */ diff --git a/home/nipa/nipa_out/963409/ynl/new-code/rt-rule-user.c b/home/nipa/nipa_out/963409/ynl/new-code/rt-rule-user.c new file mode 100644 index 000000000000..c44ac5cb1846 --- /dev/null +++ b/home/nipa/nipa_out/963409/ynl/new-code/rt-rule-user.c @@ -0,0 +1,515 @@ +// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) +/* Do not edit directly, auto-generated from: */ +/* Documentation/netlink/specs/rt-rule.yaml */ +/* YNL-GEN user source */ + +#include +#include +#include "rt-rule-user.h" +#include "ynl.h" +#include + +#include + +/* Enums */ +static const char * const rt_rule_op_strmap[] = { + // skip "newrule-ntf", duplicate reply value + [33] = "delrule-ntf", + [32] = "getrule", +}; + +const char *rt_rule_op_str(int op) +{ + if (op < 0 || op >= (int)YNL_ARRAY_SIZE(rt_rule_op_strmap)) + return NULL; + return rt_rule_op_strmap[op]; +} + +static const char * const rt_rule_fr_act_strmap[] = { + [0] = "unspec", + [1] = "to-tbl", + [2] = "goto", + [3] = "nop", + [4] = "res3", + [5] = "res4", + [6] = "blackhole", + [7] = "unreachable", + [8] = "prohibit", +}; + +const char *rt_rule_fr_act_str(int value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(rt_rule_fr_act_strmap)) + return NULL; + return rt_rule_fr_act_strmap[value]; +} + +/* Policies */ +const struct ynl_policy_attr rt_rule_fib_rule_attrs_policy[FRA_MAX + 1] = { + [FRA_DST] = { .name = "dst", .type = YNL_PT_U32, }, + [FRA_SRC] = { .name = "src", .type = YNL_PT_U32, }, + [FRA_IIFNAME] = { .name = "iifname", .type = YNL_PT_NUL_STR, }, + [FRA_GOTO] = { .name = "goto", .type = YNL_PT_U32, }, + [FRA_UNUSED2] = { .name = "unused2", .type = YNL_PT_IGNORE, }, + [FRA_PRIORITY] = { .name = "priority", .type = YNL_PT_U32, }, + [FRA_UNUSED3] = { .name = "unused3", .type = YNL_PT_IGNORE, }, + [FRA_UNUSED4] = { .name = "unused4", .type = YNL_PT_IGNORE, }, + [FRA_UNUSED5] = { .name = "unused5", .type = YNL_PT_IGNORE, }, + [FRA_FWMARK] = { .name = "fwmark", .type = YNL_PT_U32, }, + [FRA_FLOW] = { .name = "flow", .type = YNL_PT_U32, }, + [FRA_TUN_ID] = { .name = "tun-id", .type = YNL_PT_U64, }, + [FRA_SUPPRESS_IFGROUP] = { .name = "suppress-ifgroup", .type = YNL_PT_U32, }, + [FRA_SUPPRESS_PREFIXLEN] = { .name = "suppress-prefixlen", .type = YNL_PT_U32, }, + [FRA_TABLE] = { .name = "table", .type = YNL_PT_U32, }, + [FRA_FWMASK] = { .name = "fwmask", .type = YNL_PT_U32, }, + [FRA_OIFNAME] = { .name = "oifname", .type = YNL_PT_NUL_STR, }, + [FRA_PAD] = { .name = "pad", .type = YNL_PT_IGNORE, }, + [FRA_L3MDEV] = { .name = "l3mdev", .type = YNL_PT_U8, }, + [FRA_UID_RANGE] = { .name = "uid-range", .type = YNL_PT_BINARY,}, + [FRA_PROTOCOL] = { .name = "protocol", .type = YNL_PT_U8, }, + [FRA_IP_PROTO] = { .name = "ip-proto", .type = YNL_PT_U8, }, + [FRA_SPORT_RANGE] = { .name = "sport-range", .type = YNL_PT_BINARY,}, + [FRA_DPORT_RANGE] = { .name = "dport-range", .type = YNL_PT_BINARY,}, + [FRA_DSCP] = { .name = "dscp", .type = YNL_PT_U8, }, + [FRA_FLOWLABEL] = { .name = "flowlabel", .type = YNL_PT_U32, }, + [FRA_FLOWLABEL_MASK] = { .name = "flowlabel-mask", .type = YNL_PT_U32, }, + [FRA_SPORT_MASK] = { .name = "sport-mask", .type = YNL_PT_U16, }, + [FRA_DPORT_MASK] = { .name = "dport-mask", .type = YNL_PT_U16, }, + [FRA_DSCP_MASK] = { .name = "dscp-mask", .type = YNL_PT_U8, }, +}; + +const struct ynl_policy_nest rt_rule_fib_rule_attrs_nest = { + .max_attr = FRA_MAX, + .table = rt_rule_fib_rule_attrs_policy, +}; + +/* Common nested types */ +/* ============== RTM_NEWRULE ============== */ +/* RTM_NEWRULE - do */ +void rt_rule_newrule_req_free(struct rt_rule_newrule_req *req) +{ + free(req->iifname); + free(req->oifname); + free(req->uid_range); + free(req->sport_range); + free(req->dport_range); + free(req); +} + +int rt_rule_newrule(struct ynl_sock *ys, struct rt_rule_newrule_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_msg_start_req(ys, RTM_NEWRULE, req->_nlmsg_flags); + ys->req_policy = &rt_rule_fib_rule_attrs_nest; + ys->req_hdr_len = ys->family->hdr_len; + + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + if (req->_len.iifname) + ynl_attr_put_str(nlh, FRA_IIFNAME, req->iifname); + if (req->_len.oifname) + ynl_attr_put_str(nlh, FRA_OIFNAME, req->oifname); + if (req->_present.priority) + ynl_attr_put_u32(nlh, FRA_PRIORITY, req->priority); + if (req->_present.fwmark) + ynl_attr_put_u32(nlh, FRA_FWMARK, req->fwmark); + if (req->_present.flow) + ynl_attr_put_u32(nlh, FRA_FLOW, req->flow); + if (req->_present.tun_id) + ynl_attr_put_u64(nlh, FRA_TUN_ID, req->tun_id); + if (req->_present.fwmask) + ynl_attr_put_u32(nlh, FRA_FWMASK, req->fwmask); + if (req->_present.table) + ynl_attr_put_u32(nlh, FRA_TABLE, req->table); + if (req->_present.suppress_prefixlen) + ynl_attr_put_u32(nlh, FRA_SUPPRESS_PREFIXLEN, req->suppress_prefixlen); + if (req->_present.suppress_ifgroup) + ynl_attr_put_u32(nlh, FRA_SUPPRESS_IFGROUP, req->suppress_ifgroup); + if (req->_present.goto_) + ynl_attr_put_u32(nlh, FRA_GOTO, req->goto_); + if (req->_present.l3mdev) + ynl_attr_put_u8(nlh, FRA_L3MDEV, req->l3mdev); + if (req->_len.uid_range) + ynl_attr_put(nlh, FRA_UID_RANGE, req->uid_range, req->_len.uid_range); + if (req->_present.protocol) + ynl_attr_put_u8(nlh, FRA_PROTOCOL, req->protocol); + if (req->_present.ip_proto) + ynl_attr_put_u8(nlh, FRA_IP_PROTO, req->ip_proto); + if (req->_len.sport_range) + ynl_attr_put(nlh, FRA_SPORT_RANGE, req->sport_range, req->_len.sport_range); + if (req->_len.dport_range) + ynl_attr_put(nlh, FRA_DPORT_RANGE, req->dport_range, req->_len.dport_range); + if (req->_present.dscp) + ynl_attr_put_u8(nlh, FRA_DSCP, req->dscp); + if (req->_present.flowlabel) + ynl_attr_put_u32(nlh, FRA_FLOWLABEL, req->flowlabel); + if (req->_present.flowlabel_mask) + ynl_attr_put_u32(nlh, FRA_FLOWLABEL_MASK, req->flowlabel_mask); + if (req->_present.sport_mask) + ynl_attr_put_u16(nlh, FRA_SPORT_MASK, req->sport_mask); + if (req->_present.dport_mask) + ynl_attr_put_u16(nlh, FRA_DPORT_MASK, req->dport_mask); + if (req->_present.dscp_mask) + ynl_attr_put_u8(nlh, FRA_DSCP_MASK, req->dscp_mask); + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + return -1; + + return 0; +} + +/* ============== RTM_DELRULE ============== */ +/* RTM_DELRULE - do */ +void rt_rule_delrule_req_free(struct rt_rule_delrule_req *req) +{ + free(req->iifname); + free(req->oifname); + free(req->uid_range); + free(req->sport_range); + free(req->dport_range); + free(req); +} + +int rt_rule_delrule(struct ynl_sock *ys, struct rt_rule_delrule_req *req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_msg_start_req(ys, RTM_DELRULE, req->_nlmsg_flags); + ys->req_policy = &rt_rule_fib_rule_attrs_nest; + ys->req_hdr_len = ys->family->hdr_len; + + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + if (req->_len.iifname) + ynl_attr_put_str(nlh, FRA_IIFNAME, req->iifname); + if (req->_len.oifname) + ynl_attr_put_str(nlh, FRA_OIFNAME, req->oifname); + if (req->_present.priority) + ynl_attr_put_u32(nlh, FRA_PRIORITY, req->priority); + if (req->_present.fwmark) + ynl_attr_put_u32(nlh, FRA_FWMARK, req->fwmark); + if (req->_present.flow) + ynl_attr_put_u32(nlh, FRA_FLOW, req->flow); + if (req->_present.tun_id) + ynl_attr_put_u64(nlh, FRA_TUN_ID, req->tun_id); + if (req->_present.fwmask) + ynl_attr_put_u32(nlh, FRA_FWMASK, req->fwmask); + if (req->_present.table) + ynl_attr_put_u32(nlh, FRA_TABLE, req->table); + if (req->_present.suppress_prefixlen) + ynl_attr_put_u32(nlh, FRA_SUPPRESS_PREFIXLEN, req->suppress_prefixlen); + if (req->_present.suppress_ifgroup) + ynl_attr_put_u32(nlh, FRA_SUPPRESS_IFGROUP, req->suppress_ifgroup); + if (req->_present.goto_) + ynl_attr_put_u32(nlh, FRA_GOTO, req->goto_); + if (req->_present.l3mdev) + ynl_attr_put_u8(nlh, FRA_L3MDEV, req->l3mdev); + if (req->_len.uid_range) + ynl_attr_put(nlh, FRA_UID_RANGE, req->uid_range, req->_len.uid_range); + if (req->_present.protocol) + ynl_attr_put_u8(nlh, FRA_PROTOCOL, req->protocol); + if (req->_present.ip_proto) + ynl_attr_put_u8(nlh, FRA_IP_PROTO, req->ip_proto); + if (req->_len.sport_range) + ynl_attr_put(nlh, FRA_SPORT_RANGE, req->sport_range, req->_len.sport_range); + if (req->_len.dport_range) + ynl_attr_put(nlh, FRA_DPORT_RANGE, req->dport_range, req->_len.dport_range); + if (req->_present.dscp) + ynl_attr_put_u8(nlh, FRA_DSCP, req->dscp); + if (req->_present.flowlabel) + ynl_attr_put_u32(nlh, FRA_FLOWLABEL, req->flowlabel); + if (req->_present.flowlabel_mask) + ynl_attr_put_u32(nlh, FRA_FLOWLABEL_MASK, req->flowlabel_mask); + if (req->_present.sport_mask) + ynl_attr_put_u16(nlh, FRA_SPORT_MASK, req->sport_mask); + if (req->_present.dport_mask) + ynl_attr_put_u16(nlh, FRA_DPORT_MASK, req->dport_mask); + if (req->_present.dscp_mask) + ynl_attr_put_u8(nlh, FRA_DSCP_MASK, req->dscp_mask); + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) + return -1; + + return 0; +} + +/* ============== RTM_GETRULE ============== */ +/* RTM_GETRULE - dump */ +int rt_rule_getrule_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + struct rt_rule_getrule_rsp *dst; + const struct nlattr *attr; + void *hdr; + + dst = yarg->data; + + hdr = ynl_nlmsg_data(nlh); + memcpy(&dst->_hdr, hdr, sizeof(struct fib_rule_hdr)); + + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + unsigned int type = ynl_attr_type(attr); + + if (type == FRA_IIFNAME) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.iifname = len; + dst->iifname = malloc(len + 1); + memcpy(dst->iifname, ynl_attr_get_str(attr), len); + dst->iifname[len] = 0; + } else if (type == FRA_OIFNAME) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = strnlen(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + dst->_len.oifname = len; + dst->oifname = malloc(len + 1); + memcpy(dst->oifname, ynl_attr_get_str(attr), len); + dst->oifname[len] = 0; + } else if (type == FRA_PRIORITY) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.priority = 1; + dst->priority = ynl_attr_get_u32(attr); + } else if (type == FRA_FWMARK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fwmark = 1; + dst->fwmark = ynl_attr_get_u32(attr); + } else if (type == FRA_FLOW) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flow = 1; + dst->flow = ynl_attr_get_u32(attr); + } else if (type == FRA_TUN_ID) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.tun_id = 1; + dst->tun_id = ynl_attr_get_u64(attr); + } else if (type == FRA_FWMASK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.fwmask = 1; + dst->fwmask = ynl_attr_get_u32(attr); + } else if (type == FRA_TABLE) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.table = 1; + dst->table = ynl_attr_get_u32(attr); + } else if (type == FRA_SUPPRESS_PREFIXLEN) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.suppress_prefixlen = 1; + dst->suppress_prefixlen = ynl_attr_get_u32(attr); + } else if (type == FRA_SUPPRESS_IFGROUP) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.suppress_ifgroup = 1; + dst->suppress_ifgroup = ynl_attr_get_u32(attr); + } else if (type == FRA_GOTO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.goto_ = 1; + dst->goto_ = ynl_attr_get_u32(attr); + } else if (type == FRA_L3MDEV) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.l3mdev = 1; + dst->l3mdev = ynl_attr_get_u8(attr); + } else if (type == FRA_UID_RANGE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.uid_range = len; + if (len < sizeof(struct fib_rule_uid_range)) + dst->uid_range = calloc(1, sizeof(struct fib_rule_uid_range)); + else + dst->uid_range = malloc(len); + memcpy(dst->uid_range, ynl_attr_data(attr), len); + } else if (type == FRA_PROTOCOL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.protocol = 1; + dst->protocol = ynl_attr_get_u8(attr); + } else if (type == FRA_IP_PROTO) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.ip_proto = 1; + dst->ip_proto = ynl_attr_get_u8(attr); + } else if (type == FRA_SPORT_RANGE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.sport_range = len; + if (len < sizeof(struct fib_rule_port_range)) + dst->sport_range = calloc(1, sizeof(struct fib_rule_port_range)); + else + dst->sport_range = malloc(len); + memcpy(dst->sport_range, ynl_attr_data(attr), len); + } else if (type == FRA_DPORT_RANGE) { + unsigned int len; + + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + + len = ynl_attr_data_len(attr); + dst->_len.dport_range = len; + if (len < sizeof(struct fib_rule_port_range)) + dst->dport_range = calloc(1, sizeof(struct fib_rule_port_range)); + else + dst->dport_range = malloc(len); + memcpy(dst->dport_range, ynl_attr_data(attr), len); + } else if (type == FRA_DSCP) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.dscp = 1; + dst->dscp = ynl_attr_get_u8(attr); + } else if (type == FRA_FLOWLABEL) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flowlabel = 1; + dst->flowlabel = ynl_attr_get_u32(attr); + } else if (type == FRA_FLOWLABEL_MASK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.flowlabel_mask = 1; + dst->flowlabel_mask = ynl_attr_get_u32(attr); + } else if (type == FRA_SPORT_MASK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.sport_mask = 1; + dst->sport_mask = ynl_attr_get_u16(attr); + } else if (type == FRA_DPORT_MASK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.dport_mask = 1; + dst->dport_mask = ynl_attr_get_u16(attr); + } else if (type == FRA_DSCP_MASK) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.dscp_mask = 1; + dst->dscp_mask = ynl_attr_get_u8(attr); + } + } + + return YNL_PARSE_CB_OK; +} + +void rt_rule_getrule_req_free(struct rt_rule_getrule_req *req) +{ + free(req); +} + +void rt_rule_getrule_list_free(struct rt_rule_getrule_list *rsp) +{ + struct rt_rule_getrule_list *next = rsp; + + while ((void *)next != YNL_LIST_END) { + rsp = next; + next = rsp->next; + + free(rsp->obj.iifname); + free(rsp->obj.oifname); + free(rsp->obj.uid_range); + free(rsp->obj.sport_range); + free(rsp->obj.dport_range); + free(rsp); + } +} + +struct rt_rule_getrule_list * +rt_rule_getrule_dump(struct ynl_sock *ys, struct rt_rule_getrule_req *req) +{ + struct ynl_dump_state yds = {}; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &rt_rule_fib_rule_attrs_nest; + yds.yarg.data = NULL; + yds.alloc_sz = sizeof(struct rt_rule_getrule_list); + yds.cb = rt_rule_getrule_rsp_parse; + yds.rsp_cmd = 32; + + nlh = ynl_msg_start_dump(ys, RTM_GETRULE); + hdr_len = sizeof(req->_hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req->_hdr, hdr_len); + + ys->req_policy = &rt_rule_fib_rule_attrs_nest; + ys->req_hdr_len = ys->family->hdr_len; + + err = ynl_exec_dump(ys, nlh, &yds); + if (err < 0) + goto free_list; + + return yds.first; + +free_list: + rt_rule_getrule_list_free(yds.first); + return NULL; +} + +/* RTM_GETRULE - notify */ +void rt_rule_getrule_ntf_free(struct rt_rule_getrule_ntf *rsp) +{ + free(rsp->obj.iifname); + free(rsp->obj.oifname); + free(rsp->obj.uid_range); + free(rsp->obj.sport_range); + free(rsp->obj.dport_range); + free(rsp); +} + +static const struct ynl_ntf_info rt_rule_ntf_info[] = { + [RTM_NEWRULE] = { + .alloc_sz = sizeof(struct rt_rule_getrule_ntf), + .cb = rt_rule_getrule_rsp_parse, + .policy = &rt_rule_fib_rule_attrs_nest, + .free = (void *)rt_rule_getrule_ntf_free, + }, + [RTM_DELRULE] = { + .alloc_sz = sizeof(struct rt_rule_getrule_ntf), + .cb = rt_rule_getrule_rsp_parse, + .policy = &rt_rule_fib_rule_attrs_nest, + .free = (void *)rt_rule_getrule_ntf_free, + }, +}; + +const struct ynl_family ynl_rt_rule_family = { + .name = "rt_rule", + .is_classic = true, + .classic_id = 0, + .hdr_len = sizeof(struct fib_rule_hdr), + .ntf_info = rt_rule_ntf_info, + .ntf_info_size = YNL_ARRAY_SIZE(rt_rule_ntf_info), +}; diff --git a/home/nipa/nipa_out/963409/ynl/new-code/rt-rule-user.h b/home/nipa/nipa_out/963409/ynl/new-code/rt-rule-user.h new file mode 100644 index 000000000000..e490acc4ffde --- /dev/null +++ b/home/nipa/nipa_out/963409/ynl/new-code/rt-rule-user.h @@ -0,0 +1,600 @@ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* Do not edit directly, auto-generated from: */ +/* Documentation/netlink/specs/rt-rule.yaml */ +/* YNL-GEN user header */ + +#ifndef _LINUX_RT_RULE_GEN_H +#define _LINUX_RT_RULE_GEN_H + +#include +#include +#include +#include + +struct ynl_sock; + +extern const struct ynl_family ynl_rt_rule_family; + +/* Enums */ +const char *rt_rule_op_str(int op); +const char *rt_rule_fr_act_str(int value); + +/* Common nested types */ +/* ============== RTM_NEWRULE ============== */ +/* RTM_NEWRULE - do */ +struct rt_rule_newrule_req { + __u16 _nlmsg_flags; + + struct fib_rule_hdr _hdr; + + struct { + __u32 priority:1; + __u32 fwmark:1; + __u32 flow:1; + __u32 tun_id:1; + __u32 fwmask:1; + __u32 table:1; + __u32 suppress_prefixlen:1; + __u32 suppress_ifgroup:1; + __u32 goto_:1; + __u32 l3mdev:1; + __u32 protocol:1; + __u32 ip_proto:1; + __u32 dscp:1; + __u32 flowlabel:1; + __u32 flowlabel_mask:1; + __u32 sport_mask:1; + __u32 dport_mask:1; + __u32 dscp_mask:1; + } _present; + struct { + __u32 iifname; + __u32 oifname; + __u32 uid_range; + __u32 sport_range; + __u32 dport_range; + } _len; + + char *iifname; + char *oifname; + __u32 priority; + __u32 fwmark; + __u32 flow; + __u64 tun_id; + __u32 fwmask; + __u32 table; + __u32 suppress_prefixlen; + __u32 suppress_ifgroup; + __u32 goto_; + __u8 l3mdev; + struct fib_rule_uid_range *uid_range; + __u8 protocol; + __u8 ip_proto; + struct fib_rule_port_range *sport_range; + struct fib_rule_port_range *dport_range; + __u8 dscp; + __u32 flowlabel /* big-endian */; + __u32 flowlabel_mask /* big-endian */; + __u16 sport_mask; + __u16 dport_mask; + __u8 dscp_mask; +}; + +static inline struct rt_rule_newrule_req *rt_rule_newrule_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_rule_newrule_req)); +} +void rt_rule_newrule_req_free(struct rt_rule_newrule_req *req); + +static inline void +rt_rule_newrule_req_set_nlflags(struct rt_rule_newrule_req *req, + __u16 nl_flags) +{ + req->_nlmsg_flags = nl_flags; +} + +static inline void +rt_rule_newrule_req_set_iifname(struct rt_rule_newrule_req *req, + const char *iifname) +{ + free(req->iifname); + req->_len.iifname = strlen(iifname); + req->iifname = malloc(req->_len.iifname + 1); + memcpy(req->iifname, iifname, req->_len.iifname); + req->iifname[req->_len.iifname] = 0; +} +static inline void +rt_rule_newrule_req_set_oifname(struct rt_rule_newrule_req *req, + const char *oifname) +{ + free(req->oifname); + req->_len.oifname = strlen(oifname); + req->oifname = malloc(req->_len.oifname + 1); + memcpy(req->oifname, oifname, req->_len.oifname); + req->oifname[req->_len.oifname] = 0; +} +static inline void +rt_rule_newrule_req_set_priority(struct rt_rule_newrule_req *req, + __u32 priority) +{ + req->_present.priority = 1; + req->priority = priority; +} +static inline void +rt_rule_newrule_req_set_fwmark(struct rt_rule_newrule_req *req, __u32 fwmark) +{ + req->_present.fwmark = 1; + req->fwmark = fwmark; +} +static inline void +rt_rule_newrule_req_set_flow(struct rt_rule_newrule_req *req, __u32 flow) +{ + req->_present.flow = 1; + req->flow = flow; +} +static inline void +rt_rule_newrule_req_set_tun_id(struct rt_rule_newrule_req *req, __u64 tun_id) +{ + req->_present.tun_id = 1; + req->tun_id = tun_id; +} +static inline void +rt_rule_newrule_req_set_fwmask(struct rt_rule_newrule_req *req, __u32 fwmask) +{ + req->_present.fwmask = 1; + req->fwmask = fwmask; +} +static inline void +rt_rule_newrule_req_set_table(struct rt_rule_newrule_req *req, __u32 table) +{ + req->_present.table = 1; + req->table = table; +} +static inline void +rt_rule_newrule_req_set_suppress_prefixlen(struct rt_rule_newrule_req *req, + __u32 suppress_prefixlen) +{ + req->_present.suppress_prefixlen = 1; + req->suppress_prefixlen = suppress_prefixlen; +} +static inline void +rt_rule_newrule_req_set_suppress_ifgroup(struct rt_rule_newrule_req *req, + __u32 suppress_ifgroup) +{ + req->_present.suppress_ifgroup = 1; + req->suppress_ifgroup = suppress_ifgroup; +} +static inline void +rt_rule_newrule_req_set_goto_(struct rt_rule_newrule_req *req, __u32 goto_) +{ + req->_present.goto_ = 1; + req->goto_ = goto_; +} +static inline void +rt_rule_newrule_req_set_l3mdev(struct rt_rule_newrule_req *req, __u8 l3mdev) +{ + req->_present.l3mdev = 1; + req->l3mdev = l3mdev; +} +static inline void +rt_rule_newrule_req_set_uid_range(struct rt_rule_newrule_req *req, + const void *uid_range, size_t len) +{ + free(req->uid_range); + req->_len.uid_range = len; + req->uid_range = malloc(req->_len.uid_range); + memcpy(req->uid_range, uid_range, req->_len.uid_range); +} +static inline void +rt_rule_newrule_req_set_protocol(struct rt_rule_newrule_req *req, + __u8 protocol) +{ + req->_present.protocol = 1; + req->protocol = protocol; +} +static inline void +rt_rule_newrule_req_set_ip_proto(struct rt_rule_newrule_req *req, + __u8 ip_proto) +{ + req->_present.ip_proto = 1; + req->ip_proto = ip_proto; +} +static inline void +rt_rule_newrule_req_set_sport_range(struct rt_rule_newrule_req *req, + const void *sport_range, size_t len) +{ + free(req->sport_range); + req->_len.sport_range = len; + req->sport_range = malloc(req->_len.sport_range); + memcpy(req->sport_range, sport_range, req->_len.sport_range); +} +static inline void +rt_rule_newrule_req_set_dport_range(struct rt_rule_newrule_req *req, + const void *dport_range, size_t len) +{ + free(req->dport_range); + req->_len.dport_range = len; + req->dport_range = malloc(req->_len.dport_range); + memcpy(req->dport_range, dport_range, req->_len.dport_range); +} +static inline void +rt_rule_newrule_req_set_dscp(struct rt_rule_newrule_req *req, __u8 dscp) +{ + req->_present.dscp = 1; + req->dscp = dscp; +} +static inline void +rt_rule_newrule_req_set_flowlabel(struct rt_rule_newrule_req *req, + __u32 flowlabel /* big-endian */) +{ + req->_present.flowlabel = 1; + req->flowlabel = flowlabel; +} +static inline void +rt_rule_newrule_req_set_flowlabel_mask(struct rt_rule_newrule_req *req, + __u32 flowlabel_mask /* big-endian */) +{ + req->_present.flowlabel_mask = 1; + req->flowlabel_mask = flowlabel_mask; +} +static inline void +rt_rule_newrule_req_set_sport_mask(struct rt_rule_newrule_req *req, + __u16 sport_mask) +{ + req->_present.sport_mask = 1; + req->sport_mask = sport_mask; +} +static inline void +rt_rule_newrule_req_set_dport_mask(struct rt_rule_newrule_req *req, + __u16 dport_mask) +{ + req->_present.dport_mask = 1; + req->dport_mask = dport_mask; +} +static inline void +rt_rule_newrule_req_set_dscp_mask(struct rt_rule_newrule_req *req, + __u8 dscp_mask) +{ + req->_present.dscp_mask = 1; + req->dscp_mask = dscp_mask; +} + +/* + * Add new FIB rule + */ +int rt_rule_newrule(struct ynl_sock *ys, struct rt_rule_newrule_req *req); + +/* ============== RTM_DELRULE ============== */ +/* RTM_DELRULE - do */ +struct rt_rule_delrule_req { + __u16 _nlmsg_flags; + + struct fib_rule_hdr _hdr; + + struct { + __u32 priority:1; + __u32 fwmark:1; + __u32 flow:1; + __u32 tun_id:1; + __u32 fwmask:1; + __u32 table:1; + __u32 suppress_prefixlen:1; + __u32 suppress_ifgroup:1; + __u32 goto_:1; + __u32 l3mdev:1; + __u32 protocol:1; + __u32 ip_proto:1; + __u32 dscp:1; + __u32 flowlabel:1; + __u32 flowlabel_mask:1; + __u32 sport_mask:1; + __u32 dport_mask:1; + __u32 dscp_mask:1; + } _present; + struct { + __u32 iifname; + __u32 oifname; + __u32 uid_range; + __u32 sport_range; + __u32 dport_range; + } _len; + + char *iifname; + char *oifname; + __u32 priority; + __u32 fwmark; + __u32 flow; + __u64 tun_id; + __u32 fwmask; + __u32 table; + __u32 suppress_prefixlen; + __u32 suppress_ifgroup; + __u32 goto_; + __u8 l3mdev; + struct fib_rule_uid_range *uid_range; + __u8 protocol; + __u8 ip_proto; + struct fib_rule_port_range *sport_range; + struct fib_rule_port_range *dport_range; + __u8 dscp; + __u32 flowlabel /* big-endian */; + __u32 flowlabel_mask /* big-endian */; + __u16 sport_mask; + __u16 dport_mask; + __u8 dscp_mask; +}; + +static inline struct rt_rule_delrule_req *rt_rule_delrule_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_rule_delrule_req)); +} +void rt_rule_delrule_req_free(struct rt_rule_delrule_req *req); + +static inline void +rt_rule_delrule_req_set_nlflags(struct rt_rule_delrule_req *req, + __u16 nl_flags) +{ + req->_nlmsg_flags = nl_flags; +} + +static inline void +rt_rule_delrule_req_set_iifname(struct rt_rule_delrule_req *req, + const char *iifname) +{ + free(req->iifname); + req->_len.iifname = strlen(iifname); + req->iifname = malloc(req->_len.iifname + 1); + memcpy(req->iifname, iifname, req->_len.iifname); + req->iifname[req->_len.iifname] = 0; +} +static inline void +rt_rule_delrule_req_set_oifname(struct rt_rule_delrule_req *req, + const char *oifname) +{ + free(req->oifname); + req->_len.oifname = strlen(oifname); + req->oifname = malloc(req->_len.oifname + 1); + memcpy(req->oifname, oifname, req->_len.oifname); + req->oifname[req->_len.oifname] = 0; +} +static inline void +rt_rule_delrule_req_set_priority(struct rt_rule_delrule_req *req, + __u32 priority) +{ + req->_present.priority = 1; + req->priority = priority; +} +static inline void +rt_rule_delrule_req_set_fwmark(struct rt_rule_delrule_req *req, __u32 fwmark) +{ + req->_present.fwmark = 1; + req->fwmark = fwmark; +} +static inline void +rt_rule_delrule_req_set_flow(struct rt_rule_delrule_req *req, __u32 flow) +{ + req->_present.flow = 1; + req->flow = flow; +} +static inline void +rt_rule_delrule_req_set_tun_id(struct rt_rule_delrule_req *req, __u64 tun_id) +{ + req->_present.tun_id = 1; + req->tun_id = tun_id; +} +static inline void +rt_rule_delrule_req_set_fwmask(struct rt_rule_delrule_req *req, __u32 fwmask) +{ + req->_present.fwmask = 1; + req->fwmask = fwmask; +} +static inline void +rt_rule_delrule_req_set_table(struct rt_rule_delrule_req *req, __u32 table) +{ + req->_present.table = 1; + req->table = table; +} +static inline void +rt_rule_delrule_req_set_suppress_prefixlen(struct rt_rule_delrule_req *req, + __u32 suppress_prefixlen) +{ + req->_present.suppress_prefixlen = 1; + req->suppress_prefixlen = suppress_prefixlen; +} +static inline void +rt_rule_delrule_req_set_suppress_ifgroup(struct rt_rule_delrule_req *req, + __u32 suppress_ifgroup) +{ + req->_present.suppress_ifgroup = 1; + req->suppress_ifgroup = suppress_ifgroup; +} +static inline void +rt_rule_delrule_req_set_goto_(struct rt_rule_delrule_req *req, __u32 goto_) +{ + req->_present.goto_ = 1; + req->goto_ = goto_; +} +static inline void +rt_rule_delrule_req_set_l3mdev(struct rt_rule_delrule_req *req, __u8 l3mdev) +{ + req->_present.l3mdev = 1; + req->l3mdev = l3mdev; +} +static inline void +rt_rule_delrule_req_set_uid_range(struct rt_rule_delrule_req *req, + const void *uid_range, size_t len) +{ + free(req->uid_range); + req->_len.uid_range = len; + req->uid_range = malloc(req->_len.uid_range); + memcpy(req->uid_range, uid_range, req->_len.uid_range); +} +static inline void +rt_rule_delrule_req_set_protocol(struct rt_rule_delrule_req *req, + __u8 protocol) +{ + req->_present.protocol = 1; + req->protocol = protocol; +} +static inline void +rt_rule_delrule_req_set_ip_proto(struct rt_rule_delrule_req *req, + __u8 ip_proto) +{ + req->_present.ip_proto = 1; + req->ip_proto = ip_proto; +} +static inline void +rt_rule_delrule_req_set_sport_range(struct rt_rule_delrule_req *req, + const void *sport_range, size_t len) +{ + free(req->sport_range); + req->_len.sport_range = len; + req->sport_range = malloc(req->_len.sport_range); + memcpy(req->sport_range, sport_range, req->_len.sport_range); +} +static inline void +rt_rule_delrule_req_set_dport_range(struct rt_rule_delrule_req *req, + const void *dport_range, size_t len) +{ + free(req->dport_range); + req->_len.dport_range = len; + req->dport_range = malloc(req->_len.dport_range); + memcpy(req->dport_range, dport_range, req->_len.dport_range); +} +static inline void +rt_rule_delrule_req_set_dscp(struct rt_rule_delrule_req *req, __u8 dscp) +{ + req->_present.dscp = 1; + req->dscp = dscp; +} +static inline void +rt_rule_delrule_req_set_flowlabel(struct rt_rule_delrule_req *req, + __u32 flowlabel /* big-endian */) +{ + req->_present.flowlabel = 1; + req->flowlabel = flowlabel; +} +static inline void +rt_rule_delrule_req_set_flowlabel_mask(struct rt_rule_delrule_req *req, + __u32 flowlabel_mask /* big-endian */) +{ + req->_present.flowlabel_mask = 1; + req->flowlabel_mask = flowlabel_mask; +} +static inline void +rt_rule_delrule_req_set_sport_mask(struct rt_rule_delrule_req *req, + __u16 sport_mask) +{ + req->_present.sport_mask = 1; + req->sport_mask = sport_mask; +} +static inline void +rt_rule_delrule_req_set_dport_mask(struct rt_rule_delrule_req *req, + __u16 dport_mask) +{ + req->_present.dport_mask = 1; + req->dport_mask = dport_mask; +} +static inline void +rt_rule_delrule_req_set_dscp_mask(struct rt_rule_delrule_req *req, + __u8 dscp_mask) +{ + req->_present.dscp_mask = 1; + req->dscp_mask = dscp_mask; +} + +/* + * Remove an existing FIB rule + */ +int rt_rule_delrule(struct ynl_sock *ys, struct rt_rule_delrule_req *req); + +/* ============== RTM_GETRULE ============== */ +/* RTM_GETRULE - dump */ +struct rt_rule_getrule_req { + struct fib_rule_hdr _hdr; +}; + +static inline struct rt_rule_getrule_req *rt_rule_getrule_req_alloc(void) +{ + return calloc(1, sizeof(struct rt_rule_getrule_req)); +} +void rt_rule_getrule_req_free(struct rt_rule_getrule_req *req); + +struct rt_rule_getrule_rsp { + struct fib_rule_hdr _hdr; + + struct { + __u32 priority:1; + __u32 fwmark:1; + __u32 flow:1; + __u32 tun_id:1; + __u32 fwmask:1; + __u32 table:1; + __u32 suppress_prefixlen:1; + __u32 suppress_ifgroup:1; + __u32 goto_:1; + __u32 l3mdev:1; + __u32 protocol:1; + __u32 ip_proto:1; + __u32 dscp:1; + __u32 flowlabel:1; + __u32 flowlabel_mask:1; + __u32 sport_mask:1; + __u32 dport_mask:1; + __u32 dscp_mask:1; + } _present; + struct { + __u32 iifname; + __u32 oifname; + __u32 uid_range; + __u32 sport_range; + __u32 dport_range; + } _len; + + char *iifname; + char *oifname; + __u32 priority; + __u32 fwmark; + __u32 flow; + __u64 tun_id; + __u32 fwmask; + __u32 table; + __u32 suppress_prefixlen; + __u32 suppress_ifgroup; + __u32 goto_; + __u8 l3mdev; + struct fib_rule_uid_range *uid_range; + __u8 protocol; + __u8 ip_proto; + struct fib_rule_port_range *sport_range; + struct fib_rule_port_range *dport_range; + __u8 dscp; + __u32 flowlabel /* big-endian */; + __u32 flowlabel_mask /* big-endian */; + __u16 sport_mask; + __u16 dport_mask; + __u8 dscp_mask; +}; + +struct rt_rule_getrule_list { + struct rt_rule_getrule_list *next; + struct rt_rule_getrule_rsp obj __attribute__((aligned(8))); +}; + +void rt_rule_getrule_list_free(struct rt_rule_getrule_list *rsp); + +struct rt_rule_getrule_list * +rt_rule_getrule_dump(struct ynl_sock *ys, struct rt_rule_getrule_req *req); + +/* RTM_GETRULE - notify */ +struct rt_rule_getrule_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type *next; + void (*free)(struct rt_rule_getrule_ntf *ntf); + struct rt_rule_getrule_rsp obj __attribute__((aligned(8))); +}; + +void rt_rule_getrule_ntf_free(struct rt_rule_getrule_ntf *rsp); + +#endif /* _LINUX_RT_RULE_GEN_H */