Re: [PATCHv6 2/4] netfilter: bridge: forward IPv6 fragmented packets

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 28, 2015 at 10:24:33AM +0200, Bernhard Thaler wrote:
[...]
> @@ -264,6 +265,109 @@ drop:
>  	return -1;
>  }
>  
> +/* We only check the length. A bridge shouldn't do hop-by-hop stuff anyway */
> +static int check_hbh_len(struct sk_buff *skb)
> +{
> +	unsigned char *raw = (u8 *)(ipv6_hdr(skb) + 1);
> +	u32 pkt_len;
> +	const unsigned char *nh = skb_network_header(skb);
> +	int off = raw - nh;
> +	int len = (raw[1] + 1) << 3;
> +
> +	if ((raw + len) - skb->data > skb_headlen(skb))
> +		goto bad;
> +
> +	off += 2;
> +	len -= 2;
> +
> +	while (len > 0) {
> +		int optlen = nh[off + 1] + 2;
> +
> +		switch (nh[off]) {
> +		case IPV6_TLV_PAD1:
> +			optlen = 1;
> +			break;
> +
> +		case IPV6_TLV_PADN:
> +			break;
> +
> +		case IPV6_TLV_JUMBO:
> +			if (nh[off + 1] != 4 || (off & 3) != 2)
> +				goto bad;
> +			pkt_len = ntohl(*(__be32 *)(nh + off + 2));
> +			if (pkt_len <= IPV6_MAXPLEN ||
> +			    ipv6_hdr(skb)->payload_len)
> +				goto bad;
> +			if (pkt_len > skb->len - sizeof(struct ipv6hdr))
> +				goto bad;
> +			if (pskb_trim_rcsum(skb,
> +					    pkt_len + sizeof(struct ipv6hdr)))
> +				goto bad;
> +			nh = skb_network_header(skb);
> +			break;
> +		default:
> +			if (optlen > len)
> +				goto bad;
> +			break;
> +		}
> +		off += optlen;
> +		len -= optlen;
> +	}
> +	if (len == 0)
> +		return 0;
> +bad:
> +	return -1;
> +}
[...]
> @@ -554,91 +662,17 @@ static struct net_device *setup_pre_routing(struct sk_buff *skb)
>  	return skb->dev;
>  }
>  
> -/* We only check the length. A bridge shouldn't do any hop-by-hop stuff anyway */
> -static int check_hbh_len(struct sk_buff *skb)
> -{
> -	unsigned char *raw = (u8 *)(ipv6_hdr(skb) + 1);
> -	u32 pkt_len;
> -	const unsigned char *nh = skb_network_header(skb);
> -	int off = raw - nh;
> -	int len = (raw[1] + 1) << 3;
> -
> -	if ((raw + len) - skb->data > skb_headlen(skb))
> -		goto bad;
> -
> -	off += 2;
> -	len -= 2;
> -
> -	while (len > 0) {
> -		int optlen = nh[off + 1] + 2;
> -
> -		switch (nh[off]) {
> -		case IPV6_TLV_PAD1:
> -			optlen = 1;
> -			break;
> -
> -		case IPV6_TLV_PADN:
> -			break;
> -
> -		case IPV6_TLV_JUMBO:
> -			if (nh[off + 1] != 4 || (off & 3) != 2)
> -				goto bad;
> -			pkt_len = ntohl(*(__be32 *) (nh + off + 2));
> -			if (pkt_len <= IPV6_MAXPLEN ||
> -			    ipv6_hdr(skb)->payload_len)
> -				goto bad;
> -			if (pkt_len > skb->len - sizeof(struct ipv6hdr))
> -				goto bad;
> -			if (pskb_trim_rcsum(skb,
> -					    pkt_len + sizeof(struct ipv6hdr)))
> -				goto bad;
> -			nh = skb_network_header(skb);
> -			break;
> -		default:
> -			if (optlen > len)
> -				goto bad;
> -			break;
> -		}
> -		off += optlen;
> -		len -= optlen;
> -	}
> -	if (len == 0)
> -		return 0;
> -bad:
> -	return -1;
> -
> -}

Please, if you need to move this code at the top of the file, do this
in a separated patch in first place as preparation.  Then, it should
follow the patch that makes real changes on the code.

This helps us to review your changes.

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux