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