diff --git a/SOURCES/iproute2-3.16.0-addrgenmode.patch b/SOURCES/iproute2-3.16.0-addrgenmode.patch new file mode 100644 index 0000000..02f6fec --- /dev/null +++ b/SOURCES/iproute2-3.16.0-addrgenmode.patch @@ -0,0 +1,97 @@ +diff --git a/include/linux/if_link.h b/include/linux/if_link.h +index fadef0f..39cb62c 100644 +--- a/include/linux/if_link.h ++++ b/include/linux/if_link.h +@@ -202,11 +202,17 @@ enum { + IFLA_INET6_CACHEINFO, /* time values and max reasm size */ + IFLA_INET6_ICMP6STATS, /* statistics (icmpv6) */ + IFLA_INET6_TOKEN, /* device token */ ++ IFLA_INET6_ADDR_GEN_MODE, /* implicit address generator mode */ + __IFLA_INET6_MAX + }; + + #define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1) + ++enum in6_addr_gen_mode { ++ IN6_ADDR_GEN_MODE_EUI64, ++ IN6_ADDR_GEN_MODE_NONE, ++}; ++ + enum { + BRIDGE_MODE_UNSPEC, + BRIDGE_MODE_HAIRPIN, +diff --git a/ip/iplink.c b/ip/iplink.c +index 0d020ef..ecb05d6 100644 +--- a/ip/iplink.c ++++ b/ip/iplink.c +@@ -81,6 +81,7 @@ void iplink_usage(void) + fprintf(stderr, " [ state { auto | enable | disable} ] ]\n"); + fprintf(stderr, " [ master DEVICE ]\n"); + fprintf(stderr, " [ nomaster ]\n"); ++ fprintf(stderr, " [ addrgenmode { eui64 | none } ]\n"); + fprintf(stderr, " ip link show [ DEVICE | group GROUP ] [up]\n"); + + if (iplink_have_newlink()) { +@@ -161,6 +162,15 @@ static int get_link_mode(const char *mode) + return -1; + } + ++static int get_addr_gen_mode(const char *mode) ++{ ++ if (strcasecmp(mode, "eui64") == 0) ++ return IN6_ADDR_GEN_MODE_EUI64; ++ if (strcasecmp(mode, "none") == 0) ++ return IN6_ADDR_GEN_MODE_NONE; ++ return -1; ++} ++ + #if IPLINK_IOCTL_COMPAT + static int have_rtnl_newlink = -1; + +@@ -557,6 +567,18 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, + invarg("Invalid \"numrxqueues\" value\n", *argv); + addattr_l(&req->n, sizeof(*req), IFLA_NUM_RX_QUEUES, + &numrxqueues, 4); ++ } else if (matches(*argv, "addrgenmode") == 0) { ++ struct rtattr *afs, *afs6; ++ int mode; ++ NEXT_ARG(); ++ mode = get_addr_gen_mode(*argv); ++ if (mode < 0) ++ invarg("Invalid address generation mode\n", *argv); ++ afs = addattr_nest(&req->n, sizeof(*req), IFLA_AF_SPEC); ++ afs6 = addattr_nest(&req->n, sizeof(*req), AF_INET6); ++ addattr8(&req->n, sizeof(*req), IFLA_INET6_ADDR_GEN_MODE, mode); ++ addattr_nest_end(&req->n, afs6); ++ addattr_nest_end(&req->n, afs); + } else { + if (strcmp(*argv, "dev") == 0) { + NEXT_ARG(); +diff -uNrp iproute2-3.10.0.orig/man/man8/ip-link.8.in iproute2-3.10.0/man/man8/ip-link.8.in +--- iproute2-3.10.0.orig/man/man8/ip-link.8.in 2014-10-24 12:59:52.388574153 +0200 ++++ iproute2-3.10.0/man/man8/ip-link.8.in 2014-10-24 12:57:58.650081739 +0200 +@@ -120,9 +120,11 @@ ip-link \- network device configuration + ] | + .br + .B master +-.IR DEVICE ++.IR DEVICE " |" + .br +-.B nomaster ++.B nomaster " |" ++.br ++.B addrgenmode { eui64 | none } + .BR " }" + + +@@ -512,6 +514,10 @@ set master device of the device (enslave + .BI nomaster + unset master device of the device (release device). + ++.TP ++.BR "addrgenmode eui64 " or " addrgenmode none" ++set IPv6 address generation mode ++ + .PP + .B Warning: + If multiple parameter changes are requested, diff --git a/SOURCES/iproute2-3.16.0-addrlabel.patch b/SOURCES/iproute2-3.16.0-addrlabel.patch new file mode 100644 index 0000000..4361395 --- /dev/null +++ b/SOURCES/iproute2-3.16.0-addrlabel.patch @@ -0,0 +1,22 @@ +diff --git a/lib/utils.c b/lib/utils.c +index 4e9c719..eb92414 100644 +--- a/lib/utils.c ++++ b/lib/utils.c +@@ -487,7 +487,7 @@ int get_addr(inet_prefix *dst, const char *arg, int family) + exit(1); + } + if (get_addr_1(dst, arg, family)) { +- fprintf(stderr, "Error: an inet address is expected rather than \"%s\".\n", arg); ++ fprintf(stderr, "Error: an %s address is expected rather than \"%s\".\n", (family == AF_INET6 ? "inet6" : "inet") ,arg); + exit(1); + } + return 0; +@@ -500,7 +500,7 @@ int get_prefix(inet_prefix *dst, char *arg, int family) + exit(1); + } + if (get_prefix_1(dst, arg, family)) { +- fprintf(stderr, "Error: an inet prefix is expected rather than \"%s\".\n", arg); ++ fprintf(stderr, "Error: an %s prefix is expected rather than \"%s\".\n", (family == AF_INET6 ? "inet6" : "inet") ,arg); + exit(1); + } + return 0; diff --git a/SOURCES/iproute2-3.16.0-bpf.patch b/SOURCES/iproute2-3.16.0-bpf.patch new file mode 100644 index 0000000..c4c7df9 --- /dev/null +++ b/SOURCES/iproute2-3.16.0-bpf.patch @@ -0,0 +1,410 @@ +From d05df6861f99f251282e59f36dd94d7ff28d1bb8 Mon Sep 17 00:00:00 2001 +From: Daniel Borkmann +Date: Mon, 28 Oct 2013 12:35:33 +0100 +Subject: tc: add cls_bpf frontend + +This is the iproute2 part of the kernel patch "net: sched: +add BPF-based traffic classifier". + +[Will re-submit later again for iproute2 when window for + -next submissions opens.] + +Signed-off-by: Daniel Borkmann +Cc: Thomas Graf + +diff --git a/tc/Makefile b/tc/Makefile +index f54a955..84215c0 100644 +--- a/tc/Makefile ++++ b/tc/Makefile +@@ -22,6 +22,7 @@ TCMODULES += f_u32.o + TCMODULES += f_route.o + TCMODULES += f_fw.o + TCMODULES += f_basic.o ++TCMODULES += f_bpf.o + TCMODULES += f_flow.o + TCMODULES += f_cgroup.o + TCMODULES += q_dsmark.o +diff --git a/tc/f_bpf.c b/tc/f_bpf.c +new file mode 100644 +index 0000000..d52d7d8 +--- /dev/null ++++ b/tc/f_bpf.c +@@ -0,0 +1,288 @@ ++/* ++ * f_bpf.c BPF-based Classifier ++ * ++ * This program is free software; you can distribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ * ++ * Authors: Daniel Borkmann ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "utils.h" ++#include "tc_util.h" ++ ++static void explain(void) ++{ ++ fprintf(stderr, "Usage: ... bpf ...\n"); ++ fprintf(stderr, "\n"); ++ fprintf(stderr, " [inline]: run bytecode BPF_BYTECODE\n"); ++ fprintf(stderr, " [from file]: run bytecode-file FILE\n"); ++ fprintf(stderr, "\n"); ++ fprintf(stderr, " [ police POLICE_SPEC ] [ action ACTION_SPEC ]\n"); ++ fprintf(stderr, " [ classid CLASSID ]\n"); ++ fprintf(stderr, "\n"); ++ fprintf(stderr, "Where BPF_BYTECODE := \'s,c t f k,c t f k,c t f k,...\'\n"); ++ fprintf(stderr, " c,t,f,k and s are decimals; s denotes number of 4-tuples\n"); ++ fprintf(stderr, "Where FILE points to a file containing the BPF_BYTECODE string\n"); ++ fprintf(stderr, "\nNOTE: CLASSID is parsed as hexadecimal input.\n"); ++} ++ ++static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len, ++ char **bpf_string, bool *need_release, ++ const char separator) ++{ ++ char sp; ++ ++ if (from_file) { ++ size_t tmp_len, op_len = sizeof("65535 255 255 4294967295,"); ++ char *tmp_string; ++ FILE *fp; ++ ++ tmp_len = sizeof("4096,") + BPF_MAXINSNS * op_len; ++ tmp_string = malloc(tmp_len); ++ if (tmp_string == NULL) ++ return -ENOMEM; ++ ++ memset(tmp_string, 0, tmp_len); ++ ++ fp = fopen(arg, "r"); ++ if (fp == NULL) { ++ perror("Cannot fopen"); ++ free(tmp_string); ++ return -ENOENT; ++ } ++ ++ if (!fgets(tmp_string, tmp_len, fp)) { ++ free(tmp_string); ++ fclose(fp); ++ return -EIO; ++ } ++ ++ fclose(fp); ++ ++ *need_release = true; ++ *bpf_string = tmp_string; ++ } else { ++ *need_release = false; ++ *bpf_string = arg; ++ } ++ ++ if (sscanf(*bpf_string, "%hu%c", bpf_len, &sp) != 2 || ++ sp != separator) { ++ if (*need_release) ++ free(*bpf_string); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static int bpf_parse_ops(int argc, char **argv, struct nlmsghdr *n, ++ bool from_file) ++{ ++ char *bpf_string, *token, separator = ','; ++ struct sock_filter bpf_ops[BPF_MAXINSNS]; ++ int ret = 0, i = 0; ++ bool need_release; ++ __u16 bpf_len = 0; ++ ++ if (argc < 1) ++ return -EINVAL; ++ if (bpf_parse_string(argv[0], from_file, &bpf_len, &bpf_string, ++ &need_release, separator)) ++ return -EINVAL; ++ if (bpf_len == 0 || bpf_len > BPF_MAXINSNS) { ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ token = bpf_string; ++ while ((token = strchr(token, separator)) && (++token)[0]) { ++ if (i >= bpf_len) { ++ fprintf(stderr, "Real program length exceeds encoded " ++ "length parameter!\n"); ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ if (sscanf(token, "%hu %hhu %hhu %u,", ++ &bpf_ops[i].code, &bpf_ops[i].jt, ++ &bpf_ops[i].jf, &bpf_ops[i].k) != 4) { ++ fprintf(stderr, "Error at instruction %d!\n", i); ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ i++; ++ } ++ ++ if (i != bpf_len) { ++ fprintf(stderr, "Parsed program length is less than encoded" ++ "length parameter!\n"); ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ addattr_l(n, MAX_MSG, TCA_BPF_OPS_LEN, &bpf_len, sizeof(bpf_len)); ++ addattr_l(n, MAX_MSG, TCA_BPF_OPS, &bpf_ops, ++ bpf_len * sizeof(struct sock_filter)); ++out: ++ if (need_release) ++ free(bpf_string); ++ ++ return ret; ++} ++ ++static void bpf_print_ops(FILE *f, struct rtattr *bpf_ops, __u16 len) ++{ ++ struct sock_filter *ops = (struct sock_filter *) RTA_DATA(bpf_ops); ++ int i; ++ ++ if (len == 0) ++ return; ++ ++ fprintf(f, "bytecode \'%u,", len); ++ ++ for (i = 0; i < len - 1; i++) ++ fprintf(f, "%hu %hhu %hhu %u,", ops[i].code, ops[i].jt, ++ ops[i].jf, ops[i].k); ++ ++ fprintf(f, "%hu %hhu %hhu %u\'\n", ops[i].code, ops[i].jt, ++ ops[i].jf, ops[i].k); ++} ++ ++static int bpf_parse_opt(struct filter_util *qu, char *handle, ++ int argc, char **argv, struct nlmsghdr *n) ++{ ++ struct tcmsg *t = NLMSG_DATA(n); ++ struct rtattr *tail; ++ long h = 0; ++ ++ if (argc == 0) ++ return 0; ++ ++ if (handle) { ++ h = strtol(handle, NULL, 0); ++ if (h == LONG_MIN || h == LONG_MAX) { ++ fprintf(stderr, "Illegal handle \"%s\", must be " ++ "numeric.\n", handle); ++ return -1; ++ } ++ } ++ ++ t->tcm_handle = h; ++ ++ tail = (struct rtattr*)(((void*)n)+NLMSG_ALIGN(n->nlmsg_len)); ++ addattr_l(n, MAX_MSG, TCA_OPTIONS, NULL, 0); ++ ++ while (argc > 0) { ++ if (matches(*argv, "run") == 0) { ++ bool from_file; ++ NEXT_ARG(); ++ if (strcmp(*argv, "bytecode-file") == 0) { ++ from_file = true; ++ } else if (strcmp(*argv, "bytecode") == 0) { ++ from_file = false; ++ } else { ++ fprintf(stderr, "What is \"%s\"?\n", *argv); ++ explain(); ++ return -1; ++ } ++ NEXT_ARG(); ++ if (bpf_parse_ops(argc, argv, n, from_file)) { ++ fprintf(stderr, "Illegal \"bytecode\"\n"); ++ return -1; ++ } ++ } else if (matches(*argv, "classid") == 0 || ++ strcmp(*argv, "flowid") == 0) { ++ unsigned handle; ++ NEXT_ARG(); ++ if (get_tc_classid(&handle, *argv)) { ++ fprintf(stderr, "Illegal \"classid\"\n"); ++ return -1; ++ } ++ addattr_l(n, MAX_MSG, TCA_BPF_CLASSID, &handle, 4); ++ } else if (matches(*argv, "action") == 0) { ++ NEXT_ARG(); ++ if (parse_action(&argc, &argv, TCA_BPF_ACT, n)) { ++ fprintf(stderr, "Illegal \"action\"\n"); ++ return -1; ++ } ++ continue; ++ } else if (matches(*argv, "police") == 0) { ++ NEXT_ARG(); ++ if (parse_police(&argc, &argv, TCA_BPF_POLICE, n)) { ++ fprintf(stderr, "Illegal \"police\"\n"); ++ return -1; ++ } ++ continue; ++ } else if (strcmp(*argv, "help") == 0) { ++ explain(); ++ return -1; ++ } else { ++ fprintf(stderr, "What is \"%s\"?\n", *argv); ++ explain(); ++ return -1; ++ } ++ argc--; argv++; ++ } ++ ++ tail->rta_len = (((void*)n)+n->nlmsg_len) - (void*)tail; ++ return 0; ++} ++ ++static int bpf_print_opt(struct filter_util *qu, FILE *f, ++ struct rtattr *opt, __u32 handle) ++{ ++ struct rtattr *tb[TCA_BPF_MAX + 1]; ++ ++ if (opt == NULL) ++ return 0; ++ ++ parse_rtattr_nested(tb, TCA_BPF_MAX, opt); ++ ++ if (handle) ++ fprintf(f, "handle 0x%x ", handle); ++ ++ if (tb[TCA_BPF_CLASSID]) { ++ SPRINT_BUF(b1); ++ fprintf(f, "flowid %s ", ++ sprint_tc_classid(rta_getattr_u32(tb[TCA_BPF_CLASSID]), b1)); ++ } ++ ++ if (tb[TCA_BPF_OPS] && tb[TCA_BPF_OPS_LEN]) ++ bpf_print_ops(f, tb[TCA_BPF_OPS], ++ rta_getattr_u16(tb[TCA_BPF_OPS_LEN])); ++ ++ if (tb[TCA_BPF_POLICE]) { ++ fprintf(f, "\n"); ++ tc_print_police(f, tb[TCA_BPF_POLICE]); ++ } ++ ++ if (tb[TCA_BPF_ACT]) { ++ tc_print_action(f, tb[TCA_BPF_ACT]); ++ } ++ ++ return 0; ++} ++ ++struct filter_util bpf_filter_util = { ++ .id = "bpf", ++ .parse_fopt = bpf_parse_opt, ++ .print_fopt = bpf_print_opt, ++}; +-- +cgit v0.10.1 + +commit 793da0e7023ce29e32914af477fdbcc4bdbb022f +Author: Stephen Hemminger +Date: Wed Oct 30 16:42:03 2013 -0700 + + Update kernel headers + + Lastest from net-next + +diff --git a/include/linux/can/netlink.h b/include/linux/can/netlink.h +index 14966dd..df944ed 100644 +--- a/include/linux/can/netlink.h ++++ b/include/linux/can/netlink.h +@@ -5,6 +5,14 @@ + * + * Copyright (c) 2009 Wolfgang Grandegger + * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the version 2 of the GNU General Public License ++ * as published by the Free Software Foundation ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. + */ + + #ifndef CAN_NETLINK_H +diff --git a/include/linux/if_link.h b/include/linux/if_link.h +index ee4f2ba..a485920 100644 +--- a/include/linux/if_link.h ++++ b/include/linux/if_link.h +@@ -323,6 +323,17 @@ struct ifla_vxlan_port_range { + __be16 high; + }; + ++/* Bonding section */ ++ ++enum { ++ IFLA_BOND_UNSPEC, ++ IFLA_BOND_MODE, ++ IFLA_BOND_ACTIVE_SLAVE, ++ __IFLA_BOND_MAX, ++}; ++ ++#define IFLA_BOND_MAX (__IFLA_BOND_MAX - 1) ++ + /* SR-IOV virtual function management section */ + + enum { +diff --git a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h +index 082eafa..25731df 100644 +--- a/include/linux/pkt_cls.h ++++ b/include/linux/pkt_cls.h +@@ -388,6 +388,20 @@ enum { + + #define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1) + ++/* BPF classifier */ ++ ++enum { ++ TCA_BPF_UNSPEC, ++ TCA_BPF_ACT, ++ TCA_BPF_POLICE, ++ TCA_BPF_CLASSID, ++ TCA_BPF_OPS_LEN, ++ TCA_BPF_OPS, ++ __TCA_BPF_MAX, ++}; ++ ++#define TCA_BPF_MAX (__TCA_BPF_MAX - 1) ++ + /* Extended Matches */ + + struct tcf_ematch_tree_hdr { +diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h +index 9b82913..f2624b5 100644 +--- a/include/linux/pkt_sched.h ++++ b/include/linux/pkt_sched.h +@@ -357,6 +357,8 @@ enum { + TCA_HTB_CTAB, + TCA_HTB_RTAB, + TCA_HTB_DIRECT_QLEN, ++ TCA_HTB_RATE64, ++ TCA_HTB_CEIL64, + __TCA_HTB_MAX, + }; + diff --git a/SOURCES/iproute2-3.16.0-quickack.patch b/SOURCES/iproute2-3.16.0-quickack.patch new file mode 100644 index 0000000..8d780b0 --- /dev/null +++ b/SOURCES/iproute2-3.16.0-quickack.patch @@ -0,0 +1,94 @@ +commit b37f2c895d7876416a45e608754a39fff47ddf29 +Author: Cong Wang +Date: Sat Jun 15 09:39:19 2013 +0800 + + add quickack option to ip route + + This patch adds quickack option to enable/disable TCP quick ack + mode for per-route. + + Cc: Stephen Hemminger + Cc: "David S. Miller" + Cc: Thomas Graf + Signed-off-by: Cong Wang + +diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h +index 93370bd..248fdd3 100644 +--- a/include/linux/rtnetlink.h ++++ b/include/linux/rtnetlink.h +@@ -386,6 +386,8 @@ enum { + #define RTAX_RTO_MIN RTAX_RTO_MIN + RTAX_INITRWND, + #define RTAX_INITRWND RTAX_INITRWND ++ RTAX_QUICKACK, ++#define RTAX_QUICKACK RTAX_QUICKACK + __RTAX_MAX + }; + +diff --git a/ip/iproute.c b/ip/iproute.c +index adef774..46710b2 100644 +--- a/ip/iproute.c ++++ b/ip/iproute.c +@@ -52,6 +52,7 @@ static const char *mx_names[RTAX_MAX+1] = { + [RTAX_FEATURES] = "features", + [RTAX_RTO_MIN] = "rto_min", + [RTAX_INITRWND] = "initrwnd", ++ [RTAX_QUICKACK] = "quickack", + }; + static void usage(void) __attribute__((noreturn)); + +@@ -79,6 +80,7 @@ static void usage(void) + fprintf(stderr, " [ window NUMBER] [ cwnd NUMBER ] [ initcwnd NUMBER ]\n"); + fprintf(stderr, " [ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]\n"); + fprintf(stderr, " [ rto_min TIME ] [ hoplimit NUMBER ] [ initrwnd NUMBER ]\n"); ++ fprintf(stderr, " [ quickack BOOL ]\n"); + fprintf(stderr, "TYPE := [ unicast | local | broadcast | multicast | throw |\n"); + fprintf(stderr, " unreachable | prohibit | blackhole | nat ]\n"); + fprintf(stderr, "TABLE_ID := [ local | main | default | all | NUMBER ]\n"); +@@ -86,6 +88,7 @@ static void usage(void) + fprintf(stderr, "NHFLAGS := [ onlink | pervasive ]\n"); + fprintf(stderr, "RTPROTO := [ kernel | boot | static | NUMBER ]\n"); + fprintf(stderr, "TIME := NUMBER[s|ms]\n"); ++ fprintf(stderr, "BOOL := [1|0]\n"); + exit(-1); + } + +@@ -885,6 +888,14 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv) + if (get_unsigned(&win, *argv, 0)) + invarg("\"initrwnd\" value is invalid\n", *argv); + rta_addattr32(mxrta, sizeof(mxbuf), RTAX_INITRWND, win); ++ } else if (matches(*argv, "quickack") == 0) { ++ unsigned quickack; ++ NEXT_ARG(); ++ if (get_unsigned(&quickack, *argv, 0)) ++ invarg("\"quickack\" value is invalid\n", *argv); ++ if (quickack != 1 && quickack != 0) ++ invarg("\"quickack\" value should be 0 or 1\n", *argv); ++ rta_addattr32(mxrta, sizeof(mxbuf), RTAX_QUICKACK, quickack); + } else if (matches(*argv, "rttvar") == 0) { + unsigned win; + NEXT_ARG(); +diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in +index 2c35a97..01997fa 100644 +--- a/man/man8/ip-route.8.in ++++ b/man/man8/ip-route.8.in +@@ -111,6 +111,8 @@ replace " } " + .IR NUMBER " ] [ " + .B initrwnd + .IR NUMBER " ]" ++.B quickack ++.IR BOOL " ]" + + .ti -8 + .IR TYPE " := [ " +@@ -401,6 +403,10 @@ Actual window size is this value multiplied by the MSS of the connection. + The default value is zero, meaning to use Slow Start value. + + .TP ++.BI quickack " BOOL " "(3.11+ only)" ++Enable or disable quick ack for connections to this destination. ++ ++.TP + .BI advmss " NUMBER " "(2.3.15+ only)" + the MSS ('Maximal Segment Size') to advertise to these + destinations when establishing TCP connections. If it is not given, diff --git a/SPECS/iproute.spec b/SPECS/iproute.spec index bdb90ad..f4ab6c5 100644 --- a/SPECS/iproute.spec +++ b/SPECS/iproute.spec @@ -2,7 +2,7 @@ Summary: Advanced IP routing and network device configuration tools Name: iproute Version: 3.10.0 -Release: 13%{?dist} +Release: 21%{?dist} Group: Applications/System URL: http://kernel.org/pub/linux/utils/net/%{name}2/ Source0: http://kernel.org/pub/linux/utils/net/%{name}2/%{name}2-%{version}.tar.gz @@ -45,6 +45,14 @@ Patch21: iproute2-3.10.0-Add-destination-port-support-for-VXLAN.patch Patch22: iproute2-3.10.0-Add-IPv6-support-to-VXLAN.patch # rhbz#1061593 Patch23: iproute2-3.10.0-Add-VF-link-state-control.patch +# rhbz#1119180 +Patch24: iproute2-3.16.0-addrgenmode.patch +# rhbz#1034049 +Patch25: iproute2-3.16.0-addrlabel.patch +# rhbz#1091010 +Patch26: iproute2-3.16.0-quickack.patch +# rhbz#1044535 +Patch27: iproute2-3.16.0-bpf.patch License: GPLv2+ and Public Domain BuildRequires: bison BuildRequires: flex @@ -114,7 +122,12 @@ sed -i "s/_VERSION_/%{version}/" man/man8/ss.8 %patch21 -p1 %patch22 -p1 %patch23 -p1 +%patch24 -p1 +%patch25 -p1 +%patch26 -p1 +%patch27 -p1 sed -i 's/^LIBDIR=/LIBDIR?=/' Makefile +sed -i 's/iproute-doc/%{name}-%{version}/' man/man8/lnstat.8 %build export LIBDIR=/%{_libdir} @@ -213,6 +226,32 @@ done %{_includedir}/libnetlink.h %changelog +* Fri Oct 24 2014 Pavel Šimerda - 3.10.0-21 +- Related: #1119180 - improve addrgen documentation + +* Fri Oct 24 2014 Pavel Šimerda - 3.10.0-20 +- Related: #1119180 - document addrgen + +* Wed Oct 08 2014 Pavel Šimerda - 3.10.0-19 +- Resolves: #1081081 - lnstat man page references iproute-doc when it should + reference iproute- + +* Fri Oct 03 2014 Pavel Šimerda - 3.10.0-18 +- Resolves: #1044535 - tc: add cls_bpf frontend + +* Fri Oct 03 2014 Pavel Šimerda - 3.10.0-17 +- Resolves: #1044535 - backport tc: + +* Fri Oct 03 2014 Pavel Šimerda - 3.10.0-16 +- Resolves: #1091010 - [RFE] iproute2: Allow Configurable TCP Delayed Ack in + RHEL + +* Fri Oct 03 2014 Pavel Šimerda - 3.10.0-15 +- Resolves: #1100271 - ip -6 addrlabel return incorrect error message + +* Fri Oct 03 2014 Pavel Šimerda - 3.10.0-14 +- Resolves: #1119180 - iproute2: allow to ipv6 set address generation mode + * Tue Feb 25 2014 Petr Šabata - 3.10.0-13 - Add VF link state control mechanisms (#1061593)