* [patch iproute2 v3 0/2] add support for IFA_F_MANAGETEMPADDR
@ 2014-01-06 9:17 Jiri Pirko
2014-01-06 9:17 ` [patch iproute2 v3 1/2] add support for extended ifa_flags Jiri Pirko
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Jiri Pirko @ 2014-01-06 9:17 UTC (permalink / raw)
To: netdev; +Cc: stephen, thaller
v1->v2: Removed 0xff masking of ifa_flags
v2->v3: Incorporated changes that Thomas suggested
Jiri Pirko (2):
add support for extended ifa_flags
add support for IFA_F_MANAGETEMPADDR
include/linux/if_addr.h | 2 ++
ip/ipaddress.c | 55 +++++++++++++++++++++++++++++++++++--------------
2 files changed, 42 insertions(+), 15 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [patch iproute2 v3 1/2] add support for extended ifa_flags
2014-01-06 9:17 [patch iproute2 v3 0/2] add support for IFA_F_MANAGETEMPADDR Jiri Pirko
@ 2014-01-06 9:17 ` Jiri Pirko
2014-01-10 6:47 ` Stephen Hemminger
2014-01-06 9:17 ` [patch iproute2 v3 2/2] add support for IFA_F_MANAGETEMPADDR Jiri Pirko
2014-01-07 20:46 ` [patch iproute2 v3 3/3] add support for IFA_F_NOPREFIXROUTE Thomas Haller
2 siblings, 1 reply; 6+ messages in thread
From: Jiri Pirko @ 2014-01-06 9:17 UTC (permalink / raw)
To: netdev; +Cc: stephen, thaller
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
---
include/linux/if_addr.h | 1 +
ip/ipaddress.c | 44 ++++++++++++++++++++++++++++++--------------
2 files changed, 31 insertions(+), 14 deletions(-)
diff --git a/include/linux/if_addr.h b/include/linux/if_addr.h
index 58b39f4..cced59f 100644
--- a/include/linux/if_addr.h
+++ b/include/linux/if_addr.h
@@ -28,6 +28,7 @@ enum {
IFA_ANYCAST,
IFA_CACHEINFO,
IFA_MULTICAST,
+ IFA_FLAGS,
__IFA_MAX,
};
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index d02eaaf..1e3f22c 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c
@@ -541,6 +541,13 @@ static int set_lifetime(unsigned int *lifetime, char *argv)
return 0;
}
+static unsigned int get_ifa_flags(struct ifaddrmsg *ifa,
+ struct rtattr *ifa_flags_attr)
+{
+ return ifa_flags_attr ? rta_getattr_u32(ifa_flags_attr) :
+ ifa->ifa_flags;
+}
+
int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n,
void *arg)
{
@@ -567,6 +574,8 @@ int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n,
parse_rtattr(rta_tb, IFA_MAX, IFA_RTA(ifa), n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa)));
+ ifa_flags = get_ifa_flags(ifa, rta_tb[IFA_FLAGS]);
+
if (!rta_tb[IFA_LOCAL])
rta_tb[IFA_LOCAL] = rta_tb[IFA_ADDRESS];
if (!rta_tb[IFA_ADDRESS])
@@ -576,7 +585,7 @@ int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n,
return 0;
if ((filter.scope^ifa->ifa_scope)&filter.scopemask)
return 0;
- if ((filter.flags^ifa->ifa_flags)&filter.flagmask)
+ if ((filter.flags ^ ifa_flags) & filter.flagmask)
return 0;
if (filter.label) {
SPRINT_BUF(b1);
@@ -670,36 +679,35 @@ int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n,
abuf, sizeof(abuf)));
}
fprintf(fp, "scope %s ", rtnl_rtscope_n2a(ifa->ifa_scope, b1, sizeof(b1)));
- ifa_flags = ifa->ifa_flags;
- if (ifa->ifa_flags&IFA_F_SECONDARY) {
+ if (ifa_flags & IFA_F_SECONDARY) {
ifa_flags &= ~IFA_F_SECONDARY;
if (ifa->ifa_family == AF_INET6)
fprintf(fp, "temporary ");
else
fprintf(fp, "secondary ");
}
- if (ifa->ifa_flags&IFA_F_TENTATIVE) {
+ if (ifa_flags & IFA_F_TENTATIVE) {
ifa_flags &= ~IFA_F_TENTATIVE;
fprintf(fp, "tentative ");
}
- if (ifa->ifa_flags&IFA_F_DEPRECATED) {
+ if (ifa_flags & IFA_F_DEPRECATED) {
ifa_flags &= ~IFA_F_DEPRECATED;
deprecated = 1;
fprintf(fp, "deprecated ");
}
- if (ifa->ifa_flags&IFA_F_HOMEADDRESS) {
+ if (ifa_flags & IFA_F_HOMEADDRESS) {
ifa_flags &= ~IFA_F_HOMEADDRESS;
fprintf(fp, "home ");
}
- if (ifa->ifa_flags&IFA_F_NODAD) {
+ if (ifa_flags & IFA_F_NODAD) {
ifa_flags &= ~IFA_F_NODAD;
fprintf(fp, "nodad ");
}
- if (!(ifa->ifa_flags&IFA_F_PERMANENT)) {
+ if (!(ifa_flags & IFA_F_PERMANENT)) {
fprintf(fp, "dynamic ");
} else
ifa_flags &= ~IFA_F_PERMANENT;
- if (ifa->ifa_flags&IFA_F_DADFAILED) {
+ if (ifa_flags & IFA_F_DADFAILED) {
ifa_flags &= ~IFA_F_DADFAILED;
fprintf(fp, "dadfailed ");
}
@@ -926,6 +934,8 @@ static void ipaddr_filter(struct nlmsg_chain *linfo, struct nlmsg_chain *ainfo)
for (a = ainfo->head; a; a = a->next) {
struct nlmsghdr *n = &a->h;
struct ifaddrmsg *ifa = NLMSG_DATA(n);
+ struct rtattr *tb[IFA_MAX + 1];
+ unsigned int ifa_flags;
if (ifa->ifa_index != ifi->ifi_index)
continue;
@@ -934,11 +944,13 @@ static void ipaddr_filter(struct nlmsg_chain *linfo, struct nlmsg_chain *ainfo)
continue;
if ((filter.scope^ifa->ifa_scope)&filter.scopemask)
continue;
- if ((filter.flags^ifa->ifa_flags)&filter.flagmask)
+
+ parse_rtattr(tb, IFA_MAX, IFA_RTA(ifa), IFA_PAYLOAD(n));
+ ifa_flags = get_ifa_flags(ifa, tb[IFA_FLAGS]);
+
+ if ((filter.flags ^ ifa_flags) & filter.flagmask)
continue;
if (filter.pfx.family || filter.label) {
- struct rtattr *tb[IFA_MAX+1];
- parse_rtattr(tb, IFA_MAX, IFA_RTA(ifa), IFA_PAYLOAD(n));
if (!tb[IFA_LOCAL])
tb[IFA_LOCAL] = tb[IFA_ADDRESS];
@@ -1252,6 +1264,7 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
__u32 preferred_lft = INFINITY_LIFE_TIME;
__u32 valid_lft = INFINITY_LIFE_TIME;
struct ifa_cacheinfo cinfo;
+ unsigned int ifa_flags = 0;
memset(&req, 0, sizeof(req));
@@ -1329,9 +1342,9 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
if (set_lifetime(&preferred_lft, *argv))
invarg("preferred_lft value", *argv);
} else if (strcmp(*argv, "home") == 0) {
- req.ifa.ifa_flags |= IFA_F_HOMEADDRESS;
+ ifa_flags |= IFA_F_HOMEADDRESS;
} else if (strcmp(*argv, "nodad") == 0) {
- req.ifa.ifa_flags |= IFA_F_NODAD;
+ ifa_flags |= IFA_F_NODAD;
} else {
if (strcmp(*argv, "local") == 0) {
NEXT_ARG();
@@ -1349,6 +1362,9 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
}
argc--; argv++;
}
+ req.ifa.ifa_flags = ifa_flags;
+ addattr32(&req.n, sizeof(req), IFA_FLAGS, ifa_flags);
+
if (d == NULL) {
fprintf(stderr, "Not enough information: \"dev\" argument is required.\n");
return -1;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [patch iproute2 v3 2/2] add support for IFA_F_MANAGETEMPADDR
2014-01-06 9:17 [patch iproute2 v3 0/2] add support for IFA_F_MANAGETEMPADDR Jiri Pirko
2014-01-06 9:17 ` [patch iproute2 v3 1/2] add support for extended ifa_flags Jiri Pirko
@ 2014-01-06 9:17 ` Jiri Pirko
2014-01-07 20:46 ` [patch iproute2 v3 3/3] add support for IFA_F_NOPREFIXROUTE Thomas Haller
2 siblings, 0 replies; 6+ messages in thread
From: Jiri Pirko @ 2014-01-06 9:17 UTC (permalink / raw)
To: netdev; +Cc: stephen, thaller
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
---
include/linux/if_addr.h | 1 +
ip/ipaddress.c | 11 ++++++++++-
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/include/linux/if_addr.h b/include/linux/if_addr.h
index cced59f..e1e95ce 100644
--- a/include/linux/if_addr.h
+++ b/include/linux/if_addr.h
@@ -45,6 +45,7 @@ enum {
#define IFA_F_DEPRECATED 0x20
#define IFA_F_TENTATIVE 0x40
#define IFA_F_PERMANENT 0x80
+#define IFA_F_MANAGETEMPADDR 0x0100
struct ifa_cacheinfo {
__u32 ifa_prefered;
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index 1e3f22c..b0d54fe 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c
@@ -82,7 +82,7 @@ static void usage(void)
fprintf(stderr, " tentative | deprecated | dadfailed | temporary |\n");
fprintf(stderr, " CONFFLAG-LIST ]\n");
fprintf(stderr, "CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG\n");
- fprintf(stderr, "CONFFLAG := [ home | nodad ]\n");
+ fprintf(stderr, "CONFFLAG := [ home | nodad | mngtmpaddr ]\n");
fprintf(stderr, "LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]\n");
fprintf(stderr, "LFT := forever | SECONDS\n");
@@ -703,6 +703,10 @@ int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n,
ifa_flags &= ~IFA_F_NODAD;
fprintf(fp, "nodad ");
}
+ if (ifa_flags & IFA_F_MANAGETEMPADDR) {
+ ifa_flags &= ~IFA_F_MANAGETEMPADDR;
+ fprintf(fp, "mngtmpaddr ");
+ }
if (!(ifa_flags & IFA_F_PERMANENT)) {
fprintf(fp, "dynamic ");
} else
@@ -1126,6 +1130,9 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action)
} else if (strcmp(*argv, "nodad") == 0) {
filter.flags |= IFA_F_NODAD;
filter.flagmask |= IFA_F_NODAD;
+ } else if (strcmp(*argv, "mngtmpaddr") == 0) {
+ filter.flags |= IFA_F_MANAGETEMPADDR;
+ filter.flagmask |= IFA_F_MANAGETEMPADDR;
} else if (strcmp(*argv, "dadfailed") == 0) {
filter.flags |= IFA_F_DADFAILED;
filter.flagmask |= IFA_F_DADFAILED;
@@ -1345,6 +1352,8 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
ifa_flags |= IFA_F_HOMEADDRESS;
} else if (strcmp(*argv, "nodad") == 0) {
ifa_flags |= IFA_F_NODAD;
+ } else if (strcmp(*argv, "mngtmpaddr") == 0) {
+ ifa_flags |= IFA_F_MANAGETEMPADDR;
} else {
if (strcmp(*argv, "local") == 0) {
NEXT_ARG();
--
1.8.3.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [patch iproute2 v3 3/3] add support for IFA_F_NOPREFIXROUTE
2014-01-06 9:17 [patch iproute2 v3 0/2] add support for IFA_F_MANAGETEMPADDR Jiri Pirko
2014-01-06 9:17 ` [patch iproute2 v3 1/2] add support for extended ifa_flags Jiri Pirko
2014-01-06 9:17 ` [patch iproute2 v3 2/2] add support for IFA_F_MANAGETEMPADDR Jiri Pirko
@ 2014-01-07 20:46 ` Thomas Haller
2014-01-20 20:36 ` Stephen Hemminger
2 siblings, 1 reply; 6+ messages in thread
From: Thomas Haller @ 2014-01-07 20:46 UTC (permalink / raw)
To: Jiri Pirko; +Cc: Hannes Frederic Sowa, netdev, stephen, dcbw, Thomas Haller
Signed-off-by: Thomas Haller <thaller@redhat.com>
---
Hi,
this additional patch is based on the previous two patches v2,
so I reply to this email.
It's related to the discussion about adding a flag IFA_F_NOPREFIXROUTE
to suppress creation of prefix routes
(see thread "[patch iproute2 v2 0/2] add support for IFA_F_MANAGETEMPADDR",
from Thu, 2 Jan 2014 16:34:37 +0100).
include/linux/if_addr.h | 6 +++++-
ip/ipaddress.c | 11 ++++++++++-
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/include/linux/if_addr.h b/include/linux/if_addr.h
index e1e95ce..cc375e4 100644
--- a/include/linux/if_addr.h
+++ b/include/linux/if_addr.h
@@ -18,6 +18,9 @@ struct ifaddrmsg {
* It makes no difference for normally configured broadcast interfaces,
* but for point-to-point IFA_ADDRESS is DESTINATION address,
* local address is supplied in IFA_LOCAL attribute.
+ *
+ * IFA_FLAGS is a u32 attribute that extends the u8 field ifa_flags.
+ * If present, the value from struct ifaddrmsg will be ignored.
*/
enum {
IFA_UNSPEC,
@@ -45,7 +48,8 @@ enum {
#define IFA_F_DEPRECATED 0x20
#define IFA_F_TENTATIVE 0x40
#define IFA_F_PERMANENT 0x80
-#define IFA_F_MANAGETEMPADDR 0x0100
+#define IFA_F_MANAGETEMPADDR 0x100
+#define IFA_F_NOPREFIXROUTE 0x200
struct ifa_cacheinfo {
__u32 ifa_prefered;
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index b0d54fe..f794fa1 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c
@@ -82,7 +82,7 @@ static void usage(void)
fprintf(stderr, " tentative | deprecated | dadfailed | temporary |\n");
fprintf(stderr, " CONFFLAG-LIST ]\n");
fprintf(stderr, "CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG\n");
- fprintf(stderr, "CONFFLAG := [ home | nodad | mngtmpaddr ]\n");
+ fprintf(stderr, "CONFFLAG := [ home | nodad | mngtmpaddr | noprefixroute ]\n");
fprintf(stderr, "LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]\n");
fprintf(stderr, "LFT := forever | SECONDS\n");
@@ -707,6 +707,10 @@ int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n,
ifa_flags &= ~IFA_F_MANAGETEMPADDR;
fprintf(fp, "mngtmpaddr ");
}
+ if (ifa_flags & IFA_F_NOPREFIXROUTE) {
+ ifa_flags &= ~IFA_F_NOPREFIXROUTE;
+ fprintf(fp, "noprefixroute ");
+ }
if (!(ifa_flags & IFA_F_PERMANENT)) {
fprintf(fp, "dynamic ");
} else
@@ -1133,6 +1137,9 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action)
} else if (strcmp(*argv, "mngtmpaddr") == 0) {
filter.flags |= IFA_F_MANAGETEMPADDR;
filter.flagmask |= IFA_F_MANAGETEMPADDR;
+ } else if (strcmp(*argv, "noprefixroute") == 0) {
+ filter.flags |= IFA_F_NOPREFIXROUTE;
+ filter.flagmask |= IFA_F_NOPREFIXROUTE;
} else if (strcmp(*argv, "dadfailed") == 0) {
filter.flags |= IFA_F_DADFAILED;
filter.flagmask |= IFA_F_DADFAILED;
@@ -1354,6 +1361,8 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv)
ifa_flags |= IFA_F_NODAD;
} else if (strcmp(*argv, "mngtmpaddr") == 0) {
ifa_flags |= IFA_F_MANAGETEMPADDR;
+ } else if (strcmp(*argv, "noprefixroute") == 0) {
+ ifa_flags |= IFA_F_NOPREFIXROUTE;
} else {
if (strcmp(*argv, "local") == 0) {
NEXT_ARG();
--
1.8.4.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [patch iproute2 v3 1/2] add support for extended ifa_flags
2014-01-06 9:17 ` [patch iproute2 v3 1/2] add support for extended ifa_flags Jiri Pirko
@ 2014-01-10 6:47 ` Stephen Hemminger
0 siblings, 0 replies; 6+ messages in thread
From: Stephen Hemminger @ 2014-01-10 6:47 UTC (permalink / raw)
To: Jiri Pirko; +Cc: netdev, thaller
On Mon, 6 Jan 2014 10:17:09 +0100
Jiri Pirko <jiri@resnulli.us> wrote:
> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Applied to net-next-3.13 branch to be merged in next window
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [patch iproute2 v3 3/3] add support for IFA_F_NOPREFIXROUTE
2014-01-07 20:46 ` [patch iproute2 v3 3/3] add support for IFA_F_NOPREFIXROUTE Thomas Haller
@ 2014-01-20 20:36 ` Stephen Hemminger
0 siblings, 0 replies; 6+ messages in thread
From: Stephen Hemminger @ 2014-01-20 20:36 UTC (permalink / raw)
To: Thomas Haller; +Cc: Jiri Pirko, Hannes Frederic Sowa, netdev, dcbw
On Tue, 7 Jan 2014 21:46:28 +0100
Thomas Haller <thaller@redhat.com> wrote:
> Signed-off-by: Thomas Haller <thaller@redhat.com>
All three of these are now applied to net-next-3.13 branch
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-01-20 20:37 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-01-06 9:17 [patch iproute2 v3 0/2] add support for IFA_F_MANAGETEMPADDR Jiri Pirko
2014-01-06 9:17 ` [patch iproute2 v3 1/2] add support for extended ifa_flags Jiri Pirko
2014-01-10 6:47 ` Stephen Hemminger
2014-01-06 9:17 ` [patch iproute2 v3 2/2] add support for IFA_F_MANAGETEMPADDR Jiri Pirko
2014-01-07 20:46 ` [patch iproute2 v3 3/3] add support for IFA_F_NOPREFIXROUTE Thomas Haller
2014-01-20 20:36 ` Stephen Hemminger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).