From: Mike Rapoport <mike.rapoport@ravellosystems.com>
To: netdev@vger.kernel.org
Cc: Mike Rapoport <mike.rapoport@ravellosystems.com>
Subject: [PATCH iproute2] vxlan: allow specifying multiple default destinations
Date: Tue, 28 May 2013 11:33:04 +0300 [thread overview]
Message-ID: <1369729984-9802-1-git-send-email-mike.rapoport@ravellosystems.com> (raw)
In-Reply-To: <1369729878-9690-1-git-send-email-mike.rapoport@ravellosystems.com>
Signed-off-by: Mike Rapoport <mike.rapoport@ravellosystems.com>
---
ip/iplink_vxlan.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 85 insertions(+)
diff --git a/ip/iplink_vxlan.c b/ip/iplink_vxlan.c
index 1025326..89ca3c2 100644
--- a/ip/iplink_vxlan.c
+++ b/ip/iplink_vxlan.c
@@ -28,11 +28,57 @@ static void explain(void)
fprintf(stderr, " [ port MIN MAX ] [ [no]learning ]\n");
fprintf(stderr, " [ [no]proxy ] [ [no]rsc ]\n");
fprintf(stderr, " [ [no]l2miss ] [ [no]l3miss ]\n");
+ fprintf(stderr, " [ dstadd DST ]\n");
+ fprintf(stderr, " [ dstdel ADDR ]\n");
fprintf(stderr, "\n");
fprintf(stderr, "Where: VNI := 0-16777215\n");
fprintf(stderr, " ADDR := { IP_ADDRESS | any }\n");
fprintf(stderr, " TOS := { NUMBER | inherit }\n");
fprintf(stderr, " TTL := { 1..255 | inherit }\n");
+ fprintf(stderr, " DST := [ ADDR [port PORT] [vni VNI] [via DEV]]\n");
+}
+
+static int vxlan_parse_dst(int *argcp, char ***argvp, struct nlmsghdr *n)
+{
+ int argc = *argcp;
+ char **argv = *argvp;
+ __u32 vni, ifindex;
+ __u16 port;
+ struct rtattr *tail;
+
+ tail = NLMSG_TAIL(n);
+ addattr_l(n, 1024, IFLA_VXLAN_REMOTE_ADD, NULL, 0);
+
+ while (argc > 0) {
+ if (!matches(*argv, "vni")) {
+ NEXT_ARG();
+ if (get_u32(&vni, *argv, 0) ||
+ vni >= 1u << 24)
+ invarg("invalid id", *argv);
+ addattr32(n, 1024, IFLA_VXLAN_REMOTE_VNI, vni);
+ } else if (!matches(*argv, "port")) {
+ NEXT_ARG();
+ if (get_u16(&port, *argv, 0))
+ invarg("port", *argv);
+ addattr32(n, 1024, IFLA_VXLAN_REMOTE_PORT, htons(port));
+ } else if (!matches(*argv, "via")) {
+ NEXT_ARG();
+ ifindex = if_nametoindex(*argv);
+ addattr32(n, 1024, IFLA_VXLAN_REMOTE_IFINDEX, ifindex);
+ } else {
+ inet_prefix addr;
+ get_prefix(&addr, *argv, AF_UNSPEC);
+ addattr_l(n, 1024, IFLA_VXLAN_REMOTE_ADDR,
+ &addr.data, addr.bytelen);
+ }
+ argc--, argv++;
+ }
+
+ tail->rta_len = (void *) NLMSG_TAIL(n) - (void *)tail;
+
+ *argcp = argc;
+ *argvp = argv;
+ return 0;
}
static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
@@ -54,6 +100,7 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
__u32 age = 0;
__u32 maxaddr = 0;
struct ifla_vxlan_port_range range = { 0, 0 };
+ inet_prefix *remote_del = NULL;
while (argc > 0) {
if (!matches(*argv, "id") ||
@@ -125,6 +172,14 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
invarg("max port", *argv);
range.low = htons(minport);
range.high = htons(maxport);
+ } else if (!matches(*argv, "dstadd")) {
+ NEXT_ARG();
+ vxlan_parse_dst(&argc, &argv, n);
+ } else if (!matches(*argv, "dstdel")) {
+ inet_prefix addr;
+ NEXT_ARG();
+ get_prefix(&addr, *argv, AF_UNSPEC);
+ remote_del = &addr;
} else if (!matches(*argv, "nolearning")) {
learning = 0;
} else if (!matches(*argv, "learning")) {
@@ -183,10 +238,37 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
if (range.low || range.high)
addattr_l(n, 1024, IFLA_VXLAN_PORT_RANGE,
&range, sizeof(range));
+ if (remote_del)
+ addattr_l(n, 1024, IFLA_VXLAN_REMOTE_DEL, remote_del->data,
+ remote_del->bytelen);
return 0;
}
+static void vxlan_print_remotes(FILE *f, struct rtattr *attr)
+{
+ struct rtattr *i;
+ char s1[1024];
+ int rem, n = 0;
+
+ fprintf(f, "\n default destinations :\n");
+
+ rem = RTA_PAYLOAD(attr);
+ for (i = RTA_DATA(attr); RTA_OK(i, rem); i = RTA_NEXT(i, rem), n++) {
+ if (RTA_PAYLOAD(i) >= sizeof(struct in6_addr)) {
+ struct in6_addr addr;
+ memcpy(&addr, RTA_DATA(i), sizeof(struct in6_addr));
+ fprintf(f, " %s\n",
+ format_host(AF_INET6, sizeof(struct in6_addr),
+ &addr, s1, sizeof(s1)));
+ } else if (RTA_PAYLOAD(i) >= sizeof(__be32)) {
+ __be32 addr = rta_getattr_u32(i);
+ fprintf(f, " %s\n",
+ format_host(AF_INET, 4, &addr, s1, sizeof(s1)));
+ }
+ }
+}
+
static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
{
__u32 vni;
@@ -277,6 +359,9 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
if (tb[IFLA_VXLAN_LIMIT] &&
(maxaddr = rta_getattr_u32(tb[IFLA_VXLAN_LIMIT]) != 0))
fprintf(f, "maxaddr %u ", maxaddr);
+
+ if (tb[IFLA_VXLAN_REMOTE_LST])
+ vxlan_print_remotes(f, tb[IFLA_VXLAN_REMOTE_LST]);
}
struct link_util vxlan_link_util = {
--
1.8.1.5
next prev parent reply other threads:[~2013-05-28 8:33 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-28 8:31 [PATCH net-next v2 0/2] vxlan: allow specifying multiple default destinations Mike Rapoport
2013-05-28 8:31 ` [PATCH net-next v2 1/2] vxlan: introduce vxlan_rdst_append Mike Rapoport
2013-05-28 8:31 ` [PATCH net-next v2 2/2] vxlan: allow specifying multiple default destinations Mike Rapoport
2013-05-28 8:46 ` Cong Wang
2013-05-28 8:58 ` Mike Rapoport
2013-05-28 11:43 ` Thomas Graf
2013-05-28 8:33 ` Mike Rapoport [this message]
-- strict thread matches above, loose matches on Subject: below --
2016-09-18 17:41 [PATCH iproute2] " Tomasz Chmielewski
2013-05-29 10:00 [PATCH net-next v3 0/2] " Mike Rapoport
2013-05-29 10:00 ` [PATCH iproute2] " Mike Rapoport
2013-05-29 10:13 ` Cong Wang
2013-05-29 10:52 ` Mike Rapoport
2013-05-29 22:56 ` Stephen Hemminger
2013-05-30 8:42 ` Mike Rapoport
2013-05-30 11:44 ` Thomas Graf
2013-05-30 12:46 ` Mike Rapoport
2013-05-30 15:57 ` Thomas Graf
2013-06-02 7:09 ` Mike Rapoport
2013-06-05 4:30 ` Stephen Hemminger
2013-06-05 12:58 ` Mike Rapoport
2013-05-30 17:07 ` Stephen Hemminger
2013-04-25 11:03 [PATCH net-next 0/2] " Mike Rapoport
2013-04-25 11:04 ` [PATCH iproute2] " Mike Rapoport
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=1369729984-9802-1-git-send-email-mike.rapoport@ravellosystems.com \
--to=mike.rapoport@ravellosystems.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).