netlink: Rightsize IFLA_AF_SPEC size calculation
if_nlmsg_size() overestimates the minimum allocation size of netlink dump request (when called from rtnl_calcit()) or the size of the message (when called from rtnl_getlink()). This is because ext_filter_mask is not supported by rtnl_link_get_af_size() and rtnl_link_get_size(). The over-estimation is significant when at least one netdev has many VLANs configured (8 bytes for each configured VLAN). This patch-set "rightsizes" the protocol specific attribute size calculation by propagating ext_filter_mask to rtnl_link_get_af_size() and adding this a argument to get_link_af_size op in rtnl_af_ops. Bridge module already used filtering aware sizing for notifications. br_get_link_af_size_filtered() is consistent with the modified get_link_af_size op so it replaces br_get_link_af_size() in br_af_ops. br_get_link_af_size() becomes unused and thus removed. Signed-off-by: Ronen Arad <ronen.arad@intel.com> Acked-by: Sridhar Samudrala <sridhar.samudrala@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
6ac311ae8b
commit
b1974ed05e
@@ -1214,29 +1214,10 @@ static int br_fill_info(struct sk_buff *skb, const struct net_device *brdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t br_get_link_af_size(const struct net_device *dev)
|
||||
{
|
||||
struct net_bridge_port *p;
|
||||
struct net_bridge *br;
|
||||
int num_vlans = 0;
|
||||
|
||||
if (br_port_exists(dev)) {
|
||||
p = br_port_get_rtnl(dev);
|
||||
num_vlans = br_get_num_vlan_infos(nbp_vlan_group(p),
|
||||
RTEXT_FILTER_BRVLAN);
|
||||
} else if (dev->priv_flags & IFF_EBRIDGE) {
|
||||
br = netdev_priv(dev);
|
||||
num_vlans = br_get_num_vlan_infos(br_vlan_group(br),
|
||||
RTEXT_FILTER_BRVLAN);
|
||||
}
|
||||
|
||||
/* Each VLAN is returned in bridge_vlan_info along with flags */
|
||||
return num_vlans * nla_total_size(sizeof(struct bridge_vlan_info));
|
||||
}
|
||||
|
||||
static struct rtnl_af_ops br_af_ops __read_mostly = {
|
||||
.family = AF_BRIDGE,
|
||||
.get_link_af_size = br_get_link_af_size,
|
||||
.get_link_af_size = br_get_link_af_size_filtered,
|
||||
};
|
||||
|
||||
struct rtnl_link_ops br_link_ops __read_mostly = {
|
||||
|
Reference in New Issue
Block a user