On Thu, 2020-10-01 at 10:30 +0000, Henrik Bjoernlund wrote: > This patch extends the processing of frames in the bridge. Currently MRP > frames needs special processing and the current implementation doesn't > allow a nice way to process different frame types. Therefore try to > improve this by adding a list that contains frame types that need > special processing. This list is iterated for each input frame and if > there is a match based on frame type then these functions will be called > and decide what to do with the frame. It can process the frame then the > bridge doesn't need to do anything or don't process so then the bridge > will do normal forwarding. > > Reviewed-by: Horatiu Vultur <horatiu.vultur@xxxxxxxxxxxxx> > Signed-off-by: Henrik Bjoernlund <henrik.bjoernlund@xxxxxxxxxxxxx> > --- > net/bridge/br_device.c | 1 + > net/bridge/br_input.c | 31 ++++++++++++++++++++++++++++++- > net/bridge/br_mrp.c | 19 +++++++++++++++---- > net/bridge/br_private.h | 18 ++++++++++++------ > 4 files changed, 58 insertions(+), 11 deletions(-) > Hi, Mostly looks good, one comment below. > diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c > index 9a2fb4aa1a10..206c4ba51cd2 100644 > --- a/net/bridge/br_device.c > +++ b/net/bridge/br_device.c > [snip] > @@ -380,3 +395,17 @@ rx_handler_func_t *br_get_rx_handler(const struct net_device *dev) > > return br_handle_frame; > } > + > +void br_add_frame(struct net_bridge *br, struct br_frame_type *ft) > +{ > + hlist_add_head_rcu(&ft->list, &br->frame_type_list); > +} > + > +void br_del_frame(struct net_bridge *br, struct br_frame_type *ft) > +{ > + struct br_frame_type *tmp; > + > + hlist_for_each_entry(tmp, &br->frame_type_list, list) > + if (ft == tmp) > + hlist_del_rcu(&ft->list); This hasn't crashed only because you're using hlist_del_rcu(), otherwise it's wrong. You should use hlist_for_each_entry_safe() when deleting from the list while walking it or you should end the walk after the delete since there can't be two elements with the same address anyway. Thanks, Nik