ipq806x: NSS Hardware Offloading CFI Support Patch
This commit is contained in:
		| @@ -0,0 +1,119 @@ | ||||
| diff --git a/crypto/authenc.c b/crypto/authenc.c | ||||
| index 3f0ed9402..17ce66bba 100644 | ||||
| --- a/crypto/authenc.c | ||||
| +++ b/crypto/authenc.c | ||||
| @@ -449,6 +449,8 @@ static int crypto_authenc_create(struct crypto_template *tmpl, | ||||
|   | ||||
|  	inst->alg.base.cra_flags = (auth_base->cra_flags | | ||||
|  				    enc->base.cra_flags) & CRYPTO_ALG_ASYNC; | ||||
| +	inst->alg.base.cra_flags |= (auth_base->cra_flags | | ||||
| +				    enc->base.cra_flags) & CRYPTO_ALG_NOSUPP_SG; | ||||
|  	inst->alg.base.cra_priority = enc->base.cra_priority * 10 + | ||||
|  				      auth_base->cra_priority; | ||||
|  	inst->alg.base.cra_blocksize = enc->base.cra_blocksize; | ||||
| diff --git a/include/linux/crypto.h b/include/linux/crypto.h | ||||
| index 19ea3a371..1463e824c 100644 | ||||
| --- a/include/linux/crypto.h | ||||
| +++ b/include/linux/crypto.h | ||||
| @@ -104,6 +104,11 @@ | ||||
|   */ | ||||
|  #define CRYPTO_NOLOAD			0x00008000 | ||||
|   | ||||
| +/* | ||||
| + * Set this flag if algorithm does not support SG list transforms | ||||
| + */ | ||||
| +#define CRYPTO_ALG_NOSUPP_SG		0x0000c000 | ||||
| + | ||||
|  /* | ||||
|   * Transform masks and values (for crt_flags). | ||||
|   */ | ||||
| diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c | ||||
| index 5c9677640..23b3a9e91 100644 | ||||
| --- a/net/ipv4/esp4.c | ||||
| +++ b/net/ipv4/esp4.c | ||||
| @@ -488,6 +488,7 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb) | ||||
|  	struct ip_esp_hdr *esph; | ||||
|  	struct crypto_aead *aead; | ||||
|  	struct esp_info esp; | ||||
| +	bool nosupp_sg; | ||||
|   | ||||
|  	esp.inplace = true; | ||||
|   | ||||
| @@ -499,6 +500,11 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb) | ||||
|  	aead = x->data; | ||||
|  	alen = crypto_aead_authsize(aead); | ||||
|   | ||||
| +	nosupp_sg = crypto_tfm_alg_type(&aead->base) & CRYPTO_ALG_NOSUPP_SG; | ||||
| +	if (nosupp_sg && skb_linearize(skb)) { | ||||
| +		return -ENOMEM; | ||||
| +	} | ||||
| + | ||||
|  	esp.tfclen = 0; | ||||
|  	if (x->tfcpad) { | ||||
|  		struct xfrm_dst *dst = (struct xfrm_dst *)skb_dst(skb); | ||||
| @@ -708,6 +714,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | ||||
|  	u8 *iv; | ||||
|  	struct scatterlist *sg; | ||||
|  	int err = -EINVAL; | ||||
| +	bool nosupp_sg; | ||||
|   | ||||
|  	if (!pskb_may_pull(skb, sizeof(struct ip_esp_hdr) + ivlen)) | ||||
|  		goto out; | ||||
| @@ -715,6 +722,12 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | ||||
|  	if (elen <= 0) | ||||
|  		goto out; | ||||
|   | ||||
| +	nosupp_sg = crypto_tfm_alg_type(&aead->base) & CRYPTO_ALG_NOSUPP_SG; | ||||
| +	if (nosupp_sg && skb_linearize(skb)) { | ||||
| +		err = -ENOMEM; | ||||
| +		goto out; | ||||
| +	} | ||||
| + | ||||
|  	assoclen = sizeof(struct ip_esp_hdr); | ||||
|  	seqhilen = 0; | ||||
|   | ||||
| diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c | ||||
| index a3b403ba8..019bea284 100644 | ||||
| --- a/net/ipv6/esp6.c | ||||
| +++ b/net/ipv6/esp6.c | ||||
| @@ -429,6 +429,7 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) | ||||
|  	struct ip_esp_hdr *esph; | ||||
|  	struct crypto_aead *aead; | ||||
|  	struct esp_info esp; | ||||
| +	bool nosupp_sg; | ||||
|   | ||||
|  	esp.inplace = true; | ||||
|   | ||||
| @@ -440,6 +441,11 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) | ||||
|  	aead = x->data; | ||||
|  	alen = crypto_aead_authsize(aead); | ||||
|   | ||||
| +	nosupp_sg = crypto_tfm_alg_type(&aead->base) & CRYPTO_ALG_NOSUPP_SG; | ||||
| +	if (nosupp_sg && skb_linearize(skb)) { | ||||
| +		return -ENOMEM; | ||||
| +	} | ||||
| + | ||||
|  	esp.tfclen = 0; | ||||
|  	if (x->tfcpad) { | ||||
|  		struct xfrm_dst *dst = (struct xfrm_dst *)skb_dst(skb); | ||||
| @@ -603,6 +609,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb) | ||||
|  	__be32 *seqhi; | ||||
|  	u8 *iv; | ||||
|  	struct scatterlist *sg; | ||||
| +	bool nosupp_sg; | ||||
|   | ||||
|  	if (!pskb_may_pull(skb, sizeof(struct ip_esp_hdr) + ivlen)) { | ||||
|  		ret = -EINVAL; | ||||
| @@ -614,6 +621,12 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb) | ||||
|  		goto out; | ||||
|  	} | ||||
|   | ||||
| +	nosupp_sg = crypto_tfm_alg_type(&aead->base) & CRYPTO_ALG_NOSUPP_SG; | ||||
| +	if (nosupp_sg && skb_linearize(skb)) { | ||||
| +		ret = -ENOMEM; | ||||
| +		goto out; | ||||
| +	} | ||||
| + | ||||
|  	assoclen = sizeof(struct ip_esp_hdr); | ||||
|  	seqhilen = 0; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ACwifidude
					ACwifidude