diff mbox series

[net] netfilter: Drop fragmented ndisc packets assembled in netfilter

Message ID 20201012125347.13011-1-geokohma@cisco.com
State New
Headers show
Series [net] netfilter: Drop fragmented ndisc packets assembled in netfilter | expand

Commit Message

Georg Kohmann Oct. 12, 2020, 12:53 p.m. UTC
Fragmented ndisc packets assembled in netfilter not dropped as specified
in RFC 6980, section 5. This behaviour breaks TAHI IPv6 Core Conformance
Tests v6LC.2.1.22/23, V6LC.2.2.26/27 and V6LC.2.3.18.

Setting IPSKB_FRAGMENTED flag during reassembly.

References: commit b800c3b966bc ("ipv6: drop fragmented ndisc packets by
default (RFC 6980)")
Signed-off-by: Georg Kohmann <geokohma@cisco.com>
---
 net/ipv6/netfilter/nf_conntrack_reasm.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Pablo Neira Ayuso Oct. 12, 2020, 12:56 p.m. UTC | #1
Please, Cc: netfilter-devel@vger.kernel.org for your netfilter
patches, so patchwork can catch it there too next time.

On Mon, Oct 12, 2020 at 02:53:47PM +0200, Georg Kohmann wrote:
> Fragmented ndisc packets assembled in netfilter not dropped as specified
> in RFC 6980, section 5. This behaviour breaks TAHI IPv6 Core Conformance
> Tests v6LC.2.1.22/23, V6LC.2.2.26/27 and V6LC.2.3.18.
> 
> Setting IPSKB_FRAGMENTED flag during reassembly.
> 
> References: commit b800c3b966bc ("ipv6: drop fragmented ndisc packets by
> default (RFC 6980)")
> Signed-off-by: Georg Kohmann <geokohma@cisco.com>
> ---
>  net/ipv6/netfilter/nf_conntrack_reasm.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c
> index fed9666..054d287 100644
> --- a/net/ipv6/netfilter/nf_conntrack_reasm.c
> +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
> @@ -355,6 +355,7 @@ static int nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *skb,
>  	ipv6_hdr(skb)->payload_len = htons(payload_len);
>  	ipv6_change_dsfield(ipv6_hdr(skb), 0xff, ecn);
>  	IP6CB(skb)->frag_max_size = sizeof(struct ipv6hdr) + fq->q.max_size;
> +	IP6CB(skb)->flags |= IP6SKB_FRAGMENTED;
>  
>  	/* Yes, and fold redundant checksum back. 8) */
>  	if (skb->ip_summed == CHECKSUM_COMPLETE)
> -- 
> 2.10.2
>
Georg Kohmann Oct. 12, 2020, 2:22 p.m. UTC | #2
On 12.10.2020 14:56, Pablo Neira Ayuso wrote:
> Please, Cc: netfilter-devel@vger.kernel.org for your netfilter

> patches, so patchwork can catch it there too next time.

Thank you, I will next time.
>

> On Mon, Oct 12, 2020 at 02:53:47PM +0200, Georg Kohmann wrote:

>> Fragmented ndisc packets assembled in netfilter not dropped as specified

>> in RFC 6980, section 5. This behaviour breaks TAHI IPv6 Core Conformance

>> Tests v6LC.2.1.22/23, V6LC.2.2.26/27 and V6LC.2.3.18.

>>

>> Setting IPSKB_FRAGMENTED flag during reassembly.

>>

>> References: commit b800c3b966bc ("ipv6: drop fragmented ndisc packets by

>> default (RFC 6980)")

>> Signed-off-by: Georg Kohmann <geokohma@cisco.com>

>> ---

>>  net/ipv6/netfilter/nf_conntrack_reasm.c | 1 +

>>  1 file changed, 1 insertion(+)

>>

>> diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c

>> index fed9666..054d287 100644

>> --- a/net/ipv6/netfilter/nf_conntrack_reasm.c

>> +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c

>> @@ -355,6 +355,7 @@ static int nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *skb,

>>  	ipv6_hdr(skb)->payload_len = htons(payload_len);

>>  	ipv6_change_dsfield(ipv6_hdr(skb), 0xff, ecn);

>>  	IP6CB(skb)->frag_max_size = sizeof(struct ipv6hdr) + fq->q.max_size;

>> +	IP6CB(skb)->flags |= IP6SKB_FRAGMENTED;

>>  

>>  	/* Yes, and fold redundant checksum back. 8) */

>>  	if (skb->ip_summed == CHECKSUM_COMPLETE)

>> -- 

>> 2.10.2

>>
diff mbox series

Patch

diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c
index fed9666..054d287 100644
--- a/net/ipv6/netfilter/nf_conntrack_reasm.c
+++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
@@ -355,6 +355,7 @@  static int nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *skb,
 	ipv6_hdr(skb)->payload_len = htons(payload_len);
 	ipv6_change_dsfield(ipv6_hdr(skb), 0xff, ecn);
 	IP6CB(skb)->frag_max_size = sizeof(struct ipv6hdr) + fq->q.max_size;
+	IP6CB(skb)->flags |= IP6SKB_FRAGMENTED;
 
 	/* Yes, and fold redundant checksum back. 8) */
 	if (skb->ip_summed == CHECKSUM_COMPLETE)