cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bond_netlink.c (24876B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * drivers/net/bond/bond_netlink.c - Netlink interface for bonding
      4 * Copyright (c) 2013 Jiri Pirko <jiri@resnulli.us>
      5 * Copyright (c) 2013 Scott Feldman <sfeldma@cumulusnetworks.com>
      6 */
      7
      8#include <linux/module.h>
      9#include <linux/errno.h>
     10#include <linux/netdevice.h>
     11#include <linux/etherdevice.h>
     12#include <linux/if_link.h>
     13#include <linux/if_ether.h>
     14#include <net/netlink.h>
     15#include <net/rtnetlink.h>
     16#include <net/bonding.h>
     17#include <net/ipv6.h>
     18
     19static size_t bond_get_slave_size(const struct net_device *bond_dev,
     20				  const struct net_device *slave_dev)
     21{
     22	return nla_total_size(sizeof(u8)) +	/* IFLA_BOND_SLAVE_STATE */
     23		nla_total_size(sizeof(u8)) +	/* IFLA_BOND_SLAVE_MII_STATUS */
     24		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_SLAVE_LINK_FAILURE_COUNT */
     25		nla_total_size(MAX_ADDR_LEN) +	/* IFLA_BOND_SLAVE_PERM_HWADDR */
     26		nla_total_size(sizeof(u16)) +	/* IFLA_BOND_SLAVE_QUEUE_ID */
     27		nla_total_size(sizeof(u16)) +	/* IFLA_BOND_SLAVE_AD_AGGREGATOR_ID */
     28		nla_total_size(sizeof(u8)) +	/* IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE */
     29		nla_total_size(sizeof(u16)) +	/* IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE */
     30		0;
     31}
     32
     33static int bond_fill_slave_info(struct sk_buff *skb,
     34				const struct net_device *bond_dev,
     35				const struct net_device *slave_dev)
     36{
     37	struct slave *slave = bond_slave_get_rtnl(slave_dev);
     38
     39	if (nla_put_u8(skb, IFLA_BOND_SLAVE_STATE, bond_slave_state(slave)))
     40		goto nla_put_failure;
     41
     42	if (nla_put_u8(skb, IFLA_BOND_SLAVE_MII_STATUS, slave->link))
     43		goto nla_put_failure;
     44
     45	if (nla_put_u32(skb, IFLA_BOND_SLAVE_LINK_FAILURE_COUNT,
     46			slave->link_failure_count))
     47		goto nla_put_failure;
     48
     49	if (nla_put(skb, IFLA_BOND_SLAVE_PERM_HWADDR,
     50		    slave_dev->addr_len, slave->perm_hwaddr))
     51		goto nla_put_failure;
     52
     53	if (nla_put_u16(skb, IFLA_BOND_SLAVE_QUEUE_ID, slave->queue_id))
     54		goto nla_put_failure;
     55
     56	if (BOND_MODE(slave->bond) == BOND_MODE_8023AD) {
     57		const struct aggregator *agg;
     58		const struct port *ad_port;
     59
     60		ad_port = &SLAVE_AD_INFO(slave)->port;
     61		agg = SLAVE_AD_INFO(slave)->port.aggregator;
     62		if (agg) {
     63			if (nla_put_u16(skb, IFLA_BOND_SLAVE_AD_AGGREGATOR_ID,
     64					agg->aggregator_identifier))
     65				goto nla_put_failure;
     66			if (nla_put_u8(skb,
     67				       IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE,
     68				       ad_port->actor_oper_port_state))
     69				goto nla_put_failure;
     70			if (nla_put_u16(skb,
     71					IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE,
     72					ad_port->partner_oper.port_state))
     73				goto nla_put_failure;
     74		}
     75	}
     76
     77	return 0;
     78
     79nla_put_failure:
     80	return -EMSGSIZE;
     81}
     82
     83static const struct nla_policy bond_policy[IFLA_BOND_MAX + 1] = {
     84	[IFLA_BOND_MODE]		= { .type = NLA_U8 },
     85	[IFLA_BOND_ACTIVE_SLAVE]	= { .type = NLA_U32 },
     86	[IFLA_BOND_MIIMON]		= { .type = NLA_U32 },
     87	[IFLA_BOND_UPDELAY]		= { .type = NLA_U32 },
     88	[IFLA_BOND_DOWNDELAY]		= { .type = NLA_U32 },
     89	[IFLA_BOND_USE_CARRIER]		= { .type = NLA_U8 },
     90	[IFLA_BOND_ARP_INTERVAL]	= { .type = NLA_U32 },
     91	[IFLA_BOND_ARP_IP_TARGET]	= { .type = NLA_NESTED },
     92	[IFLA_BOND_ARP_VALIDATE]	= { .type = NLA_U32 },
     93	[IFLA_BOND_ARP_ALL_TARGETS]	= { .type = NLA_U32 },
     94	[IFLA_BOND_PRIMARY]		= { .type = NLA_U32 },
     95	[IFLA_BOND_PRIMARY_RESELECT]	= { .type = NLA_U8 },
     96	[IFLA_BOND_FAIL_OVER_MAC]	= { .type = NLA_U8 },
     97	[IFLA_BOND_XMIT_HASH_POLICY]	= { .type = NLA_U8 },
     98	[IFLA_BOND_RESEND_IGMP]		= { .type = NLA_U32 },
     99	[IFLA_BOND_NUM_PEER_NOTIF]	= { .type = NLA_U8 },
    100	[IFLA_BOND_ALL_SLAVES_ACTIVE]	= { .type = NLA_U8 },
    101	[IFLA_BOND_MIN_LINKS]		= { .type = NLA_U32 },
    102	[IFLA_BOND_LP_INTERVAL]		= { .type = NLA_U32 },
    103	[IFLA_BOND_PACKETS_PER_SLAVE]	= { .type = NLA_U32 },
    104	[IFLA_BOND_AD_LACP_ACTIVE]	= { .type = NLA_U8 },
    105	[IFLA_BOND_AD_LACP_RATE]	= { .type = NLA_U8 },
    106	[IFLA_BOND_AD_SELECT]		= { .type = NLA_U8 },
    107	[IFLA_BOND_AD_INFO]		= { .type = NLA_NESTED },
    108	[IFLA_BOND_AD_ACTOR_SYS_PRIO]	= { .type = NLA_U16 },
    109	[IFLA_BOND_AD_USER_PORT_KEY]	= { .type = NLA_U16 },
    110	[IFLA_BOND_AD_ACTOR_SYSTEM]	= { .type = NLA_BINARY,
    111					    .len  = ETH_ALEN },
    112	[IFLA_BOND_TLB_DYNAMIC_LB]	= { .type = NLA_U8 },
    113	[IFLA_BOND_PEER_NOTIF_DELAY]    = { .type = NLA_U32 },
    114	[IFLA_BOND_MISSED_MAX]		= { .type = NLA_U8 },
    115	[IFLA_BOND_NS_IP6_TARGET]	= { .type = NLA_NESTED },
    116};
    117
    118static const struct nla_policy bond_slave_policy[IFLA_BOND_SLAVE_MAX + 1] = {
    119	[IFLA_BOND_SLAVE_QUEUE_ID]	= { .type = NLA_U16 },
    120};
    121
    122static int bond_validate(struct nlattr *tb[], struct nlattr *data[],
    123			 struct netlink_ext_ack *extack)
    124{
    125	if (tb[IFLA_ADDRESS]) {
    126		if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
    127			return -EINVAL;
    128		if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS])))
    129			return -EADDRNOTAVAIL;
    130	}
    131	return 0;
    132}
    133
    134static int bond_slave_changelink(struct net_device *bond_dev,
    135				 struct net_device *slave_dev,
    136				 struct nlattr *tb[], struct nlattr *data[],
    137				 struct netlink_ext_ack *extack)
    138{
    139	struct bonding *bond = netdev_priv(bond_dev);
    140	struct bond_opt_value newval;
    141	int err;
    142
    143	if (!data)
    144		return 0;
    145
    146	if (data[IFLA_BOND_SLAVE_QUEUE_ID]) {
    147		u16 queue_id = nla_get_u16(data[IFLA_BOND_SLAVE_QUEUE_ID]);
    148		char queue_id_str[IFNAMSIZ + 7];
    149
    150		/* queue_id option setting expects slave_name:queue_id */
    151		snprintf(queue_id_str, sizeof(queue_id_str), "%s:%u\n",
    152			 slave_dev->name, queue_id);
    153		bond_opt_initstr(&newval, queue_id_str);
    154		err = __bond_opt_set(bond, BOND_OPT_QUEUE_ID, &newval);
    155		if (err)
    156			return err;
    157	}
    158
    159	return 0;
    160}
    161
    162static int bond_changelink(struct net_device *bond_dev, struct nlattr *tb[],
    163			   struct nlattr *data[],
    164			   struct netlink_ext_ack *extack)
    165{
    166	struct bonding *bond = netdev_priv(bond_dev);
    167	struct bond_opt_value newval;
    168	int miimon = 0;
    169	int err;
    170
    171	if (!data)
    172		return 0;
    173
    174	if (data[IFLA_BOND_MODE]) {
    175		int mode = nla_get_u8(data[IFLA_BOND_MODE]);
    176
    177		bond_opt_initval(&newval, mode);
    178		err = __bond_opt_set(bond, BOND_OPT_MODE, &newval);
    179		if (err)
    180			return err;
    181	}
    182	if (data[IFLA_BOND_ACTIVE_SLAVE]) {
    183		int ifindex = nla_get_u32(data[IFLA_BOND_ACTIVE_SLAVE]);
    184		struct net_device *slave_dev;
    185		char *active_slave = "";
    186
    187		if (ifindex != 0) {
    188			slave_dev = __dev_get_by_index(dev_net(bond_dev),
    189						       ifindex);
    190			if (!slave_dev)
    191				return -ENODEV;
    192			active_slave = slave_dev->name;
    193		}
    194		bond_opt_initstr(&newval, active_slave);
    195		err = __bond_opt_set(bond, BOND_OPT_ACTIVE_SLAVE, &newval);
    196		if (err)
    197			return err;
    198	}
    199	if (data[IFLA_BOND_MIIMON]) {
    200		miimon = nla_get_u32(data[IFLA_BOND_MIIMON]);
    201
    202		bond_opt_initval(&newval, miimon);
    203		err = __bond_opt_set(bond, BOND_OPT_MIIMON, &newval);
    204		if (err)
    205			return err;
    206	}
    207	if (data[IFLA_BOND_UPDELAY]) {
    208		int updelay = nla_get_u32(data[IFLA_BOND_UPDELAY]);
    209
    210		bond_opt_initval(&newval, updelay);
    211		err = __bond_opt_set(bond, BOND_OPT_UPDELAY, &newval);
    212		if (err)
    213			return err;
    214	}
    215	if (data[IFLA_BOND_DOWNDELAY]) {
    216		int downdelay = nla_get_u32(data[IFLA_BOND_DOWNDELAY]);
    217
    218		bond_opt_initval(&newval, downdelay);
    219		err = __bond_opt_set(bond, BOND_OPT_DOWNDELAY, &newval);
    220		if (err)
    221			return err;
    222	}
    223	if (data[IFLA_BOND_PEER_NOTIF_DELAY]) {
    224		int delay = nla_get_u32(data[IFLA_BOND_PEER_NOTIF_DELAY]);
    225
    226		bond_opt_initval(&newval, delay);
    227		err = __bond_opt_set(bond, BOND_OPT_PEER_NOTIF_DELAY, &newval);
    228		if (err)
    229			return err;
    230	}
    231	if (data[IFLA_BOND_USE_CARRIER]) {
    232		int use_carrier = nla_get_u8(data[IFLA_BOND_USE_CARRIER]);
    233
    234		bond_opt_initval(&newval, use_carrier);
    235		err = __bond_opt_set(bond, BOND_OPT_USE_CARRIER, &newval);
    236		if (err)
    237			return err;
    238	}
    239	if (data[IFLA_BOND_ARP_INTERVAL]) {
    240		int arp_interval = nla_get_u32(data[IFLA_BOND_ARP_INTERVAL]);
    241
    242		if (arp_interval && miimon) {
    243			netdev_err(bond->dev, "ARP monitoring cannot be used with MII monitoring\n");
    244			return -EINVAL;
    245		}
    246
    247		bond_opt_initval(&newval, arp_interval);
    248		err = __bond_opt_set(bond, BOND_OPT_ARP_INTERVAL, &newval);
    249		if (err)
    250			return err;
    251	}
    252	if (data[IFLA_BOND_ARP_IP_TARGET]) {
    253		struct nlattr *attr;
    254		int i = 0, rem;
    255
    256		bond_option_arp_ip_targets_clear(bond);
    257		nla_for_each_nested(attr, data[IFLA_BOND_ARP_IP_TARGET], rem) {
    258			__be32 target;
    259
    260			if (nla_len(attr) < sizeof(target))
    261				return -EINVAL;
    262
    263			target = nla_get_be32(attr);
    264
    265			bond_opt_initval(&newval, (__force u64)target);
    266			err = __bond_opt_set(bond, BOND_OPT_ARP_TARGETS,
    267					     &newval);
    268			if (err)
    269				break;
    270			i++;
    271		}
    272		if (i == 0 && bond->params.arp_interval)
    273			netdev_warn(bond->dev, "Removing last arp target with arp_interval on\n");
    274		if (err)
    275			return err;
    276	}
    277#if IS_ENABLED(CONFIG_IPV6)
    278	if (data[IFLA_BOND_NS_IP6_TARGET]) {
    279		struct nlattr *attr;
    280		int i = 0, rem;
    281
    282		bond_option_ns_ip6_targets_clear(bond);
    283		nla_for_each_nested(attr, data[IFLA_BOND_NS_IP6_TARGET], rem) {
    284			struct in6_addr addr6;
    285
    286			if (nla_len(attr) < sizeof(addr6)) {
    287				NL_SET_ERR_MSG(extack, "Invalid IPv6 address");
    288				return -EINVAL;
    289			}
    290
    291			addr6 = nla_get_in6_addr(attr);
    292
    293			bond_opt_initextra(&newval, &addr6, sizeof(addr6));
    294			err = __bond_opt_set(bond, BOND_OPT_NS_TARGETS,
    295					     &newval);
    296			if (err)
    297				break;
    298			i++;
    299		}
    300		if (i == 0 && bond->params.arp_interval)
    301			netdev_warn(bond->dev, "Removing last ns target with arp_interval on\n");
    302		if (err)
    303			return err;
    304	}
    305#endif
    306	if (data[IFLA_BOND_ARP_VALIDATE]) {
    307		int arp_validate = nla_get_u32(data[IFLA_BOND_ARP_VALIDATE]);
    308
    309		if (arp_validate && miimon) {
    310			netdev_err(bond->dev, "ARP validating cannot be used with MII monitoring\n");
    311			return -EINVAL;
    312		}
    313
    314		bond_opt_initval(&newval, arp_validate);
    315		err = __bond_opt_set(bond, BOND_OPT_ARP_VALIDATE, &newval);
    316		if (err)
    317			return err;
    318	}
    319	if (data[IFLA_BOND_ARP_ALL_TARGETS]) {
    320		int arp_all_targets =
    321			nla_get_u32(data[IFLA_BOND_ARP_ALL_TARGETS]);
    322
    323		bond_opt_initval(&newval, arp_all_targets);
    324		err = __bond_opt_set(bond, BOND_OPT_ARP_ALL_TARGETS, &newval);
    325		if (err)
    326			return err;
    327	}
    328	if (data[IFLA_BOND_PRIMARY]) {
    329		int ifindex = nla_get_u32(data[IFLA_BOND_PRIMARY]);
    330		struct net_device *dev;
    331		char *primary = "";
    332
    333		dev = __dev_get_by_index(dev_net(bond_dev), ifindex);
    334		if (dev)
    335			primary = dev->name;
    336
    337		bond_opt_initstr(&newval, primary);
    338		err = __bond_opt_set(bond, BOND_OPT_PRIMARY, &newval);
    339		if (err)
    340			return err;
    341	}
    342	if (data[IFLA_BOND_PRIMARY_RESELECT]) {
    343		int primary_reselect =
    344			nla_get_u8(data[IFLA_BOND_PRIMARY_RESELECT]);
    345
    346		bond_opt_initval(&newval, primary_reselect);
    347		err = __bond_opt_set(bond, BOND_OPT_PRIMARY_RESELECT, &newval);
    348		if (err)
    349			return err;
    350	}
    351	if (data[IFLA_BOND_FAIL_OVER_MAC]) {
    352		int fail_over_mac =
    353			nla_get_u8(data[IFLA_BOND_FAIL_OVER_MAC]);
    354
    355		bond_opt_initval(&newval, fail_over_mac);
    356		err = __bond_opt_set(bond, BOND_OPT_FAIL_OVER_MAC, &newval);
    357		if (err)
    358			return err;
    359	}
    360	if (data[IFLA_BOND_XMIT_HASH_POLICY]) {
    361		int xmit_hash_policy =
    362			nla_get_u8(data[IFLA_BOND_XMIT_HASH_POLICY]);
    363
    364		bond_opt_initval(&newval, xmit_hash_policy);
    365		err = __bond_opt_set(bond, BOND_OPT_XMIT_HASH, &newval);
    366		if (err)
    367			return err;
    368	}
    369	if (data[IFLA_BOND_RESEND_IGMP]) {
    370		int resend_igmp =
    371			nla_get_u32(data[IFLA_BOND_RESEND_IGMP]);
    372
    373		bond_opt_initval(&newval, resend_igmp);
    374		err = __bond_opt_set(bond, BOND_OPT_RESEND_IGMP, &newval);
    375		if (err)
    376			return err;
    377	}
    378	if (data[IFLA_BOND_NUM_PEER_NOTIF]) {
    379		int num_peer_notif =
    380			nla_get_u8(data[IFLA_BOND_NUM_PEER_NOTIF]);
    381
    382		bond_opt_initval(&newval, num_peer_notif);
    383		err = __bond_opt_set(bond, BOND_OPT_NUM_PEER_NOTIF, &newval);
    384		if (err)
    385			return err;
    386	}
    387	if (data[IFLA_BOND_ALL_SLAVES_ACTIVE]) {
    388		int all_slaves_active =
    389			nla_get_u8(data[IFLA_BOND_ALL_SLAVES_ACTIVE]);
    390
    391		bond_opt_initval(&newval, all_slaves_active);
    392		err = __bond_opt_set(bond, BOND_OPT_ALL_SLAVES_ACTIVE, &newval);
    393		if (err)
    394			return err;
    395	}
    396	if (data[IFLA_BOND_MIN_LINKS]) {
    397		int min_links =
    398			nla_get_u32(data[IFLA_BOND_MIN_LINKS]);
    399
    400		bond_opt_initval(&newval, min_links);
    401		err = __bond_opt_set(bond, BOND_OPT_MINLINKS, &newval);
    402		if (err)
    403			return err;
    404	}
    405	if (data[IFLA_BOND_LP_INTERVAL]) {
    406		int lp_interval =
    407			nla_get_u32(data[IFLA_BOND_LP_INTERVAL]);
    408
    409		bond_opt_initval(&newval, lp_interval);
    410		err = __bond_opt_set(bond, BOND_OPT_LP_INTERVAL, &newval);
    411		if (err)
    412			return err;
    413	}
    414	if (data[IFLA_BOND_PACKETS_PER_SLAVE]) {
    415		int packets_per_slave =
    416			nla_get_u32(data[IFLA_BOND_PACKETS_PER_SLAVE]);
    417
    418		bond_opt_initval(&newval, packets_per_slave);
    419		err = __bond_opt_set(bond, BOND_OPT_PACKETS_PER_SLAVE, &newval);
    420		if (err)
    421			return err;
    422	}
    423
    424	if (data[IFLA_BOND_AD_LACP_ACTIVE]) {
    425		int lacp_active = nla_get_u8(data[IFLA_BOND_AD_LACP_ACTIVE]);
    426
    427		bond_opt_initval(&newval, lacp_active);
    428		err = __bond_opt_set(bond, BOND_OPT_LACP_ACTIVE, &newval);
    429		if (err)
    430			return err;
    431	}
    432
    433	if (data[IFLA_BOND_AD_LACP_RATE]) {
    434		int lacp_rate =
    435			nla_get_u8(data[IFLA_BOND_AD_LACP_RATE]);
    436
    437		bond_opt_initval(&newval, lacp_rate);
    438		err = __bond_opt_set(bond, BOND_OPT_LACP_RATE, &newval);
    439		if (err)
    440			return err;
    441	}
    442	if (data[IFLA_BOND_AD_SELECT]) {
    443		int ad_select =
    444			nla_get_u8(data[IFLA_BOND_AD_SELECT]);
    445
    446		bond_opt_initval(&newval, ad_select);
    447		err = __bond_opt_set(bond, BOND_OPT_AD_SELECT, &newval);
    448		if (err)
    449			return err;
    450	}
    451	if (data[IFLA_BOND_AD_ACTOR_SYS_PRIO]) {
    452		int actor_sys_prio =
    453			nla_get_u16(data[IFLA_BOND_AD_ACTOR_SYS_PRIO]);
    454
    455		bond_opt_initval(&newval, actor_sys_prio);
    456		err = __bond_opt_set(bond, BOND_OPT_AD_ACTOR_SYS_PRIO, &newval);
    457		if (err)
    458			return err;
    459	}
    460	if (data[IFLA_BOND_AD_USER_PORT_KEY]) {
    461		int port_key =
    462			nla_get_u16(data[IFLA_BOND_AD_USER_PORT_KEY]);
    463
    464		bond_opt_initval(&newval, port_key);
    465		err = __bond_opt_set(bond, BOND_OPT_AD_USER_PORT_KEY, &newval);
    466		if (err)
    467			return err;
    468	}
    469	if (data[IFLA_BOND_AD_ACTOR_SYSTEM]) {
    470		if (nla_len(data[IFLA_BOND_AD_ACTOR_SYSTEM]) != ETH_ALEN)
    471			return -EINVAL;
    472
    473		bond_opt_initval(&newval,
    474				 nla_get_u64(data[IFLA_BOND_AD_ACTOR_SYSTEM]));
    475		err = __bond_opt_set(bond, BOND_OPT_AD_ACTOR_SYSTEM, &newval);
    476		if (err)
    477			return err;
    478	}
    479	if (data[IFLA_BOND_TLB_DYNAMIC_LB]) {
    480		int dynamic_lb = nla_get_u8(data[IFLA_BOND_TLB_DYNAMIC_LB]);
    481
    482		bond_opt_initval(&newval, dynamic_lb);
    483		err = __bond_opt_set(bond, BOND_OPT_TLB_DYNAMIC_LB, &newval);
    484		if (err)
    485			return err;
    486	}
    487
    488	if (data[IFLA_BOND_MISSED_MAX]) {
    489		int missed_max = nla_get_u8(data[IFLA_BOND_MISSED_MAX]);
    490
    491		bond_opt_initval(&newval, missed_max);
    492		err = __bond_opt_set(bond, BOND_OPT_MISSED_MAX, &newval);
    493		if (err)
    494			return err;
    495	}
    496
    497	return 0;
    498}
    499
    500static int bond_newlink(struct net *src_net, struct net_device *bond_dev,
    501			struct nlattr *tb[], struct nlattr *data[],
    502			struct netlink_ext_ack *extack)
    503{
    504	int err;
    505
    506	err = bond_changelink(bond_dev, tb, data, extack);
    507	if (err < 0)
    508		return err;
    509
    510	err = register_netdevice(bond_dev);
    511	if (!err) {
    512		struct bonding *bond = netdev_priv(bond_dev);
    513
    514		netif_carrier_off(bond_dev);
    515		bond_work_init_all(bond);
    516	}
    517
    518	return err;
    519}
    520
    521static size_t bond_get_size(const struct net_device *bond_dev)
    522{
    523	return nla_total_size(sizeof(u8)) +	/* IFLA_BOND_MODE */
    524		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_ACTIVE_SLAVE */
    525		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_MIIMON */
    526		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_UPDELAY */
    527		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_DOWNDELAY */
    528		nla_total_size(sizeof(u8)) +	/* IFLA_BOND_USE_CARRIER */
    529		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_ARP_INTERVAL */
    530						/* IFLA_BOND_ARP_IP_TARGET */
    531		nla_total_size(sizeof(struct nlattr)) +
    532		nla_total_size(sizeof(u32)) * BOND_MAX_ARP_TARGETS +
    533		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_ARP_VALIDATE */
    534		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_ARP_ALL_TARGETS */
    535		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_PRIMARY */
    536		nla_total_size(sizeof(u8)) +	/* IFLA_BOND_PRIMARY_RESELECT */
    537		nla_total_size(sizeof(u8)) +	/* IFLA_BOND_FAIL_OVER_MAC */
    538		nla_total_size(sizeof(u8)) +	/* IFLA_BOND_XMIT_HASH_POLICY */
    539		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_RESEND_IGMP */
    540		nla_total_size(sizeof(u8)) +	/* IFLA_BOND_NUM_PEER_NOTIF */
    541		nla_total_size(sizeof(u8)) +   /* IFLA_BOND_ALL_SLAVES_ACTIVE */
    542		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_MIN_LINKS */
    543		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_LP_INTERVAL */
    544		nla_total_size(sizeof(u32)) +  /* IFLA_BOND_PACKETS_PER_SLAVE */
    545		nla_total_size(sizeof(u8)) +	/* IFLA_BOND_AD_LACP_ACTIVE */
    546		nla_total_size(sizeof(u8)) +	/* IFLA_BOND_AD_LACP_RATE */
    547		nla_total_size(sizeof(u8)) +	/* IFLA_BOND_AD_SELECT */
    548		nla_total_size(sizeof(struct nlattr)) + /* IFLA_BOND_AD_INFO */
    549		nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_AGGREGATOR */
    550		nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_NUM_PORTS */
    551		nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_ACTOR_KEY */
    552		nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_PARTNER_KEY*/
    553		nla_total_size(ETH_ALEN) +    /* IFLA_BOND_AD_INFO_PARTNER_MAC*/
    554		nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_ACTOR_SYS_PRIO */
    555		nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_USER_PORT_KEY */
    556		nla_total_size(ETH_ALEN) + /* IFLA_BOND_AD_ACTOR_SYSTEM */
    557		nla_total_size(sizeof(u8)) + /* IFLA_BOND_TLB_DYNAMIC_LB */
    558		nla_total_size(sizeof(u32)) +	/* IFLA_BOND_PEER_NOTIF_DELAY */
    559		nla_total_size(sizeof(u8)) +	/* IFLA_BOND_MISSED_MAX */
    560						/* IFLA_BOND_NS_IP6_TARGET */
    561		nla_total_size(sizeof(struct nlattr)) +
    562		nla_total_size(sizeof(struct in6_addr)) * BOND_MAX_NS_TARGETS +
    563		0;
    564}
    565
    566static int bond_option_active_slave_get_ifindex(struct bonding *bond)
    567{
    568	const struct net_device *slave;
    569	int ifindex;
    570
    571	rcu_read_lock();
    572	slave = bond_option_active_slave_get_rcu(bond);
    573	ifindex = slave ? slave->ifindex : 0;
    574	rcu_read_unlock();
    575	return ifindex;
    576}
    577
    578static int bond_fill_info(struct sk_buff *skb,
    579			  const struct net_device *bond_dev)
    580{
    581	struct bonding *bond = netdev_priv(bond_dev);
    582	unsigned int packets_per_slave;
    583	int ifindex, i, targets_added;
    584	struct nlattr *targets;
    585	struct slave *primary;
    586
    587	if (nla_put_u8(skb, IFLA_BOND_MODE, BOND_MODE(bond)))
    588		goto nla_put_failure;
    589
    590	ifindex = bond_option_active_slave_get_ifindex(bond);
    591	if (ifindex && nla_put_u32(skb, IFLA_BOND_ACTIVE_SLAVE, ifindex))
    592		goto nla_put_failure;
    593
    594	if (nla_put_u32(skb, IFLA_BOND_MIIMON, bond->params.miimon))
    595		goto nla_put_failure;
    596
    597	if (nla_put_u32(skb, IFLA_BOND_UPDELAY,
    598			bond->params.updelay * bond->params.miimon))
    599		goto nla_put_failure;
    600
    601	if (nla_put_u32(skb, IFLA_BOND_DOWNDELAY,
    602			bond->params.downdelay * bond->params.miimon))
    603		goto nla_put_failure;
    604
    605	if (nla_put_u32(skb, IFLA_BOND_PEER_NOTIF_DELAY,
    606			bond->params.peer_notif_delay * bond->params.miimon))
    607		goto nla_put_failure;
    608
    609	if (nla_put_u8(skb, IFLA_BOND_USE_CARRIER, bond->params.use_carrier))
    610		goto nla_put_failure;
    611
    612	if (nla_put_u32(skb, IFLA_BOND_ARP_INTERVAL, bond->params.arp_interval))
    613		goto nla_put_failure;
    614
    615	targets = nla_nest_start_noflag(skb, IFLA_BOND_ARP_IP_TARGET);
    616	if (!targets)
    617		goto nla_put_failure;
    618
    619	targets_added = 0;
    620	for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) {
    621		if (bond->params.arp_targets[i]) {
    622			if (nla_put_be32(skb, i, bond->params.arp_targets[i]))
    623				goto nla_put_failure;
    624			targets_added = 1;
    625		}
    626	}
    627
    628	if (targets_added)
    629		nla_nest_end(skb, targets);
    630	else
    631		nla_nest_cancel(skb, targets);
    632
    633	if (nla_put_u32(skb, IFLA_BOND_ARP_VALIDATE, bond->params.arp_validate))
    634		goto nla_put_failure;
    635
    636	if (nla_put_u32(skb, IFLA_BOND_ARP_ALL_TARGETS,
    637			bond->params.arp_all_targets))
    638		goto nla_put_failure;
    639
    640#if IS_ENABLED(CONFIG_IPV6)
    641	targets = nla_nest_start(skb, IFLA_BOND_NS_IP6_TARGET);
    642	if (!targets)
    643		goto nla_put_failure;
    644
    645	targets_added = 0;
    646	for (i = 0; i < BOND_MAX_NS_TARGETS; i++) {
    647		if (!ipv6_addr_any(&bond->params.ns_targets[i])) {
    648			if (nla_put_in6_addr(skb, i, &bond->params.ns_targets[i]))
    649				goto nla_put_failure;
    650			targets_added = 1;
    651		}
    652	}
    653
    654	if (targets_added)
    655		nla_nest_end(skb, targets);
    656	else
    657		nla_nest_cancel(skb, targets);
    658#endif
    659
    660	primary = rtnl_dereference(bond->primary_slave);
    661	if (primary &&
    662	    nla_put_u32(skb, IFLA_BOND_PRIMARY, primary->dev->ifindex))
    663		goto nla_put_failure;
    664
    665	if (nla_put_u8(skb, IFLA_BOND_PRIMARY_RESELECT,
    666		       bond->params.primary_reselect))
    667		goto nla_put_failure;
    668
    669	if (nla_put_u8(skb, IFLA_BOND_FAIL_OVER_MAC,
    670		       bond->params.fail_over_mac))
    671		goto nla_put_failure;
    672
    673	if (nla_put_u8(skb, IFLA_BOND_XMIT_HASH_POLICY,
    674		       bond->params.xmit_policy))
    675		goto nla_put_failure;
    676
    677	if (nla_put_u32(skb, IFLA_BOND_RESEND_IGMP,
    678			bond->params.resend_igmp))
    679		goto nla_put_failure;
    680
    681	if (nla_put_u8(skb, IFLA_BOND_NUM_PEER_NOTIF,
    682		       bond->params.num_peer_notif))
    683		goto nla_put_failure;
    684
    685	if (nla_put_u8(skb, IFLA_BOND_ALL_SLAVES_ACTIVE,
    686		       bond->params.all_slaves_active))
    687		goto nla_put_failure;
    688
    689	if (nla_put_u32(skb, IFLA_BOND_MIN_LINKS,
    690			bond->params.min_links))
    691		goto nla_put_failure;
    692
    693	if (nla_put_u32(skb, IFLA_BOND_LP_INTERVAL,
    694			bond->params.lp_interval))
    695		goto nla_put_failure;
    696
    697	packets_per_slave = bond->params.packets_per_slave;
    698	if (nla_put_u32(skb, IFLA_BOND_PACKETS_PER_SLAVE,
    699			packets_per_slave))
    700		goto nla_put_failure;
    701
    702	if (nla_put_u8(skb, IFLA_BOND_AD_LACP_ACTIVE,
    703		       bond->params.lacp_active))
    704		goto nla_put_failure;
    705
    706	if (nla_put_u8(skb, IFLA_BOND_AD_LACP_RATE,
    707		       bond->params.lacp_fast))
    708		goto nla_put_failure;
    709
    710	if (nla_put_u8(skb, IFLA_BOND_AD_SELECT,
    711		       bond->params.ad_select))
    712		goto nla_put_failure;
    713
    714	if (nla_put_u8(skb, IFLA_BOND_TLB_DYNAMIC_LB,
    715		       bond->params.tlb_dynamic_lb))
    716		goto nla_put_failure;
    717
    718	if (nla_put_u8(skb, IFLA_BOND_MISSED_MAX,
    719		       bond->params.missed_max))
    720		goto nla_put_failure;
    721
    722	if (BOND_MODE(bond) == BOND_MODE_8023AD) {
    723		struct ad_info info;
    724
    725		if (capable(CAP_NET_ADMIN)) {
    726			if (nla_put_u16(skb, IFLA_BOND_AD_ACTOR_SYS_PRIO,
    727					bond->params.ad_actor_sys_prio))
    728				goto nla_put_failure;
    729
    730			if (nla_put_u16(skb, IFLA_BOND_AD_USER_PORT_KEY,
    731					bond->params.ad_user_port_key))
    732				goto nla_put_failure;
    733
    734			if (nla_put(skb, IFLA_BOND_AD_ACTOR_SYSTEM,
    735				    ETH_ALEN, &bond->params.ad_actor_system))
    736				goto nla_put_failure;
    737		}
    738		if (!bond_3ad_get_active_agg_info(bond, &info)) {
    739			struct nlattr *nest;
    740
    741			nest = nla_nest_start_noflag(skb, IFLA_BOND_AD_INFO);
    742			if (!nest)
    743				goto nla_put_failure;
    744
    745			if (nla_put_u16(skb, IFLA_BOND_AD_INFO_AGGREGATOR,
    746					info.aggregator_id))
    747				goto nla_put_failure;
    748			if (nla_put_u16(skb, IFLA_BOND_AD_INFO_NUM_PORTS,
    749					info.ports))
    750				goto nla_put_failure;
    751			if (nla_put_u16(skb, IFLA_BOND_AD_INFO_ACTOR_KEY,
    752					info.actor_key))
    753				goto nla_put_failure;
    754			if (nla_put_u16(skb, IFLA_BOND_AD_INFO_PARTNER_KEY,
    755					info.partner_key))
    756				goto nla_put_failure;
    757			if (nla_put(skb, IFLA_BOND_AD_INFO_PARTNER_MAC,
    758				    sizeof(info.partner_system),
    759				    &info.partner_system))
    760				goto nla_put_failure;
    761
    762			nla_nest_end(skb, nest);
    763		}
    764	}
    765
    766	return 0;
    767
    768nla_put_failure:
    769	return -EMSGSIZE;
    770}
    771
    772static size_t bond_get_linkxstats_size(const struct net_device *dev, int attr)
    773{
    774	switch (attr) {
    775	case IFLA_STATS_LINK_XSTATS:
    776	case IFLA_STATS_LINK_XSTATS_SLAVE:
    777		break;
    778	default:
    779		return 0;
    780	}
    781
    782	return bond_3ad_stats_size() + nla_total_size(0);
    783}
    784
    785static int bond_fill_linkxstats(struct sk_buff *skb,
    786				const struct net_device *dev,
    787				int *prividx, int attr)
    788{
    789	struct nlattr *nla __maybe_unused;
    790	struct slave *slave = NULL;
    791	struct nlattr *nest, *nest2;
    792	struct bonding *bond;
    793
    794	switch (attr) {
    795	case IFLA_STATS_LINK_XSTATS:
    796		bond = netdev_priv(dev);
    797		break;
    798	case IFLA_STATS_LINK_XSTATS_SLAVE:
    799		slave = bond_slave_get_rtnl(dev);
    800		if (!slave)
    801			return 0;
    802		bond = slave->bond;
    803		break;
    804	default:
    805		return -EINVAL;
    806	}
    807
    808	nest = nla_nest_start_noflag(skb, LINK_XSTATS_TYPE_BOND);
    809	if (!nest)
    810		return -EMSGSIZE;
    811	if (BOND_MODE(bond) == BOND_MODE_8023AD) {
    812		struct bond_3ad_stats *stats;
    813
    814		if (slave)
    815			stats = &SLAVE_AD_INFO(slave)->stats;
    816		else
    817			stats = &BOND_AD_INFO(bond).stats;
    818
    819		nest2 = nla_nest_start_noflag(skb, BOND_XSTATS_3AD);
    820		if (!nest2) {
    821			nla_nest_end(skb, nest);
    822			return -EMSGSIZE;
    823		}
    824
    825		if (bond_3ad_stats_fill(skb, stats)) {
    826			nla_nest_cancel(skb, nest2);
    827			nla_nest_end(skb, nest);
    828			return -EMSGSIZE;
    829		}
    830		nla_nest_end(skb, nest2);
    831	}
    832	nla_nest_end(skb, nest);
    833
    834	return 0;
    835}
    836
    837struct rtnl_link_ops bond_link_ops __read_mostly = {
    838	.kind			= "bond",
    839	.priv_size		= sizeof(struct bonding),
    840	.setup			= bond_setup,
    841	.maxtype		= IFLA_BOND_MAX,
    842	.policy			= bond_policy,
    843	.validate		= bond_validate,
    844	.newlink		= bond_newlink,
    845	.changelink		= bond_changelink,
    846	.get_size		= bond_get_size,
    847	.fill_info		= bond_fill_info,
    848	.get_num_tx_queues	= bond_get_num_tx_queues,
    849	.get_num_rx_queues	= bond_get_num_tx_queues, /* Use the same number
    850							     as for TX queues */
    851	.fill_linkxstats        = bond_fill_linkxstats,
    852	.get_linkxstats_size    = bond_get_linkxstats_size,
    853	.slave_maxtype		= IFLA_BOND_SLAVE_MAX,
    854	.slave_policy		= bond_slave_policy,
    855	.slave_changelink	= bond_slave_changelink,
    856	.get_slave_size		= bond_get_slave_size,
    857	.fill_slave_info	= bond_fill_slave_info,
    858};
    859
    860int __init bond_netlink_init(void)
    861{
    862	return rtnl_link_register(&bond_link_ops);
    863}
    864
    865void bond_netlink_fini(void)
    866{
    867	rtnl_link_unregister(&bond_link_ops);
    868}
    869
    870MODULE_ALIAS_RTNL_LINK("bond");