diff options
author | Charles Strahan <charles@cstrahan.com> | 2016-04-09 19:36:02 -0400 |
---|---|---|
committer | Charles Strahan <charles@cstrahan.com> | 2016-04-10 16:07:03 -0400 |
commit | ad7b1e24c20d60199525f3849115fa7e96bc5174 (patch) | |
tree | a0d97c245b6cb33106cbb2f35749c34e063a4057 /pkgs/os-specific/linux/iproute | |
parent | aec8daed8685c885f2e8c2701c4a013c607d163d (diff) |
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.patch | 65 | ||||
-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.patch | 177 | ||||
-rw-r--r-- | pkgs/os-specific/linux/iproute/default.nix | 8 |
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 0000000000000..ca91b81600083 --- /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 e55425c2ce6a0..a940b341ea0f7 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 0000000000000..2ddc2840bdd13 --- /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 891d39d24dd8b..5f328bd90c84d 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 |