15 Jul, 2020

5 commits

  • Thie patch adds support for MRP Interconnect. Similar with the MRP ring,
    if the HW can't generate MRP_InTest frames, then the SW will try to
    generate them. And if also the SW fails to generate the frames then an
    error is return to userspace.

    The forwarding/termination of MRP_In frames is happening in the kernel
    and is done by MRP instances.

    Signed-off-by: Horatiu Vultur
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Horatiu Vultur
     
  • Implement the MRP API for interconnect switchdev. Similar with the other
    br_mrp_switchdev function, these function will just eventually call the
    switchdev functions: switchdev_port_obj_add/del.

    Signed-off-by: Horatiu Vultur
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Horatiu Vultur
     
  • This function notifies the userspace when the node lost the continuity
    of MRP_InTest frames.

    Signed-off-by: Horatiu Vultur
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Horatiu Vultur
     
  • This patch renames the function br_mrp_port_open to
    br_mrp_ring_port_open. In this way is more clear that a ring port lost
    the continuity because there will be also a br_mrp_in_port_open.

    Signed-off-by: Horatiu Vultur
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Horatiu Vultur
     
  • This patch extends the 'struct br_mrp' to contain information regarding
    the MRP interconnect. It contains the following:
    - the interconnect port 'i_port', which is NULL if the node doesn't have
    a interconnect role
    - the interconnect id, which is similar with the ring id, but this field
    is also part of the MRP_InTest frames.
    - the interconnect role, which can be MIM or MIC.
    - the interconnect state, which can be open or closed.
    - the interconnect delayed_work for sending MRP_InTest frames and check
    for lost of continuity.

    Signed-off-by: Horatiu Vultur
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Horatiu Vultur
     

29 Jun, 2020

1 commit

  • The following sparse warnings are fixed:
    net/bridge/br_mrp.c:106:18: warning: incorrect type in assignment (different base types)
    net/bridge/br_mrp.c:106:18: expected unsigned short [usertype]
    net/bridge/br_mrp.c:106:18: got restricted __be16 [usertype]
    net/bridge/br_mrp.c:281:23: warning: incorrect type in argument 1 (different modifiers)
    net/bridge/br_mrp.c:281:23: expected struct list_head *entry
    net/bridge/br_mrp.c:281:23: got struct list_head [noderef] *
    net/bridge/br_mrp.c:332:28: warning: incorrect type in argument 1 (different modifiers)
    net/bridge/br_mrp.c:332:28: expected struct list_head *new
    net/bridge/br_mrp.c:332:28: got struct list_head [noderef] *
    net/bridge/br_mrp.c:332:40: warning: incorrect type in argument 2 (different modifiers)
    net/bridge/br_mrp.c:332:40: expected struct list_head *head
    net/bridge/br_mrp.c:332:40: got struct list_head [noderef] *
    net/bridge/br_mrp.c:682:29: warning: incorrect type in argument 1 (different modifiers)
    net/bridge/br_mrp.c:682:29: expected struct list_head const *head
    net/bridge/br_mrp.c:682:29: got struct list_head [noderef] *

    Reported-by: kernel test robot
    Fixes: 2f1a11ae11d222 ("bridge: mrp: Add MRP interface.")
    Fixes: 4b8d7d4c599182 ("bridge: mrp: Extend bridge interface")
    Fixes: 9a9f26e8f7ea30 ("bridge: mrp: Connect MRP API with the switchdev API")
    Signed-off-by: Horatiu Vultur
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Horatiu Vultur
     

02 Jun, 2020

2 commits

  • A node that has the MRA role, it can behave as MRM or MRC.

    Initially it starts as MRM and sends MRP_Test frames on both ring ports.
    If it detects that there are MRP_Test send by another MRM, then it
    checks if these frames have a lower priority than itself. In this case
    it would send MRP_Nack frames to notify the other node that it needs to
    stop sending MRP_Test frames.
    If it receives a MRP_Nack frame then it stops sending MRP_Test frames
    and starts to behave as a MRC but it would continue to monitor the
    MRP_Test frames send by MRM. If at a point the MRM stops to send
    MRP_Test frames it would get the MRM role and start to send MRP_Test
    frames.

    Signed-off-by: Horatiu Vultur
    Signed-off-by: David S. Miller

    Horatiu Vultur
     
  • Each MRP instance has a priority, a lower value means a higher priority.
    The priority of MRP instance is stored in MRP_Test frame in this way
    all the MRP nodes in the ring can see other nodes priority.

    Signed-off-by: Horatiu Vultur
    Signed-off-by: David S. Miller

    Horatiu Vultur
     

28 May, 2020

1 commit

  • This patch reworks the MRP netlink interface. Before, each attribute
    represented a binary structure which made it hard to be extended.
    Therefore update the MRP netlink interface such that each existing
    attribute to be a nested attribute which contains the fields of the
    binary structures.
    In this way the MRP netlink interface can be extended without breaking
    the backwards compatibility. It is also using strict checking for
    attributes under the MRP top attribute.

    Signed-off-by: Horatiu Vultur
    Acked-by: Nikolay Aleksandrov
    Signed-off-by: David S. Miller

    Horatiu Vultur
     

28 Apr, 2020

1 commit

  • Define the MRP interface.
    This interface is used by the netlink to update the MRP instances and by the MRP
    to make the calls to switchdev to offload it to HW.

    It defines an MRP instance 'struct br_mrp' which is a list of MRP instances.
    Which will be part of the 'struct net_bridge'. Each instance has 2 ring ports,
    a bridge and an ID.

    In case the HW can't generate MRP Test frames then the SW will generate those.

    br_mrp_add - adds a new MRP instance.

    br_mrp_del - deletes an existing MRP instance. Each instance has an ID(ring_id).

    br_mrp_set_port_state - changes the port state. The port can be in forwarding
    state, which means that the frames can pass through or in blocked state which
    means that the frames can't pass through except MRP frames. This will
    eventually call the switchdev API to notify the HW. This information is used
    also by the SW bridge to know how to forward frames in case the HW doesn't
    have this capability.

    br_mrp_set_port_role - a port role can be primary or secondary. This
    information is required to be pushed to HW in case the HW can generate
    MRP_Test frames. Because the MRP_Test frames contains a file with this
    information. Otherwise the HW will not be able to generate the frames
    correctly.

    br_mrp_set_ring_state - a ring can be in state open or closed. State open means
    that the mrp port stopped receiving MRP_Test frames, while closed means that
    the mrp port received MRP_Test frames. Similar with br_mrp_port_role, this
    information is pushed in HW because the MRP_Test frames contain this
    information.

    br_mrp_set_ring_role - a ring can have the following roles MRM or MRC. For the
    role MRM it is expected that the HW can terminate the MRP frames, notify the
    SW that it stopped receiving MRP_Test frames and trapp all the other MRP
    frames. While for MRC mode it is expected that the HW can forward the MRP
    frames only between the MRP ports and copy MRP_Topology frames to CPU. In
    case the HW doesn't support a role it needs to return an error code different
    than -EOPNOTSUPP.

    br_mrp_start_test - this starts/stops the generation of MRP_Test frames. To stop
    the generation of frames the interval needs to have a value of 0. In this case
    the userspace needs to know if the HW supports this or not. Not to have
    duplicate frames(generated by HW and SW). Because if the HW supports this then
    the SW will not generate anymore frames and will expect that the HW will
    notify when it stopped receiving MRP frames using the function
    br_mrp_port_open.

    br_mrp_port_open - this function is used by drivers to notify the userspace via
    a netlink callback that one of the ports stopped receiving MRP_Test frames.
    This function is called only when the node has the role MRM. It is not
    supposed to be called from userspace.

    br_mrp_port_switchdev_add - this corresponds to the function br_mrp_add,
    and will notify the HW that a MRP instance is added. The function gets
    as parameter the MRP instance.

    br_mrp_port_switchdev_del - this corresponds to the function br_mrp_del,
    and will notify the HW that a MRP instance is removed. The function
    gets as parameter the ID of the MRP instance that is removed.

    br_mrp_port_switchdev_set_state - this corresponds to the function
    br_mrp_set_port_state. It would notify the HW if it should block or not
    non-MRP frames.

    br_mrp_port_switchdev_set_port - this corresponds to the function
    br_mrp_set_port_role. It would set the port role, primary or secondary.

    br_mrp_switchdev_set_role - this corresponds to the function
    br_mrp_set_ring_role and would set one of the role MRM or MRC.

    br_mrp_switchdev_set_ring_state - this corresponds to the function
    br_mrp_set_ring_state and would set the ring to be open or closed.

    br_mrp_switchdev_send_ring_test - this corresponds to the function
    br_mrp_start_test. This will notify the HW to start or stop generating
    MRP_Test frames. Value 0 for the interval parameter means to stop generating
    the frames.

    br_mrp_port_open - this function is used to notify the userspace that the port
    lost the continuity of MRP Test frames.

    Reviewed-by: Nikolay Aleksandrov
    Signed-off-by: Horatiu Vultur
    Signed-off-by: David S. Miller

    Horatiu Vultur