Add vxlan destination port option
Add ability to set UDP destination port on a per device basis. If no port is assigned, the default IANA assigned port will be used. If you want the kernel default value, then use port 0. Source port range option is now called 'srcport', to avoid confusion. The old option syntax is accepted for compatiablity. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
parent
191b60bd73
commit
d85e0a59d4
|
|
@ -25,8 +25,8 @@ static void explain(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Usage: ... vxlan id VNI [ group ADDR ] [ local ADDR ]\n");
|
fprintf(stderr, "Usage: ... vxlan id VNI [ group ADDR ] [ local ADDR ]\n");
|
||||||
fprintf(stderr, " [ ttl TTL ] [ tos TOS ] [ dev PHYS_DEV ]\n");
|
fprintf(stderr, " [ ttl TTL ] [ tos TOS ] [ dev PHYS_DEV ]\n");
|
||||||
fprintf(stderr, " [ port MIN MAX ] [ [no]learning ]\n");
|
fprintf(stderr, " [ dstport PORT ] [ srcport MIN MAX ]\n");
|
||||||
fprintf(stderr, " [ [no]proxy ] [ [no]rsc ]\n");
|
fprintf(stderr, " [ [no]learning ] [ [no]proxy ] [ [no]rsc ]\n");
|
||||||
fprintf(stderr, " [ [no]l2miss ] [ [no]l3miss ]\n");
|
fprintf(stderr, " [ [no]l2miss ] [ [no]l3miss ]\n");
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
fprintf(stderr, "Where: VNI := 0-16777215\n");
|
fprintf(stderr, "Where: VNI := 0-16777215\n");
|
||||||
|
|
@ -53,6 +53,7 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||||
__u8 noage = 0;
|
__u8 noage = 0;
|
||||||
__u32 age = 0;
|
__u32 age = 0;
|
||||||
__u32 maxaddr = 0;
|
__u32 maxaddr = 0;
|
||||||
|
__u16 dstport = 4789;
|
||||||
struct ifla_vxlan_port_range range = { 0, 0 };
|
struct ifla_vxlan_port_range range = { 0, 0 };
|
||||||
|
|
||||||
while (argc > 0) {
|
while (argc > 0) {
|
||||||
|
|
@ -115,7 +116,8 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||||
maxaddr = 0;
|
maxaddr = 0;
|
||||||
else if (get_u32(&maxaddr, *argv, 0))
|
else if (get_u32(&maxaddr, *argv, 0))
|
||||||
invarg("max addresses", *argv);
|
invarg("max addresses", *argv);
|
||||||
} else if (!matches(*argv, "port")) {
|
} else if (!matches(*argv, "port") ||
|
||||||
|
!matches(*argv, "srcport")) {
|
||||||
__u16 minport, maxport;
|
__u16 minport, maxport;
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
if (get_u16(&minport, *argv, 0))
|
if (get_u16(&minport, *argv, 0))
|
||||||
|
|
@ -125,6 +127,10 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||||
invarg("max port", *argv);
|
invarg("max port", *argv);
|
||||||
range.low = htons(minport);
|
range.low = htons(minport);
|
||||||
range.high = htons(maxport);
|
range.high = htons(maxport);
|
||||||
|
} else if (!matches(*argv, "dstport")){
|
||||||
|
NEXT_ARG();
|
||||||
|
if (get_u16(&dstport, *argv, 0))
|
||||||
|
invarg("dst port", *argv);
|
||||||
} else if (!matches(*argv, "nolearning")) {
|
} else if (!matches(*argv, "nolearning")) {
|
||||||
learning = 0;
|
learning = 0;
|
||||||
} else if (!matches(*argv, "learning")) {
|
} else if (!matches(*argv, "learning")) {
|
||||||
|
|
@ -155,7 +161,6 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||||
}
|
}
|
||||||
argc--, argv++;
|
argc--, argv++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!vni_set) {
|
if (!vni_set) {
|
||||||
fprintf(stderr, "vxlan: missing virtual network identifier\n");
|
fprintf(stderr, "vxlan: missing virtual network identifier\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -183,6 +188,8 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
|
||||||
if (range.low || range.high)
|
if (range.low || range.high)
|
||||||
addattr_l(n, 1024, IFLA_VXLAN_PORT_RANGE,
|
addattr_l(n, 1024, IFLA_VXLAN_PORT_RANGE,
|
||||||
&range, sizeof(range));
|
&range, sizeof(range));
|
||||||
|
if (dstport)
|
||||||
|
addattr16(n, 1024, IFLA_VXLAN_PORT, htons(dstport));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -233,9 +240,13 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
|
||||||
if (tb[IFLA_VXLAN_PORT_RANGE]) {
|
if (tb[IFLA_VXLAN_PORT_RANGE]) {
|
||||||
const struct ifla_vxlan_port_range *r
|
const struct ifla_vxlan_port_range *r
|
||||||
= RTA_DATA(tb[IFLA_VXLAN_PORT_RANGE]);
|
= RTA_DATA(tb[IFLA_VXLAN_PORT_RANGE]);
|
||||||
fprintf(f, "port %u %u ", ntohs(r->low), ntohs(r->high));
|
fprintf(f, "srcport %u %u ", ntohs(r->low), ntohs(r->high));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tb[IFLA_VXLAN_PORT])
|
||||||
|
fprintf(f, "dstport %u ",
|
||||||
|
ntohs(rta_getattr_u16(tb[IFLA_VXLAN_PORT])));
|
||||||
|
|
||||||
if (tb[IFLA_VXLAN_LEARNING] &&
|
if (tb[IFLA_VXLAN_LEARNING] &&
|
||||||
!rta_getattr_u8(tb[IFLA_VXLAN_LEARNING]))
|
!rta_getattr_u8(tb[IFLA_VXLAN_LEARNING]))
|
||||||
fputs("nolearning ", f);
|
fputs("nolearning ", f);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue