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>
This commit is contained in:
parent
94a12b15e4
commit
9a32b86043
2 changed files with 10 additions and 5 deletions
|
@ -9,7 +9,7 @@ struct dn_ifaddr {
|
||||||
struct dn_dev *ifa_dev;
|
struct dn_dev *ifa_dev;
|
||||||
__le16 ifa_local;
|
__le16 ifa_local;
|
||||||
__le16 ifa_address;
|
__le16 ifa_address;
|
||||||
__u8 ifa_flags;
|
__u32 ifa_flags;
|
||||||
__u8 ifa_scope;
|
__u8 ifa_scope;
|
||||||
char ifa_label[IFNAMSIZ];
|
char ifa_label[IFNAMSIZ];
|
||||||
struct rcu_head rcu;
|
struct rcu_head rcu;
|
||||||
|
|
|
@ -561,6 +561,7 @@ static const struct nla_policy dn_ifa_policy[IFA_MAX+1] = {
|
||||||
[IFA_LOCAL] = { .type = NLA_U16 },
|
[IFA_LOCAL] = { .type = NLA_U16 },
|
||||||
[IFA_LABEL] = { .type = NLA_STRING,
|
[IFA_LABEL] = { .type = NLA_STRING,
|
||||||
.len = IFNAMSIZ - 1 },
|
.len = IFNAMSIZ - 1 },
|
||||||
|
[IFA_FLAGS] = { .type = NLA_U32 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh)
|
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)
|
||||||
|
|
||||||
ifa->ifa_local = nla_get_le16(tb[IFA_LOCAL]);
|
ifa->ifa_local = nla_get_le16(tb[IFA_LOCAL]);
|
||||||
ifa->ifa_address = nla_get_le16(tb[IFA_ADDRESS]);
|
ifa->ifa_address = nla_get_le16(tb[IFA_ADDRESS]);
|
||||||
ifa->ifa_flags = ifm->ifa_flags;
|
ifa->ifa_flags = tb[IFA_FLAGS] ? nla_get_u32(tb[IFA_FLAGS]) :
|
||||||
|
ifm->ifa_flags;
|
||||||
ifa->ifa_scope = ifm->ifa_scope;
|
ifa->ifa_scope = ifm->ifa_scope;
|
||||||
ifa->ifa_dev = dn_db;
|
ifa->ifa_dev = dn_db;
|
||||||
|
|
||||||
|
@ -669,7 +671,8 @@ static inline size_t dn_ifaddr_nlmsg_size(void)
|
||||||
return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
|
return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
|
||||||
+ nla_total_size(IFNAMSIZ) /* IFA_LABEL */
|
+ nla_total_size(IFNAMSIZ) /* IFA_LABEL */
|
||||||
+ nla_total_size(2) /* IFA_ADDRESS */
|
+ nla_total_size(2) /* IFA_ADDRESS */
|
||||||
+ nla_total_size(2); /* IFA_LOCAL */
|
+ nla_total_size(2) /* IFA_LOCAL */
|
||||||
|
+ nla_total_size(4); /* IFA_FLAGS */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dn_nl_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa,
|
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,
|
||||||
{
|
{
|
||||||
struct ifaddrmsg *ifm;
|
struct ifaddrmsg *ifm;
|
||||||
struct nlmsghdr *nlh;
|
struct nlmsghdr *nlh;
|
||||||
|
u32 ifa_flags = ifa->ifa_flags | IFA_F_PERMANENT;
|
||||||
|
|
||||||
nlh = nlmsg_put(skb, portid, seq, event, sizeof(*ifm), flags);
|
nlh = nlmsg_put(skb, portid, seq, event, sizeof(*ifm), flags);
|
||||||
if (nlh == NULL)
|
if (nlh == NULL)
|
||||||
|
@ -685,7 +689,7 @@ static int dn_nl_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa,
|
||||||
ifm = nlmsg_data(nlh);
|
ifm = nlmsg_data(nlh);
|
||||||
ifm->ifa_family = AF_DECnet;
|
ifm->ifa_family = AF_DECnet;
|
||||||
ifm->ifa_prefixlen = 16;
|
ifm->ifa_prefixlen = 16;
|
||||||
ifm->ifa_flags = ifa->ifa_flags | IFA_F_PERMANENT;
|
ifm->ifa_flags = ifa_flags;
|
||||||
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;
|
||||||
|
|
||||||
|
@ -694,7 +698,8 @@ static int dn_nl_fill_ifaddr(struct sk_buff *skb, struct dn_ifaddr *ifa,
|
||||||
(ifa->ifa_local &&
|
(ifa->ifa_local &&
|
||||||
nla_put_le16(skb, IFA_LOCAL, ifa->ifa_local)) ||
|
nla_put_le16(skb, IFA_LOCAL, ifa->ifa_local)) ||
|
||||||
(ifa->ifa_label[0] &&
|
(ifa->ifa_label[0] &&
|
||||||
nla_put_string(skb, IFA_LABEL, ifa->ifa_label)))
|
nla_put_string(skb, IFA_LABEL, ifa->ifa_label)) ||
|
||||||
|
nla_put_u32(skb, IFA_FLAGS, ifa_flags))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
return nlmsg_end(skb, nlh);
|
return nlmsg_end(skb, nlh);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue