[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 3/3] net: checksum: Introduce fine control over checksum type
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [PATCH 3/3] net: checksum: Introduce fine control over checksum type |
Date: |
Sun, 6 Dec 2020 12:50:47 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.4.0 |
Hi Ben,
On 12/6/20 3:14 AM, Bin Meng wrote:
> From: Bin Meng <bin.meng@windriver.com>
>
> At present net_checksum_calculate() blindly calculates all types of
> checksums (IP, TCP, UDP). Some NICs may have a per type setting in
> their BDs to control what checksum should be offloaded. To support
> such hardware behavior, introduce a 'csum_flag' parameter to the
> net_checksum_calculate() API to allow fine control over what type
> checksum is calculated.
>
> Existing users of this API are updated accordingly.
>
> Signed-off-by: Bin Meng <bin.meng@windriver.com>
>
> ---
>
> hw/net/allwinner-sun8i-emac.c | 2 +-
> hw/net/cadence_gem.c | 2 +-
> hw/net/fsl_etsec/rings.c | 8 +++-----
> hw/net/ftgmac100.c | 10 +++++++++-
> hw/net/imx_fec.c | 15 +++------------
> hw/net/virtio-net.c | 2 +-
> hw/net/xen_nic.c | 2 +-
> include/net/checksum.h | 7 ++++++-
When sending a such API refactor, patch is easier to
review if you setup the scripts/git.orderfile config.
> net/checksum.c | 18 ++++++++++++++----
> net/filter-rewriter.c | 4 ++--
> 10 files changed, 41 insertions(+), 29 deletions(-)
...
> diff --git a/include/net/checksum.h b/include/net/checksum.h
> index 05a0d27..7dec37e 100644
> --- a/include/net/checksum.h
> +++ b/include/net/checksum.h
> @@ -21,11 +21,16 @@
> #include "qemu/bswap.h"
> struct iovec;
>
> +#define CSUM_IP 0x01
IMO this is IP_HEADER,
> +#define CSUM_TCP 0x02
> +#define CSUM_UDP 0x04
and these IP_PAYLOAD, regardless the payload protocol.
> +#define CSUM_ALL (CSUM_IP | CSUM_TCP | CSUM_UDP)
Maybe CSUM_HEADER / CSUM_PAYLOAD / CSUM_FULL (aka RAW?).
> +
> uint32_t net_checksum_add_cont(int len, uint8_t *buf, int seq);
> uint16_t net_checksum_finish(uint32_t sum);
> uint16_t net_checksum_tcpudp(uint16_t length, uint16_t proto,
> uint8_t *addrs, uint8_t *buf);
> -void net_checksum_calculate(uint8_t *data, int length);
> +void net_checksum_calculate(uint8_t *data, int length, int csum_flag);
>
> static inline uint32_t
> net_checksum_add(int len, uint8_t *buf)
> diff --git a/net/checksum.c b/net/checksum.c
> index dabd290..70f4eae 100644
> --- a/net/checksum.c
> +++ b/net/checksum.c
> @@ -57,7 +57,7 @@ uint16_t net_checksum_tcpudp(uint16_t length, uint16_t
> proto,
> return net_checksum_finish(sum);
> }
>
> -void net_checksum_calculate(uint8_t *data, int length)
> +void net_checksum_calculate(uint8_t *data, int length, int csum_flag)
> {
> int mac_hdr_len, ip_len;
> struct ip_header *ip;
> @@ -108,9 +108,11 @@ void net_checksum_calculate(uint8_t *data, int length)
> }
>
> /* Calculate IP checksum */
> - stw_he_p(&ip->ip_sum, 0);
> - csum = net_raw_checksum((uint8_t *)ip, IP_HDR_GET_LEN(ip));
> - stw_be_p(&ip->ip_sum, csum);
> + if (csum_flag & CSUM_IP) {
> + stw_he_p(&ip->ip_sum, 0);
> + csum = net_raw_checksum((uint8_t *)ip, IP_HDR_GET_LEN(ip));
> + stw_be_p(&ip->ip_sum, csum);
> + }
>
> if (IP4_IS_FRAGMENT(ip)) {
> return; /* a fragmented IP packet */
> @@ -128,6 +130,10 @@ void net_checksum_calculate(uint8_t *data, int length)
> switch (ip->ip_p) {
> case IP_PROTO_TCP:
> {
> + if (!(csum_flag & CSUM_TCP)) {
> + return;
> + }
> +
> tcp_header *tcp = (tcp_header *)(ip + 1);
>
> if (ip_len < sizeof(tcp_header)) {
> @@ -148,6 +154,10 @@ void net_checksum_calculate(uint8_t *data, int length)
> }
> case IP_PROTO_UDP:
> {
> + if (!(csum_flag & CSUM_UDP)) {
> + return;
> + }
> +
> udp_header *udp = (udp_header *)(ip + 1);
>
> if (ip_len < sizeof(udp_header)) {
...