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

br_mrp.c (32854B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2
      3#include <linux/mrp_bridge.h>
      4#include "br_private_mrp.h"
      5
      6static const u8 mrp_test_dmac[ETH_ALEN] = { 0x1, 0x15, 0x4e, 0x0, 0x0, 0x1 };
      7static const u8 mrp_in_test_dmac[ETH_ALEN] = { 0x1, 0x15, 0x4e, 0x0, 0x0, 0x3 };
      8
      9static int br_mrp_process(struct net_bridge_port *p, struct sk_buff *skb);
     10
     11static struct br_frame_type mrp_frame_type __read_mostly = {
     12	.type = cpu_to_be16(ETH_P_MRP),
     13	.frame_handler = br_mrp_process,
     14};
     15
     16static bool br_mrp_is_ring_port(struct net_bridge_port *p_port,
     17				struct net_bridge_port *s_port,
     18				struct net_bridge_port *port)
     19{
     20	if (port == p_port ||
     21	    port == s_port)
     22		return true;
     23
     24	return false;
     25}
     26
     27static bool br_mrp_is_in_port(struct net_bridge_port *i_port,
     28			      struct net_bridge_port *port)
     29{
     30	if (port == i_port)
     31		return true;
     32
     33	return false;
     34}
     35
     36static struct net_bridge_port *br_mrp_get_port(struct net_bridge *br,
     37					       u32 ifindex)
     38{
     39	struct net_bridge_port *res = NULL;
     40	struct net_bridge_port *port;
     41
     42	list_for_each_entry(port, &br->port_list, list) {
     43		if (port->dev->ifindex == ifindex) {
     44			res = port;
     45			break;
     46		}
     47	}
     48
     49	return res;
     50}
     51
     52static struct br_mrp *br_mrp_find_id(struct net_bridge *br, u32 ring_id)
     53{
     54	struct br_mrp *res = NULL;
     55	struct br_mrp *mrp;
     56
     57	hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
     58				 lockdep_rtnl_is_held()) {
     59		if (mrp->ring_id == ring_id) {
     60			res = mrp;
     61			break;
     62		}
     63	}
     64
     65	return res;
     66}
     67
     68static struct br_mrp *br_mrp_find_in_id(struct net_bridge *br, u32 in_id)
     69{
     70	struct br_mrp *res = NULL;
     71	struct br_mrp *mrp;
     72
     73	hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
     74				 lockdep_rtnl_is_held()) {
     75		if (mrp->in_id == in_id) {
     76			res = mrp;
     77			break;
     78		}
     79	}
     80
     81	return res;
     82}
     83
     84static bool br_mrp_unique_ifindex(struct net_bridge *br, u32 ifindex)
     85{
     86	struct br_mrp *mrp;
     87
     88	hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
     89				 lockdep_rtnl_is_held()) {
     90		struct net_bridge_port *p;
     91
     92		p = rtnl_dereference(mrp->p_port);
     93		if (p && p->dev->ifindex == ifindex)
     94			return false;
     95
     96		p = rtnl_dereference(mrp->s_port);
     97		if (p && p->dev->ifindex == ifindex)
     98			return false;
     99
    100		p = rtnl_dereference(mrp->i_port);
    101		if (p && p->dev->ifindex == ifindex)
    102			return false;
    103	}
    104
    105	return true;
    106}
    107
    108static struct br_mrp *br_mrp_find_port(struct net_bridge *br,
    109				       struct net_bridge_port *p)
    110{
    111	struct br_mrp *res = NULL;
    112	struct br_mrp *mrp;
    113
    114	hlist_for_each_entry_rcu(mrp, &br->mrp_list, list,
    115				 lockdep_rtnl_is_held()) {
    116		if (rcu_access_pointer(mrp->p_port) == p ||
    117		    rcu_access_pointer(mrp->s_port) == p ||
    118		    rcu_access_pointer(mrp->i_port) == p) {
    119			res = mrp;
    120			break;
    121		}
    122	}
    123
    124	return res;
    125}
    126
    127static int br_mrp_next_seq(struct br_mrp *mrp)
    128{
    129	mrp->seq_id++;
    130	return mrp->seq_id;
    131}
    132
    133static struct sk_buff *br_mrp_skb_alloc(struct net_bridge_port *p,
    134					const u8 *src, const u8 *dst)
    135{
    136	struct ethhdr *eth_hdr;
    137	struct sk_buff *skb;
    138	__be16 *version;
    139
    140	skb = dev_alloc_skb(MRP_MAX_FRAME_LENGTH);
    141	if (!skb)
    142		return NULL;
    143
    144	skb->dev = p->dev;
    145	skb->protocol = htons(ETH_P_MRP);
    146	skb->priority = MRP_FRAME_PRIO;
    147	skb_reserve(skb, sizeof(*eth_hdr));
    148
    149	eth_hdr = skb_push(skb, sizeof(*eth_hdr));
    150	ether_addr_copy(eth_hdr->h_dest, dst);
    151	ether_addr_copy(eth_hdr->h_source, src);
    152	eth_hdr->h_proto = htons(ETH_P_MRP);
    153
    154	version = skb_put(skb, sizeof(*version));
    155	*version = cpu_to_be16(MRP_VERSION);
    156
    157	return skb;
    158}
    159
    160static void br_mrp_skb_tlv(struct sk_buff *skb,
    161			   enum br_mrp_tlv_header_type type,
    162			   u8 length)
    163{
    164	struct br_mrp_tlv_hdr *hdr;
    165
    166	hdr = skb_put(skb, sizeof(*hdr));
    167	hdr->type = type;
    168	hdr->length = length;
    169}
    170
    171static void br_mrp_skb_common(struct sk_buff *skb, struct br_mrp *mrp)
    172{
    173	struct br_mrp_common_hdr *hdr;
    174
    175	br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_COMMON, sizeof(*hdr));
    176
    177	hdr = skb_put(skb, sizeof(*hdr));
    178	hdr->seq_id = cpu_to_be16(br_mrp_next_seq(mrp));
    179	memset(hdr->domain, 0xff, MRP_DOMAIN_UUID_LENGTH);
    180}
    181
    182static struct sk_buff *br_mrp_alloc_test_skb(struct br_mrp *mrp,
    183					     struct net_bridge_port *p,
    184					     enum br_mrp_port_role_type port_role)
    185{
    186	struct br_mrp_ring_test_hdr *hdr = NULL;
    187	struct sk_buff *skb = NULL;
    188
    189	if (!p)
    190		return NULL;
    191
    192	skb = br_mrp_skb_alloc(p, p->dev->dev_addr, mrp_test_dmac);
    193	if (!skb)
    194		return NULL;
    195
    196	br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_RING_TEST, sizeof(*hdr));
    197	hdr = skb_put(skb, sizeof(*hdr));
    198
    199	hdr->prio = cpu_to_be16(mrp->prio);
    200	ether_addr_copy(hdr->sa, p->br->dev->dev_addr);
    201	hdr->port_role = cpu_to_be16(port_role);
    202	hdr->state = cpu_to_be16(mrp->ring_state);
    203	hdr->transitions = cpu_to_be16(mrp->ring_transitions);
    204	hdr->timestamp = cpu_to_be32(jiffies_to_msecs(jiffies));
    205
    206	br_mrp_skb_common(skb, mrp);
    207
    208	/* In case the node behaves as MRA then the Test frame needs to have
    209	 * an Option TLV which includes eventually a sub-option TLV that has
    210	 * the type AUTO_MGR
    211	 */
    212	if (mrp->ring_role == BR_MRP_RING_ROLE_MRA) {
    213		struct br_mrp_sub_option1_hdr *sub_opt = NULL;
    214		struct br_mrp_tlv_hdr *sub_tlv = NULL;
    215		struct br_mrp_oui_hdr *oui = NULL;
    216		u8 length;
    217
    218		length = sizeof(*sub_opt) + sizeof(*sub_tlv) + sizeof(oui) +
    219			MRP_OPT_PADDING;
    220		br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_OPTION, length);
    221
    222		oui = skb_put(skb, sizeof(*oui));
    223		memset(oui, 0x0, sizeof(*oui));
    224		sub_opt = skb_put(skb, sizeof(*sub_opt));
    225		memset(sub_opt, 0x0, sizeof(*sub_opt));
    226
    227		sub_tlv = skb_put(skb, sizeof(*sub_tlv));
    228		sub_tlv->type = BR_MRP_SUB_TLV_HEADER_TEST_AUTO_MGR;
    229
    230		/* 32 bit alligment shall be ensured therefore add 2 bytes */
    231		skb_put(skb, MRP_OPT_PADDING);
    232	}
    233
    234	br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_END, 0x0);
    235
    236	return skb;
    237}
    238
    239static struct sk_buff *br_mrp_alloc_in_test_skb(struct br_mrp *mrp,
    240						struct net_bridge_port *p,
    241						enum br_mrp_port_role_type port_role)
    242{
    243	struct br_mrp_in_test_hdr *hdr = NULL;
    244	struct sk_buff *skb = NULL;
    245
    246	if (!p)
    247		return NULL;
    248
    249	skb = br_mrp_skb_alloc(p, p->dev->dev_addr, mrp_in_test_dmac);
    250	if (!skb)
    251		return NULL;
    252
    253	br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_IN_TEST, sizeof(*hdr));
    254	hdr = skb_put(skb, sizeof(*hdr));
    255
    256	hdr->id = cpu_to_be16(mrp->in_id);
    257	ether_addr_copy(hdr->sa, p->br->dev->dev_addr);
    258	hdr->port_role = cpu_to_be16(port_role);
    259	hdr->state = cpu_to_be16(mrp->in_state);
    260	hdr->transitions = cpu_to_be16(mrp->in_transitions);
    261	hdr->timestamp = cpu_to_be32(jiffies_to_msecs(jiffies));
    262
    263	br_mrp_skb_common(skb, mrp);
    264	br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_END, 0x0);
    265
    266	return skb;
    267}
    268
    269/* This function is continuously called in the following cases:
    270 * - when node role is MRM, in this case test_monitor is always set to false
    271 *   because it needs to notify the userspace that the ring is open and needs to
    272 *   send MRP_Test frames
    273 * - when node role is MRA, there are 2 subcases:
    274 *     - when MRA behaves as MRM, in this case is similar with MRM role
    275 *     - when MRA behaves as MRC, in this case test_monitor is set to true,
    276 *       because it needs to detect when it stops seeing MRP_Test frames
    277 *       from MRM node but it doesn't need to send MRP_Test frames.
    278 */
    279static void br_mrp_test_work_expired(struct work_struct *work)
    280{
    281	struct delayed_work *del_work = to_delayed_work(work);
    282	struct br_mrp *mrp = container_of(del_work, struct br_mrp, test_work);
    283	struct net_bridge_port *p;
    284	bool notify_open = false;
    285	struct sk_buff *skb;
    286
    287	if (time_before_eq(mrp->test_end, jiffies))
    288		return;
    289
    290	if (mrp->test_count_miss < mrp->test_max_miss) {
    291		mrp->test_count_miss++;
    292	} else {
    293		/* Notify that the ring is open only if the ring state is
    294		 * closed, otherwise it would continue to notify at every
    295		 * interval.
    296		 * Also notify that the ring is open when the node has the
    297		 * role MRA and behaves as MRC. The reason is that the
    298		 * userspace needs to know when the MRM stopped sending
    299		 * MRP_Test frames so that the current node to try to take
    300		 * the role of a MRM.
    301		 */
    302		if (mrp->ring_state == BR_MRP_RING_STATE_CLOSED ||
    303		    mrp->test_monitor)
    304			notify_open = true;
    305	}
    306
    307	rcu_read_lock();
    308
    309	p = rcu_dereference(mrp->p_port);
    310	if (p) {
    311		if (!mrp->test_monitor) {
    312			skb = br_mrp_alloc_test_skb(mrp, p,
    313						    BR_MRP_PORT_ROLE_PRIMARY);
    314			if (!skb)
    315				goto out;
    316
    317			skb_reset_network_header(skb);
    318			dev_queue_xmit(skb);
    319		}
    320
    321		if (notify_open && !mrp->ring_role_offloaded)
    322			br_mrp_ring_port_open(p->dev, true);
    323	}
    324
    325	p = rcu_dereference(mrp->s_port);
    326	if (p) {
    327		if (!mrp->test_monitor) {
    328			skb = br_mrp_alloc_test_skb(mrp, p,
    329						    BR_MRP_PORT_ROLE_SECONDARY);
    330			if (!skb)
    331				goto out;
    332
    333			skb_reset_network_header(skb);
    334			dev_queue_xmit(skb);
    335		}
    336
    337		if (notify_open && !mrp->ring_role_offloaded)
    338			br_mrp_ring_port_open(p->dev, true);
    339	}
    340
    341out:
    342	rcu_read_unlock();
    343
    344	queue_delayed_work(system_wq, &mrp->test_work,
    345			   usecs_to_jiffies(mrp->test_interval));
    346}
    347
    348/* This function is continuously called when the node has the interconnect role
    349 * MIM. It would generate interconnect test frames and will send them on all 3
    350 * ports. But will also check if it stop receiving interconnect test frames.
    351 */
    352static void br_mrp_in_test_work_expired(struct work_struct *work)
    353{
    354	struct delayed_work *del_work = to_delayed_work(work);
    355	struct br_mrp *mrp = container_of(del_work, struct br_mrp, in_test_work);
    356	struct net_bridge_port *p;
    357	bool notify_open = false;
    358	struct sk_buff *skb;
    359
    360	if (time_before_eq(mrp->in_test_end, jiffies))
    361		return;
    362
    363	if (mrp->in_test_count_miss < mrp->in_test_max_miss) {
    364		mrp->in_test_count_miss++;
    365	} else {
    366		/* Notify that the interconnect ring is open only if the
    367		 * interconnect ring state is closed, otherwise it would
    368		 * continue to notify at every interval.
    369		 */
    370		if (mrp->in_state == BR_MRP_IN_STATE_CLOSED)
    371			notify_open = true;
    372	}
    373
    374	rcu_read_lock();
    375
    376	p = rcu_dereference(mrp->p_port);
    377	if (p) {
    378		skb = br_mrp_alloc_in_test_skb(mrp, p,
    379					       BR_MRP_PORT_ROLE_PRIMARY);
    380		if (!skb)
    381			goto out;
    382
    383		skb_reset_network_header(skb);
    384		dev_queue_xmit(skb);
    385
    386		if (notify_open && !mrp->in_role_offloaded)
    387			br_mrp_in_port_open(p->dev, true);
    388	}
    389
    390	p = rcu_dereference(mrp->s_port);
    391	if (p) {
    392		skb = br_mrp_alloc_in_test_skb(mrp, p,
    393					       BR_MRP_PORT_ROLE_SECONDARY);
    394		if (!skb)
    395			goto out;
    396
    397		skb_reset_network_header(skb);
    398		dev_queue_xmit(skb);
    399
    400		if (notify_open && !mrp->in_role_offloaded)
    401			br_mrp_in_port_open(p->dev, true);
    402	}
    403
    404	p = rcu_dereference(mrp->i_port);
    405	if (p) {
    406		skb = br_mrp_alloc_in_test_skb(mrp, p,
    407					       BR_MRP_PORT_ROLE_INTER);
    408		if (!skb)
    409			goto out;
    410
    411		skb_reset_network_header(skb);
    412		dev_queue_xmit(skb);
    413
    414		if (notify_open && !mrp->in_role_offloaded)
    415			br_mrp_in_port_open(p->dev, true);
    416	}
    417
    418out:
    419	rcu_read_unlock();
    420
    421	queue_delayed_work(system_wq, &mrp->in_test_work,
    422			   usecs_to_jiffies(mrp->in_test_interval));
    423}
    424
    425/* Deletes the MRP instance.
    426 * note: called under rtnl_lock
    427 */
    428static void br_mrp_del_impl(struct net_bridge *br, struct br_mrp *mrp)
    429{
    430	struct net_bridge_port *p;
    431	u8 state;
    432
    433	/* Stop sending MRP_Test frames */
    434	cancel_delayed_work_sync(&mrp->test_work);
    435	br_mrp_switchdev_send_ring_test(br, mrp, 0, 0, 0, 0);
    436
    437	/* Stop sending MRP_InTest frames if has an interconnect role */
    438	cancel_delayed_work_sync(&mrp->in_test_work);
    439	br_mrp_switchdev_send_in_test(br, mrp, 0, 0, 0);
    440
    441	/* Disable the roles */
    442	br_mrp_switchdev_set_ring_role(br, mrp, BR_MRP_RING_ROLE_DISABLED);
    443	p = rtnl_dereference(mrp->i_port);
    444	if (p)
    445		br_mrp_switchdev_set_in_role(br, mrp, mrp->in_id, mrp->ring_id,
    446					     BR_MRP_IN_ROLE_DISABLED);
    447
    448	br_mrp_switchdev_del(br, mrp);
    449
    450	/* Reset the ports */
    451	p = rtnl_dereference(mrp->p_port);
    452	if (p) {
    453		spin_lock_bh(&br->lock);
    454		state = netif_running(br->dev) ?
    455				BR_STATE_FORWARDING : BR_STATE_DISABLED;
    456		p->state = state;
    457		p->flags &= ~BR_MRP_AWARE;
    458		spin_unlock_bh(&br->lock);
    459		br_mrp_port_switchdev_set_state(p, state);
    460		rcu_assign_pointer(mrp->p_port, NULL);
    461	}
    462
    463	p = rtnl_dereference(mrp->s_port);
    464	if (p) {
    465		spin_lock_bh(&br->lock);
    466		state = netif_running(br->dev) ?
    467				BR_STATE_FORWARDING : BR_STATE_DISABLED;
    468		p->state = state;
    469		p->flags &= ~BR_MRP_AWARE;
    470		spin_unlock_bh(&br->lock);
    471		br_mrp_port_switchdev_set_state(p, state);
    472		rcu_assign_pointer(mrp->s_port, NULL);
    473	}
    474
    475	p = rtnl_dereference(mrp->i_port);
    476	if (p) {
    477		spin_lock_bh(&br->lock);
    478		state = netif_running(br->dev) ?
    479				BR_STATE_FORWARDING : BR_STATE_DISABLED;
    480		p->state = state;
    481		p->flags &= ~BR_MRP_AWARE;
    482		spin_unlock_bh(&br->lock);
    483		br_mrp_port_switchdev_set_state(p, state);
    484		rcu_assign_pointer(mrp->i_port, NULL);
    485	}
    486
    487	hlist_del_rcu(&mrp->list);
    488	kfree_rcu(mrp, rcu);
    489
    490	if (hlist_empty(&br->mrp_list))
    491		br_del_frame(br, &mrp_frame_type);
    492}
    493
    494/* Adds a new MRP instance.
    495 * note: called under rtnl_lock
    496 */
    497int br_mrp_add(struct net_bridge *br, struct br_mrp_instance *instance)
    498{
    499	struct net_bridge_port *p;
    500	struct br_mrp *mrp;
    501	int err;
    502
    503	/* If the ring exists, it is not possible to create another one with the
    504	 * same ring_id
    505	 */
    506	mrp = br_mrp_find_id(br, instance->ring_id);
    507	if (mrp)
    508		return -EINVAL;
    509
    510	if (!br_mrp_get_port(br, instance->p_ifindex) ||
    511	    !br_mrp_get_port(br, instance->s_ifindex))
    512		return -EINVAL;
    513
    514	/* It is not possible to have the same port part of multiple rings */
    515	if (!br_mrp_unique_ifindex(br, instance->p_ifindex) ||
    516	    !br_mrp_unique_ifindex(br, instance->s_ifindex))
    517		return -EINVAL;
    518
    519	mrp = kzalloc(sizeof(*mrp), GFP_KERNEL);
    520	if (!mrp)
    521		return -ENOMEM;
    522
    523	mrp->ring_id = instance->ring_id;
    524	mrp->prio = instance->prio;
    525
    526	p = br_mrp_get_port(br, instance->p_ifindex);
    527	spin_lock_bh(&br->lock);
    528	p->state = BR_STATE_FORWARDING;
    529	p->flags |= BR_MRP_AWARE;
    530	spin_unlock_bh(&br->lock);
    531	rcu_assign_pointer(mrp->p_port, p);
    532
    533	p = br_mrp_get_port(br, instance->s_ifindex);
    534	spin_lock_bh(&br->lock);
    535	p->state = BR_STATE_FORWARDING;
    536	p->flags |= BR_MRP_AWARE;
    537	spin_unlock_bh(&br->lock);
    538	rcu_assign_pointer(mrp->s_port, p);
    539
    540	if (hlist_empty(&br->mrp_list))
    541		br_add_frame(br, &mrp_frame_type);
    542
    543	INIT_DELAYED_WORK(&mrp->test_work, br_mrp_test_work_expired);
    544	INIT_DELAYED_WORK(&mrp->in_test_work, br_mrp_in_test_work_expired);
    545	hlist_add_tail_rcu(&mrp->list, &br->mrp_list);
    546
    547	err = br_mrp_switchdev_add(br, mrp);
    548	if (err)
    549		goto delete_mrp;
    550
    551	return 0;
    552
    553delete_mrp:
    554	br_mrp_del_impl(br, mrp);
    555
    556	return err;
    557}
    558
    559/* Deletes the MRP instance from which the port is part of
    560 * note: called under rtnl_lock
    561 */
    562void br_mrp_port_del(struct net_bridge *br, struct net_bridge_port *p)
    563{
    564	struct br_mrp *mrp = br_mrp_find_port(br, p);
    565
    566	/* If the port is not part of a MRP instance just bail out */
    567	if (!mrp)
    568		return;
    569
    570	br_mrp_del_impl(br, mrp);
    571}
    572
    573/* Deletes existing MRP instance based on ring_id
    574 * note: called under rtnl_lock
    575 */
    576int br_mrp_del(struct net_bridge *br, struct br_mrp_instance *instance)
    577{
    578	struct br_mrp *mrp = br_mrp_find_id(br, instance->ring_id);
    579
    580	if (!mrp)
    581		return -EINVAL;
    582
    583	br_mrp_del_impl(br, mrp);
    584
    585	return 0;
    586}
    587
    588/* Set port state, port state can be forwarding, blocked or disabled
    589 * note: already called with rtnl_lock
    590 */
    591int br_mrp_set_port_state(struct net_bridge_port *p,
    592			  enum br_mrp_port_state_type state)
    593{
    594	u32 port_state;
    595
    596	if (!p || !(p->flags & BR_MRP_AWARE))
    597		return -EINVAL;
    598
    599	spin_lock_bh(&p->br->lock);
    600
    601	if (state == BR_MRP_PORT_STATE_FORWARDING)
    602		port_state = BR_STATE_FORWARDING;
    603	else
    604		port_state = BR_STATE_BLOCKING;
    605
    606	p->state = port_state;
    607	spin_unlock_bh(&p->br->lock);
    608
    609	br_mrp_port_switchdev_set_state(p, port_state);
    610
    611	return 0;
    612}
    613
    614/* Set port role, port role can be primary or secondary
    615 * note: already called with rtnl_lock
    616 */
    617int br_mrp_set_port_role(struct net_bridge_port *p,
    618			 enum br_mrp_port_role_type role)
    619{
    620	struct br_mrp *mrp;
    621
    622	if (!p || !(p->flags & BR_MRP_AWARE))
    623		return -EINVAL;
    624
    625	mrp = br_mrp_find_port(p->br, p);
    626
    627	if (!mrp)
    628		return -EINVAL;
    629
    630	switch (role) {
    631	case BR_MRP_PORT_ROLE_PRIMARY:
    632		rcu_assign_pointer(mrp->p_port, p);
    633		break;
    634	case BR_MRP_PORT_ROLE_SECONDARY:
    635		rcu_assign_pointer(mrp->s_port, p);
    636		break;
    637	default:
    638		return -EINVAL;
    639	}
    640
    641	br_mrp_port_switchdev_set_role(p, role);
    642
    643	return 0;
    644}
    645
    646/* Set ring state, ring state can be only Open or Closed
    647 * note: already called with rtnl_lock
    648 */
    649int br_mrp_set_ring_state(struct net_bridge *br,
    650			  struct br_mrp_ring_state *state)
    651{
    652	struct br_mrp *mrp = br_mrp_find_id(br, state->ring_id);
    653
    654	if (!mrp)
    655		return -EINVAL;
    656
    657	if (mrp->ring_state != state->ring_state)
    658		mrp->ring_transitions++;
    659
    660	mrp->ring_state = state->ring_state;
    661
    662	br_mrp_switchdev_set_ring_state(br, mrp, state->ring_state);
    663
    664	return 0;
    665}
    666
    667/* Set ring role, ring role can be only MRM(Media Redundancy Manager) or
    668 * MRC(Media Redundancy Client).
    669 * note: already called with rtnl_lock
    670 */
    671int br_mrp_set_ring_role(struct net_bridge *br,
    672			 struct br_mrp_ring_role *role)
    673{
    674	struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id);
    675	enum br_mrp_hw_support support;
    676
    677	if (!mrp)
    678		return -EINVAL;
    679
    680	mrp->ring_role = role->ring_role;
    681
    682	/* If there is an error just bailed out */
    683	support = br_mrp_switchdev_set_ring_role(br, mrp, role->ring_role);
    684	if (support == BR_MRP_NONE)
    685		return -EOPNOTSUPP;
    686
    687	/* Now detect if the HW actually applied the role or not. If the HW
    688	 * applied the role it means that the SW will not to do those operations
    689	 * anymore. For example if the role ir MRM then the HW will notify the
    690	 * SW when ring is open, but if the is not pushed to the HW the SW will
    691	 * need to detect when the ring is open
    692	 */
    693	mrp->ring_role_offloaded = support == BR_MRP_SW ? 0 : 1;
    694
    695	return 0;
    696}
    697
    698/* Start to generate or monitor MRP test frames, the frames are generated by
    699 * HW and if it fails, they are generated by the SW.
    700 * note: already called with rtnl_lock
    701 */
    702int br_mrp_start_test(struct net_bridge *br,
    703		      struct br_mrp_start_test *test)
    704{
    705	struct br_mrp *mrp = br_mrp_find_id(br, test->ring_id);
    706	enum br_mrp_hw_support support;
    707
    708	if (!mrp)
    709		return -EINVAL;
    710
    711	/* Try to push it to the HW and if it fails then continue with SW
    712	 * implementation and if that also fails then return error.
    713	 */
    714	support = br_mrp_switchdev_send_ring_test(br, mrp, test->interval,
    715						  test->max_miss, test->period,
    716						  test->monitor);
    717	if (support == BR_MRP_NONE)
    718		return -EOPNOTSUPP;
    719
    720	if (support == BR_MRP_HW)
    721		return 0;
    722
    723	mrp->test_interval = test->interval;
    724	mrp->test_end = jiffies + usecs_to_jiffies(test->period);
    725	mrp->test_max_miss = test->max_miss;
    726	mrp->test_monitor = test->monitor;
    727	mrp->test_count_miss = 0;
    728	queue_delayed_work(system_wq, &mrp->test_work,
    729			   usecs_to_jiffies(test->interval));
    730
    731	return 0;
    732}
    733
    734/* Set in state, int state can be only Open or Closed
    735 * note: already called with rtnl_lock
    736 */
    737int br_mrp_set_in_state(struct net_bridge *br, struct br_mrp_in_state *state)
    738{
    739	struct br_mrp *mrp = br_mrp_find_in_id(br, state->in_id);
    740
    741	if (!mrp)
    742		return -EINVAL;
    743
    744	if (mrp->in_state != state->in_state)
    745		mrp->in_transitions++;
    746
    747	mrp->in_state = state->in_state;
    748
    749	br_mrp_switchdev_set_in_state(br, mrp, state->in_state);
    750
    751	return 0;
    752}
    753
    754/* Set in role, in role can be only MIM(Media Interconnection Manager) or
    755 * MIC(Media Interconnection Client).
    756 * note: already called with rtnl_lock
    757 */
    758int br_mrp_set_in_role(struct net_bridge *br, struct br_mrp_in_role *role)
    759{
    760	struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id);
    761	enum br_mrp_hw_support support;
    762	struct net_bridge_port *p;
    763
    764	if (!mrp)
    765		return -EINVAL;
    766
    767	if (!br_mrp_get_port(br, role->i_ifindex))
    768		return -EINVAL;
    769
    770	if (role->in_role == BR_MRP_IN_ROLE_DISABLED) {
    771		u8 state;
    772
    773		/* It is not allowed to disable a port that doesn't exist */
    774		p = rtnl_dereference(mrp->i_port);
    775		if (!p)
    776			return -EINVAL;
    777
    778		/* Stop the generating MRP_InTest frames */
    779		cancel_delayed_work_sync(&mrp->in_test_work);
    780		br_mrp_switchdev_send_in_test(br, mrp, 0, 0, 0);
    781
    782		/* Remove the port */
    783		spin_lock_bh(&br->lock);
    784		state = netif_running(br->dev) ?
    785				BR_STATE_FORWARDING : BR_STATE_DISABLED;
    786		p->state = state;
    787		p->flags &= ~BR_MRP_AWARE;
    788		spin_unlock_bh(&br->lock);
    789		br_mrp_port_switchdev_set_state(p, state);
    790		rcu_assign_pointer(mrp->i_port, NULL);
    791
    792		mrp->in_role = role->in_role;
    793		mrp->in_id = 0;
    794
    795		return 0;
    796	}
    797
    798	/* It is not possible to have the same port part of multiple rings */
    799	if (!br_mrp_unique_ifindex(br, role->i_ifindex))
    800		return -EINVAL;
    801
    802	/* It is not allowed to set a different interconnect port if the mrp
    803	 * instance has already one. First it needs to be disabled and after
    804	 * that set the new port
    805	 */
    806	if (rcu_access_pointer(mrp->i_port))
    807		return -EINVAL;
    808
    809	p = br_mrp_get_port(br, role->i_ifindex);
    810	spin_lock_bh(&br->lock);
    811	p->state = BR_STATE_FORWARDING;
    812	p->flags |= BR_MRP_AWARE;
    813	spin_unlock_bh(&br->lock);
    814	rcu_assign_pointer(mrp->i_port, p);
    815
    816	mrp->in_role = role->in_role;
    817	mrp->in_id = role->in_id;
    818
    819	/* If there is an error just bailed out */
    820	support = br_mrp_switchdev_set_in_role(br, mrp, role->in_id,
    821					       role->ring_id, role->in_role);
    822	if (support == BR_MRP_NONE)
    823		return -EOPNOTSUPP;
    824
    825	/* Now detect if the HW actually applied the role or not. If the HW
    826	 * applied the role it means that the SW will not to do those operations
    827	 * anymore. For example if the role is MIM then the HW will notify the
    828	 * SW when interconnect ring is open, but if the is not pushed to the HW
    829	 * the SW will need to detect when the interconnect ring is open.
    830	 */
    831	mrp->in_role_offloaded = support == BR_MRP_SW ? 0 : 1;
    832
    833	return 0;
    834}
    835
    836/* Start to generate MRP_InTest frames, the frames are generated by
    837 * HW and if it fails, they are generated by the SW.
    838 * note: already called with rtnl_lock
    839 */
    840int br_mrp_start_in_test(struct net_bridge *br,
    841			 struct br_mrp_start_in_test *in_test)
    842{
    843	struct br_mrp *mrp = br_mrp_find_in_id(br, in_test->in_id);
    844	enum br_mrp_hw_support support;
    845
    846	if (!mrp)
    847		return -EINVAL;
    848
    849	if (mrp->in_role != BR_MRP_IN_ROLE_MIM)
    850		return -EINVAL;
    851
    852	/* Try to push it to the HW and if it fails then continue with SW
    853	 * implementation and if that also fails then return error.
    854	 */
    855	support =  br_mrp_switchdev_send_in_test(br, mrp, in_test->interval,
    856						 in_test->max_miss,
    857						 in_test->period);
    858	if (support == BR_MRP_NONE)
    859		return -EOPNOTSUPP;
    860
    861	if (support == BR_MRP_HW)
    862		return 0;
    863
    864	mrp->in_test_interval = in_test->interval;
    865	mrp->in_test_end = jiffies + usecs_to_jiffies(in_test->period);
    866	mrp->in_test_max_miss = in_test->max_miss;
    867	mrp->in_test_count_miss = 0;
    868	queue_delayed_work(system_wq, &mrp->in_test_work,
    869			   usecs_to_jiffies(in_test->interval));
    870
    871	return 0;
    872}
    873
    874/* Determine if the frame type is a ring frame */
    875static bool br_mrp_ring_frame(struct sk_buff *skb)
    876{
    877	const struct br_mrp_tlv_hdr *hdr;
    878	struct br_mrp_tlv_hdr _hdr;
    879
    880	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
    881	if (!hdr)
    882		return false;
    883
    884	if (hdr->type == BR_MRP_TLV_HEADER_RING_TEST ||
    885	    hdr->type == BR_MRP_TLV_HEADER_RING_TOPO ||
    886	    hdr->type == BR_MRP_TLV_HEADER_RING_LINK_DOWN ||
    887	    hdr->type == BR_MRP_TLV_HEADER_RING_LINK_UP ||
    888	    hdr->type == BR_MRP_TLV_HEADER_OPTION)
    889		return true;
    890
    891	return false;
    892}
    893
    894/* Determine if the frame type is an interconnect frame */
    895static bool br_mrp_in_frame(struct sk_buff *skb)
    896{
    897	const struct br_mrp_tlv_hdr *hdr;
    898	struct br_mrp_tlv_hdr _hdr;
    899
    900	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
    901	if (!hdr)
    902		return false;
    903
    904	if (hdr->type == BR_MRP_TLV_HEADER_IN_TEST ||
    905	    hdr->type == BR_MRP_TLV_HEADER_IN_TOPO ||
    906	    hdr->type == BR_MRP_TLV_HEADER_IN_LINK_DOWN ||
    907	    hdr->type == BR_MRP_TLV_HEADER_IN_LINK_UP ||
    908	    hdr->type == BR_MRP_TLV_HEADER_IN_LINK_STATUS)
    909		return true;
    910
    911	return false;
    912}
    913
    914/* Process only MRP Test frame. All the other MRP frames are processed by
    915 * userspace application
    916 * note: already called with rcu_read_lock
    917 */
    918static void br_mrp_mrm_process(struct br_mrp *mrp, struct net_bridge_port *port,
    919			       struct sk_buff *skb)
    920{
    921	const struct br_mrp_tlv_hdr *hdr;
    922	struct br_mrp_tlv_hdr _hdr;
    923
    924	/* Each MRP header starts with a version field which is 16 bits.
    925	 * Therefore skip the version and get directly the TLV header.
    926	 */
    927	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
    928	if (!hdr)
    929		return;
    930
    931	if (hdr->type != BR_MRP_TLV_HEADER_RING_TEST)
    932		return;
    933
    934	mrp->test_count_miss = 0;
    935
    936	/* Notify the userspace that the ring is closed only when the ring is
    937	 * not closed
    938	 */
    939	if (mrp->ring_state != BR_MRP_RING_STATE_CLOSED)
    940		br_mrp_ring_port_open(port->dev, false);
    941}
    942
    943/* Determine if the test hdr has a better priority than the node */
    944static bool br_mrp_test_better_than_own(struct br_mrp *mrp,
    945					struct net_bridge *br,
    946					const struct br_mrp_ring_test_hdr *hdr)
    947{
    948	u16 prio = be16_to_cpu(hdr->prio);
    949
    950	if (prio < mrp->prio ||
    951	    (prio == mrp->prio &&
    952	    ether_addr_to_u64(hdr->sa) < ether_addr_to_u64(br->dev->dev_addr)))
    953		return true;
    954
    955	return false;
    956}
    957
    958/* Process only MRP Test frame. All the other MRP frames are processed by
    959 * userspace application
    960 * note: already called with rcu_read_lock
    961 */
    962static void br_mrp_mra_process(struct br_mrp *mrp, struct net_bridge *br,
    963			       struct net_bridge_port *port,
    964			       struct sk_buff *skb)
    965{
    966	const struct br_mrp_ring_test_hdr *test_hdr;
    967	struct br_mrp_ring_test_hdr _test_hdr;
    968	const struct br_mrp_tlv_hdr *hdr;
    969	struct br_mrp_tlv_hdr _hdr;
    970
    971	/* Each MRP header starts with a version field which is 16 bits.
    972	 * Therefore skip the version and get directly the TLV header.
    973	 */
    974	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
    975	if (!hdr)
    976		return;
    977
    978	if (hdr->type != BR_MRP_TLV_HEADER_RING_TEST)
    979		return;
    980
    981	test_hdr = skb_header_pointer(skb, sizeof(uint16_t) + sizeof(_hdr),
    982				      sizeof(_test_hdr), &_test_hdr);
    983	if (!test_hdr)
    984		return;
    985
    986	/* Only frames that have a better priority than the node will
    987	 * clear the miss counter because otherwise the node will need to behave
    988	 * as MRM.
    989	 */
    990	if (br_mrp_test_better_than_own(mrp, br, test_hdr))
    991		mrp->test_count_miss = 0;
    992}
    993
    994/* Process only MRP InTest frame. All the other MRP frames are processed by
    995 * userspace application
    996 * note: already called with rcu_read_lock
    997 */
    998static bool br_mrp_mim_process(struct br_mrp *mrp, struct net_bridge_port *port,
    999			       struct sk_buff *skb)
   1000{
   1001	const struct br_mrp_in_test_hdr *in_hdr;
   1002	struct br_mrp_in_test_hdr _in_hdr;
   1003	const struct br_mrp_tlv_hdr *hdr;
   1004	struct br_mrp_tlv_hdr _hdr;
   1005
   1006	/* Each MRP header starts with a version field which is 16 bits.
   1007	 * Therefore skip the version and get directly the TLV header.
   1008	 */
   1009	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
   1010	if (!hdr)
   1011		return false;
   1012
   1013	/* The check for InTest frame type was already done */
   1014	in_hdr = skb_header_pointer(skb, sizeof(uint16_t) + sizeof(_hdr),
   1015				    sizeof(_in_hdr), &_in_hdr);
   1016	if (!in_hdr)
   1017		return false;
   1018
   1019	/* It needs to process only it's own InTest frames. */
   1020	if (mrp->in_id != ntohs(in_hdr->id))
   1021		return false;
   1022
   1023	mrp->in_test_count_miss = 0;
   1024
   1025	/* Notify the userspace that the ring is closed only when the ring is
   1026	 * not closed
   1027	 */
   1028	if (mrp->in_state != BR_MRP_IN_STATE_CLOSED)
   1029		br_mrp_in_port_open(port->dev, false);
   1030
   1031	return true;
   1032}
   1033
   1034/* Get the MRP frame type
   1035 * note: already called with rcu_read_lock
   1036 */
   1037static u8 br_mrp_get_frame_type(struct sk_buff *skb)
   1038{
   1039	const struct br_mrp_tlv_hdr *hdr;
   1040	struct br_mrp_tlv_hdr _hdr;
   1041
   1042	/* Each MRP header starts with a version field which is 16 bits.
   1043	 * Therefore skip the version and get directly the TLV header.
   1044	 */
   1045	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
   1046	if (!hdr)
   1047		return 0xff;
   1048
   1049	return hdr->type;
   1050}
   1051
   1052static bool br_mrp_mrm_behaviour(struct br_mrp *mrp)
   1053{
   1054	if (mrp->ring_role == BR_MRP_RING_ROLE_MRM ||
   1055	    (mrp->ring_role == BR_MRP_RING_ROLE_MRA && !mrp->test_monitor))
   1056		return true;
   1057
   1058	return false;
   1059}
   1060
   1061static bool br_mrp_mrc_behaviour(struct br_mrp *mrp)
   1062{
   1063	if (mrp->ring_role == BR_MRP_RING_ROLE_MRC ||
   1064	    (mrp->ring_role == BR_MRP_RING_ROLE_MRA && mrp->test_monitor))
   1065		return true;
   1066
   1067	return false;
   1068}
   1069
   1070/* This will just forward the frame to the other mrp ring ports, depending on
   1071 * the frame type, ring role and interconnect role
   1072 * note: already called with rcu_read_lock
   1073 */
   1074static int br_mrp_rcv(struct net_bridge_port *p,
   1075		      struct sk_buff *skb, struct net_device *dev)
   1076{
   1077	struct net_bridge_port *p_port, *s_port, *i_port = NULL;
   1078	struct net_bridge_port *p_dst, *s_dst, *i_dst = NULL;
   1079	struct net_bridge *br;
   1080	struct br_mrp *mrp;
   1081
   1082	/* If port is disabled don't accept any frames */
   1083	if (p->state == BR_STATE_DISABLED)
   1084		return 0;
   1085
   1086	br = p->br;
   1087	mrp =  br_mrp_find_port(br, p);
   1088	if (unlikely(!mrp))
   1089		return 0;
   1090
   1091	p_port = rcu_dereference(mrp->p_port);
   1092	if (!p_port)
   1093		return 0;
   1094	p_dst = p_port;
   1095
   1096	s_port = rcu_dereference(mrp->s_port);
   1097	if (!s_port)
   1098		return 0;
   1099	s_dst = s_port;
   1100
   1101	/* If the frame is a ring frame then it is not required to check the
   1102	 * interconnect role and ports to process or forward the frame
   1103	 */
   1104	if (br_mrp_ring_frame(skb)) {
   1105		/* If the role is MRM then don't forward the frames */
   1106		if (mrp->ring_role == BR_MRP_RING_ROLE_MRM) {
   1107			br_mrp_mrm_process(mrp, p, skb);
   1108			goto no_forward;
   1109		}
   1110
   1111		/* If the role is MRA then don't forward the frames if it
   1112		 * behaves as MRM node
   1113		 */
   1114		if (mrp->ring_role == BR_MRP_RING_ROLE_MRA) {
   1115			if (!mrp->test_monitor) {
   1116				br_mrp_mrm_process(mrp, p, skb);
   1117				goto no_forward;
   1118			}
   1119
   1120			br_mrp_mra_process(mrp, br, p, skb);
   1121		}
   1122
   1123		goto forward;
   1124	}
   1125
   1126	if (br_mrp_in_frame(skb)) {
   1127		u8 in_type = br_mrp_get_frame_type(skb);
   1128
   1129		i_port = rcu_dereference(mrp->i_port);
   1130		i_dst = i_port;
   1131
   1132		/* If the ring port is in block state it should not forward
   1133		 * In_Test frames
   1134		 */
   1135		if (br_mrp_is_ring_port(p_port, s_port, p) &&
   1136		    p->state == BR_STATE_BLOCKING &&
   1137		    in_type == BR_MRP_TLV_HEADER_IN_TEST)
   1138			goto no_forward;
   1139
   1140		/* Nodes that behaves as MRM needs to stop forwarding the
   1141		 * frames in case the ring is closed, otherwise will be a loop.
   1142		 * In this case the frame is no forward between the ring ports.
   1143		 */
   1144		if (br_mrp_mrm_behaviour(mrp) &&
   1145		    br_mrp_is_ring_port(p_port, s_port, p) &&
   1146		    (s_port->state != BR_STATE_FORWARDING ||
   1147		     p_port->state != BR_STATE_FORWARDING)) {
   1148			p_dst = NULL;
   1149			s_dst = NULL;
   1150		}
   1151
   1152		/* A node that behaves as MRC and doesn't have a interconnect
   1153		 * role then it should forward all frames between the ring ports
   1154		 * because it doesn't have an interconnect port
   1155		 */
   1156		if (br_mrp_mrc_behaviour(mrp) &&
   1157		    mrp->in_role == BR_MRP_IN_ROLE_DISABLED)
   1158			goto forward;
   1159
   1160		if (mrp->in_role == BR_MRP_IN_ROLE_MIM) {
   1161			if (in_type == BR_MRP_TLV_HEADER_IN_TEST) {
   1162				/* MIM should not forward it's own InTest
   1163				 * frames
   1164				 */
   1165				if (br_mrp_mim_process(mrp, p, skb)) {
   1166					goto no_forward;
   1167				} else {
   1168					if (br_mrp_is_ring_port(p_port, s_port,
   1169								p))
   1170						i_dst = NULL;
   1171
   1172					if (br_mrp_is_in_port(i_port, p))
   1173						goto no_forward;
   1174				}
   1175			} else {
   1176				/* MIM should forward IntLinkChange/Status and
   1177				 * IntTopoChange between ring ports but MIM
   1178				 * should not forward IntLinkChange/Status and
   1179				 * IntTopoChange if the frame was received at
   1180				 * the interconnect port
   1181				 */
   1182				if (br_mrp_is_ring_port(p_port, s_port, p))
   1183					i_dst = NULL;
   1184
   1185				if (br_mrp_is_in_port(i_port, p))
   1186					goto no_forward;
   1187			}
   1188		}
   1189
   1190		if (mrp->in_role == BR_MRP_IN_ROLE_MIC) {
   1191			/* MIC should forward InTest frames on all ports
   1192			 * regardless of the received port
   1193			 */
   1194			if (in_type == BR_MRP_TLV_HEADER_IN_TEST)
   1195				goto forward;
   1196
   1197			/* MIC should forward IntLinkChange frames only if they
   1198			 * are received on ring ports to all the ports
   1199			 */
   1200			if (br_mrp_is_ring_port(p_port, s_port, p) &&
   1201			    (in_type == BR_MRP_TLV_HEADER_IN_LINK_UP ||
   1202			     in_type == BR_MRP_TLV_HEADER_IN_LINK_DOWN))
   1203				goto forward;
   1204
   1205			/* MIC should forward IntLinkStatus frames only to
   1206			 * interconnect port if it was received on a ring port.
   1207			 * If it is received on interconnect port then, it
   1208			 * should be forward on both ring ports
   1209			 */
   1210			if (br_mrp_is_ring_port(p_port, s_port, p) &&
   1211			    in_type == BR_MRP_TLV_HEADER_IN_LINK_STATUS) {
   1212				p_dst = NULL;
   1213				s_dst = NULL;
   1214			}
   1215
   1216			/* Should forward the InTopo frames only between the
   1217			 * ring ports
   1218			 */
   1219			if (in_type == BR_MRP_TLV_HEADER_IN_TOPO) {
   1220				i_dst = NULL;
   1221				goto forward;
   1222			}
   1223
   1224			/* In all the other cases don't forward the frames */
   1225			goto no_forward;
   1226		}
   1227	}
   1228
   1229forward:
   1230	if (p_dst)
   1231		br_forward(p_dst, skb, true, false);
   1232	if (s_dst)
   1233		br_forward(s_dst, skb, true, false);
   1234	if (i_dst)
   1235		br_forward(i_dst, skb, true, false);
   1236
   1237no_forward:
   1238	return 1;
   1239}
   1240
   1241/* Check if the frame was received on a port that is part of MRP ring
   1242 * and if the frame has MRP eth. In that case process the frame otherwise do
   1243 * normal forwarding.
   1244 * note: already called with rcu_read_lock
   1245 */
   1246static int br_mrp_process(struct net_bridge_port *p, struct sk_buff *skb)
   1247{
   1248	/* If there is no MRP instance do normal forwarding */
   1249	if (likely(!(p->flags & BR_MRP_AWARE)))
   1250		goto out;
   1251
   1252	return br_mrp_rcv(p, skb, p->dev);
   1253out:
   1254	return 0;
   1255}
   1256
   1257bool br_mrp_enabled(struct net_bridge *br)
   1258{
   1259	return !hlist_empty(&br->mrp_list);
   1260}