linux/net/bridge/br_mrp.c
<<
>>
Prefs
   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 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
  20static 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
  29static 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
  45static 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
  61static 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
  77static 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
 101static 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
 120static int br_mrp_next_seq(struct br_mrp *mrp)
 121{
 122        mrp->seq_id++;
 123        return mrp->seq_id;
 124}
 125
 126static 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
 153static 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
 164static 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
 175static 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
 205static 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 */
 245static 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
 307out:
 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 */
 318static 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
 384out:
 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 */
 394static 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 */
 453int 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
 506delete_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 */
 515void 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 */
 529int 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 */
 544int br_mrp_set_port_state(struct net_bridge_port *p,
 545                          enum br_mrp_port_state_type state)
 546{
 547        if (!p || !(p->flags & BR_MRP_AWARE))
 548                return -EINVAL;
 549
 550        spin_lock_bh(&p->br->lock);
 551
 552        if (state == BR_MRP_PORT_STATE_FORWARDING)
 553                p->state = BR_STATE_FORWARDING;
 554        else
 555                p->state = BR_STATE_BLOCKING;
 556
 557        spin_unlock_bh(&p->br->lock);
 558
 559        br_mrp_port_switchdev_set_state(p, state);
 560
 561        return 0;
 562}
 563
 564/* Set port role, port role can be primary or secondary
 565 * note: already called with rtnl_lock
 566 */
 567int br_mrp_set_port_role(struct net_bridge_port *p,
 568                         enum br_mrp_port_role_type role)
 569{
 570        struct br_mrp *mrp;
 571
 572        if (!p || !(p->flags & BR_MRP_AWARE))
 573                return -EINVAL;
 574
 575        mrp = br_mrp_find_port(p->br, p);
 576
 577        if (!mrp)
 578                return -EINVAL;
 579
 580        switch (role) {
 581        case BR_MRP_PORT_ROLE_PRIMARY:
 582                rcu_assign_pointer(mrp->p_port, p);
 583                break;
 584        case BR_MRP_PORT_ROLE_SECONDARY:
 585                rcu_assign_pointer(mrp->s_port, p);
 586                break;
 587        default:
 588                return -EINVAL;
 589        }
 590
 591        br_mrp_port_switchdev_set_role(p, role);
 592
 593        return 0;
 594}
 595
 596/* Set ring state, ring state can be only Open or Closed
 597 * note: already called with rtnl_lock
 598 */
 599int br_mrp_set_ring_state(struct net_bridge *br,
 600                          struct br_mrp_ring_state *state)
 601{
 602        struct br_mrp *mrp = br_mrp_find_id(br, state->ring_id);
 603
 604        if (!mrp)
 605                return -EINVAL;
 606
 607        if (mrp->ring_state == BR_MRP_RING_STATE_CLOSED &&
 608            state->ring_state != BR_MRP_RING_STATE_CLOSED)
 609                mrp->ring_transitions++;
 610
 611        mrp->ring_state = state->ring_state;
 612
 613        br_mrp_switchdev_set_ring_state(br, mrp, state->ring_state);
 614
 615        return 0;
 616}
 617
 618/* Set ring role, ring role can be only MRM(Media Redundancy Manager) or
 619 * MRC(Media Redundancy Client).
 620 * note: already called with rtnl_lock
 621 */
 622int br_mrp_set_ring_role(struct net_bridge *br,
 623                         struct br_mrp_ring_role *role)
 624{
 625        struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id);
 626        int err;
 627
 628        if (!mrp)
 629                return -EINVAL;
 630
 631        mrp->ring_role = role->ring_role;
 632
 633        /* If there is an error just bailed out */
 634        err = br_mrp_switchdev_set_ring_role(br, mrp, role->ring_role);
 635        if (err && err != -EOPNOTSUPP)
 636                return err;
 637
 638        /* Now detect if the HW actually applied the role or not. If the HW
 639         * applied the role it means that the SW will not to do those operations
 640         * anymore. For example if the role ir MRM then the HW will notify the
 641         * SW when ring is open, but if the is not pushed to the HW the SW will
 642         * need to detect when the ring is open
 643         */
 644        mrp->ring_role_offloaded = err == -EOPNOTSUPP ? 0 : 1;
 645
 646        return 0;
 647}
 648
 649/* Start to generate or monitor MRP test frames, the frames are generated by
 650 * HW and if it fails, they are generated by the SW.
 651 * note: already called with rtnl_lock
 652 */
 653int br_mrp_start_test(struct net_bridge *br,
 654                      struct br_mrp_start_test *test)
 655{
 656        struct br_mrp *mrp = br_mrp_find_id(br, test->ring_id);
 657
 658        if (!mrp)
 659                return -EINVAL;
 660
 661        /* Try to push it to the HW and if it fails then continue with SW
 662         * implementation and if that also fails then return error.
 663         */
 664        if (!br_mrp_switchdev_send_ring_test(br, mrp, test->interval,
 665                                             test->max_miss, test->period,
 666                                             test->monitor))
 667                return 0;
 668
 669        mrp->test_interval = test->interval;
 670        mrp->test_end = jiffies + usecs_to_jiffies(test->period);
 671        mrp->test_max_miss = test->max_miss;
 672        mrp->test_monitor = test->monitor;
 673        mrp->test_count_miss = 0;
 674        queue_delayed_work(system_wq, &mrp->test_work,
 675                           usecs_to_jiffies(test->interval));
 676
 677        return 0;
 678}
 679
 680/* Set in state, int state can be only Open or Closed
 681 * note: already called with rtnl_lock
 682 */
 683int br_mrp_set_in_state(struct net_bridge *br, struct br_mrp_in_state *state)
 684{
 685        struct br_mrp *mrp = br_mrp_find_in_id(br, state->in_id);
 686
 687        if (!mrp)
 688                return -EINVAL;
 689
 690        if (mrp->in_state == BR_MRP_IN_STATE_CLOSED &&
 691            state->in_state != BR_MRP_IN_STATE_CLOSED)
 692                mrp->in_transitions++;
 693
 694        mrp->in_state = state->in_state;
 695
 696        br_mrp_switchdev_set_in_state(br, mrp, state->in_state);
 697
 698        return 0;
 699}
 700
 701/* Set in role, in role can be only MIM(Media Interconnection Manager) or
 702 * MIC(Media Interconnection Client).
 703 * note: already called with rtnl_lock
 704 */
 705int br_mrp_set_in_role(struct net_bridge *br, struct br_mrp_in_role *role)
 706{
 707        struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id);
 708        struct net_bridge_port *p;
 709        int err;
 710
 711        if (!mrp)
 712                return -EINVAL;
 713
 714        if (!br_mrp_get_port(br, role->i_ifindex))
 715                return -EINVAL;
 716
 717        if (role->in_role == BR_MRP_IN_ROLE_DISABLED) {
 718                u8 state;
 719
 720                /* It is not allowed to disable a port that doesn't exist */
 721                p = rtnl_dereference(mrp->i_port);
 722                if (!p)
 723                        return -EINVAL;
 724
 725                /* Stop the generating MRP_InTest frames */
 726                cancel_delayed_work_sync(&mrp->in_test_work);
 727                br_mrp_switchdev_send_in_test(br, mrp, 0, 0, 0);
 728
 729                /* Remove the port */
 730                spin_lock_bh(&br->lock);
 731                state = netif_running(br->dev) ?
 732                                BR_STATE_FORWARDING : BR_STATE_DISABLED;
 733                p->state = state;
 734                p->flags &= ~BR_MRP_AWARE;
 735                spin_unlock_bh(&br->lock);
 736                br_mrp_port_switchdev_set_state(p, state);
 737                rcu_assign_pointer(mrp->i_port, NULL);
 738
 739                mrp->in_role = role->in_role;
 740                mrp->in_id = 0;
 741
 742                return 0;
 743        }
 744
 745        /* It is not possible to have the same port part of multiple rings */
 746        if (!br_mrp_unique_ifindex(br, role->i_ifindex))
 747                return -EINVAL;
 748
 749        /* It is not allowed to set a different interconnect port if the mrp
 750         * instance has already one. First it needs to be disabled and after
 751         * that set the new port
 752         */
 753        if (rcu_access_pointer(mrp->i_port))
 754                return -EINVAL;
 755
 756        p = br_mrp_get_port(br, role->i_ifindex);
 757        spin_lock_bh(&br->lock);
 758        p->state = BR_STATE_FORWARDING;
 759        p->flags |= BR_MRP_AWARE;
 760        spin_unlock_bh(&br->lock);
 761        rcu_assign_pointer(mrp->i_port, p);
 762
 763        mrp->in_role = role->in_role;
 764        mrp->in_id = role->in_id;
 765
 766        /* If there is an error just bailed out */
 767        err = br_mrp_switchdev_set_in_role(br, mrp, role->in_id,
 768                                           role->ring_id, role->in_role);
 769        if (err && err != -EOPNOTSUPP)
 770                return err;
 771
 772        /* Now detect if the HW actually applied the role or not. If the HW
 773         * applied the role it means that the SW will not to do those operations
 774         * anymore. For example if the role is MIM then the HW will notify the
 775         * SW when interconnect ring is open, but if the is not pushed to the HW
 776         * the SW will need to detect when the interconnect ring is open.
 777         */
 778        mrp->in_role_offloaded = err == -EOPNOTSUPP ? 0 : 1;
 779
 780        return 0;
 781}
 782
 783/* Start to generate MRP_InTest frames, the frames are generated by
 784 * HW and if it fails, they are generated by the SW.
 785 * note: already called with rtnl_lock
 786 */
 787int br_mrp_start_in_test(struct net_bridge *br,
 788                         struct br_mrp_start_in_test *in_test)
 789{
 790        struct br_mrp *mrp = br_mrp_find_in_id(br, in_test->in_id);
 791
 792        if (!mrp)
 793                return -EINVAL;
 794
 795        if (mrp->in_role != BR_MRP_IN_ROLE_MIM)
 796                return -EINVAL;
 797
 798        /* Try to push it to the HW and if it fails then continue with SW
 799         * implementation and if that also fails then return error.
 800         */
 801        if (!br_mrp_switchdev_send_in_test(br, mrp, in_test->interval,
 802                                           in_test->max_miss, in_test->period))
 803                return 0;
 804
 805        mrp->in_test_interval = in_test->interval;
 806        mrp->in_test_end = jiffies + usecs_to_jiffies(in_test->period);
 807        mrp->in_test_max_miss = in_test->max_miss;
 808        mrp->in_test_count_miss = 0;
 809        queue_delayed_work(system_wq, &mrp->in_test_work,
 810                           usecs_to_jiffies(in_test->interval));
 811
 812        return 0;
 813}
 814
 815/* Determin if the frame type is a ring frame */
 816static bool br_mrp_ring_frame(struct sk_buff *skb)
 817{
 818        const struct br_mrp_tlv_hdr *hdr;
 819        struct br_mrp_tlv_hdr _hdr;
 820
 821        hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 822        if (!hdr)
 823                return false;
 824
 825        if (hdr->type == BR_MRP_TLV_HEADER_RING_TEST ||
 826            hdr->type == BR_MRP_TLV_HEADER_RING_TOPO ||
 827            hdr->type == BR_MRP_TLV_HEADER_RING_LINK_DOWN ||
 828            hdr->type == BR_MRP_TLV_HEADER_RING_LINK_UP ||
 829            hdr->type == BR_MRP_TLV_HEADER_OPTION)
 830                return true;
 831
 832        return false;
 833}
 834
 835/* Determin if the frame type is an interconnect frame */
 836static bool br_mrp_in_frame(struct sk_buff *skb)
 837{
 838        const struct br_mrp_tlv_hdr *hdr;
 839        struct br_mrp_tlv_hdr _hdr;
 840
 841        hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 842        if (!hdr)
 843                return false;
 844
 845        if (hdr->type == BR_MRP_TLV_HEADER_IN_TEST ||
 846            hdr->type == BR_MRP_TLV_HEADER_IN_TOPO ||
 847            hdr->type == BR_MRP_TLV_HEADER_IN_LINK_DOWN ||
 848            hdr->type == BR_MRP_TLV_HEADER_IN_LINK_UP)
 849                return true;
 850
 851        return false;
 852}
 853
 854/* Process only MRP Test frame. All the other MRP frames are processed by
 855 * userspace application
 856 * note: already called with rcu_read_lock
 857 */
 858static void br_mrp_mrm_process(struct br_mrp *mrp, struct net_bridge_port *port,
 859                               struct sk_buff *skb)
 860{
 861        const struct br_mrp_tlv_hdr *hdr;
 862        struct br_mrp_tlv_hdr _hdr;
 863
 864        /* Each MRP header starts with a version field which is 16 bits.
 865         * Therefore skip the version and get directly the TLV header.
 866         */
 867        hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 868        if (!hdr)
 869                return;
 870
 871        if (hdr->type != BR_MRP_TLV_HEADER_RING_TEST)
 872                return;
 873
 874        mrp->test_count_miss = 0;
 875
 876        /* Notify the userspace that the ring is closed only when the ring is
 877         * not closed
 878         */
 879        if (mrp->ring_state != BR_MRP_RING_STATE_CLOSED)
 880                br_mrp_ring_port_open(port->dev, false);
 881}
 882
 883/* Determin if the test hdr has a better priority than the node */
 884static bool br_mrp_test_better_than_own(struct br_mrp *mrp,
 885                                        struct net_bridge *br,
 886                                        const struct br_mrp_ring_test_hdr *hdr)
 887{
 888        u16 prio = be16_to_cpu(hdr->prio);
 889
 890        if (prio < mrp->prio ||
 891            (prio == mrp->prio &&
 892            ether_addr_to_u64(hdr->sa) < ether_addr_to_u64(br->dev->dev_addr)))
 893                return true;
 894
 895        return false;
 896}
 897
 898/* Process only MRP Test frame. All the other MRP frames are processed by
 899 * userspace application
 900 * note: already called with rcu_read_lock
 901 */
 902static void br_mrp_mra_process(struct br_mrp *mrp, struct net_bridge *br,
 903                               struct net_bridge_port *port,
 904                               struct sk_buff *skb)
 905{
 906        const struct br_mrp_ring_test_hdr *test_hdr;
 907        struct br_mrp_ring_test_hdr _test_hdr;
 908        const struct br_mrp_tlv_hdr *hdr;
 909        struct br_mrp_tlv_hdr _hdr;
 910
 911        /* Each MRP header starts with a version field which is 16 bits.
 912         * Therefore skip the version and get directly the TLV header.
 913         */
 914        hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 915        if (!hdr)
 916                return;
 917
 918        if (hdr->type != BR_MRP_TLV_HEADER_RING_TEST)
 919                return;
 920
 921        test_hdr = skb_header_pointer(skb, sizeof(uint16_t) + sizeof(_hdr),
 922                                      sizeof(_test_hdr), &_test_hdr);
 923        if (!test_hdr)
 924                return;
 925
 926        /* Only frames that have a better priority than the node will
 927         * clear the miss counter because otherwise the node will need to behave
 928         * as MRM.
 929         */
 930        if (br_mrp_test_better_than_own(mrp, br, test_hdr))
 931                mrp->test_count_miss = 0;
 932}
 933
 934/* Process only MRP InTest frame. All the other MRP frames are processed by
 935 * userspace application
 936 * note: already called with rcu_read_lock
 937 */
 938static bool br_mrp_mim_process(struct br_mrp *mrp, struct net_bridge_port *port,
 939                               struct sk_buff *skb)
 940{
 941        const struct br_mrp_in_test_hdr *in_hdr;
 942        struct br_mrp_in_test_hdr _in_hdr;
 943        const struct br_mrp_tlv_hdr *hdr;
 944        struct br_mrp_tlv_hdr _hdr;
 945
 946        /* Each MRP header starts with a version field which is 16 bits.
 947         * Therefore skip the version and get directly the TLV header.
 948         */
 949        hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 950        if (!hdr)
 951                return false;
 952
 953        /* The check for InTest frame type was already done */
 954        in_hdr = skb_header_pointer(skb, sizeof(uint16_t) + sizeof(_hdr),
 955                                    sizeof(_in_hdr), &_in_hdr);
 956        if (!in_hdr)
 957                return false;
 958
 959        /* It needs to process only it's own InTest frames. */
 960        if (mrp->in_id != ntohs(in_hdr->id))
 961                return false;
 962
 963        mrp->in_test_count_miss = 0;
 964
 965        /* Notify the userspace that the ring is closed only when the ring is
 966         * not closed
 967         */
 968        if (mrp->in_state != BR_MRP_IN_STATE_CLOSED)
 969                br_mrp_in_port_open(port->dev, false);
 970
 971        return true;
 972}
 973
 974/* Get the MRP frame type
 975 * note: already called with rcu_read_lock
 976 */
 977static u8 br_mrp_get_frame_type(struct sk_buff *skb)
 978{
 979        const struct br_mrp_tlv_hdr *hdr;
 980        struct br_mrp_tlv_hdr _hdr;
 981
 982        /* Each MRP header starts with a version field which is 16 bits.
 983         * Therefore skip the version and get directly the TLV header.
 984         */
 985        hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 986        if (!hdr)
 987                return 0xff;
 988
 989        return hdr->type;
 990}
 991
 992static bool br_mrp_mrm_behaviour(struct br_mrp *mrp)
 993{
 994        if (mrp->ring_role == BR_MRP_RING_ROLE_MRM ||
 995            (mrp->ring_role == BR_MRP_RING_ROLE_MRA && !mrp->test_monitor))
 996                return true;
 997
 998        return false;
 999}
1000
1001static bool br_mrp_mrc_behaviour(struct br_mrp *mrp)
1002{
1003        if (mrp->ring_role == BR_MRP_RING_ROLE_MRC ||
1004            (mrp->ring_role == BR_MRP_RING_ROLE_MRA && mrp->test_monitor))
1005                return true;
1006
1007        return false;
1008}
1009
1010/* This will just forward the frame to the other mrp ring ports, depending on
1011 * the frame type, ring role and interconnect role
1012 * note: already called with rcu_read_lock
1013 */
1014static int br_mrp_rcv(struct net_bridge_port *p,
1015                      struct sk_buff *skb, struct net_device *dev)
1016{
1017        struct net_bridge_port *p_port, *s_port, *i_port = NULL;
1018        struct net_bridge_port *p_dst, *s_dst, *i_dst = NULL;
1019        struct net_bridge *br;
1020        struct br_mrp *mrp;
1021
1022        /* If port is disabled don't accept any frames */
1023        if (p->state == BR_STATE_DISABLED)
1024                return 0;
1025
1026        br = p->br;
1027        mrp =  br_mrp_find_port(br, p);
1028        if (unlikely(!mrp))
1029                return 0;
1030
1031        p_port = rcu_dereference(mrp->p_port);
1032        if (!p_port)
1033                return 0;
1034        p_dst = p_port;
1035
1036        s_port = rcu_dereference(mrp->s_port);
1037        if (!s_port)
1038                return 0;
1039        s_dst = s_port;
1040
1041        /* If the frame is a ring frame then it is not required to check the
1042         * interconnect role and ports to process or forward the frame
1043         */
1044        if (br_mrp_ring_frame(skb)) {
1045                /* If the role is MRM then don't forward the frames */
1046                if (mrp->ring_role == BR_MRP_RING_ROLE_MRM) {
1047                        br_mrp_mrm_process(mrp, p, skb);
1048                        goto no_forward;
1049                }
1050
1051                /* If the role is MRA then don't forward the frames if it
1052                 * behaves as MRM node
1053                 */
1054                if (mrp->ring_role == BR_MRP_RING_ROLE_MRA) {
1055                        if (!mrp->test_monitor) {
1056                                br_mrp_mrm_process(mrp, p, skb);
1057                                goto no_forward;
1058                        }
1059
1060                        br_mrp_mra_process(mrp, br, p, skb);
1061                }
1062
1063                goto forward;
1064        }
1065
1066        if (br_mrp_in_frame(skb)) {
1067                u8 in_type = br_mrp_get_frame_type(skb);
1068
1069                i_port = rcu_dereference(mrp->i_port);
1070                i_dst = i_port;
1071
1072                /* If the ring port is in block state it should not forward
1073                 * In_Test frames
1074                 */
1075                if (br_mrp_is_ring_port(p_port, s_port, p) &&
1076                    p->state == BR_STATE_BLOCKING &&
1077                    in_type == BR_MRP_TLV_HEADER_IN_TEST)
1078                        goto no_forward;
1079
1080                /* Nodes that behaves as MRM needs to stop forwarding the
1081                 * frames in case the ring is closed, otherwise will be a loop.
1082                 * In this case the frame is no forward between the ring ports.
1083                 */
1084                if (br_mrp_mrm_behaviour(mrp) &&
1085                    br_mrp_is_ring_port(p_port, s_port, p) &&
1086                    (s_port->state != BR_STATE_FORWARDING ||
1087                     p_port->state != BR_STATE_FORWARDING)) {
1088                        p_dst = NULL;
1089                        s_dst = NULL;
1090                }
1091
1092                /* A node that behaves as MRC and doesn't have a interconnect
1093                 * role then it should forward all frames between the ring ports
1094                 * because it doesn't have an interconnect port
1095                 */
1096                if (br_mrp_mrc_behaviour(mrp) &&
1097                    mrp->in_role == BR_MRP_IN_ROLE_DISABLED)
1098                        goto forward;
1099
1100                if (mrp->in_role == BR_MRP_IN_ROLE_MIM) {
1101                        if (in_type == BR_MRP_TLV_HEADER_IN_TEST) {
1102                                /* MIM should not forward it's own InTest
1103                                 * frames
1104                                 */
1105                                if (br_mrp_mim_process(mrp, p, skb)) {
1106                                        goto no_forward;
1107                                } else {
1108                                        if (br_mrp_is_ring_port(p_port, s_port,
1109                                                                p))
1110                                                i_dst = NULL;
1111
1112                                        if (br_mrp_is_in_port(i_port, p))
1113                                                goto no_forward;
1114                                }
1115                        } else {
1116                                /* MIM should forward IntLinkChange and
1117                                 * IntTopoChange between ring ports but MIM
1118                                 * should not forward IntLinkChange and
1119                                 * IntTopoChange if the frame was received at
1120                                 * the interconnect port
1121                                 */
1122                                if (br_mrp_is_ring_port(p_port, s_port, p))
1123                                        i_dst = NULL;
1124
1125                                if (br_mrp_is_in_port(i_port, p))
1126                                        goto no_forward;
1127                        }
1128                }
1129
1130                if (mrp->in_role == BR_MRP_IN_ROLE_MIC) {
1131                        /* MIC should forward InTest frames on all ports
1132                         * regardless of the received port
1133                         */
1134                        if (in_type == BR_MRP_TLV_HEADER_IN_TEST)
1135                                goto forward;
1136
1137                        /* MIC should forward IntLinkChange frames only if they
1138                         * are received on ring ports to all the ports
1139                         */
1140                        if (br_mrp_is_ring_port(p_port, s_port, p) &&
1141                            (in_type == BR_MRP_TLV_HEADER_IN_LINK_UP ||
1142                             in_type == BR_MRP_TLV_HEADER_IN_LINK_DOWN))
1143                                goto forward;
1144
1145                        /* Should forward the InTopo frames only between the
1146                         * ring ports
1147                         */
1148                        if (in_type == BR_MRP_TLV_HEADER_IN_TOPO) {
1149                                i_dst = NULL;
1150                                goto forward;
1151                        }
1152
1153                        /* In all the other cases don't forward the frames */
1154                        goto no_forward;
1155                }
1156        }
1157
1158forward:
1159        if (p_dst)
1160                br_forward(p_dst, skb, true, false);
1161        if (s_dst)
1162                br_forward(s_dst, skb, true, false);
1163        if (i_dst)
1164                br_forward(i_dst, skb, true, false);
1165
1166no_forward:
1167        return 1;
1168}
1169
1170/* Check if the frame was received on a port that is part of MRP ring
1171 * and if the frame has MRP eth. In that case process the frame otherwise do
1172 * normal forwarding.
1173 * note: already called with rcu_read_lock
1174 */
1175int br_mrp_process(struct net_bridge_port *p, struct sk_buff *skb)
1176{
1177        /* If there is no MRP instance do normal forwarding */
1178        if (likely(!(p->flags & BR_MRP_AWARE)))
1179                goto out;
1180
1181        if (unlikely(skb->protocol == htons(ETH_P_MRP)))
1182                return br_mrp_rcv(p, skb, p->dev);
1183
1184out:
1185        return 0;
1186}
1187
1188bool br_mrp_enabled(struct net_bridge *br)
1189{
1190        return !list_empty(&br->mrp_list);
1191}
1192