diff options
-rw-r--r-- | net/core/rtnetlink.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 8db72ac88feb..9837bebf93ce 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -774,7 +774,8 @@ static inline int rtnl_vfinfo_size(const struct net_device *dev, | |||
774 | return 0; | 774 | return 0; |
775 | } | 775 | } |
776 | 776 | ||
777 | static size_t rtnl_port_size(const struct net_device *dev) | 777 | static size_t rtnl_port_size(const struct net_device *dev, |
778 | u32 ext_filter_mask) | ||
778 | { | 779 | { |
779 | size_t port_size = nla_total_size(4) /* PORT_VF */ | 780 | size_t port_size = nla_total_size(4) /* PORT_VF */ |
780 | + nla_total_size(PORT_PROFILE_MAX) /* PORT_PROFILE */ | 781 | + nla_total_size(PORT_PROFILE_MAX) /* PORT_PROFILE */ |
@@ -790,7 +791,8 @@ static size_t rtnl_port_size(const struct net_device *dev) | |||
790 | size_t port_self_size = nla_total_size(sizeof(struct nlattr)) | 791 | size_t port_self_size = nla_total_size(sizeof(struct nlattr)) |
791 | + port_size; | 792 | + port_size; |
792 | 793 | ||
793 | if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent) | 794 | if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent || |
795 | !(ext_filter_mask & RTEXT_FILTER_VF)) | ||
794 | return 0; | 796 | return 0; |
795 | if (dev_num_vf(dev->dev.parent)) | 797 | if (dev_num_vf(dev->dev.parent)) |
796 | return port_self_size + vf_ports_size + | 798 | return port_self_size + vf_ports_size + |
@@ -826,7 +828,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, | |||
826 | + nla_total_size(ext_filter_mask | 828 | + nla_total_size(ext_filter_mask |
827 | & RTEXT_FILTER_VF ? 4 : 0) /* IFLA_NUM_VF */ | 829 | & RTEXT_FILTER_VF ? 4 : 0) /* IFLA_NUM_VF */ |
828 | + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ | 830 | + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ |
829 | + rtnl_port_size(dev) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ | 831 | + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ |
830 | + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ | 832 | + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ |
831 | + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ | 833 | + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ |
832 | + nla_total_size(MAX_PHYS_PORT_ID_LEN); /* IFLA_PHYS_PORT_ID */ | 834 | + nla_total_size(MAX_PHYS_PORT_ID_LEN); /* IFLA_PHYS_PORT_ID */ |
@@ -888,11 +890,13 @@ static int rtnl_port_self_fill(struct sk_buff *skb, struct net_device *dev) | |||
888 | return 0; | 890 | return 0; |
889 | } | 891 | } |
890 | 892 | ||
891 | static int rtnl_port_fill(struct sk_buff *skb, struct net_device *dev) | 893 | static int rtnl_port_fill(struct sk_buff *skb, struct net_device *dev, |
894 | u32 ext_filter_mask) | ||
892 | { | 895 | { |
893 | int err; | 896 | int err; |
894 | 897 | ||
895 | if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent) | 898 | if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent || |
899 | !(ext_filter_mask & RTEXT_FILTER_VF)) | ||
896 | return 0; | 900 | return 0; |
897 | 901 | ||
898 | err = rtnl_port_self_fill(skb, dev); | 902 | err = rtnl_port_self_fill(skb, dev); |
@@ -1079,7 +1083,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
1079 | nla_nest_end(skb, vfinfo); | 1083 | nla_nest_end(skb, vfinfo); |
1080 | } | 1084 | } |
1081 | 1085 | ||
1082 | if (rtnl_port_fill(skb, dev)) | 1086 | if (rtnl_port_fill(skb, dev, ext_filter_mask)) |
1083 | goto nla_put_failure; | 1087 | goto nla_put_failure; |
1084 | 1088 | ||
1085 | if (dev->rtnl_link_ops || rtnl_have_link_slave_info(dev)) { | 1089 | if (dev->rtnl_link_ops || rtnl_have_link_slave_info(dev)) { |