aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJiri Pirko <jiri@resnulli.us>2013-12-08 06:16:09 -0500
committerDavid S. Miller <davem@davemloft.net>2013-12-10 21:50:00 -0500
commit9a32b860431aee0cba50ab2414bfa29f4bb2f0d7 (patch)
tree7f513202f363507c1ed7b90b6b0d524af9106d69 /net
parent94a12b15e4c575e0aa0ba5e24a4f213163a823d0 (diff)
dn_dev: add support for IFA_FLAGS nl attribute
Signed-off-by: Jiri Pirko <jiri@resnulli.us> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/decnet/dn_dev.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c
index dd0dfb25f4b1..a603823a3e27 100644
--- a/net/decnet/dn_dev.c
+++ b/net/decnet/dn_dev.c
@@ -561,6 +561,7 @@ static const struct nla_policy dn_ifa_policy[IFA_MAX+1] = {
561 [IFA_LOCAL] = { .type = NLA_U16 }, 561 [IFA_LOCAL] = { .type = NLA_U16 },
562 [IFA_LABEL] = { .type = NLA_STRING, 562 [IFA_LABEL] = { .type = NLA_STRING,
563 .len = IFNAMSIZ - 1 }, 563 .len = IFNAMSIZ - 1 },
564 [IFA_FLAGS] = { .type = NLA_U32 },
564}; 565};
565 566
566static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh) 567static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh)
@@ -648,7 +649,8 @@ static int dn_nl_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh)
648 649
649 ifa->ifa_local = nla_get_le16(tb[IFA_LOCAL]); 650 ifa->ifa_local = nla_get_le16(tb[IFA_LOCAL]);
650 ifa->ifa_address = nla_get_le16(tb[IFA_ADDRESS]); 651 ifa->ifa_address = nla_get_le16(tb[IFA_ADDRESS]);
651 ifa->ifa_flags = ifm->ifa_flags; 652 ifa->ifa_flags = tb[IFA_FLAGS] ? nla_get_u32(tb[IFA_FLAGS]) :
653 ifm->ifa_flags;
652 ifa->ifa_scope = ifm->ifa_scope; 654 ifa->ifa_scope = ifm->ifa_scope;
653 ifa->ifa_dev = dn_db; 655 ifa->ifa_dev = dn_db;
654 656
@@ -669,7 +671,8 @@ static inline size_t dn_ifaddr_nlmsg_size(void)
669 return NLMSG_ALIGN(sizeof(struct ifaddrmsg)) 671 return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
670 + nla_total_size(IFNAMSIZ) /* IFA_LABEL */ 672 + nla_total_size(IFNAMSIZ) /* IFA_LABEL */
671 + nla_total_size(2) /* IFA_ADDRESS */ 673 + nla_total_size(2) /* IFA_ADDRESS */
672 + nla_total_size(2); /* IFA_LOCAL */ 674 + nla_total_size(2) /* IFA_LOCAL */
675 + nla_total_size(4); /* IFA_FLAGS */
673} 676}
674 677
675static int dn_nl_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa, 678static int dn_nl_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa,
@@ -677,6 +680,7 @@ static int dn_nl_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa,
677{ 680{
678 struct ifaddrmsg *ifm; 681 struct ifaddrmsg *ifm;
679 struct nlmsghdr *nlh; 682 struct nlmsghdr *nlh;
683 u32 ifa_flags = ifa->ifa_flags | IFA_F_PERMANENT;
680 684
681 nlh = nlmsg_put(skb, portid, seq, event, sizeof(*ifm), flags); 685 nlh = nlmsg_put(skb, portid, seq, event, sizeof(*ifm), flags);
682 if (nlh == NULL) 686 if (nlh == NULL)
@@ -685,7 +689,7 @@ static int dn_nl_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa,
685 ifm = nlmsg_data(nlh); 689 ifm = nlmsg_data(nlh);
686 ifm->ifa_family = AF_DECnet; 690 ifm->ifa_family = AF_DECnet;
687 ifm->ifa_prefixlen = 16; 691 ifm->ifa_prefixlen = 16;
688 ifm->ifa_flags = ifa->ifa_flags | IFA_F_PERMANENT; 692 ifm->ifa_flags = ifa_flags;
689 ifm->ifa_scope = ifa->ifa_scope; 693 ifm->ifa_scope = ifa->ifa_scope;
690 ifm->ifa_index = ifa->ifa_dev->dev->ifindex; 694 ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
691 695
@@ -694,7 +698,8 @@ static int dn_nl_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa,
694 (ifa->ifa_local && 698 (ifa->ifa_local &&
695 nla_put_le16(skb, IFA_LOCAL, ifa->ifa_local)) || 699 nla_put_le16(skb, IFA_LOCAL, ifa->ifa_local)) ||
696 (ifa->ifa_label[0] && 700 (ifa->ifa_label[0] &&
697 nla_put_string(skb, IFA_LABEL, ifa->ifa_label))) 701 nla_put_string(skb, IFA_LABEL, ifa->ifa_label)) ||
702 nla_put_u32(skb, IFA_FLAGS, ifa_flags))
698 goto nla_put_failure; 703 goto nla_put_failure;
699 return nlmsg_end(skb, nlh); 704 return nlmsg_end(skb, nlh);
700 705