diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/decnet/dn_dev.c | 13 |
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 | ||
| 566 | static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh) | 567 | static 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 | ||
| 675 | static int dn_nl_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa, | 678 | static 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 | ||
