|
@@ -2245,8 +2245,8 @@ static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
|
|
|
return skb->len;
|
|
|
}
|
|
|
|
|
|
-void rtmsg_ifinfo(int type, struct net_device *dev, unsigned int change,
|
|
|
- gfp_t flags)
|
|
|
+struct sk_buff *rtmsg_ifinfo_build_skb(int type, struct net_device *dev,
|
|
|
+ unsigned int change, gfp_t flags)
|
|
|
{
|
|
|
struct net *net = dev_net(dev);
|
|
|
struct sk_buff *skb;
|
|
@@ -2264,11 +2264,28 @@ void rtmsg_ifinfo(int type, struct net_device *dev, unsigned int change,
|
|
|
kfree_skb(skb);
|
|
|
goto errout;
|
|
|
}
|
|
|
- rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, flags);
|
|
|
- return;
|
|
|
+ return skb;
|
|
|
errout:
|
|
|
if (err < 0)
|
|
|
rtnl_set_sk_err(net, RTNLGRP_LINK, err);
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+void rtmsg_ifinfo_send(struct sk_buff *skb, struct net_device *dev, gfp_t flags)
|
|
|
+{
|
|
|
+ struct net *net = dev_net(dev);
|
|
|
+
|
|
|
+ rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, flags);
|
|
|
+}
|
|
|
+
|
|
|
+void rtmsg_ifinfo(int type, struct net_device *dev, unsigned int change,
|
|
|
+ gfp_t flags)
|
|
|
+{
|
|
|
+ struct sk_buff *skb;
|
|
|
+
|
|
|
+ skb = rtmsg_ifinfo_build_skb(type, dev, change, flags);
|
|
|
+ if (skb)
|
|
|
+ rtmsg_ifinfo_send(skb, dev, flags);
|
|
|
}
|
|
|
EXPORT_SYMBOL(rtmsg_ifinfo);
|
|
|
|