On 23/11/2020 13:14, Horatiu Vultur wrote:
> Extend MRP to support LC mode(link check) for the interconnect port.
> This applies only to the interconnect ring.
> 
> Opposite to RC mode(ring check) the LC mode is using CFM frames to
> detect when the link goes up or down and based on that the userspace
> will need to react.
> One advantage of the LC mode over RC mode is that there will be fewer
> frames in the normal rings. Because RC mode generates InTest on all
> ports while LC mode sends CFM frame only on the interconnect port.
> 
> All 4 nodes part of the interconnect ring needs to have the same mode.
> And it is not possible to have running LC and RC mode at the same time
> on a node.
> 
> Whenever the MIM starts it needs to detect the status of the other 3
> nodes in the interconnect ring so it would send a frame called
> InLinkStatus, on which the clients needs to reply with their link
> status.
> 
> This patch adds the frame header for the frame InLinkStatus and
> extends existing rules on how to forward this frame.
> 
> Signed-off-by: Horatiu Vultur <horatiu.vul...@microchip.com>
> ---
>  include/uapi/linux/mrp_bridge.h |  7 +++++++
>  net/bridge/br_mrp.c             | 18 +++++++++++++++---
>  2 files changed, 22 insertions(+), 3 deletions(-)
> 

Hi Horatiu,
The patch looks good overall, just one question below.

> diff --git a/include/uapi/linux/mrp_bridge.h b/include/uapi/linux/mrp_bridge.h
> index 6aeb13ef0b1e..450f6941a5a1 100644
> --- a/include/uapi/linux/mrp_bridge.h
> +++ b/include/uapi/linux/mrp_bridge.h
> @@ -61,6 +61,7 @@ enum br_mrp_tlv_header_type {
>       BR_MRP_TLV_HEADER_IN_TOPO = 0x7,
>       BR_MRP_TLV_HEADER_IN_LINK_DOWN = 0x8,
>       BR_MRP_TLV_HEADER_IN_LINK_UP = 0x9,
> +     BR_MRP_TLV_HEADER_IN_LINK_STATUS = 0xa,
>       BR_MRP_TLV_HEADER_OPTION = 0x7f,
>  };
>  
> @@ -156,4 +157,10 @@ struct br_mrp_in_link_hdr {
>       __be16 interval;
>  };
>  
> +struct br_mrp_in_link_status_hdr {
> +     __u8 sa[ETH_ALEN];
> +     __be16 port_role;
> +     __be16 id;
> +};
> +

I didn't see this struct used anywhere, am I missing anything?

Cheers,
 Nik

>  #endif
> diff --git a/net/bridge/br_mrp.c b/net/bridge/br_mrp.c
> index bb12fbf9aaf2..cec2c4e4561d 100644
> --- a/net/bridge/br_mrp.c
> +++ b/net/bridge/br_mrp.c
> @@ -858,7 +858,8 @@ static bool br_mrp_in_frame(struct sk_buff *skb)
>       if (hdr->type == BR_MRP_TLV_HEADER_IN_TEST ||
>           hdr->type == BR_MRP_TLV_HEADER_IN_TOPO ||
>           hdr->type == BR_MRP_TLV_HEADER_IN_LINK_DOWN ||
> -         hdr->type == BR_MRP_TLV_HEADER_IN_LINK_UP)
> +         hdr->type == BR_MRP_TLV_HEADER_IN_LINK_UP ||
> +         hdr->type == BR_MRP_TLV_HEADER_IN_LINK_STATUS)
>               return true;
>  
>       return false;
> @@ -1126,9 +1127,9 @@ static int br_mrp_rcv(struct net_bridge_port *p,
>                                               goto no_forward;
>                               }
>                       } else {
> -                             /* MIM should forward IntLinkChange and
> +                             /* MIM should forward IntLinkChange/Status and
>                                * IntTopoChange between ring ports but MIM
> -                              * should not forward IntLinkChange and
> +                              * should not forward IntLinkChange/Status and
>                                * IntTopoChange if the frame was received at
>                                * the interconnect port
>                                */
> @@ -1155,6 +1156,17 @@ static int br_mrp_rcv(struct net_bridge_port *p,
>                            in_type == BR_MRP_TLV_HEADER_IN_LINK_DOWN))
>                               goto forward;
>  
> +                     /* MIC should forward IntLinkStatus frames only to
> +                      * interconnect port if it was received on a ring port.
> +                      * If it is received on interconnect port then, it
> +                      * should be forward on both ring ports
> +                      */
> +                     if (br_mrp_is_ring_port(p_port, s_port, p) &&
> +                         in_type == BR_MRP_TLV_HEADER_IN_LINK_STATUS) {
> +                             p_dst = NULL;
> +                             s_dst = NULL;
> +                     }
> +
>                       /* Should forward the InTopo frames only between the
>                        * ring ports
>                        */
> 

Reply via email to