public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Stefano Brivio <sbrivio@redhat.com>
Cc: passt-dev@passt.top
Subject: Re: [PATCH 02/14] Add csum_icmp4() helper for calculating ICMPv4 checksums
Date: Tue, 18 Oct 2022 23:06:11 +1100	[thread overview]
Message-ID: <Y06Ws2paKTMZfyQq@yekko> (raw)
In-Reply-To: <20221018050151.5739f1ad@elisabeth>

[-- Attachment #1: Type: text/plain, Size: 4051 bytes --]

On Tue, Oct 18, 2022 at 05:01:51AM +0200, Stefano Brivio wrote:
> On Mon, 17 Oct 2022 19:57:55 +1100
> David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > Although tap_ip_send() is currently the only place calculating ICMPv4
> > checksums, create a helper function for symmetry with ICMPv6.  For future
> > flexibility it allows the ICMPv6 header and payload to be in separate
> > buffers.
> > 
> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > ---
> >  checksum.c | 15 +++++++++++++++
> >  checksum.h |  2 ++
> >  tap.c      |  4 +---
> >  3 files changed, 18 insertions(+), 3 deletions(-)
> > 
> > diff --git a/checksum.c b/checksum.c
> > index 0e207c8..c8b6b42 100644
> > --- a/checksum.c
> > +++ b/checksum.c
> > @@ -52,6 +52,7 @@
> >  #include <stddef.h>
> >  #include <stdint.h>
> >  
> > +#include <linux/icmp.h>
> >  #include <linux/icmpv6.h>
> >  
> >  /**
> > @@ -107,6 +108,20 @@ uint16_t csum_unaligned(const void *buf, size_t len, uint32_t init)
> >  	return (uint16_t)~csum_fold(sum_16b(buf, len) + init);
> >  }
> >  
> > +/**
> > + * csum_icmp4() - Calculate checksum for an ICMPv4 packet
> 
> "Calculate and set"?

Done.

> By the way, there's no such thing as ICMPv4 --
> it's ICMP.

Technically, yes, but I kind of wanted to make it clear at a glance
that these are IPv4 specific functions.  I'd also like to avoid the
implication that v4 is the "normal" sort.  I've changed from "ICMPv4"
to "ICMP" in the comments, but I've left the '4's in the various names

> > + * @icmp4hr:	ICMPv4 header, initialized apart from checksum
> 
> ...-ised, if you respin. For consistency, I would call this 'ih'.
> 
> > + * @payload:	ICMPv4 packet payload
> > + * @len:	Length of @payload (not including ICMPv4 header)
> > + */
> > +void csum_icmp4(struct icmphdr *icmp4hr, const void *payload, size_t len)
> 
> I guess csum_icmp() is preferable. Indeed, for TCP and UDP 'tcp4' and
> 'udp4' make sense because those are the same protocols over IPv4 and
> IPv6.

See above.

> > +{
> > +	/* Partial checksum for ICMPv4 header alone */
> > +	uint32_t hrsum = sum_16b(icmp4hr, sizeof(*icmp4hr));
> 
> A white line would be nice here.

Done.
> 
> I would call this psum (same as in csum_icmp6())

Changed to 'psum'.

> or hdrsum, 'hr' isn't
> really used for "header" elsewhere.

Well.. except as a suffix, 'ihr' etc.

> > +	icmp4hr->checksum = 0;
> > +	icmp4hr->checksum = csum_unaligned(payload, len, hrsum);
> > +}
> > +
> >  /**
> >   * csum_icmp6() - Calculate checksum for an ICMPv6 packet
> >   * @icmp6hr:	ICMPv6 header, initialized apart from checksum
> > diff --git a/checksum.h b/checksum.h
> > index 2c72200..ff95cf9 100644
> > --- a/checksum.h
> > +++ b/checksum.h
> > @@ -6,11 +6,13 @@
> >  #ifndef CHECKSUM_H
> >  #define CHECKSUM_H
> >  
> > +struct icmphdr;
> >  struct icmp6hdr;
> >  
> >  uint32_t sum_16b(const void *buf, size_t len);
> >  uint16_t csum_fold(uint32_t sum);
> >  uint16_t csum_unaligned(const void *buf, size_t len, uint32_t init);
> > +void csum_icmp4(struct icmphdr *ih, const void *payload, size_t len);
> >  void csum_icmp6(struct icmp6hdr *ih,
> >  		const struct in6_addr *saddr,
> >  		const struct in6_addr *daddr,
> > diff --git a/tap.c b/tap.c
> > index aafc92b..f082901 100644
> > --- a/tap.c
> > +++ b/tap.c
> > @@ -148,9 +148,7 @@ void tap_ip_send(const struct ctx *c, const struct in6_addr *src, uint8_t proto,
> >  			uh->check = 0;
> >  		} else if (iph->protocol == IPPROTO_ICMP) {
> >  			struct icmphdr *ih = (struct icmphdr *)(iph + 1);
> > -
> > -			ih->checksum = 0;
> > -			ih->checksum = csum_unaligned(ih, len, 0);
> > +			csum_icmp4(ih, ih + 1, len - sizeof(*ih));
> >  		}
> >  
> >  		if (tap_send(c, buf, len + sizeof(*iph) + sizeof(*eh), 1) < 0)
> 

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2022-10-18 12:08 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-17  8:57 [PATCH 00/14] Clean up checksum and header generation for inbound packets David Gibson
2022-10-17  8:57 ` [PATCH 01/14] Add csum_icmp6() helper for calculating ICMPv6 checksums David Gibson
2022-10-18  3:01   ` Stefano Brivio
2022-10-18 12:05     ` David Gibson
2022-10-17  8:57 ` [PATCH 02/14] Add csum_icmp4() helper for calculating ICMPv4 checksums David Gibson
2022-10-18  3:01   ` Stefano Brivio
2022-10-18 12:06     ` David Gibson [this message]
2022-10-18 12:28       ` Stefano Brivio
2022-10-17  8:57 ` [PATCH 03/14] Add csum_udp6() helper for calculating UDP over IPv6 checksums David Gibson
2022-10-18  3:02   ` Stefano Brivio
2022-10-18 12:06     ` David Gibson
2022-10-17  8:57 ` [PATCH 04/14] Add csum_udp4() helper for calculating UDP over IPv4 checksums David Gibson
2022-10-18  3:03   ` Stefano Brivio
2022-10-18 12:06     ` David Gibson
2022-10-17  8:57 ` [PATCH 05/14] Add csum_ip4_header() helper to calculate IPv4 header checksums David Gibson
2022-10-18  3:03   ` Stefano Brivio
2022-10-18 12:07     ` David Gibson
2022-10-17  8:57 ` [PATCH 06/14] Add helpers for normal inbound packet destination addresses David Gibson
2022-10-18  3:04   ` Stefano Brivio
2022-10-18 12:07     ` David Gibson
2022-10-17  8:58 ` [PATCH 07/14] Remove support for TCP packets from tap_ip_send() David Gibson
2022-10-17  8:58 ` [PATCH 08/14] tap: Remove unhelpeful vnet_pre optimization from tap_send() David Gibson
2022-10-18  3:05   ` Stefano Brivio
2022-10-18 12:07     ` David Gibson
2022-10-17  8:58 ` [PATCH 09/14] Split tap_ip_send() into IPv4 and IPv6 specific functions David Gibson
2022-10-18  3:06   ` Stefano Brivio
2022-10-18 12:07     ` David Gibson
2022-10-17  8:58 ` [PATCH 10/14] tap: Split tap_ip6_send() into UDP and ICMP variants David Gibson
2022-10-17  8:58 ` [PATCH 11/14] ndp: Remove unneeded eh_source parameter David Gibson
2022-10-17  8:58 ` [PATCH 12/14] ndp: Use tap_icmp6_send() helper David Gibson
2022-10-17  8:58 ` [PATCH 13/14] tap: Split tap_ip4_send() into UDP and ICMP variants David Gibson
2022-10-18  3:06   ` Stefano Brivio
2022-10-18 12:07     ` David Gibson
2022-10-18 12:27       ` Stefano Brivio
2022-10-18 23:54         ` David Gibson
2022-10-17  8:58 ` [PATCH 14/14] dhcp: Use tap_udp4_send() helper in dhcp() David Gibson

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=Y06Ws2paKTMZfyQq@yekko \
    --to=david@gibson.dropbear.id.au \
    --cc=passt-dev@passt.top \
    --cc=sbrivio@redhat.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.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).