diff options
Diffstat (limited to 'net/core/rtnetlink.c')
-rw-r--r-- | net/core/rtnetlink.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 358d52a38533..8de36824018d 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -2416,6 +2416,9 @@ void rtmsg_ifinfo(int type, struct net_device *dev, unsigned int change, | |||
2416 | { | 2416 | { |
2417 | struct sk_buff *skb; | 2417 | struct sk_buff *skb; |
2418 | 2418 | ||
2419 | if (dev->reg_state != NETREG_REGISTERED) | ||
2420 | return; | ||
2421 | |||
2419 | skb = rtmsg_ifinfo_build_skb(type, dev, change, flags); | 2422 | skb = rtmsg_ifinfo_build_skb(type, dev, change, flags); |
2420 | if (skb) | 2423 | if (skb) |
2421 | rtmsg_ifinfo_send(skb, dev, flags); | 2424 | rtmsg_ifinfo_send(skb, dev, flags); |
@@ -2854,7 +2857,7 @@ static int brport_nla_put_flag(struct sk_buff *skb, u32 flags, u32 mask, | |||
2854 | 2857 | ||
2855 | int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, | 2858 | int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, |
2856 | struct net_device *dev, u16 mode, | 2859 | struct net_device *dev, u16 mode, |
2857 | u32 flags, u32 mask) | 2860 | u32 flags, u32 mask, int nlflags) |
2858 | { | 2861 | { |
2859 | struct nlmsghdr *nlh; | 2862 | struct nlmsghdr *nlh; |
2860 | struct ifinfomsg *ifm; | 2863 | struct ifinfomsg *ifm; |
@@ -2863,7 +2866,7 @@ int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, | |||
2863 | u8 operstate = netif_running(dev) ? dev->operstate : IF_OPER_DOWN; | 2866 | u8 operstate = netif_running(dev) ? dev->operstate : IF_OPER_DOWN; |
2864 | struct net_device *br_dev = netdev_master_upper_dev_get(dev); | 2867 | struct net_device *br_dev = netdev_master_upper_dev_get(dev); |
2865 | 2868 | ||
2866 | nlh = nlmsg_put(skb, pid, seq, RTM_NEWLINK, sizeof(*ifm), NLM_F_MULTI); | 2869 | nlh = nlmsg_put(skb, pid, seq, RTM_NEWLINK, sizeof(*ifm), nlflags); |
2867 | if (nlh == NULL) | 2870 | if (nlh == NULL) |
2868 | return -EMSGSIZE; | 2871 | return -EMSGSIZE; |
2869 | 2872 | ||
@@ -2969,7 +2972,8 @@ static int rtnl_bridge_getlink(struct sk_buff *skb, struct netlink_callback *cb) | |||
2969 | if (br_dev && br_dev->netdev_ops->ndo_bridge_getlink) { | 2972 | if (br_dev && br_dev->netdev_ops->ndo_bridge_getlink) { |
2970 | if (idx >= cb->args[0] && | 2973 | if (idx >= cb->args[0] && |
2971 | br_dev->netdev_ops->ndo_bridge_getlink( | 2974 | br_dev->netdev_ops->ndo_bridge_getlink( |
2972 | skb, portid, seq, dev, filter_mask) < 0) | 2975 | skb, portid, seq, dev, filter_mask, |
2976 | NLM_F_MULTI) < 0) | ||
2973 | break; | 2977 | break; |
2974 | idx++; | 2978 | idx++; |
2975 | } | 2979 | } |
@@ -2977,7 +2981,8 @@ static int rtnl_bridge_getlink(struct sk_buff *skb, struct netlink_callback *cb) | |||
2977 | if (ops->ndo_bridge_getlink) { | 2981 | if (ops->ndo_bridge_getlink) { |
2978 | if (idx >= cb->args[0] && | 2982 | if (idx >= cb->args[0] && |
2979 | ops->ndo_bridge_getlink(skb, portid, seq, dev, | 2983 | ops->ndo_bridge_getlink(skb, portid, seq, dev, |
2980 | filter_mask) < 0) | 2984 | filter_mask, |
2985 | NLM_F_MULTI) < 0) | ||
2981 | break; | 2986 | break; |
2982 | idx++; | 2987 | idx++; |
2983 | } | 2988 | } |
@@ -3018,7 +3023,7 @@ static int rtnl_bridge_notify(struct net_device *dev) | |||
3018 | goto errout; | 3023 | goto errout; |
3019 | } | 3024 | } |
3020 | 3025 | ||
3021 | err = dev->netdev_ops->ndo_bridge_getlink(skb, 0, 0, dev, 0); | 3026 | err = dev->netdev_ops->ndo_bridge_getlink(skb, 0, 0, dev, 0, 0); |
3022 | if (err < 0) | 3027 | if (err < 0) |
3023 | goto errout; | 3028 | goto errout; |
3024 | 3029 | ||