esp: Use a synchronous crypto algorithm on offloading.
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>
This commit is contained in:
Родитель
d7dbefc45c
Коммит
b3859c8ebf
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче