gre/gre6: Unify local/remote endpoint address parsing
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> Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
parent
3d4e0db65c
commit
a066cc6623
|
|
@ -86,8 +86,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||||
__u16 oflags = 0;
|
__u16 oflags = 0;
|
||||||
__be32 ikey = 0;
|
__be32 ikey = 0;
|
||||||
__be32 okey = 0;
|
__be32 okey = 0;
|
||||||
unsigned int saddr = 0;
|
inet_prefix saddr, daddr;
|
||||||
unsigned int daddr = 0;
|
|
||||||
__u8 pmtudisc = 1;
|
__u8 pmtudisc = 1;
|
||||||
__u8 ignore_df = 0;
|
__u8 ignore_df = 0;
|
||||||
__u8 tos = 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;
|
__u8 erspan_dir = 0;
|
||||||
__u16 erspan_hwid = 0;
|
__u16 erspan_hwid = 0;
|
||||||
|
|
||||||
|
inet_prefix_reset(&saddr);
|
||||||
|
inet_prefix_reset(&daddr);
|
||||||
|
|
||||||
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
|
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
|
||||||
|
const struct rtattr *rta;
|
||||||
|
|
||||||
if (rtnl_talk(&rth, &req.n, &answer) < 0) {
|
if (rtnl_talk(&rth, &req.n, &answer) < 0) {
|
||||||
get_failed:
|
get_failed:
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
|
|
@ -130,6 +134,14 @@ get_failed:
|
||||||
parse_rtattr_nested(greinfo, IFLA_GRE_MAX,
|
parse_rtattr_nested(greinfo, IFLA_GRE_MAX,
|
||||||
linkinfo[IFLA_INFO_DATA]);
|
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])
|
if (greinfo[IFLA_GRE_IKEY])
|
||||||
ikey = rta_getattr_u32(greinfo[IFLA_GRE_IKEY]);
|
ikey = rta_getattr_u32(greinfo[IFLA_GRE_IKEY]);
|
||||||
|
|
||||||
|
|
@ -142,12 +154,6 @@ get_failed:
|
||||||
if (greinfo[IFLA_GRE_OFLAGS])
|
if (greinfo[IFLA_GRE_OFLAGS])
|
||||||
oflags = rta_getattr_u16(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])
|
if (greinfo[IFLA_GRE_PMTUDISC])
|
||||||
pmtudisc = rta_getattr_u8(
|
pmtudisc = rta_getattr_u8(
|
||||||
greinfo[IFLA_GRE_PMTUDISC]);
|
greinfo[IFLA_GRE_PMTUDISC]);
|
||||||
|
|
@ -232,10 +238,10 @@ get_failed:
|
||||||
pmtudisc = 1;
|
pmtudisc = 1;
|
||||||
} else if (!matches(*argv, "remote")) {
|
} else if (!matches(*argv, "remote")) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
daddr = get_addr32(*argv);
|
get_addr(&daddr, *argv, AF_INET);
|
||||||
} else if (!matches(*argv, "local")) {
|
} else if (!matches(*argv, "local")) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
saddr = get_addr32(*argv);
|
get_addr(&saddr, *argv, AF_INET);
|
||||||
} else if (!matches(*argv, "dev")) {
|
} else if (!matches(*argv, "dev")) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
link = ll_name_to_index(*argv);
|
link = ll_name_to_index(*argv);
|
||||||
|
|
@ -343,17 +349,20 @@ get_failed:
|
||||||
argc--; argv++;
|
argc--; argv++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ikey && IN_MULTICAST(ntohl(daddr))) {
|
if (is_addrtype_inet_multi(&daddr)) {
|
||||||
ikey = daddr;
|
if (!ikey) {
|
||||||
iflags |= GRE_KEY;
|
ikey = daddr.data[0];
|
||||||
}
|
iflags |= GRE_KEY;
|
||||||
if (!okey && IN_MULTICAST(ntohl(daddr))) {
|
}
|
||||||
okey = daddr;
|
if (!okey) {
|
||||||
oflags |= GRE_KEY;
|
okey = daddr.data[0];
|
||||||
}
|
oflags |= GRE_KEY;
|
||||||
if (IN_MULTICAST(ntohl(daddr)) && !saddr) {
|
}
|
||||||
fprintf(stderr, "A broadcast tunnel requires a source address.\n");
|
if (!is_addrtype_inet_not_unspec(&saddr)) {
|
||||||
return -1;
|
fprintf(stderr,
|
||||||
|
"A broadcast tunnel requires a source address.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (metadata) {
|
if (metadata) {
|
||||||
|
|
@ -365,8 +374,10 @@ get_failed:
|
||||||
addattr32(n, 1024, IFLA_GRE_OKEY, okey);
|
addattr32(n, 1024, IFLA_GRE_OKEY, okey);
|
||||||
addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2);
|
addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2);
|
||||||
addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2);
|
addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2);
|
||||||
addattr_l(n, 1024, IFLA_GRE_LOCAL, &saddr, 4);
|
if (is_addrtype_inet(&saddr))
|
||||||
addattr_l(n, 1024, IFLA_GRE_REMOTE, &daddr, 4);
|
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);
|
addattr_l(n, 1024, IFLA_GRE_PMTUDISC, &pmtudisc, 1);
|
||||||
if (ignore_df)
|
if (ignore_df)
|
||||||
addattr8(n, 1024, IFLA_GRE_IGNORE_DF, ignore_df & 1);
|
addattr8(n, 1024, IFLA_GRE_IGNORE_DF, ignore_df & 1);
|
||||||
|
|
|
||||||
|
|
@ -97,8 +97,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||||
__u16 oflags = 0;
|
__u16 oflags = 0;
|
||||||
__be32 ikey = 0;
|
__be32 ikey = 0;
|
||||||
__be32 okey = 0;
|
__be32 okey = 0;
|
||||||
struct in6_addr raddr = IN6ADDR_ANY_INIT;
|
inet_prefix saddr, daddr;
|
||||||
struct in6_addr laddr = IN6ADDR_ANY_INIT;
|
|
||||||
__u8 hop_limit = DEFAULT_TNL_HOP_LIMIT;
|
__u8 hop_limit = DEFAULT_TNL_HOP_LIMIT;
|
||||||
__u8 encap_limit = IPV6_DEFAULT_TNL_ENCAP_LIMIT;
|
__u8 encap_limit = IPV6_DEFAULT_TNL_ENCAP_LIMIT;
|
||||||
__u32 flowinfo = 0;
|
__u32 flowinfo = 0;
|
||||||
|
|
@ -115,7 +114,12 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||||
__u8 erspan_dir = 0;
|
__u8 erspan_dir = 0;
|
||||||
__u16 erspan_hwid = 0;
|
__u16 erspan_hwid = 0;
|
||||||
|
|
||||||
|
inet_prefix_reset(&saddr);
|
||||||
|
inet_prefix_reset(&daddr);
|
||||||
|
|
||||||
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
|
if (!(n->nlmsg_flags & NLM_F_CREATE)) {
|
||||||
|
const struct rtattr *rta;
|
||||||
|
|
||||||
if (rtnl_talk(&rth, &req.n, &answer) < 0) {
|
if (rtnl_talk(&rth, &req.n, &answer) < 0) {
|
||||||
get_failed:
|
get_failed:
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
|
|
@ -141,6 +145,14 @@ get_failed:
|
||||||
parse_rtattr_nested(greinfo, IFLA_GRE_MAX,
|
parse_rtattr_nested(greinfo, IFLA_GRE_MAX,
|
||||||
linkinfo[IFLA_INFO_DATA]);
|
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])
|
if (greinfo[IFLA_GRE_IKEY])
|
||||||
ikey = rta_getattr_u32(greinfo[IFLA_GRE_IKEY]);
|
ikey = rta_getattr_u32(greinfo[IFLA_GRE_IKEY]);
|
||||||
|
|
||||||
|
|
@ -153,12 +165,6 @@ get_failed:
|
||||||
if (greinfo[IFLA_GRE_OFLAGS])
|
if (greinfo[IFLA_GRE_OFLAGS])
|
||||||
oflags = rta_getattr_u16(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])
|
if (greinfo[IFLA_GRE_TTL])
|
||||||
hop_limit = rta_getattr_u8(greinfo[IFLA_GRE_TTL]);
|
hop_limit = rta_getattr_u8(greinfo[IFLA_GRE_TTL]);
|
||||||
|
|
||||||
|
|
@ -236,17 +242,11 @@ get_failed:
|
||||||
} else if (!matches(*argv, "ocsum")) {
|
} else if (!matches(*argv, "ocsum")) {
|
||||||
oflags |= GRE_CSUM;
|
oflags |= GRE_CSUM;
|
||||||
} else if (!matches(*argv, "remote")) {
|
} else if (!matches(*argv, "remote")) {
|
||||||
inet_prefix addr;
|
|
||||||
|
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
get_addr(&addr, *argv, AF_INET6);
|
get_addr(&daddr, *argv, AF_INET6);
|
||||||
memcpy(&raddr, &addr.data, sizeof(raddr));
|
|
||||||
} else if (!matches(*argv, "local")) {
|
} else if (!matches(*argv, "local")) {
|
||||||
inet_prefix addr;
|
|
||||||
|
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
get_addr(&addr, *argv, AF_INET6);
|
get_addr(&saddr, *argv, AF_INET6);
|
||||||
memcpy(&laddr, &addr.data, sizeof(laddr));
|
|
||||||
} else if (!matches(*argv, "dev")) {
|
} else if (!matches(*argv, "dev")) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
link = ll_name_to_index(*argv);
|
link = ll_name_to_index(*argv);
|
||||||
|
|
@ -398,8 +398,10 @@ get_failed:
|
||||||
addattr32(n, 1024, IFLA_GRE_OKEY, okey);
|
addattr32(n, 1024, IFLA_GRE_OKEY, okey);
|
||||||
addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2);
|
addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2);
|
||||||
addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2);
|
addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2);
|
||||||
addattr_l(n, 1024, IFLA_GRE_LOCAL, &laddr, sizeof(laddr));
|
if (is_addrtype_inet(&saddr))
|
||||||
addattr_l(n, 1024, IFLA_GRE_REMOTE, &raddr, sizeof(raddr));
|
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)
|
if (link)
|
||||||
addattr32(n, 1024, IFLA_GRE_LINK, link);
|
addattr32(n, 1024, IFLA_GRE_LINK, link);
|
||||||
addattr_l(n, 1024, IFLA_GRE_TTL, &hop_limit, 1);
|
addattr_l(n, 1024, IFLA_GRE_TTL, &hop_limit, 1);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue