esp: Use a synchronous crypto algorithm on offloading.
authorSteffen Klassert <steffen.klassert@secunet.com>
Fri, 14 Apr 2017 08:07:19 +0000 (10:07 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Fri, 14 Apr 2017 08:07:19 +0000 (10:07 +0200)
We need a fallback algorithm for crypto offloading to a NIC.
This is because packets can be rerouted to other NICs that
don't support crypto offloading. The fallback is going to be
implemented at layer2 where we know the final output device
but can't handle asynchronous returns fron the crypto layer.

Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/ipv4/esp4.c
net/ipv6/esp6.c

index 4382f306935b2b0b32f27010fca093bb027c6e26..7e501adb50421f625c0816332efcce0df18123cd 100644 (file)
@@ -783,13 +783,17 @@ static int esp_init_aead(struct xfrm_state *x)
        char aead_name[CRYPTO_MAX_ALG_NAME];
        struct crypto_aead *aead;
        int err;
+       u32 mask = 0;
 
        err = -ENAMETOOLONG;
        if (snprintf(aead_name, CRYPTO_MAX_ALG_NAME, "%s(%s)",
                     x->geniv, x->aead->alg_name) >= CRYPTO_MAX_ALG_NAME)
                goto error;
 
-       aead = crypto_alloc_aead(aead_name, 0, 0);
+       if (x->xso.offload_handle)
+               mask |= CRYPTO_ALG_ASYNC;
+
+       aead = crypto_alloc_aead(aead_name, 0, mask);
        err = PTR_ERR(aead);
        if (IS_ERR(aead))
                goto error;
@@ -819,6 +823,7 @@ static int esp_init_authenc(struct xfrm_state *x)
        char authenc_name[CRYPTO_MAX_ALG_NAME];
        unsigned int keylen;
        int err;
+       u32 mask = 0;
 
        err = -EINVAL;
        if (!x->ealg)
@@ -844,7 +849,10 @@ static int esp_init_authenc(struct xfrm_state *x)
                        goto error;
        }
 
-       aead = crypto_alloc_aead(authenc_name, 0, 0);
+       if (x->xso.offload_handle)
+               mask |= CRYPTO_ALG_ASYNC;
+
+       aead = crypto_alloc_aead(authenc_name, 0, mask);
        err = PTR_ERR(aead);
        if (IS_ERR(aead))
                goto error;
index 82d3da81293e48138e16aaee4259f2f135be46e6..8b55abf1c45bdf10b2db286f48c744ded7ab07c2 100644 (file)
@@ -704,13 +704,17 @@ static int esp_init_aead(struct xfrm_state *x)
        char aead_name[CRYPTO_MAX_ALG_NAME];
        struct crypto_aead *aead;
        int err;
+       u32 mask = 0;
 
        err = -ENAMETOOLONG;
        if (snprintf(aead_name, CRYPTO_MAX_ALG_NAME, "%s(%s)",
                     x->geniv, x->aead->alg_name) >= CRYPTO_MAX_ALG_NAME)
                goto error;
 
-       aead = crypto_alloc_aead(aead_name, 0, 0);
+       if (x->xso.offload_handle)
+               mask |= CRYPTO_ALG_ASYNC;
+
+       aead = crypto_alloc_aead(aead_name, 0, mask);
        err = PTR_ERR(aead);
        if (IS_ERR(aead))
                goto error;
@@ -740,6 +744,7 @@ static int esp_init_authenc(struct xfrm_state *x)
        char authenc_name[CRYPTO_MAX_ALG_NAME];
        unsigned int keylen;
        int err;
+       u32 mask = 0;
 
        err = -EINVAL;
        if (!x->ealg)
@@ -765,7 +770,10 @@ static int esp_init_authenc(struct xfrm_state *x)
                        goto error;
        }
 
-       aead = crypto_alloc_aead(authenc_name, 0, 0);
+       if (x->xso.offload_handle)
+               mask |= CRYPTO_ALG_ASYNC;
+
+       aead = crypto_alloc_aead(authenc_name, 0, mask);
        err = PTR_ERR(aead);
        if (IS_ERR(aead))
                goto error;