Message ID | 1417084826-9875-15-git-send-email-jiri@resnulli.us |
---|---|
State | Superseded, archived |
Delegated to: | David Miller |
Headers | show |
On 11/27/14 05:40, Jiri Pirko wrote: > From: Scott Feldman <sfeldma@gmail.com> > > To allow brport device to return current brport flags set on port. Add > returned flags to nested IFLA_PROTINFO netlink msg built in dflt getlink. > With this change, netlink msg returned for bridge_getlink contains the port's > offloaded flag settings (the port's SELF settings). Am i missing something or we already have this stuff showing up in user space today? cheers, jamal -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 11/27/14 08:17, Jamal Hadi Salim wrote: > On 11/27/14 05:40, Jiri Pirko wrote: >> From: Scott Feldman <sfeldma@gmail.com> >> >> To allow brport device to return current brport flags set on port. Add >> returned flags to nested IFLA_PROTINFO netlink msg built in dflt getlink. >> With this change, netlink msg returned for bridge_getlink contains the >> port's >> offloaded flag settings (the port's SELF settings). > > Am i missing something or we already have this stuff showing up in user > space today? > Sorry, in events it does but for some reason not in the GETs even though trying to trace the code ndo_bridge_getlink() i couldnt tell off hand why it is not showing up. look at: br_port_fill_attrs() and its callers. cheers, jamal -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Nov 27, 2014 at 3:17 AM, Jamal Hadi Salim <jhs@mojatatu.com> wrote: > On 11/27/14 05:40, Jiri Pirko wrote: >> >> From: Scott Feldman <sfeldma@gmail.com> >> >> To allow brport device to return current brport flags set on port. Add >> returned flags to nested IFLA_PROTINFO netlink msg built in dflt getlink. >> With this change, netlink msg returned for bridge_getlink contains the >> port's >> offloaded flag settings (the port's SELF settings). > > > Am i missing something or we already have this stuff showing up in user > space today? For RTM_GETLINK, rtnl_bridge_getlink() calls ndo_bridge_getlink twice for each dev, once on bridge and second time on dev. Each call adds an RTM_NEWLINK to skb. For the ndo_bridge_getlink() call to bridge, the MASTER port flags are filled in using br_port_fill_attr(). For the second ndo_bridge_getlink() call to dev, the port driver calls ndo_dflt_bridge_getlink() which fills in the SELF port flags. Before this patch, ndo_dflt_bridge_getlink() was only filling in hwmode. Whew, in any case, I think you'll agree this code needs a refactoring down the road. This change is just the bare minimum building on what's there to get SELF port flags up to user-space. A refactoring effort should get the port drivers out of parsing/filling netlink msg and leave that to the core code in rtnetlink.c. That way we can have one place for policy checks and one place for fill. I think this refactoring effort should be left out in this patch series, otherwise this is going to drag on into the next year. > > cheers, > jamal -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 11/27/14 15:46, Scott Feldman wrote: > On Thu, Nov 27, 2014 at 3:17 AM, Jamal Hadi Salim <jhs@mojatatu.com> wrote: > > For RTM_GETLINK, rtnl_bridge_getlink() calls ndo_bridge_getlink twice > for each dev, once on bridge and second time on dev. Each call adds > an RTM_NEWLINK to skb. For the ndo_bridge_getlink() call to bridge, > the MASTER port flags are filled in using br_port_fill_attr(). For > the second ndo_bridge_getlink() call to dev, the port driver calls > ndo_dflt_bridge_getlink() which fills in the SELF port flags. Before > this patch, ndo_dflt_bridge_getlink() was only filling in hwmode. > > Whew, in any case, I think you'll agree this code needs a refactoring > down the road. This change is just the bare minimum building on > what's there to get SELF port flags up to user-space. A refactoring > effort should get the port drivers out of parsing/filling netlink msg > and leave that to the core code in rtnetlink.c. That way we can have > one place for policy checks and one place for fill. I think this > refactoring effort should be left out in this patch series, otherwise > this is going to drag on into the next year. > I am fine with that. At minimal br_port_fill_attr() is reusable. There's a lot of stuff i wish would be "fixed" - one is clearly not abusing a u8 just to send one bit to the kernel. You just added one more horn of that sort with the sync learning. I wish i had time to clean it up. In any case: Acked-by: Jamal Hadi Salim <jhs@mojatatu.com> cheers, jamal -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 9070b98..6510ec8 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c @@ -4362,7 +4362,8 @@ static int be_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, return ndo_dflt_bridge_getlink(skb, pid, seq, dev, hsw_mode == PORT_FWD_TYPE_VEPA ? - BRIDGE_MODE_VEPA : BRIDGE_MODE_VEB); + BRIDGE_MODE_VEPA : BRIDGE_MODE_VEB, + 0, 0); } #ifdef CONFIG_BE2NET_VXLAN diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 1bad9f4..eb2a04b 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -7773,7 +7773,7 @@ static int ixgbe_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, else mode = BRIDGE_MODE_VEPA; - return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode); + return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode, 0, 0); } static void *ixgbe_fwd_add(struct net_device *pdev, struct net_device *vdev) diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index 063f0f5..3b04190 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h @@ -103,5 +103,6 @@ extern int ndo_dflt_fdb_del(struct ndmsg *ndm, u16 vid); extern int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, - struct net_device *dev, u16 mode); + struct net_device *dev, u16 mode, + u32 flags, u32 mask); #endif /* __LINUX_RTNETLINK_H */ diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index b6541f2..7525ba3 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -2687,12 +2687,22 @@ static int rtnl_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb) return skb->len; } +static int brport_nla_put_flag(struct sk_buff *skb, u32 flags, u32 mask, + unsigned int attrnum, unsigned int flag) +{ + if (mask & flag) + return nla_put_u8(skb, attrnum, !!(flags & flag)); + return 0; +} + int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, - struct net_device *dev, u16 mode) + struct net_device *dev, u16 mode, + u32 flags, u32 mask) { struct nlmsghdr *nlh; struct ifinfomsg *ifm; struct nlattr *br_afspec; + struct nlattr *protinfo; u8 operstate = netif_running(dev) ? dev->operstate : IF_OPER_DOWN; struct net_device *br_dev = netdev_master_upper_dev_get(dev); @@ -2731,6 +2741,33 @@ int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, } nla_nest_end(skb, br_afspec); + protinfo = nla_nest_start(skb, IFLA_PROTINFO | NLA_F_NESTED); + if (!protinfo) + goto nla_put_failure; + + if (brport_nla_put_flag(skb, flags, mask, + IFLA_BRPORT_MODE, BR_HAIRPIN_MODE) || + brport_nla_put_flag(skb, flags, mask, + IFLA_BRPORT_GUARD, BR_BPDU_GUARD) || + brport_nla_put_flag(skb, flags, mask, + IFLA_BRPORT_FAST_LEAVE, + BR_MULTICAST_FAST_LEAVE) || + brport_nla_put_flag(skb, flags, mask, + IFLA_BRPORT_PROTECT, BR_ROOT_BLOCK) || + brport_nla_put_flag(skb, flags, mask, + IFLA_BRPORT_LEARNING, BR_LEARNING) || + brport_nla_put_flag(skb, flags, mask, + IFLA_BRPORT_LEARNING_SYNC, BR_LEARNING_SYNC) || + brport_nla_put_flag(skb, flags, mask, + IFLA_BRPORT_UNICAST_FLOOD, BR_FLOOD) || + brport_nla_put_flag(skb, flags, mask, + IFLA_BRPORT_PROXYARP, BR_PROXYARP)) { + nla_nest_cancel(skb, protinfo); + goto nla_put_failure; + } + + nla_nest_end(skb, protinfo); + return nlmsg_end(skb, nlh); nla_put_failure: nlmsg_cancel(skb, nlh);