@@ -144,6 +144,8 @@ static void __mdb_entry_fill_flags(struct br_mdb_entry *e, unsigned char flags)
144144 e -> flags |= MDB_FLAGS_STAR_EXCL ;
145145 if (flags & MDB_PG_FLAGS_BLOCKED )
146146 e -> flags |= MDB_FLAGS_BLOCKED ;
147+ if (flags & MDB_PG_FLAGS_OFFLOAD_FAILED )
148+ e -> flags |= MDB_FLAGS_OFFLOAD_FAILED ;
147149}
148150
149151static void __mdb_entry_to_br_ip (struct br_mdb_entry * entry , struct br_ip * ip ,
@@ -517,16 +519,17 @@ static size_t rtnl_mdb_nlmsg_size(const struct net_bridge_port_group *pg)
517519 rtnl_mdb_nlmsg_pg_size (pg );
518520}
519521
520- void br_mdb_notify (struct net_device * dev ,
521- struct net_bridge_mdb_entry * mp ,
522- struct net_bridge_port_group * pg ,
523- int type )
522+ static void __br_mdb_notify (struct net_device * dev ,
523+ struct net_bridge_mdb_entry * mp ,
524+ struct net_bridge_port_group * pg ,
525+ int type , bool notify_switchdev )
524526{
525527 struct net * net = dev_net (dev );
526528 struct sk_buff * skb ;
527529 int err = - ENOBUFS ;
528530
529- br_switchdev_mdb_notify (dev , mp , pg , type );
531+ if (notify_switchdev )
532+ br_switchdev_mdb_notify (dev , mp , pg , type );
530533
531534 skb = nlmsg_new (rtnl_mdb_nlmsg_size (pg ), GFP_ATOMIC );
532535 if (!skb )
@@ -544,6 +547,21 @@ void br_mdb_notify(struct net_device *dev,
544547 rtnl_set_sk_err (net , RTNLGRP_MDB , err );
545548}
546549
550+ void br_mdb_notify (struct net_device * dev ,
551+ struct net_bridge_mdb_entry * mp ,
552+ struct net_bridge_port_group * pg ,
553+ int type )
554+ {
555+ __br_mdb_notify (dev , mp , pg , type , true);
556+ }
557+
558+ void br_mdb_flag_change_notify (struct net_device * dev ,
559+ struct net_bridge_mdb_entry * mp ,
560+ struct net_bridge_port_group * pg )
561+ {
562+ __br_mdb_notify (dev , mp , pg , RTM_NEWMDB , false);
563+ }
564+
547565static int nlmsg_populate_rtr_fill (struct sk_buff * skb ,
548566 struct net_device * dev ,
549567 int ifindex , u16 vid , u32 pid ,
@@ -1040,7 +1058,7 @@ static int br_mdb_add_group(const struct br_mdb_config *cfg,
10401058
10411059 /* host join */
10421060 if (!port ) {
1043- if (mp -> host_joined ) {
1061+ if (mp -> host_joined && !( cfg -> nlflags & NLM_F_REPLACE ) ) {
10441062 NL_SET_ERR_MSG_MOD (extack , "Group is already joined by host" );
10451063 return - EEXIST ;
10461064 }
0 commit comments