提交 47f68512 编写于 作者: T Thomas Graf 提交者: David S. Miller

[IPV4]: Convert address dumping to new netlink api

Signed-off-by: NThomas Graf <tgraf@suug.ch>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 dfdd5fd4
...@@ -1112,32 +1112,37 @@ static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa, ...@@ -1112,32 +1112,37 @@ static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
{ {
struct ifaddrmsg *ifm; struct ifaddrmsg *ifm;
struct nlmsghdr *nlh; struct nlmsghdr *nlh;
unsigned char *b = skb->tail;
nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags); nlh = nlmsg_put(skb, pid, seq, event, sizeof(*ifm), flags);
ifm = NLMSG_DATA(nlh); if (nlh == NULL)
return -ENOBUFS;
ifm = nlmsg_data(nlh);
ifm->ifa_family = AF_INET; ifm->ifa_family = AF_INET;
ifm->ifa_prefixlen = ifa->ifa_prefixlen; ifm->ifa_prefixlen = ifa->ifa_prefixlen;
ifm->ifa_flags = ifa->ifa_flags|IFA_F_PERMANENT; ifm->ifa_flags = ifa->ifa_flags|IFA_F_PERMANENT;
ifm->ifa_scope = ifa->ifa_scope; ifm->ifa_scope = ifa->ifa_scope;
ifm->ifa_index = ifa->ifa_dev->dev->ifindex; ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
if (ifa->ifa_address) if (ifa->ifa_address)
RTA_PUT(skb, IFA_ADDRESS, 4, &ifa->ifa_address); NLA_PUT_U32(skb, IFA_ADDRESS, ifa->ifa_address);
if (ifa->ifa_local) if (ifa->ifa_local)
RTA_PUT(skb, IFA_LOCAL, 4, &ifa->ifa_local); NLA_PUT_U32(skb, IFA_LOCAL, ifa->ifa_local);
if (ifa->ifa_broadcast) if (ifa->ifa_broadcast)
RTA_PUT(skb, IFA_BROADCAST, 4, &ifa->ifa_broadcast); NLA_PUT_U32(skb, IFA_BROADCAST, ifa->ifa_broadcast);
if (ifa->ifa_anycast) if (ifa->ifa_anycast)
RTA_PUT(skb, IFA_ANYCAST, 4, &ifa->ifa_anycast); NLA_PUT_U32(skb, IFA_ANYCAST, ifa->ifa_anycast);
if (ifa->ifa_label[0]) if (ifa->ifa_label[0])
RTA_PUT(skb, IFA_LABEL, IFNAMSIZ, &ifa->ifa_label); NLA_PUT_STRING(skb, IFA_LABEL, ifa->ifa_label);
nlh->nlmsg_len = skb->tail - b;
return skb->len; return nlmsg_end(skb, nlh);
nlmsg_failure: nla_put_failure:
rtattr_failure: return nlmsg_cancel(skb, nlh);
skb_trim(skb, b - skb->data);
return -1;
} }
static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
...@@ -1185,17 +1190,16 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) ...@@ -1185,17 +1190,16 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
static void rtmsg_ifa(int event, struct in_ifaddr* ifa) static void rtmsg_ifa(int event, struct in_ifaddr* ifa)
{ {
int size = NLMSG_SPACE(sizeof(struct ifaddrmsg) + 128); struct sk_buff *skb;
struct sk_buff *skb = alloc_skb(size, GFP_KERNEL);
if (!skb) skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
if (skb == NULL)
netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, ENOBUFS); netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, ENOBUFS);
else if (inet_fill_ifaddr(skb, ifa, 0, 0, event, 0) < 0) { else if (inet_fill_ifaddr(skb, ifa, 0, 0, event, 0) < 0) {
kfree_skb(skb); kfree_skb(skb);
netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, EINVAL); netlink_set_err(rtnl, 0, RTNLGRP_IPV4_IFADDR, EINVAL);
} else { } else
netlink_broadcast(rtnl, skb, 0, RTNLGRP_IPV4_IFADDR, GFP_KERNEL); netlink_broadcast(rtnl, skb, 0, RTNLGRP_IPV4_IFADDR, GFP_KERNEL);
}
} }
static struct rtnetlink_link inet_rtnetlink_table[RTM_NR_MSGTYPES] = { static struct rtnetlink_link inet_rtnetlink_table[RTM_NR_MSGTYPES] = {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册