summary refs log tree commit diff
path: root/pkgs/os-specific/linux/iproute
diff options
context:
space:
mode:
authorCharles Strahan <charles@cstrahan.com>2016-04-09 19:36:02 -0400
committerCharles Strahan <charles@cstrahan.com>2016-04-10 16:07:03 -0400
commitad7b1e24c20d60199525f3849115fa7e96bc5174 (patch)
treea0d97c245b6cb33106cbb2f35749c34e063a4057 /pkgs/os-specific/linux/iproute
parentaec8daed8685c885f2e8c2701c4a013c607d163d (diff)
downloadnixpkgs-ad7b1e24c20d60199525f3849115fa7e96bc5174.tar
nixpkgs-ad7b1e24c20d60199525f3849115fa7e96bc5174.tar.gz
nixpkgs-ad7b1e24c20d60199525f3849115fa7e96bc5174.tar.bz2
nixpkgs-ad7b1e24c20d60199525f3849115fa7e96bc5174.tar.lz
nixpkgs-ad7b1e24c20d60199525f3849115fa7e96bc5174.tar.xz
nixpkgs-ad7b1e24c20d60199525f3849115fa7e96bc5174.tar.zst
nixpkgs-ad7b1e24c20d60199525f3849115fa7e96bc5174.zip
fan-networking: updated patches from Ubuntu
This pulls in updated Fan Networking patches from Ubuntu.
(https://wiki.ubuntu.com/FanNetworking)

closes #14328
Diffstat (limited to 'pkgs/os-specific/linux/iproute')
-rw-r--r--pkgs/os-specific/linux/iproute/1000-ubuntu-poc-fan-driver.patch65
-rw-r--r--pkgs/os-specific/linux/iproute/1001-ubuntu-poc-fan-driver-v3.patch (renamed from pkgs/os-specific/linux/iproute/ubuntu-fan.patch)87
-rw-r--r--pkgs/os-specific/linux/iproute/1002-ubuntu-poc-fan-driver-vxlan.patch177
-rw-r--r--pkgs/os-specific/linux/iproute/default.nix8
4 files changed, 277 insertions, 60 deletions
diff --git a/pkgs/os-specific/linux/iproute/1000-ubuntu-poc-fan-driver.patch b/pkgs/os-specific/linux/iproute/1000-ubuntu-poc-fan-driver.patch
new file mode 100644
index 00000000000..ca91b816000
--- /dev/null
+++ b/pkgs/os-specific/linux/iproute/1000-ubuntu-poc-fan-driver.patch
@@ -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);
diff --git a/pkgs/os-specific/linux/iproute/ubuntu-fan.patch b/pkgs/os-specific/linux/iproute/1001-ubuntu-poc-fan-driver-v3.patch
index e55425c2ce6..a940b341ea0 100644
--- a/pkgs/os-specific/linux/iproute/ubuntu-fan.patch
+++ b/pkgs/os-specific/linux/iproute/1001-ubuntu-poc-fan-driver-v3.patch
@@ -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[
- 
- 	fprintf(f, "local %s ", local);
+@@ -364,6 +426,9 @@ static void iptunnel_print_opt(struct li
+ 				format_host(AF_INET, 4, &addr, s1, sizeof(s1)));
+ 	}
  
-+	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]);
 +
diff --git a/pkgs/os-specific/linux/iproute/1002-ubuntu-poc-fan-driver-vxlan.patch b/pkgs/os-specific/linux/iproute/1002-ubuntu-poc-fan-driver-vxlan.patch
new file mode 100644
index 00000000000..2ddc2840bdd
--- /dev/null
+++ b/pkgs/os-specific/linux/iproute/1002-ubuntu-poc-fan-driver-vxlan.patch
@@ -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;
diff --git a/pkgs/os-specific/linux/iproute/default.nix b/pkgs/os-specific/linux/iproute/default.nix
index 891d39d24dd..5f328bd90c8 100644
--- a/pkgs/os-specific/linux/iproute/default.nix
+++ b/pkgs/os-specific/linux/iproute/default.nix
@@ -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