fan-networking: updated patches from Ubuntu

This pulls in updated Fan Networking patches from Ubuntu.
(https://wiki.ubuntu.com/FanNetworking)

closes #14328
This commit is contained in:
Charles Strahan
2016-04-10 16:07:03 -04:00
parent aec8daed86
commit ad7b1e24c2
10 changed files with 1626 additions and 1323 deletions
@@ -0,0 +1,65 @@
Description: POC fan driver support
POC Fan driver support
Author: Jay Vosburgh <jay.vosburgh@canonical.com>
Index: iproute2-4.1.1/include/linux/if_tunnel.h
===================================================================
--- iproute2-4.1.1.orig/include/linux/if_tunnel.h
+++ iproute2-4.1.1/include/linux/if_tunnel.h
@@ -57,6 +57,9 @@ enum {
IFLA_IPTUN_ENCAP_FLAGS,
IFLA_IPTUN_ENCAP_SPORT,
IFLA_IPTUN_ENCAP_DPORT,
+
+ IFLA_IPTUN_FAN_UNDERLAY = 32,
+
__IFLA_IPTUN_MAX,
};
#define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1)
Index: iproute2-4.1.1/ip/link_iptnl.c
===================================================================
--- iproute2-4.1.1.orig/ip/link_iptnl.c
+++ iproute2-4.1.1/ip/link_iptnl.c
@@ -66,6 +66,7 @@ static int iptunnel_parse_opt(struct lin
__u32 link = 0;
__u32 laddr = 0;
__u32 raddr = 0;
+ __u32 underlay = 0;
__u8 ttl = 0;
__u8 tos = 0;
__u8 pmtudisc = 1;
@@ -174,6 +175,9 @@ get_failed:
raddr = get_addr32(*argv);
else
raddr = 0;
+ } else if (strcmp(*argv, "underlay") == 0) {
+ NEXT_ARG();
+ underlay = get_addr32(*argv);
} else if (strcmp(*argv, "local") == 0) {
NEXT_ARG();
if (strcmp(*argv, "any"))
@@ -318,6 +322,9 @@ get_failed:
}
}
+ if (underlay)
+ addattr32(n, 1024, IFLA_IPTUN_FAN_UNDERLAY, underlay);
+
return 0;
}
@@ -349,6 +356,14 @@ static void iptunnel_print_opt(struct li
fprintf(f, "local %s ", local);
+ if (tb[IFLA_IPTUN_FAN_UNDERLAY]) {
+ unsigned addr = rta_getattr_u32(tb[IFLA_IPTUN_FAN_UNDERLAY]);
+
+ if (addr)
+ fprintf(f, "underlay %s ",
+ format_host(AF_INET, 4, &addr, s1, sizeof(s1)));
+ }
+
if (tb[IFLA_IPTUN_LINK] && rta_getattr_u32(tb[IFLA_IPTUN_LINK])) {
unsigned link = rta_getattr_u32(tb[IFLA_IPTUN_LINK]);
const char *n = if_indextoname(link, s2);
@@ -1,27 +1,19 @@
This provides support for Ubuntu's Fan Networking [1].
These patches were pulled from:
https://code.launchpad.net/~ubuntu-branches/ubuntu/vivid/iproute2/vivid-proposed
See revisions 18 and 19.
[1] https://wiki.ubuntu.com/FanNetworking
diff --git a/include/linux/if_tunnel.h b/include/linux/if_tunnel.h
index 102ce7a..7b8f0e5 100644
--- a/include/linux/if_tunnel.h
+++ b/include/linux/if_tunnel.h
@@ -57,6 +57,9 @@ enum {
IFLA_IPTUN_ENCAP_FLAGS,
IFLA_IPTUN_ENCAP_SPORT,
Description: Fan driver support v3
Fan driver support v3
Author: Jay Vosburgh <jay.vosburgh@canonical.com>
Index: iproute2-4.1.1/include/linux/if_tunnel.h
===================================================================
--- iproute2-4.1.1.orig/include/linux/if_tunnel.h
+++ iproute2-4.1.1/include/linux/if_tunnel.h
@@ -59,6 +59,7 @@ enum {
IFLA_IPTUN_ENCAP_DPORT,
+
+ IFLA_IPTUN_FAN_UNDERLAY = 32,
IFLA_IPTUN_FAN_UNDERLAY = 32,
+ IFLA_IPTUN_FAN_MAP = 33,
__IFLA_IPTUN_MAX,
};
#define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1)
@@ -131,4 +134,20 @@ enum {
@@ -134,4 +135,20 @@ enum {
};
#define IFLA_VTI_MAX (__IFLA_VTI_MAX - 1)
@@ -42,10 +34,10 @@ index 102ce7a..7b8f0e5 100644
+};
+
#endif /* _IF_TUNNEL_H_ */
diff --git a/ip/link_iptnl.c b/ip/link_iptnl.c
index 9d6bc98..ec3f05d 100644
--- a/ip/link_iptnl.c
+++ b/ip/link_iptnl.c
Index: iproute2-4.1.1/ip/link_iptnl.c
===================================================================
--- iproute2-4.1.1.orig/ip/link_iptnl.c
+++ iproute2-4.1.1/ip/link_iptnl.c
@@ -49,6 +49,42 @@ static void usage(int sit)
print_usage(stderr, sit);
exit(-1);
@@ -89,21 +81,10 @@ index 9d6bc98..ec3f05d 100644
static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv,
struct nlmsghdr *n)
@@ -66,6 +102,7 @@ static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv,
__u32 link = 0;
__u32 laddr = 0;
__u32 raddr = 0;
+ __u32 underlay = 0;
__u8 ttl = 0;
__u8 tos = 0;
__u8 pmtudisc = 1;
@@ -174,6 +211,13 @@ get_failed:
raddr = get_addr32(*argv);
else
raddr = 0;
+ } else if (strcmp(*argv, "underlay") == 0) {
+ NEXT_ARG();
+ underlay = get_addr32(*argv);
@@ -178,6 +214,10 @@ get_failed:
} else if (strcmp(*argv, "underlay") == 0) {
NEXT_ARG();
underlay = get_addr32(*argv);
+ } else if (strcmp(*argv, "fan-map") == 0) {
+ NEXT_ARG();
+ if (fan_parse_map(&argc, &argv, n))
@@ -111,13 +92,7 @@ index 9d6bc98..ec3f05d 100644
} else if (strcmp(*argv, "local") == 0) {
NEXT_ARG();
if (strcmp(*argv, "any"))
@@ -318,9 +362,32 @@ get_failed:
}
}
+ if (underlay)
+ addattr32(n, 1024, IFLA_IPTUN_FAN_UNDERLAY, underlay);
+
@@ -328,6 +368,28 @@ get_failed:
return 0;
}
@@ -127,16 +102,18 @@ index 9d6bc98..ec3f05d 100644
+ struct ip_tunnel_fan_map *m;
+ struct rtattr *i;
+ int rem;
+ int p;
+
+ fprintf(f, "fan-map ");
+
+ rem = RTA_PAYLOAD(attr);
+ for (i = RTA_DATA(attr); RTA_OK(i, rem); i = RTA_NEXT(i, rem)) {
+ p = RTA_PAYLOAD(i);
+ m = RTA_DATA(i);
+ fprintf(f, "%s/%d:%s/%d ",
+ rt_addr_n2a(AF_INET, sizeof(m->overlay), &m->overlay, b1, INET_ADDRSTRLEN),
+ rt_addr_n2a(AF_INET, p, &m->overlay, b1, INET_ADDRSTRLEN),
+ m->overlay_prefix,
+ rt_addr_n2a(AF_INET, sizeof(m->overlay), &m->underlay, b2, INET_ADDRSTRLEN),
+ rt_addr_n2a(AF_INET, p, &m->underlay, b2, INET_ADDRSTRLEN),
+ m->underlay_prefix);
+ }
+}
@@ -144,18 +121,10 @@ index 9d6bc98..ec3f05d 100644
static void iptunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
{
char s1[1024];
@@ -349,6 +416,17 @@ static void iptunnel_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[
@@ -364,6 +426,9 @@ static void iptunnel_print_opt(struct li
format_host(AF_INET, 4, &addr, s1, sizeof(s1)));
}
fprintf(f, "local %s ", local);
+ if (tb[IFLA_IPTUN_FAN_UNDERLAY]) {
+ unsigned addr = rta_getattr_u32(tb[IFLA_IPTUN_FAN_UNDERLAY]);
+
+ if (addr)
+ fprintf(f, "underlay %s ",
+ format_host(AF_INET, 4, &addr, s1, sizeof(s1)));
+ }
+
+ if (tb[IFLA_IPTUN_FAN_MAP])
+ fan_print_map(f, tb[IFLA_IPTUN_FAN_MAP]);
+
@@ -0,0 +1,177 @@
Description: Fan driver support VXLAN (p4)
Fan driver setup support for vxlan interfaces.
Index: iproute2-4.3.0/include/linux/if_link.h
===================================================================
--- iproute2-4.3.0.orig/include/linux/if_link.h
+++ iproute2-4.3.0/include/linux/if_link.h
@@ -392,6 +392,7 @@ enum {
IFLA_VXLAN_GBP,
IFLA_VXLAN_REMCSUM_NOPARTIAL,
IFLA_VXLAN_COLLECT_METADATA,
+ IFLA_VXLAN_FAN_MAP = 33,
__IFLA_VXLAN_MAX
};
#define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1)
Index: iproute2-4.3.0/include/linux/if_tunnel.h
===================================================================
--- iproute2-4.3.0.orig/include/linux/if_tunnel.h
+++ iproute2-4.3.0/include/linux/if_tunnel.h
@@ -145,7 +145,7 @@ enum {
#define IFLA_FAN_MAX (__IFLA_FAN_MAX - 1)
-struct ip_tunnel_fan_map {
+struct ifla_fan_map {
__be32 underlay;
__be32 overlay;
__u16 underlay_prefix;
Index: iproute2-4.3.0/ip/iplink_vxlan.c
===================================================================
--- iproute2-4.3.0.orig/ip/iplink_vxlan.c
+++ iproute2-4.3.0/ip/iplink_vxlan.c
@@ -15,7 +15,10 @@
#include <net/if.h>
#include <linux/ip.h>
#include <linux/if_link.h>
+#include <linux/types.h>
#include <arpa/inet.h>
+#include <linux/in6.h>
+#include <linux/if_tunnel.h>
#include "rt_names.h"
#include "utils.h"
@@ -43,6 +46,45 @@ static void explain(void)
print_explain(stderr);
}
+static int fan_parse_map(int *argcp, char ***argvp, struct nlmsghdr *n)
+{
+ inet_prefix underlay, overlay;
+ struct ifla_fan_map map;
+ struct rtattr *nest;
+ char **argv = *argvp;
+ int argc = *argcp;
+
+ nest = addattr_nest(n, 1024, IFLA_VXLAN_FAN_MAP);
+ while (argc > 0) {
+ char *colon = strchr(*argv, ':');
+
+ if (!colon) {
+ PREV_ARG();
+ break;
+ }
+ *colon = '\0';
+
+ if (get_prefix(&overlay, *argv, AF_INET))
+ invarg("invalid fan-map overlay", *argv);
+ if (get_prefix(&underlay, colon + 1, AF_INET))
+ invarg("invalid fan-map underlay", colon + 1);
+
+ memcpy(&map.underlay, underlay.data, 4);
+ map.underlay_prefix = underlay.bitlen;
+ memcpy(&map.overlay, overlay.data, 4);
+ map.overlay_prefix = overlay.bitlen;
+
+ argc--, argv++;
+
+ addattr_l(n, 1024, IFLA_FAN_MAPPING, &map, sizeof(map));
+ }
+ addattr_nest_end(n, nest);
+
+ *argcp = argc;
+ *argvp = argv;
+ return 0;
+}
+
static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv,
struct nlmsghdr *n)
{
@@ -201,6 +243,10 @@ static int vxlan_parse_opt(struct link_u
udp6zerocsumrx = 0;
} else if (!matches(*argv, "gbp")) {
gbp = 1;
+ } else if (!matches(*argv, "fan-map")) {
+ NEXT_ARG();
+ if (fan_parse_map(&argc, &argv, n))
+ invarg("invalid fan-map", *argv);
} else if (matches(*argv, "help") == 0) {
explain();
return -1;
@@ -279,6 +325,28 @@ static int vxlan_parse_opt(struct link_u
return 0;
}
+static void fan_print_map(FILE *f, struct rtattr *attr)
+{
+ char b1[INET_ADDRSTRLEN], b2[INET_ADDRSTRLEN];
+ struct ifla_fan_map *m;
+ struct rtattr *i;
+ int rem;
+ int p;
+
+ fprintf(f, "fan-map ");
+
+ rem = RTA_PAYLOAD(attr);
+ for (i = RTA_DATA(attr); RTA_OK(i, rem); i = RTA_NEXT(i, rem)) {
+ p = RTA_PAYLOAD(i);
+ m = RTA_DATA(i);
+ fprintf(f, "%s/%d:%s/%d ",
+ rt_addr_n2a(AF_INET, p, &m->overlay, b1, INET_ADDRSTRLEN),
+ m->overlay_prefix,
+ rt_addr_n2a(AF_INET, p, &m->underlay, b2, INET_ADDRSTRLEN),
+ m->underlay_prefix);
+ }
+}
+
static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
{
__u32 vni;
@@ -321,6 +389,9 @@ static void vxlan_print_opt(struct link_
}
}
+ if (tb[IFLA_VXLAN_FAN_MAP])
+ fan_print_map(f, tb[IFLA_VXLAN_FAN_MAP]);
+
if (tb[IFLA_VXLAN_LOCAL]) {
__be32 addr = rta_getattr_u32(tb[IFLA_VXLAN_LOCAL]);
if (addr)
Index: iproute2-4.3.0/ip/link_iptnl.c
===================================================================
--- iproute2-4.3.0.orig/ip/link_iptnl.c
+++ iproute2-4.3.0/ip/link_iptnl.c
@@ -49,10 +49,11 @@ static void usage(int sit)
print_usage(stderr, sit);
exit(-1);
}
+
static int fan_parse_map(int *argcp, char ***argvp, struct nlmsghdr *n)
{
inet_prefix underlay, overlay;
- struct ip_tunnel_fan_map map;
+ struct ifla_fan_map map;
struct rtattr *nest;
char **argv = *argvp;
int argc = *argcp;
@@ -61,8 +62,10 @@ static int fan_parse_map(int *argcp, cha
while (argc > 0) {
char *colon = strchr(*argv, ':');
- if (!colon)
+ if (!colon) {
+ PREV_ARG();
break;
+ }
*colon = '\0';
if (get_prefix(&overlay, *argv, AF_INET))
@@ -371,7 +374,7 @@ get_failed:
static void fan_print_map(FILE *f, struct rtattr *attr)
{
char b1[INET_ADDRSTRLEN], b2[INET_ADDRSTRLEN];
- struct ip_tunnel_fan_map *m;
+ struct ifla_fan_map *m;
struct rtattr *i;
int rem;
int p;
+7 -1
View File
@@ -10,7 +10,13 @@ stdenv.mkDerivation rec {
sha256 = "159988vv3fd78bzhisfl1dl4dd7km3vjzs2d8899a0vcvn412fzh";
};
patches = lib.optionals enableFan [ ./ubuntu-fan.patch ];
patches = lib.optionals enableFan [
# These patches were pulled from:
# https://launchpad.net/ubuntu/xenial/+source/iproute2
./1000-ubuntu-poc-fan-driver.patch
./1001-ubuntu-poc-fan-driver-v3.patch
./1002-ubuntu-poc-fan-driver-vxlan.patch
];
preConfigure = ''
patchShebangs ./configure