Thread (37 messages) 37 messages, 5 authors, 2020-10-31

Re: [PATCHv5 net 2/2] IPv6: reply ICMP error if the first fragment don't include all headers

From: Georg Kohmann (geokohma) <hidden>
Date: 2020-10-27 10:20:27

On 27.10.2020 10:57, Hangbin Liu wrote:
On Tue, Oct 27, 2020 at 07:57:06AM +0000, Georg Kohmann (geokohma) wrote:
quoted
quoted
+	/* RFC 8200, Section 4.5 Fragment Header:
+	 * If the first fragment does not include all headers through an
+	 * Upper-Layer header, then that fragment should be discarded and
+	 * an ICMP Parameter Problem, Code 3, message should be sent to
+	 * the source of the fragment, with the Pointer field set to zero.
+	 */
+	nexthdr = hdr->nexthdr;
+	offset = ipv6_skip_exthdr(skb, skb_transport_offset(skb), &nexthdr, &frag_off);
+	if (offset >= 0) {
+		/* Check some common protocols' header */
+		if (nexthdr == IPPROTO_TCP)
+			offset += sizeof(struct tcphdr);
+		else if (nexthdr == IPPROTO_UDP)
+			offset += sizeof(struct udphdr);
+		else if (nexthdr == IPPROTO_ICMPV6)
+			offset += sizeof(struct icmp6hdr);
+		else
+			offset += 1;
+
+		if (frag_off == htons(ip6_mf) && offset > skb->len) {
This do not catch atomic fragments (fragmented packet with only one fragment). frag_off also contains two reserved bits (both 0) that might change in the future.
Thanks, I also didn't aware this scenario.
quoted
I suggest you only check that the offset is 0:
frag_off & htons(IP6_OFFSET)
This will match all other fragment packets. RFC request we reply ICMP for the
first fragment packet, Do you mean

if (!frag_off & htons(IP6_OFFSET) && offset > skb->len)
Almost, add some parentheses:

if (!(frag_off & htons(IP6_OFFSET)) && offset > skb->len)
Thanks
Hangbin
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help