diff --git a/include/SNAPSHOT.h b/include/SNAPSHOT.h index e9d546d0..3b2f8f1b 100644 --- a/include/SNAPSHOT.h +++ b/include/SNAPSHOT.h @@ -1 +1 @@ -static const char SNAPSHOT[] = "190107"; +static const char SNAPSHOT[] = "190319"; diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index b7b748f1..a857878f 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -2359,6 +2359,13 @@ union bpf_attr { * Return * A **struct bpf_tcp_sock** pointer on success, or NULL in * case of failure. + * + * int bpf_skb_ecn_set_ce(struct sk_buf *skb) + * Description + * Sets ECN of IP header to ce (congestion encountered) if + * current value is ect (ECN capable). Works with IPv6 and IPv4. + * Return + * 1 if set, 0 if not set. */ #define __BPF_FUNC_MAPPER(FN) \ FN(unspec), \ @@ -2457,7 +2464,8 @@ union bpf_attr { FN(spin_lock), \ FN(spin_unlock), \ FN(sk_fullsock), \ - FN(tcp_sock), + FN(tcp_sock), \ + FN(skb_ecn_set_ce), /* integer value in 'imm' field of BPF_CALL instruction selects which helper * function eBPF program intends to call @@ -2813,6 +2821,8 @@ struct bpf_prog_info { __u32 jited_line_info_rec_size; __u32 nr_prog_tags; __aligned_u64 prog_tags; + __u64 run_time_ns; + __u64 run_cnt; } __attribute__((aligned(8))); struct bpf_map_info { diff --git a/include/uapi/linux/in6.h b/include/uapi/linux/in6.h index 2bb132a9..d016ac9f 100644 --- a/include/uapi/linux/in6.h +++ b/include/uapi/linux/in6.h @@ -178,6 +178,7 @@ struct in6_flowlabel_req { #define IPV6_JOIN_ANYCAST 27 #define IPV6_LEAVE_ANYCAST 28 #define IPV6_MULTICAST_ALL 29 +#define IPV6_ROUTER_ALERT_ISOLATE 30 /* IPV6_MTU_DISCOVER values */ #define IPV6_PMTUDISC_DONT 0 diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h index 1eb572ef..7ee74c34 100644 --- a/include/uapi/linux/pkt_sched.h +++ b/include/uapi/linux/pkt_sched.h @@ -1021,6 +1021,7 @@ enum { TCA_CAKE_INGRESS, TCA_CAKE_ACK_FILTER, TCA_CAKE_SPLIT_GSO, + TCA_CAKE_FWMARK, __TCA_CAKE_MAX }; #define TCA_CAKE_MAX (__TCA_CAKE_MAX - 1) diff --git a/ip/ipaddress.c b/ip/ipaddress.c index 76edf706..b504200b 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -174,7 +174,9 @@ static void print_queuelen(FILE *f, struct rtattr *tb[IFLA_MAX + 1]) strcpy(ifr.ifr_name, rta_getattr_str(tb[IFLA_IFNAME])); if (ioctl(s, SIOCGIFTXQLEN, &ifr) < 0) { - fprintf(f, "ioctl(SIOCGIFTXQLEN) failed: %s\n", strerror(errno)); + fprintf(stderr, + "ioctl(SIOCGIFTXQLEN) failed: %s\n", + strerror(errno)); close(s); return; } diff --git a/ip/iproute.c b/ip/iproute.c index cc02a3e1..2b3dcc5d 100644 --- a/ip/iproute.c +++ b/ip/iproute.c @@ -450,10 +450,8 @@ static void print_cache_flags(FILE *fp, __u32 flags) if (flags) print_hex(PRINT_ANY, "flags", "%x>", flags); - if (jw) { + if (jw) jsonw_end_array(jw); - jsonw_destroy(&jw); - } } static void print_rta_cacheinfo(FILE *fp, const struct rta_cacheinfo *ci) @@ -766,7 +764,7 @@ int print_route(struct nlmsghdr *n, void *arg) if ((r->rtm_type != RTN_UNICAST || show_details > 0) && (!filter.typemask || (filter.typemask & (1 << r->rtm_type)))) - print_string(PRINT_ANY, NULL, "%s ", + print_string(PRINT_ANY, "type", "%s ", rtnl_rtntype_n2a(r->rtm_type, b1, sizeof(b1))); color = COLOR_NONE; @@ -2079,6 +2077,8 @@ static int iproute_get(int argc, char **argv) if (rtnl_talk(&rth, &req.n, &answer) < 0) return -2; + new_json_obj(json); + if (connected && !from_ok) { struct rtmsg *r = NLMSG_DATA(answer); int len = answer->nlmsg_len; @@ -2123,6 +2123,7 @@ static int iproute_get(int argc, char **argv) req.n.nlmsg_flags = NLM_F_REQUEST; req.n.nlmsg_type = RTM_GETROUTE; + delete_json_obj(); free(answer); if (rtnl_talk(&rth, &req.n, &answer) < 0) return -2; @@ -2134,6 +2135,7 @@ static int iproute_get(int argc, char **argv) return -1; } + delete_json_obj(); free(answer); return 0; } diff --git a/ip/iprule.c b/ip/iprule.c index 4e9437de..83aef38e 100644 --- a/ip/iprule.c +++ b/ip/iprule.c @@ -455,7 +455,8 @@ int print_rule(struct nlmsghdr *n, void *arg) print_string(PRINT_ANY, "goto", "goto %s", "none"); if (frh->flags & FIB_RULE_UNRESOLVED) - print_null(PRINT_ANY, "unresolved", "unresolved", NULL); + print_null(PRINT_ANY, "unresolved", + " [unresolved]", NULL); } else if (frh->action == FR_ACT_NOP) { print_null(PRINT_ANY, "nop", "nop", NULL); } else if (frh->action != FR_ACT_TO_TBL) { diff --git a/rdma/include/uapi/rdma/ib_user_verbs.h b/rdma/include/uapi/rdma/ib_user_verbs.h index 480d9a60..0474c740 100644 --- a/rdma/include/uapi/rdma/ib_user_verbs.h +++ b/rdma/include/uapi/rdma/ib_user_verbs.h @@ -270,6 +270,8 @@ struct ib_uverbs_ex_query_device_resp { struct ib_uverbs_tm_caps tm_caps; struct ib_uverbs_cq_moderation_caps cq_moderation_caps; __aligned_u64 max_dm_size; + __u32 xrc_odp_caps; + __u32 reserved; }; struct ib_uverbs_query_port { diff --git a/rdma/include/uapi/rdma/rdma_netlink.h b/rdma/include/uapi/rdma/rdma_netlink.h index 5027c627..23a90ad5 100644 --- a/rdma/include/uapi/rdma/rdma_netlink.h +++ b/rdma/include/uapi/rdma/rdma_netlink.h @@ -255,9 +255,11 @@ enum rdma_nldev_command { RDMA_NLDEV_CMD_GET, /* can dump */ RDMA_NLDEV_CMD_SET, - /* 3 - 4 are free to use */ + RDMA_NLDEV_CMD_NEWLINK, - RDMA_NLDEV_CMD_PORT_GET = 5, /* can dump */ + RDMA_NLDEV_CMD_DELLINK, + + RDMA_NLDEV_CMD_PORT_GET, /* can dump */ /* 6 - 8 are free to use */ @@ -465,6 +467,10 @@ enum rdma_nldev_attr { RDMA_NLDEV_ATTR_RES_MRN, /* u32 */ RDMA_NLDEV_ATTR_RES_CM_IDN, /* u32 */ RDMA_NLDEV_ATTR_RES_CTXN, /* u32 */ + /* + * Identifies the rdma driver. eg: "rxe" or "siw" + */ + RDMA_NLDEV_ATTR_LINK_TYPE, /* string */ /* * Always the end diff --git a/rdma/include/uapi/rdma/rdma_user_cm.h b/rdma/include/uapi/rdma/rdma_user_cm.h index 0d1e78eb..e42940a2 100644 --- a/rdma/include/uapi/rdma/rdma_user_cm.h +++ b/rdma/include/uapi/rdma/rdma_user_cm.h @@ -300,6 +300,10 @@ enum { RDMA_OPTION_ID_TOS = 0, RDMA_OPTION_ID_REUSEADDR = 1, RDMA_OPTION_ID_AFONLY = 2, + RDMA_OPTION_ID_ACK_TIMEOUT = 3 +}; + +enum { RDMA_OPTION_IB_PATH = 1 }; diff --git a/tc/m_connmark.c b/tc/m_connmark.c index 45e2d05f..13543d33 100644 --- a/tc/m_connmark.c +++ b/tc/m_connmark.c @@ -73,7 +73,7 @@ parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, if (matches(*argv, "zone") == 0) { NEXT_ARG(); if (get_u16(&sel.zone, *argv, 10)) { - fprintf(stderr, "simple: Illegal \"index\"\n"); + fprintf(stderr, "connmark: Illegal \"zone\"\n"); return -1; } argc--; @@ -87,7 +87,7 @@ parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, if (matches(*argv, "index") == 0) { NEXT_ARG(); if (get_u32(&sel.index, *argv, 10)) { - fprintf(stderr, "simple: Illegal \"index\"\n"); + fprintf(stderr, "connmark: Illegal \"index\"\n"); return -1; } argc--;