From: Serhey Popovych <serhe.popovych@gmail.com>
To: netdev@vger.kernel.org
Subject: [PATCH iproute2-next v3 3/4] gre/gre6: Unify local/remote endpoint address parsing
Date: Mon, 12 Feb 2018 22:17:58 +0200 [thread overview]
Message-ID: <1518466679-3605-4-git-send-email-serhe.popovych@gmail.com> (raw)
In-Reply-To: <1518466679-3605-1-git-send-email-serhe.popovych@gmail.com>
We are going to merge link_gre.c and link_gre6.c and this is final step
to make their diffs clear and show what needs to be changed during merge.
Note that it is safe to omit endpoint address(es) from netlink create
request as kernel is aware of such case and will use zero for that
endpoint(s).
Signed-off-by: Serhey Popovych <serhe.popovych@gmail.com>
---
ip/link_gre.c | 57 +++++++++++++++++++++++++++++++++-----------------------
ip/link_gre6.c | 38 +++++++++++++++++++------------------
2 files changed, 54 insertions(+), 41 deletions(-)
diff --git a/ip/link_gre.c b/ip/link_gre.c
index e3e5323..64588d7 100644
--- a/ip/link_gre.c
+++ b/ip/link_gre.c
@@ -86,8 +86,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
__u16 oflags = 0;
__be32 ikey = 0;
__be32 okey = 0;
- unsigned int saddr = 0;
- unsigned int daddr = 0;
+ inet_prefix saddr, daddr;
__u8 pmtudisc = 1;
__u8 ignore_df = 0;
__u8 tos = 0;
@@ -104,7 +103,12 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
__u8 erspan_dir = 0;
__u16 erspan_hwid = 0;
+ inet_prefix_reset(&saddr);
+ inet_prefix_reset(&daddr);
+
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
+ const struct rtattr *rta;
+
if (rtnl_talk(&rth, &req.n, &answer) < 0) {
get_failed:
fprintf(stderr,
@@ -130,6 +134,14 @@ get_failed:
parse_rtattr_nested(greinfo, IFLA_GRE_MAX,
linkinfo[IFLA_INFO_DATA]);
+ rta = greinfo[IFLA_GRE_LOCAL];
+ if (rta && get_addr_rta(&saddr, rta, AF_INET))
+ goto get_failed;
+
+ rta = greinfo[IFLA_GRE_REMOTE];
+ if (rta && get_addr_rta(&daddr, rta, AF_INET))
+ goto get_failed;
+
if (greinfo[IFLA_GRE_IKEY])
ikey = rta_getattr_u32(greinfo[IFLA_GRE_IKEY]);
@@ -142,12 +154,6 @@ get_failed:
if (greinfo[IFLA_GRE_OFLAGS])
oflags = rta_getattr_u16(greinfo[IFLA_GRE_OFLAGS]);
- if (greinfo[IFLA_GRE_LOCAL])
- saddr = rta_getattr_u32(greinfo[IFLA_GRE_LOCAL]);
-
- if (greinfo[IFLA_GRE_REMOTE])
- daddr = rta_getattr_u32(greinfo[IFLA_GRE_REMOTE]);
-
if (greinfo[IFLA_GRE_PMTUDISC])
pmtudisc = rta_getattr_u8(
greinfo[IFLA_GRE_PMTUDISC]);
@@ -232,10 +238,10 @@ get_failed:
pmtudisc = 1;
} else if (!matches(*argv, "remote")) {
NEXT_ARG();
- daddr = get_addr32(*argv);
+ get_addr(&daddr, *argv, AF_INET);
} else if (!matches(*argv, "local")) {
NEXT_ARG();
- saddr = get_addr32(*argv);
+ get_addr(&saddr, *argv, AF_INET);
} else if (!matches(*argv, "dev")) {
NEXT_ARG();
link = ll_name_to_index(*argv);
@@ -343,17 +349,20 @@ get_failed:
argc--; argv++;
}
- if (!ikey && IN_MULTICAST(ntohl(daddr))) {
- ikey = daddr;
- iflags |= GRE_KEY;
- }
- if (!okey && IN_MULTICAST(ntohl(daddr))) {
- okey = daddr;
- oflags |= GRE_KEY;
- }
- if (IN_MULTICAST(ntohl(daddr)) && !saddr) {
- fprintf(stderr, "A broadcast tunnel requires a source address.\n");
- return -1;
+ if (is_addrtype_inet_multi(&daddr)) {
+ if (!ikey) {
+ ikey = daddr.data[0];
+ iflags |= GRE_KEY;
+ }
+ if (!okey) {
+ okey = daddr.data[0];
+ oflags |= GRE_KEY;
+ }
+ if (!is_addrtype_inet_not_unspec(&saddr)) {
+ fprintf(stderr,
+ "A broadcast tunnel requires a source address.\n");
+ return -1;
+ }
}
if (metadata) {
@@ -365,8 +374,10 @@ get_failed:
addattr32(n, 1024, IFLA_GRE_OKEY, okey);
addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2);
addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2);
- addattr_l(n, 1024, IFLA_GRE_LOCAL, &saddr, 4);
- addattr_l(n, 1024, IFLA_GRE_REMOTE, &daddr, 4);
+ if (is_addrtype_inet(&saddr))
+ addattr_l(n, 1024, IFLA_GRE_LOCAL, saddr.data, saddr.bytelen);
+ if (is_addrtype_inet(&daddr))
+ addattr_l(n, 1024, IFLA_GRE_REMOTE, daddr.data, daddr.bytelen);
addattr_l(n, 1024, IFLA_GRE_PMTUDISC, &pmtudisc, 1);
if (ignore_df)
addattr8(n, 1024, IFLA_GRE_IGNORE_DF, ignore_df & 1);
diff --git a/ip/link_gre6.c b/ip/link_gre6.c
index 251ae0e..6c77038 100644
--- a/ip/link_gre6.c
+++ b/ip/link_gre6.c
@@ -97,8 +97,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
__u16 oflags = 0;
__be32 ikey = 0;
__be32 okey = 0;
- struct in6_addr raddr = IN6ADDR_ANY_INIT;
- struct in6_addr laddr = IN6ADDR_ANY_INIT;
+ inet_prefix saddr, daddr;
__u8 hop_limit = DEFAULT_TNL_HOP_LIMIT;
__u8 encap_limit = IPV6_DEFAULT_TNL_ENCAP_LIMIT;
__u32 flowinfo = 0;
@@ -115,7 +114,12 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
__u8 erspan_dir = 0;
__u16 erspan_hwid = 0;
+ inet_prefix_reset(&saddr);
+ inet_prefix_reset(&daddr);
+
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
+ const struct rtattr *rta;
+
if (rtnl_talk(&rth, &req.n, &answer) < 0) {
get_failed:
fprintf(stderr,
@@ -141,6 +145,14 @@ get_failed:
parse_rtattr_nested(greinfo, IFLA_GRE_MAX,
linkinfo[IFLA_INFO_DATA]);
+ rta = greinfo[IFLA_GRE_LOCAL];
+ if (rta && get_addr_rta(&saddr, rta, AF_INET6))
+ goto get_failed;
+
+ rta = greinfo[IFLA_GRE_REMOTE];
+ if (rta && get_addr_rta(&daddr, rta, AF_INET6))
+ goto get_failed;
+
if (greinfo[IFLA_GRE_IKEY])
ikey = rta_getattr_u32(greinfo[IFLA_GRE_IKEY]);
@@ -153,12 +165,6 @@ get_failed:
if (greinfo[IFLA_GRE_OFLAGS])
oflags = rta_getattr_u16(greinfo[IFLA_GRE_OFLAGS]);
- if (greinfo[IFLA_GRE_LOCAL])
- memcpy(&laddr, RTA_DATA(greinfo[IFLA_GRE_LOCAL]), sizeof(laddr));
-
- if (greinfo[IFLA_GRE_REMOTE])
- memcpy(&raddr, RTA_DATA(greinfo[IFLA_GRE_REMOTE]), sizeof(raddr));
-
if (greinfo[IFLA_GRE_TTL])
hop_limit = rta_getattr_u8(greinfo[IFLA_GRE_TTL]);
@@ -236,17 +242,11 @@ get_failed:
} else if (!matches(*argv, "ocsum")) {
oflags |= GRE_CSUM;
} else if (!matches(*argv, "remote")) {
- inet_prefix addr;
-
NEXT_ARG();
- get_addr(&addr, *argv, AF_INET6);
- memcpy(&raddr, &addr.data, sizeof(raddr));
+ get_addr(&daddr, *argv, AF_INET6);
} else if (!matches(*argv, "local")) {
- inet_prefix addr;
-
NEXT_ARG();
- get_addr(&addr, *argv, AF_INET6);
- memcpy(&laddr, &addr.data, sizeof(laddr));
+ get_addr(&saddr, *argv, AF_INET6);
} else if (!matches(*argv, "dev")) {
NEXT_ARG();
link = ll_name_to_index(*argv);
@@ -398,8 +398,10 @@ get_failed:
addattr32(n, 1024, IFLA_GRE_OKEY, okey);
addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2);
addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2);
- addattr_l(n, 1024, IFLA_GRE_LOCAL, &laddr, sizeof(laddr));
- addattr_l(n, 1024, IFLA_GRE_REMOTE, &raddr, sizeof(raddr));
+ if (is_addrtype_inet(&saddr))
+ addattr_l(n, 1024, IFLA_GRE_LOCAL, saddr.data, saddr.bytelen);
+ if (is_addrtype_inet(&daddr))
+ addattr_l(n, 1024, IFLA_GRE_REMOTE, daddr.data, daddr.bytelen);
if (link)
addattr32(n, 1024, IFLA_GRE_LINK, link);
addattr_l(n, 1024, IFLA_GRE_TTL, &hop_limit, 1);
--
1.7.10.4
next prev parent reply other threads:[~2018-02-12 20:18 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-12 20:17 [PATCH iproute2-next v3 0/4] ip/tunnel: Unify local/remote endpoint address parsing Serhey Popovych
2018-02-12 20:17 ` [PATCH iproute2-next v3 1/4] utils: Introduce and use inet_prefix_reset() Serhey Popovych
2018-02-12 20:17 ` [PATCH iproute2-next v3 2/4] vti/vti6: Unify local/remote endpoint address parsing Serhey Popovych
2018-02-12 20:17 ` Serhey Popovych [this message]
2018-02-12 20:17 ` [PATCH iproute2-next v3 4/4] iptnl/ip6tnl: Unify local/remote endpoint and 6rd " Serhey Popovych
2018-02-14 17:03 ` [PATCH iproute2-next v3 0/4] ip/tunnel: Unify local/remote endpoint " David Ahern
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1518466679-3605-4-git-send-email-serhe.popovych@gmail.com \
--to=serhe.popovych@gmail.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).