warning cleanups
Subsystems (6)
cover warning cleanups
This series addresses a number of warnings in common networking code visible when kernel is built with W=1
The DCB patch needs review from John Fastbend the original author of the netlink interface since it adds missing checks.
Stephen Hemminger (9):
dcb: enforce minimum length on IEEE_APPS attribute
ila: propagate error code in ila_output
udp: make local function static
inet: fix warning about missing prototype
tcpnv: do not export local function
xfrm: make xfrm_dev_register static
fou: make local function static
ipv6: drop unused variables in seg6_genl_dumphac
ipv6: remove unused variables in esp6
net/dcb/dcbnl.c | 11 ++++-- net/ipv4/fou.c | 82 ++++++++++++++++++++--------------------- net/ipv4/inet_connection_sock.c | 1 + net/ipv4/tcp_nv.c | 5 +-- net/ipv4/udp.c | 2 +- net/ipv6/esp6.c | 5 --- net/ipv6/fou6.c | 14 +++---- net/ipv6/ila/ila_lwt.c | 2 +- net/ipv6/seg6.c | 4 -- net/ipv6/udp.c | 2 +- net/xfrm/xfrm_device.c | 2 +- 11 files changed, 61 insertions(+), 69 deletions(-)
Signature · 1 line
2.11.0
PATCH 1/9 dcb: enforce minimum length on IEEE_APPS attribute
Found by reviewing the warning about unused policy table. The code implies that it meant to check for size, but since it unrolled the loop for attribute validation that is never used. Instead do explicit check for attribute.
Compile tested only. Needs review by original author.
--- net/dcb/dcbnl.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
net/dcb/dcbnl.c +7 -4
@@ -178,10 +178,6 @@ static const struct nla_policy dcbnl_ieee_policy[DCB_ATTR_IEEE_MAX + 1] = { [DCB_ATTR_IEEE_QCN_STATS] = {.len = sizeof(struct ieee_qcn_stats)}, }; -static const struct nla_policy dcbnl_ieee_app[DCB_ATTR_IEEE_APP_MAX +1 ] = { - [DCB_ATTR_IEEE_APP ] = {.len =sizeof (struct dcb_app )}, -}; -/* DCB number of traffic classes nested attributes. */ static const struct nla_policy dcbnl_featcfg_nest[DCB_FEATCFG_ATTR_MAX +1 ] = { [DCB_FEATCFG_ATTR_ALL ] = {.type =NLA_FLAG },
@@ -1463,8 +1459,15 @@ static int dcbnl_ieee_set(struct net_device *netdev, struct nlmsghdr *nlh,nla_for_each_nested (attr, ieee[DCB_ATTR_IEEE_APP_TABLE ], rem) {struct dcb_app *app_data; +if (nla_type (attr) !=DCB_ATTR_IEEE_APP )continue ; + +if (nla_len (attr) <sizeof (struct dcb_app )) { + err = -ERANGE ; + goto err; + } + app_data =nla_data (attr);if (ops->ieee_setapp) err = ops->ieee_setapp (netdev, app_data);
Signature · 1 line
2.11.0
Re: [PATCH net-next 1/9] dcb: enforce minimum length on IEEE_APPS attribute
From: Stephen Hemminger <[email protected]>
Date: Fri, 19 May 2017 09:55:48 -0700
Quoted 8 lines
Found by reviewing the warning about unused policy table. The code implies that it meant to check for size, but since it unrolled the loop for attribute validation that is never used. Instead do explicit check for attribute.
Compile tested only. Needs review by original author.
Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 2/9 ila: propagate error code in ila_output
In reply to Stephen HemmingerThis warning:net/ipv6/ila/ila_lwt.c: In function ‘ila_output’:net/ipv6/ila/ila_lwt.c:42:6: warning: variable ‘err’ set but not used [-Wunused-but-set-variable]
It looks like the code attempts to set propagate different error values, but always returned -EINVAL.
Compile tested only. Needs review by original author.
--- net/ipv6/ila/ila_lwt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/ila/ila_lwt.c +1 -1
@@ -91,7 +91,7 @@ static int ila_output(struct net *net, struct sock *sk, struct sk_buff *skb) drop:kfree_skb (skb); -return -EINVAL ; +return err; }static int ila_input (struct sk_buff *skb)
Signature · 1 line
2.11.0
Re: [PATCH net-next 2/9] ila: propagate error code in ila_output
From: Stephen Hemminger <[email protected]>
Date: Fri, 19 May 2017 09:55:49 -0700
Quoted 10 lines
This warning:
net/ipv6/ila/ila_lwt.c: In function ‘ila_output’:net/ipv6/ila/ila_lwt.c:42:6: warning: variable ‘err’ set but not used [-Wunused-but-set-variable]It looks like the code attempts to set propagate different error values, but always returned
-EINVAL.Compile tested only. Needs review by original author.
Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 3/9 udp: make local function static
In reply to Stephen Hemmingerudp_queue_rcv_skb was global but only used in one file.
Identified by this warning:net/ipv4/udp.c:1775:5: warning: no previous prototype for ‘udp_queue_rcv_skb’ [-Wmissing-prototypes]
int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
--- net/ipv4/udp.c | 2 +- net/ipv6/udp.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/ipv4/udp.c +1 -1
@@ -1772,7 +1772,7 @@ EXPORT_SYMBOL(udp_encap_enable);* Note that in the success and error cases, the skb is assumed to * have either been requeued or freed. */ -int udp_queue_rcv_skb (struct sock *sk,struct sk_buff *skb) +static int udp_queue_rcv_skb (struct sock *sk,struct sk_buff *skb) {struct udp_sock *up =udp_sk (sk);int is_udplite =IS_UDPLITE (sk);
net/ipv6/udp.c +1 -1
@@ -570,7 +570,7 @@ void udpv6_encap_enable(void) }EXPORT_SYMBOL (udpv6_encap_enable); -int udpv6_queue_rcv_skb (struct sock *sk,struct sk_buff *skb) +static int udpv6_queue_rcv_skb (struct sock *sk,struct sk_buff *skb) {struct udp_sock *up =udp_sk (sk);int is_udplite =IS_UDPLITE (sk);
Signature · 1 line
2.11.0
David Miller
maintainerRe: [PATCH net-next 3/9] udp: make local function static
From: Stephen Hemminger <[email protected]>
Date: Fri, 19 May 2017 09:55:50 -0700
Quoted 6 lines
udp_queue_rcv_skbwas global but only used in one file.
Identified by this warning:net/ipv4/udp.c:1775:5: warning: no previous prototype for ‘udp_queue_rcv_skb’ [-Wmissing-prototypes]
intudp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)Signed-off-by Stephen Hemminger <[email protected]>
Already fixed in net-next, please generate patches against current sources.
PATCH 4/9 inet: fix warning about missing prototype
In reply to Stephen HemmingerThe prototype for inet_rcv_saddr_equal was not being included.
--- net/ipv4/inet_connection_sock.c | 1 + 1 file changed, 1 insertion(+)
net/ipv4/inet_connection_sock.c +1 -0
@@ -25,6 +25,7 @@#include <net/xfrm.h> #include <net/tcp.h> #include <net/sock_reuseport.h> +#include <net/addrconf.h> #ifdef INET_CSK_DEBUG const char inet_csk_timer_bug_msg[] ="inet_csk BUG: unknown timer value\n" ;
Signature · 1 line
2.11.0
Re: [PATCH net-next 4/9] inet: fix warning about missing prototype
From: Stephen Hemminger <[email protected]>
Date: Fri, 19 May 2017 09:55:51 -0700
Quoted 3 lines
The prototype for
inet_rcv_saddr_equalwas not being included.Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 5/9 tcpnv: do not export local function
In reply to Stephen HemmingerThe TCP New Vegas congestion control was exporting an internal function tcpnv_get_info which is not used by any other in tree kernel code. Make it static.
--- net/ipv4/tcp_nv.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
net/ipv4/tcp_nv.c +2 -3
@@ -424,8 +424,8 @@ static void tcpnv_acked(struct sock *sk, const struct ack_sample *sample) }/* Extract info for Tcp socket info provided via netlink */ -size_t tcpnv_get_info (struct sock *sk,u32 ext,int *attr, -union tcp_cc_info *info) +static size_t tcpnv_get_info (struct sock *sk,u32 ext,int *attr, +union tcp_cc_info *info) {const struct tcpnv *ca =inet_csk_ca (sk);
@@ -440,7 +440,6 @@ size_t tcpnv_get_info(struct sock *sk, u32 ext, int *attr, }return 0 ; } -EXPORT_SYMBOL_GPL (tcpnv_get_info);static struct tcp_congestion_ops tcpnv__read_mostly = { .init = tcpnv_init,
Signature · 1 line
2.11.0
Re: [PATCH net-next 5/9] tcpnv: do not export local function
From: Stephen Hemminger <[email protected]>
Date: Fri, 19 May 2017 09:55:52 -0700
Quoted 5 lines
The TCP New Vegas congestion control was exporting an internal function
tcpnv_get_infowhich is not used by any other in tree kernel code. Make it static.Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 6/9 xfrm: make xfrm_dev_register static
In reply to Stephen HemmingerThis function is only used in this file and should not be global.
--- net/xfrm/xfrm_device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/xfrm/xfrm_device.c +1 -1
@@ -138,7 +138,7 @@ bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x) }EXPORT_SYMBOL_GPL (xfrm_dev_offload_ok); -int xfrm_dev_register (struct net_device *dev) +static int xfrm_dev_register (struct net_device *dev) {if ((dev->features &NETIF_F_HW_ESP ) && !dev->xfrmdev_ops)return NOTIFY_BAD ;
Signature · 1 line
2.11.0
Re: [PATCH net-next 6/9] xfrm: make xfrm_dev_register static
Quoted 12 lines · Stephen Hemminger
This function is only used in this file and should not be global.
Signed-off-by Stephen Hemminger <[email protected]>--- net/xfrm/xfrm_device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)net/xfrm/xfrm_device.c +0
-0
net/xfrm/xfrm_device.c bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x) · line 141
Quoted 5 lines
net/xfrm/xfrm_device.c +1
-1@@ -138,7 +138,7 @@ bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x) }EXPORT_SYMBOL_GPL (xfrm_dev_offload_ok); -int xfrm_dev_register (struct net_device *dev) +static int xfrm_dev_register (struct net_device *dev)
I've applied a patch with this exact fix already to the ipsec-next tree yesterday.
David Miller
maintainerRe: [PATCH net-next 6/9] xfrm: make xfrm_dev_register static
In reply to Stephen HemmingerFrom: Stephen Hemminger <[email protected]>
Date: Fri, 19 May 2017 09:55:53 -0700
Quoted 3 lines
This function is only used in this file and should not be global.
Signed-off-by Stephen Hemminger <[email protected]>
Steffen said he already took this.
PATCH 7/9 fou: make local function static
In reply to Stephen HemmingerThe build header functions are not used by any other code.
net/ipv6/fou6.c:36:5: warning: no previous prototype for ‘fou6_build_header’ [-Wmissing-prototypes] net/ipv6/fou6.c:54:5: warning: no previous prototype for ‘gue6_build_header’ [-Wmissing-prototypes]
Need to do some code rearranging to satisfy different Kconfig possiblities.
--- net/ipv4/fou.c | 82 ++++++++++++++++++++++++++++----------------------------- net/ipv6/fou6.c | 14 +++++----- 2 files changed, 47 insertions(+), 49 deletions(-)
net/ipv4/fou.c +41 -41
@@ -8,6 +8,7 @@#include <linux/kernel.h> #include <net/genetlink.h> #include <net/gue.h> +#include <net/fou.h> #include <net/ip.h> #include <net/protocol.h> #include <net/udp.h>
@@ -859,25 +860,6 @@ size_t gue_encap_hlen(struct ip_tunnel_encap *e) }EXPORT_SYMBOL (gue_encap_hlen); -static void fou_build_udp (struct sk_buff *skb,struct ip_tunnel_encap *e, -struct flowi4 *fl4,u8 *protocol,__be16 sport) -{ -struct udphdr *uh; - -skb_push (skb,sizeof (struct udphdr )); -skb_reset_transport_header (skb); - - uh =udp_hdr (skb); - - uh->dest = e->dport; - uh->source = sport; - uh->len =htons (skb->len); -udp_set_csum (!(e->flags &TUNNEL_ENCAP_FLAG_CSUM ), skb, - fl4->saddr, fl4->daddr, skb->len); - - *protocol =IPPROTO_UDP ; -} -int __fou_build_header (struct sk_buff *skb,struct ip_tunnel_encap *e,u8 *protocol,__be16 *sport,int type) {
@@ -894,24 +876,6 @@ int __fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, }EXPORT_SYMBOL (__fou_build_header); -int fou_build_header (struct sk_buff *skb,struct ip_tunnel_encap *e, -u8 *protocol,struct flowi4 *fl4) -{ -int type = e->flags &TUNNEL_ENCAP_FLAG_CSUM ?SKB_GSO_UDP_TUNNEL_CSUM : -SKB_GSO_UDP_TUNNEL ; -__be16 sport; -int err; - - err =__fou_build_header (skb, e, protocol, &sport, type); -if (err) -return err; - -fou_build_udp (skb, e, fl4, protocol, sport); - -return 0 ; -} -EXPORT_SYMBOL (fou_build_header); -int __gue_build_header (struct sk_buff *skb,struct ip_tunnel_encap *e,u8 *protocol,__be16 *sport,int type) {
@@ -985,8 +949,46 @@ int __gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, }EXPORT_SYMBOL (__gue_build_header); -int gue_build_header (struct sk_buff *skb,struct ip_tunnel_encap *e, -u8 *protocol,struct flowi4 *fl4) +#ifdef CONFIG_NET_FOU_IP_TUNNELS + +static void fou_build_udp (struct sk_buff *skb,struct ip_tunnel_encap *e, +struct flowi4 *fl4,u8 *protocol,__be16 sport) +{ +struct udphdr *uh; + +skb_push (skb,sizeof (struct udphdr )); +skb_reset_transport_header (skb); + + uh =udp_hdr (skb); + + uh->dest = e->dport; + uh->source = sport; + uh->len =htons (skb->len); +udp_set_csum (!(e->flags &TUNNEL_ENCAP_FLAG_CSUM ), skb, + fl4->saddr, fl4->daddr, skb->len); + + *protocol =IPPROTO_UDP ; +} + +static int fou_build_header (struct sk_buff *skb,struct ip_tunnel_encap *e, +u8 *protocol,struct flowi4 *fl4) +{ +int type = e->flags &TUNNEL_ENCAP_FLAG_CSUM ?SKB_GSO_UDP_TUNNEL_CSUM : +SKB_GSO_UDP_TUNNEL ; +__be16 sport; +int err; + + err =__fou_build_header (skb, e, protocol, &sport, type); +if (err) +return err; + +fou_build_udp (skb, e, fl4, protocol, sport); + +return 0 ; +} + +static int gue_build_header (struct sk_buff *skb,struct ip_tunnel_encap *e, +u8 *protocol,struct flowi4 *fl4) {int type = e->flags &TUNNEL_ENCAP_FLAG_CSUM ?SKB_GSO_UDP_TUNNEL_CSUM :SKB_GSO_UDP_TUNNEL ;
@@ -1001,9 +1003,7 @@ int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,return 0 ; } -EXPORT_SYMBOL (gue_build_header); -#ifdef CONFIG_NET_FOU_IP_TUNNELS static const struct ip_tunnel_encap_ops fou_iptun_ops = { .encap_hlen = fou_encap_hlen,
net/ipv6/fou6.c +6 -8
@@ -14,6 +14,8 @@#include <net/udp.h> #include <net/udp_tunnel.h> +#if IS_ENABLED (CONFIG_IPV6_FOU_TUNNEL ) +static void fou6_build_udp (struct sk_buff *skb,struct ip_tunnel_encap *e,struct flowi6 *fl6,u8 *protocol,__be16 sport) {
@@ -33,8 +35,8 @@ static void fou6_build_udp(struct sk_buff *skb, struct ip_tunnel_encap *e, *protocol =IPPROTO_UDP ; } -int fou6_build_header (struct sk_buff *skb,struct ip_tunnel_encap *e, -u8 *protocol,struct flowi6 *fl6) +static int fou6_build_header (struct sk_buff *skb,struct ip_tunnel_encap *e, +u8 *protocol,struct flowi6 *fl6) {__be16 sport;int err;
@@ -49,10 +51,9 @@ int fou6_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,return 0 ; } -EXPORT_SYMBOL (fou6_build_header); -int gue6_build_header (struct sk_buff *skb,struct ip_tunnel_encap *e, -u8 *protocol,struct flowi6 *fl6) +static int gue6_build_header (struct sk_buff *skb,struct ip_tunnel_encap *e, +u8 *protocol,struct flowi6 *fl6) {__be16 sport;int err;
@@ -67,9 +68,6 @@ int gue6_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,return 0 ; } -EXPORT_SYMBOL (gue6_build_header); - -#if IS_ENABLED (CONFIG_IPV6_FOU_TUNNEL )static const struct ip6_tnl_encap_ops fou_ip6tun_ops = { .encap_hlen = fou_encap_hlen,
Signature · 1 line
2.11.0
Re: [PATCH net-next 7/9] fou: make local function static
From: Stephen Hemminger <[email protected]>
Date: Fri, 19 May 2017 09:55:54 -0700
Quoted 8 lines
The build header functions are not used by any other code.
net/ipv6/fou6.c:36:5: warning: no previous prototype for ‘fou6_build_header’ [-Wmissing-prototypes]net/ipv6/fou6.c:54:5: warning: no previous prototype for ‘gue6_build_header’ [-Wmissing-prototypes]Need to do some code rearranging to satisfy different
Kconfigpossiblities.Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 8/9 ipv6: drop unused variables in seg6_genl_dumphac
In reply to Stephen HemmingerTHe seg6_pernet_data variable was set but never used.
--- net/ipv6/seg6.c | 4 ---- 1 file changed, 4 deletions(-)
net/ipv6/seg6.c +0 -4
@@ -303,13 +303,9 @@ static int seg6_genl_dumphmac_done(struct netlink_callback *cb)static int seg6_genl_dumphmac (struct sk_buff *skb,struct netlink_callback *cb) {struct rhashtable_iter *iter = (struct rhashtable_iter *)cb->args[0 ]; -struct net *net =sock_net (skb->sk); -struct seg6_pernet_data *sdata;struct seg6_hmac_info *hinfo;int ret; - sdata =seg6_pernet (net); - ret =rhashtable_walk_start (iter);if (ret && ret != -EAGAIN ) goto done;
Signature · 1 line
2.11.0
Re: [PATCH net-next 8/9] ipv6: drop unused variables in seg6_genl_dumphac
From: Stephen Hemminger <[email protected]>
Date: Fri, 19 May 2017 09:55:55 -0700
Quoted 3 lines
THe
seg6_pernet_datavariable was set but never used.Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 9/9 ipv6: remove unused variables in esp6
In reply to Stephen HemmingerResolves warnings:net/ipv6/esp6.c: In function ‘esp_ssg_unref’:net/ipv6/esp6.c:121:10: warning: variable ‘seqhi’ set but not used [-Wunused-but-set-variable] net/ipv6/esp6.c: In function ‘esp6_output_head’:net/ipv6/esp6.c:227:21: warning: variable ‘esph’ set but not used [-Wunused-but-set-variable]
--- net/ipv6/esp6.c | 5 ----- 1 file changed, 5 deletions(-)
net/ipv6/esp6.c +0 -5
@@ -118,7 +118,6 @@ static inline struct scatterlist *esp_req_sg(struct crypto_aead *aead,static void esp_ssg_unref (struct xfrm_state *x,void *tmp) { -__be32 *seqhi;struct crypto_aead *aead = x->data;int seqhilen =0 ;u8 *iv;
@@ -128,7 +127,6 @@ static void esp_ssg_unref(struct xfrm_state *x, void *tmp)if (x->props.flags &XFRM_STATE_ESN ) seqhilen +=sizeof (__be32); - seqhi =esp_tmp_seqhi (tmp); iv =esp_tmp_iv (aead, tmp, seqhilen); req =esp_tmp_req (aead, iv);
@@ -224,12 +222,9 @@ int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_infou8 *vaddr;int nfrags;struct page *page; -struct ip_esp_hdr *esph;struct sk_buff *trailer;int tailen = esp->tailen; - esph =ip_esp_hdr (skb); -if (!skb_cloned (skb)) {if (tailen <=skb_availroom (skb)) { nfrags =1 ;
Signature · 1 line
2.11.0
David Miller
maintainerRe: [PATCH net-next 9/9] ipv6: remove unused variables in esp6
From: Stephen Hemminger <[email protected]>
Date: Fri, 19 May 2017 09:55:56 -0700
Quoted 7 lines
Resolves warnings:
net/ipv6/esp6.c: In function ‘esp_ssg_unref’:net/ipv6/esp6.c:121:10: warning: variable ‘seqhi’ set but not used [-Wunused-but-set-variable]net/ipv6/esp6.c: In function ‘esp6_output_head’:net/ipv6/esp6.c:227:21: warning: variable ‘esph’ set but not used [-Wunused-but-set-variable]Signed-off-by Stephen Hemminger <[email protected]>
Stephen please always CC: the IPSEC maintainer for IPSEC implementation fixes.
Steffen, please consider taking this into your tree.
Quoted 40 lines
--- net/ipv6/esp6.c | 5 ----- 1 file changed, 5 deletions(-)net/ipv6/esp6.c +0
-5@@ -118,7 +118,6 @@ static inline struct scatterlist *esp_req_sg(struct crypto_aead *aead,static void esp_ssg_unref (struct xfrm_state *x,void *tmp) { -__be32 *seqhi;struct crypto_aead *aead = x->data;int seqhilen =0 ;u8 *iv;@@ -128,7 +127,6 @@ static void esp_ssg_unref(struct xfrm_state *x, void *tmp)if (x->props.flags &XFRM_STATE_ESN ) seqhilen +=sizeof (__be32); - seqhi =esp_tmp_seqhi (tmp); iv =esp_tmp_iv (aead, tmp, seqhilen); req =esp_tmp_req (aead, iv);@@ -224,12 +222,9 @@ int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_infou8 *vaddr;int nfrags;struct page *page; -struct ip_esp_hdr *esph;struct sk_buff *trailer;int tailen = esp->tailen; - esph =ip_esp_hdr (skb); -if (!skb_cloned (skb)) {if (tailen <=skb_availroom (skb)) { nfrags =1 ;Signature · 1 line
2.11.0
Re: [PATCH net-next 9/9] ipv6: remove unused variables in esp6
In reply to Stephen HemmingerQuoted 7 lines · Stephen Hemminger
Resolves warnings:
net/ipv6/esp6.c: In function ‘esp_ssg_unref’:net/ipv6/esp6.c:121:10: warning: variable ‘seqhi’ set but not used [-Wunused-but-set-variable]net/ipv6/esp6.c: In function ‘esp6_output_head’:net/ipv6/esp6.c:227:21: warning: variable ‘esph’ set but not used [-Wunused-but-set-variable]Signed-off-by Stephen Hemminger <[email protected]>
Applied to ipsec-next, thanks!