diff mbox series

[PATCHv2,ipsec-next,09/10] xfrm: interface: support IP6IP6 and IP6IP tunnels processing with .cb_handler

Message ID c13ffdfb739d487a415897b72bf8eee6981830c6.1593502515.git.lucien.xin@gmail.com
State Awaiting Upstream
Delegated to: David Miller
Headers show
Series xfrm: support ipip and ipv6 tunnels in vti and xfrmi | expand

Commit Message

Xin Long June 30, 2020, 7:36 a.m. UTC
Similar to ip6_vti, IP6IP6 and IP6IP tunnels processing can easily
be done with .cb_handler for xfrm interface.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
 net/xfrm/xfrm_interface.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

Comments

kernel test robot July 2, 2020, 11:54 p.m. UTC | #1
Hi Xin,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on ipsec-next/master]

url:    https://github.com/0day-ci/linux/commits/Xin-Long/xfrm-support-ipip-and-ipv6-tunnels-in-vti-and-xfrmi/20200630-154042
base:   https://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec-next.git master
config: x86_64-randconfig-a012-20200701 (attached as .config)
compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0
reproduce (this is a W=1 build):
        # save the attached .config to linux build tree
        make W=1 ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   ld: net/xfrm/xfrm_interface.o: in function `xfrmi6_rcv_tunnel':
>> net/xfrm/xfrm_interface.c:807: undefined reference to `xfrm6_tunnel_spi_lookup'

vim +807 net/xfrm/xfrm_interface.c

   800	
   801	static int xfrmi6_rcv_tunnel(struct sk_buff *skb)
   802	{
   803		const xfrm_address_t *saddr;
   804		__be32 spi;
   805	
   806		saddr = (const xfrm_address_t *)&ipv6_hdr(skb)->saddr;
 > 807		spi = xfrm6_tunnel_spi_lookup(dev_net(skb->dev), saddr);
   808	
   809		return xfrm6_rcv_spi(skb, IPPROTO_IPV6, spi, NULL);
   810	}
   811	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Xin Long July 5, 2020, 4:57 p.m. UTC | #2
On Fri, Jul 3, 2020 at 7:55 AM kernel test robot <lkp@intel.com> wrote:
>
> Hi Xin,
>
> Thank you for the patch! Yet something to improve:
>
> [auto build test ERROR on ipsec-next/master]
>
> url:    https://github.com/0day-ci/linux/commits/Xin-Long/xfrm-support-ipip-and-ipv6-tunnels-in-vti-and-xfrmi/20200630-154042
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec-next.git master
> config: x86_64-randconfig-a012-20200701 (attached as .config)
> compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0
> reproduce (this is a W=1 build):
>         # save the attached .config to linux build tree
>         make W=1 ARCH=x86_64
>
> If you fix the issue, kindly add following tag as appropriate
> Reported-by: kernel test robot <lkp@intel.com>
>
> All errors (new ones prefixed by >>):
>
>    ld: net/xfrm/xfrm_interface.o: in function `xfrmi6_rcv_tunnel':
> >> net/xfrm/xfrm_interface.c:807: undefined reference to `xfrm6_tunnel_spi_lookup'
I will add  "#ifdef CONFIG_INET(6)_XFRM_TUNNEL" to fix it in v3.

Thanks.

>
> vim +807 net/xfrm/xfrm_interface.c
>
>    800
>    801  static int xfrmi6_rcv_tunnel(struct sk_buff *skb)
>    802  {
>    803          const xfrm_address_t *saddr;
>    804          __be32 spi;
>    805
>    806          saddr = (const xfrm_address_t *)&ipv6_hdr(skb)->saddr;
>  > 807          spi = xfrm6_tunnel_spi_lookup(dev_net(skb->dev), saddr);
>    808
>    809          return xfrm6_rcv_spi(skb, IPPROTO_IPV6, spi, NULL);
>    810  }
>    811
>
> ---
> 0-DAY CI Kernel Test Service, Intel Corporation
> https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/net/xfrm/xfrm_interface.c b/net/xfrm/xfrm_interface.c
index c407ecb..7be4d0d 100644
--- a/net/xfrm/xfrm_interface.c
+++ b/net/xfrm/xfrm_interface.c
@@ -798,6 +798,24 @@  static struct xfrm6_protocol xfrmi_ipcomp6_protocol __read_mostly = {
 	.priority	=	10,
 };
 
+static int xfrmi6_rcv_tunnel(struct sk_buff *skb)
+{
+	const xfrm_address_t *saddr;
+	__be32 spi;
+
+	saddr = (const xfrm_address_t *)&ipv6_hdr(skb)->saddr;
+	spi = xfrm6_tunnel_spi_lookup(dev_net(skb->dev), saddr);
+
+	return xfrm6_rcv_spi(skb, IPPROTO_IPV6, spi, NULL);
+}
+
+static struct xfrm6_tunnel xfrmi_ipv6_handler __read_mostly = {
+	.handler	=	xfrmi6_rcv_tunnel,
+	.cb_handler	=	xfrmi_rcv_cb,
+	.err_handler	=	xfrmi6_err,
+	.priority	=	-1,
+};
+
 static struct xfrm4_protocol xfrmi_esp4_protocol __read_mostly = {
 	.handler	=	xfrm4_rcv,
 	.input_handler	=	xfrm_input,
@@ -866,9 +884,19 @@  static int __init xfrmi6_init(void)
 	err = xfrm6_protocol_register(&xfrmi_ipcomp6_protocol, IPPROTO_COMP);
 	if (err < 0)
 		goto xfrm_proto_comp_failed;
+	err = xfrm6_tunnel_register(&xfrmi_ipv6_handler, AF_INET6);
+	if (err < 0)
+		goto xfrm_tunnel_ipv6_failed;
+	err = xfrm6_tunnel_register(&xfrmi_ipv6_handler, AF_INET);
+	if (err < 0)
+		goto xfrm_tunnel_ip6ip_failed;
 
 	return 0;
 
+xfrm_tunnel_ip6ip_failed:
+	xfrm6_tunnel_deregister(&xfrmi_ipv6_handler, AF_INET6);
+xfrm_tunnel_ipv6_failed:
+	xfrm6_protocol_deregister(&xfrmi_ipcomp6_protocol, IPPROTO_COMP);
 xfrm_proto_comp_failed:
 	xfrm6_protocol_deregister(&xfrmi_ah6_protocol, IPPROTO_AH);
 xfrm_proto_ah_failed:
@@ -879,6 +907,8 @@  static int __init xfrmi6_init(void)
 
 static void xfrmi6_fini(void)
 {
+	xfrm6_tunnel_deregister(&xfrmi_ipv6_handler, AF_INET);
+	xfrm6_tunnel_deregister(&xfrmi_ipv6_handler, AF_INET6);
 	xfrm6_protocol_deregister(&xfrmi_ipcomp6_protocol, IPPROTO_COMP);
 	xfrm6_protocol_deregister(&xfrmi_ah6_protocol, IPPROTO_AH);
 	xfrm6_protocol_deregister(&xfrmi_esp6_protocol, IPPROTO_ESP);