|
@@ -2622,15 +2622,14 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
|
|
|
}
|
|
|
|
|
|
static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa,
|
|
|
- u32 pid, u32 seq, int event)
|
|
|
+ u32 pid, u32 seq, int event, unsigned int flags)
|
|
|
{
|
|
|
struct ifaddrmsg *ifm;
|
|
|
struct nlmsghdr *nlh;
|
|
|
struct ifa_cacheinfo ci;
|
|
|
unsigned char *b = skb->tail;
|
|
|
|
|
|
- nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
|
|
|
- if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
|
|
|
+ nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags);
|
|
|
ifm = NLMSG_DATA(nlh);
|
|
|
ifm->ifa_family = AF_INET6;
|
|
|
ifm->ifa_prefixlen = ifa->prefix_len;
|
|
@@ -2672,15 +2671,14 @@ rtattr_failure:
|
|
|
}
|
|
|
|
|
|
static int inet6_fill_ifmcaddr(struct sk_buff *skb, struct ifmcaddr6 *ifmca,
|
|
|
- u32 pid, u32 seq, int event)
|
|
|
+ u32 pid, u32 seq, int event, unsigned flags)
|
|
|
{
|
|
|
struct ifaddrmsg *ifm;
|
|
|
struct nlmsghdr *nlh;
|
|
|
struct ifa_cacheinfo ci;
|
|
|
unsigned char *b = skb->tail;
|
|
|
|
|
|
- nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
|
|
|
- if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
|
|
|
+ nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags);
|
|
|
ifm = NLMSG_DATA(nlh);
|
|
|
ifm->ifa_family = AF_INET6;
|
|
|
ifm->ifa_prefixlen = 128;
|
|
@@ -2709,15 +2707,14 @@ rtattr_failure:
|
|
|
}
|
|
|
|
|
|
static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca,
|
|
|
- u32 pid, u32 seq, int event)
|
|
|
+ u32 pid, u32 seq, int event, unsigned int flags)
|
|
|
{
|
|
|
struct ifaddrmsg *ifm;
|
|
|
struct nlmsghdr *nlh;
|
|
|
struct ifa_cacheinfo ci;
|
|
|
unsigned char *b = skb->tail;
|
|
|
|
|
|
- nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
|
|
|
- if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
|
|
|
+ nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags);
|
|
|
ifm = NLMSG_DATA(nlh);
|
|
|
ifm->ifa_family = AF_INET6;
|
|
|
ifm->ifa_prefixlen = 128;
|
|
@@ -2786,7 +2783,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
|
|
|
continue;
|
|
|
if ((err = inet6_fill_ifaddr(skb, ifa,
|
|
|
NETLINK_CB(cb->skb).pid,
|
|
|
- cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0)
|
|
|
+ cb->nlh->nlmsg_seq, RTM_NEWADDR,
|
|
|
+ NLM_F_MULTI)) <= 0)
|
|
|
goto done;
|
|
|
}
|
|
|
/* temp addr */
|
|
@@ -2797,7 +2795,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
|
|
|
continue;
|
|
|
if ((err = inet6_fill_ifaddr(skb, ifa,
|
|
|
NETLINK_CB(cb->skb).pid,
|
|
|
- cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0)
|
|
|
+ cb->nlh->nlmsg_seq, RTM_NEWADDR,
|
|
|
+ NLM_F_MULTI)) <= 0)
|
|
|
goto done;
|
|
|
}
|
|
|
#endif
|
|
@@ -2810,7 +2809,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
|
|
|
continue;
|
|
|
if ((err = inet6_fill_ifmcaddr(skb, ifmca,
|
|
|
NETLINK_CB(cb->skb).pid,
|
|
|
- cb->nlh->nlmsg_seq, RTM_GETMULTICAST)) <= 0)
|
|
|
+ cb->nlh->nlmsg_seq, RTM_GETMULTICAST,
|
|
|
+ NLM_F_MULTI)) <= 0)
|
|
|
goto done;
|
|
|
}
|
|
|
break;
|
|
@@ -2822,7 +2822,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
|
|
|
continue;
|
|
|
if ((err = inet6_fill_ifacaddr(skb, ifaca,
|
|
|
NETLINK_CB(cb->skb).pid,
|
|
|
- cb->nlh->nlmsg_seq, RTM_GETANYCAST)) <= 0)
|
|
|
+ cb->nlh->nlmsg_seq, RTM_GETANYCAST,
|
|
|
+ NLM_F_MULTI)) <= 0)
|
|
|
goto done;
|
|
|
}
|
|
|
break;
|
|
@@ -2872,7 +2873,7 @@ static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa)
|
|
|
netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, ENOBUFS);
|
|
|
return;
|
|
|
}
|
|
|
- if (inet6_fill_ifaddr(skb, ifa, 0, 0, event) < 0) {
|
|
|
+ if (inet6_fill_ifaddr(skb, ifa, 0, 0, event, 0) < 0) {
|
|
|
kfree_skb(skb);
|
|
|
netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, EINVAL);
|
|
|
return;
|
|
@@ -2907,7 +2908,7 @@ static void inline ipv6_store_devconf(struct ipv6_devconf *cnf,
|
|
|
}
|
|
|
|
|
|
static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
|
|
|
- u32 pid, u32 seq, int event)
|
|
|
+ u32 pid, u32 seq, int event, unsigned int flags)
|
|
|
{
|
|
|
struct net_device *dev = idev->dev;
|
|
|
__s32 *array = NULL;
|
|
@@ -2918,8 +2919,7 @@ static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
|
|
|
__u32 mtu = dev->mtu;
|
|
|
struct ifla_cacheinfo ci;
|
|
|
|
|
|
- nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*r));
|
|
|
- if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
|
|
|
+ nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*r), flags);
|
|
|
r = NLMSG_DATA(nlh);
|
|
|
r->ifi_family = AF_INET6;
|
|
|
r->ifi_type = dev->type;
|
|
@@ -2986,7 +2986,7 @@ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
|
|
|
if ((idev = in6_dev_get(dev)) == NULL)
|
|
|
continue;
|
|
|
err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid,
|
|
|
- cb->nlh->nlmsg_seq, RTM_NEWLINK);
|
|
|
+ cb->nlh->nlmsg_seq, RTM_NEWLINK, NLM_F_MULTI);
|
|
|
in6_dev_put(idev);
|
|
|
if (err <= 0)
|
|
|
break;
|
|
@@ -3008,7 +3008,7 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
|
|
|
netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, ENOBUFS);
|
|
|
return;
|
|
|
}
|
|
|
- if (inet6_fill_ifinfo(skb, idev, 0, 0, event) < 0) {
|
|
|
+ if (inet6_fill_ifinfo(skb, idev, 0, 0, event, 0) < 0) {
|
|
|
kfree_skb(skb);
|
|
|
netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, EINVAL);
|
|
|
return;
|
|
@@ -3018,18 +3018,15 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
|
|
|
}
|
|
|
|
|
|
static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev,
|
|
|
- struct prefix_info *pinfo, u32 pid, u32 seq, int event)
|
|
|
+ struct prefix_info *pinfo, u32 pid, u32 seq,
|
|
|
+ int event, unsigned int flags)
|
|
|
{
|
|
|
struct prefixmsg *pmsg;
|
|
|
struct nlmsghdr *nlh;
|
|
|
unsigned char *b = skb->tail;
|
|
|
struct prefix_cacheinfo ci;
|
|
|
|
|
|
- nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*pmsg));
|
|
|
-
|
|
|
- if (pid)
|
|
|
- nlh->nlmsg_flags |= NLM_F_MULTI;
|
|
|
-
|
|
|
+ nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*pmsg), flags);
|
|
|
pmsg = NLMSG_DATA(nlh);
|
|
|
pmsg->prefix_family = AF_INET6;
|
|
|
pmsg->prefix_ifindex = idev->dev->ifindex;
|
|
@@ -3068,7 +3065,7 @@ static void inet6_prefix_notify(int event, struct inet6_dev *idev,
|
|
|
netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, ENOBUFS);
|
|
|
return;
|
|
|
}
|
|
|
- if (inet6_fill_prefix(skb, idev, pinfo, 0, 0, event) < 0) {
|
|
|
+ if (inet6_fill_prefix(skb, idev, pinfo, 0, 0, event, 0) < 0) {
|
|
|
kfree_skb(skb);
|
|
|
netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, EINVAL);
|
|
|
return;
|