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