Commit 22a93216 authored by David S. Miller's avatar David S. Miller

Merge branch 'ifla_flags'

Jiri Pirko says:

====================
add support for IFA_FLAGS nl attribute

As this was recently added for ipv6, add it for the rest of occurences
as requested by DaveM.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 94a12b15 ad6c8135
...@@ -136,8 +136,8 @@ struct in_ifaddr { ...@@ -136,8 +136,8 @@ struct in_ifaddr {
__be32 ifa_mask; __be32 ifa_mask;
__be32 ifa_broadcast; __be32 ifa_broadcast;
unsigned char ifa_scope; unsigned char ifa_scope;
unsigned char ifa_flags;
unsigned char ifa_prefixlen; unsigned char ifa_prefixlen;
__u32 ifa_flags;
char ifa_label[IFNAMSIZ]; char ifa_label[IFNAMSIZ];
/* In seconds, relative to tstamp. Expiry is at tstamp + HZ * lft. */ /* In seconds, relative to tstamp. Expiry is at tstamp + HZ * lft. */
......
...@@ -9,7 +9,7 @@ struct dn_ifaddr { ...@@ -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] = { ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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);
......
...@@ -99,6 +99,7 @@ static const struct nla_policy ifa_ipv4_policy[IFA_MAX+1] = { ...@@ -99,6 +99,7 @@ static const struct nla_policy ifa_ipv4_policy[IFA_MAX+1] = {
[IFA_BROADCAST] = { .type = NLA_U32 }, [IFA_BROADCAST] = { .type = NLA_U32 },
[IFA_LABEL] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 }, [IFA_LABEL] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 },
[IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) }, [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) },
[IFA_FLAGS] = { .type = NLA_U32 },
}; };
#define IN4_ADDR_HSIZE_SHIFT 8 #define IN4_ADDR_HSIZE_SHIFT 8
...@@ -757,7 +758,8 @@ static struct in_ifaddr *rtm_to_ifaddr(struct net *net, struct nlmsghdr *nlh, ...@@ -757,7 +758,8 @@ static struct in_ifaddr *rtm_to_ifaddr(struct net *net, struct nlmsghdr *nlh,
INIT_HLIST_NODE(&ifa->hash); INIT_HLIST_NODE(&ifa->hash);
ifa->ifa_prefixlen = ifm->ifa_prefixlen; ifa->ifa_prefixlen = ifm->ifa_prefixlen;
ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen); ifa->ifa_mask = inet_make_mask(ifm->ifa_prefixlen);
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 = in_dev; ifa->ifa_dev = in_dev;
...@@ -1437,7 +1439,8 @@ static size_t inet_nlmsg_size(void) ...@@ -1437,7 +1439,8 @@ static size_t inet_nlmsg_size(void)
+ nla_total_size(4) /* IFA_ADDRESS */ + nla_total_size(4) /* IFA_ADDRESS */
+ nla_total_size(4) /* IFA_LOCAL */ + nla_total_size(4) /* IFA_LOCAL */
+ nla_total_size(4) /* IFA_BROADCAST */ + nla_total_size(4) /* IFA_BROADCAST */
+ nla_total_size(IFNAMSIZ); /* IFA_LABEL */ + nla_total_size(IFNAMSIZ) /* IFA_LABEL */
+ nla_total_size(4); /* IFA_FLAGS */
} }
static inline u32 cstamp_delta(unsigned long cstamp) static inline u32 cstamp_delta(unsigned long cstamp)
...@@ -1505,6 +1508,7 @@ static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa, ...@@ -1505,6 +1508,7 @@ static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
nla_put_be32(skb, IFA_BROADCAST, ifa->ifa_broadcast)) || nla_put_be32(skb, IFA_BROADCAST, ifa->ifa_broadcast)) ||
(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->ifa_flags) ||
put_cacheinfo(skb, ifa->ifa_cstamp, ifa->ifa_tstamp, put_cacheinfo(skb, ifa->ifa_cstamp, ifa->ifa_tstamp,
preferred, valid)) preferred, valid))
goto nla_put_failure; goto nla_put_failure;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment