All of lore.kernel.org
 help / color / mirror / Atom feed
From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
To: Richard Gobert <richardbgobert@gmail.com>,  netdev@vger.kernel.org
Cc: davem@davemloft.net,  edumazet@google.com,  kuba@kernel.org,
	 pabeni@redhat.com,  horms@kernel.org,  corbet@lwn.net,
	 shenjian15@huawei.com,  salil.mehta@huawei.com,
	 shaojijie@huawei.com,  andrew+netdev@lunn.ch,
	 saeedm@nvidia.com,  tariqt@nvidia.com,  mbloch@nvidia.com,
	 leon@kernel.org,  ecree.xilinx@gmail.com,  dsahern@kernel.org,
	 ncardwell@google.com,  kuniyu@google.com,  shuah@kernel.org,
	 sdf@fomichev.me,  ahmed.zaki@intel.com,
	 aleksander.lobakin@intel.com,  florian.fainelli@broadcom.com,
	 willemdebruijn.kernel@gmail.com,  linux-kernel@vger.kernel.org,
	 linux-net-drivers@amd.com,
	 Richard Gobert <richardbgobert@gmail.com>
Subject: Re: [PATCH net-next v2 5/5] selftests/net: test ipip packets in gro.sh
Date: Wed, 20 Aug 2025 07:21:05 -0400	[thread overview]
Message-ID: <willemdebruijn.kernel.33c6a8233829@gmail.com> (raw)
In-Reply-To: <20250819063223.5239-6-richardbgobert@gmail.com>

Richard Gobert wrote:
> Add IPIP test-cases to the GRO selftest.
> 
> This selftest already contains IP ID test-cases. They are now
> also tested for encapsulated packets.
> 
> Signed-off-by: Richard Gobert <richardbgobert@gmail.com>
> ---
>  tools/testing/selftests/net/gro.c  | 49 ++++++++++++++++++++++++------
>  tools/testing/selftests/net/gro.sh |  5 +--
>  2 files changed, 42 insertions(+), 12 deletions(-)
> 
> diff --git a/tools/testing/selftests/net/gro.c b/tools/testing/selftests/net/gro.c
> index 3d4a82a2607c..aeb4973418a4 100644
> --- a/tools/testing/selftests/net/gro.c
> +++ b/tools/testing/selftests/net/gro.c
> @@ -93,6 +93,7 @@ static bool tx_socket = true;
>  static int tcp_offset = -1;
>  static int total_hdr_len = -1;
>  static int ethhdr_proto = -1;
> +static bool ipip;
>  static const int num_flush_id_cases = 6;
>  
>  static void vlog(const char *fmt, ...)
> @@ -114,7 +115,9 @@ static void setup_sock_filter(int fd)
>  	int ipproto_off, opt_ipproto_off;
>  	int next_off;
>  
> -	if (proto == PF_INET)
> +	if (ipip)
> +		next_off = sizeof(struct iphdr) + offsetof(struct iphdr, protocol);
> +	else if (proto == PF_INET)
>  		next_off = offsetof(struct iphdr, protocol);
>  	else
>  		next_off = offsetof(struct ipv6hdr, nexthdr);
> @@ -244,7 +247,7 @@ static void fill_datalinklayer(void *buf)
>  	eth->h_proto = ethhdr_proto;
>  }
>  
> -static void fill_networklayer(void *buf, int payload_len)
> +static void fill_networklayer(void *buf, int payload_len, int protocol)
>  {
>  	struct ipv6hdr *ip6h = buf;
>  	struct iphdr *iph = buf;
> @@ -254,7 +257,7 @@ static void fill_networklayer(void *buf, int payload_len)
>  
>  		ip6h->version = 6;
>  		ip6h->payload_len = htons(sizeof(struct tcphdr) + payload_len);
> -		ip6h->nexthdr = IPPROTO_TCP;
> +		ip6h->nexthdr = protocol;
>  		ip6h->hop_limit = 8;
>  		if (inet_pton(AF_INET6, addr6_src, &ip6h->saddr) != 1)
>  			error(1, errno, "inet_pton source ip6");
> @@ -266,7 +269,7 @@ static void fill_networklayer(void *buf, int payload_len)
>  		iph->version = 4;
>  		iph->ihl = 5;
>  		iph->ttl = 8;
> -		iph->protocol	= IPPROTO_TCP;
> +		iph->protocol	= protocol;
>  		iph->tot_len = htons(sizeof(struct tcphdr) +
>  				payload_len + sizeof(struct iphdr));
>  		iph->frag_off = htons(0x4000); /* DF = 1, MF = 0 */
> @@ -313,9 +316,19 @@ static void create_packet(void *buf, int seq_offset, int ack_offset,
>  {
>  	memset(buf, 0, total_hdr_len);
>  	memset(buf + total_hdr_len, 'a', payload_len);
> +
>  	fill_transportlayer(buf + tcp_offset, seq_offset, ack_offset,
>  			    payload_len, fin);
> -	fill_networklayer(buf + ETH_HLEN, payload_len);
> +
> +	if (ipip) {
> +		fill_networklayer(buf + ETH_HLEN + sizeof(struct iphdr),
> +				  payload_len, IPPROTO_TCP);
> +		fill_networklayer(buf + ETH_HLEN, payload_len + sizeof(struct iphdr),
> +				  IPPROTO_IPIP);
> +	} else {
> +		fill_networklayer(buf + ETH_HLEN, payload_len, IPPROTO_TCP);
> +	}
> +
>  	fill_datalinklayer(buf);
>  }
>  
> @@ -416,6 +429,13 @@ static void recompute_packet(char *buf, char *no_ext, int extlen)
>  		iph->tot_len = htons(ntohs(iph->tot_len) + extlen);
>  		iph->check = 0;
>  		iph->check = checksum_fold(iph, sizeof(struct iphdr), 0);
> +
> +		if (ipip) {
> +			iph += 1;
> +			iph->tot_len = htons(ntohs(iph->tot_len) + extlen);
> +			iph->check = 0;
> +			iph->check = checksum_fold(iph, sizeof(struct iphdr), 0);
> +		}
>  	} else {
>  		ip6h->payload_len = htons(ntohs(ip6h->payload_len) + extlen);
>  	}
> @@ -777,7 +797,7 @@ static void send_fragment4(int fd, struct sockaddr_ll *daddr)
>  	 */
>  	memset(buf + total_hdr_len, 'a', PAYLOAD_LEN * 2);
>  	fill_transportlayer(buf + tcp_offset, PAYLOAD_LEN, 0, PAYLOAD_LEN * 2, 0);
> -	fill_networklayer(buf + ETH_HLEN, PAYLOAD_LEN);
> +	fill_networklayer(buf + ETH_HLEN, PAYLOAD_LEN, IPPROTO_TCP);
>  	fill_datalinklayer(buf);
>  
>  	iph->frag_off = htons(0x6000); // DF = 1, MF = 1
> @@ -1071,7 +1091,7 @@ static void gro_sender(void)
>  		 * and min ipv6hdr size. Like MAX_HDR_SIZE,
>  		 * MAX_PAYLOAD is defined with the larger header of the two.
>  		 */
> -		int offset = proto == PF_INET ? 20 : 0;
> +		int offset = (proto == PF_INET && !ipip) ? 20 : 0;
>  		int remainder = (MAX_PAYLOAD + offset) % MSS;
>  
>  		send_large(txfd, &daddr, remainder);
> @@ -1221,7 +1241,7 @@ static void gro_receiver(void)
>  			check_recv_pkts(rxfd, correct_payload, 2);
>  		}
>  	} else if (strcmp(testname, "large") == 0) {
> -		int offset = proto == PF_INET ? 20 : 0;
> +		int offset = (proto == PF_INET && !ipip) ? 20 : 0;
>  		int remainder = (MAX_PAYLOAD + offset) % MSS;
>  
>  		correct_payload[0] = (MAX_PAYLOAD + offset);
> @@ -1250,6 +1270,7 @@ static void parse_args(int argc, char **argv)
>  		{ "iface", required_argument, NULL, 'i' },
>  		{ "ipv4", no_argument, NULL, '4' },
>  		{ "ipv6", no_argument, NULL, '6' },
> +		{ "ipip", no_argument, NULL, 'e' },
>  		{ "rx", no_argument, NULL, 'r' },
>  		{ "saddr", required_argument, NULL, 's' },
>  		{ "smac", required_argument, NULL, 'S' },
> @@ -1259,7 +1280,7 @@ static void parse_args(int argc, char **argv)
>  	};
>  	int c;
>  
> -	while ((c = getopt_long(argc, argv, "46d:D:i:rs:S:t:v", opts, NULL)) != -1) {
> +	while ((c = getopt_long(argc, argv, "46ed:D:i:rs:S:t:v", opts, NULL)) != -1) {

Please keep alphabetical order.

>  		switch (c) {
>  		case '4':
>  			proto = PF_INET;
> @@ -1269,6 +1290,11 @@ static void parse_args(int argc, char **argv)
>  			proto = PF_INET6;
>  			ethhdr_proto = htons(ETH_P_IPV6);
>  			break;
> +		case 'e':
> +			ipip = true;
> +			proto = PF_INET;
> +			ethhdr_proto = htons(ETH_P_IP);
> +			break;
>  		case 'd':
>  			addr4_dst = addr6_dst = optarg;
>  			break;
> @@ -1304,7 +1330,10 @@ int main(int argc, char **argv)
>  {
>  	parse_args(argc, argv);
>  
> -	if (proto == PF_INET) {
> +	if (ipip) {
> +		tcp_offset = ETH_HLEN + sizeof(struct iphdr) * 2;
> +		total_hdr_len = tcp_offset + sizeof(struct tcphdr);
> +	} else if (proto == PF_INET) {
>  		tcp_offset = ETH_HLEN + sizeof(struct iphdr);
>  		total_hdr_len = tcp_offset + sizeof(struct tcphdr);
>  	} else if (proto == PF_INET6) {
> diff --git a/tools/testing/selftests/net/gro.sh b/tools/testing/selftests/net/gro.sh
> index 9e3f186bc2a1..d16ec365b3cf 100755
> --- a/tools/testing/selftests/net/gro.sh
> +++ b/tools/testing/selftests/net/gro.sh
> @@ -4,7 +4,7 @@
>  readonly SERVER_MAC="aa:00:00:00:00:02"
>  readonly CLIENT_MAC="aa:00:00:00:00:01"
>  readonly TESTS=("data" "ack" "flags" "tcp" "ip" "large")
> -readonly PROTOS=("ipv4" "ipv6")
> +readonly PROTOS=("ipv4" "ipv6" "ipip")
>  dev=""
>  test="all"
>  proto="ipv4"
> @@ -31,7 +31,8 @@ run_test() {
>        1>>log.txt
>      wait "${server_pid}"
>      exit_code=$?
> -    if [[ ${test} == "large" && -n "${KSFT_MACHINE_SLOW}" && \
> +    if [[ ( ${test} == "large" || ${protocol} == "ipip" ) && \
> +          -n "${KSFT_MACHINE_SLOW}" && \

Why does the ipip test need this debug xfail path?

>            ${exit_code} -ne 0 ]]; then
>          echo "Ignoring errors due to slow environment" 1>&2
>          exit_code=0
> -- 
> 2.36.1
> 



  reply	other threads:[~2025-08-20 11:21 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-19  6:32 [PATCH net-next v2 0/5] net: gso: restore outer ip ids correctly Richard Gobert
2025-08-19  6:32 ` [PATCH net-next v2 1/5] net: gro: remove is_ipv6 from napi_gro_cb Richard Gobert
2025-08-19  8:47   ` Eric Dumazet
2025-08-19 12:26     ` Richard Gobert
2025-08-19  6:32 ` [PATCH net-next v2 2/5] net: gro: only merge packets with incrementing or fixed outer ids Richard Gobert
2025-08-19 14:46   ` Willem de Bruijn
2025-08-20  0:30     ` Jakub Kicinski
2025-08-20 12:27       ` Richard Gobert
2025-08-20 15:04         ` Jakub Kicinski
2025-08-20  0:30   ` Jakub Kicinski
2025-08-19  6:32 ` [PATCH net-next v2 3/5] net: gso: restore ids of outer ip headers correctly Richard Gobert
2025-08-19  6:32 ` [PATCH net-next v2 4/5] net: gro: remove unnecessary df checks Richard Gobert
2025-08-20 11:24   ` Willem de Bruijn
2025-08-19  6:32 ` [PATCH net-next v2 5/5] selftests/net: test ipip packets in gro.sh Richard Gobert
2025-08-20 11:21   ` Willem de Bruijn [this message]
2025-08-20 12:21     ` Richard Gobert

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=willemdebruijn.kernel.33c6a8233829@gmail.com \
    --to=willemdebruijn.kernel@gmail.com \
    --cc=ahmed.zaki@intel.com \
    --cc=aleksander.lobakin@intel.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=corbet@lwn.net \
    --cc=davem@davemloft.net \
    --cc=dsahern@kernel.org \
    --cc=ecree.xilinx@gmail.com \
    --cc=edumazet@google.com \
    --cc=florian.fainelli@broadcom.com \
    --cc=horms@kernel.org \
    --cc=kuba@kernel.org \
    --cc=kuniyu@google.com \
    --cc=leon@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-net-drivers@amd.com \
    --cc=mbloch@nvidia.com \
    --cc=ncardwell@google.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=richardbgobert@gmail.com \
    --cc=saeedm@nvidia.com \
    --cc=salil.mehta@huawei.com \
    --cc=sdf@fomichev.me \
    --cc=shaojijie@huawei.com \
    --cc=shenjian15@huawei.com \
    --cc=shuah@kernel.org \
    --cc=tariqt@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.