[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 3/3] net: checksum: Introduce fine control over checksum type
Hi Philippe, On Sun, Dec 6, 2020 at 7:50 PM Philippe Mathieu-Daudé <philmd@xxxxxxxxxx> wrote: > > Hi Ben, > > On 12/6/20 3:14 AM, Bin Meng wrote: > > From: Bin Meng <bin.meng@xxxxxxxxxxxxx> > > > > 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@xxxxxxxxxxxxx> > > > > --- > > > > 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. Sure. I thought I have done this before but apparently not on the machine this series was genearated :) > > > 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, Yes, but I believe no one will misread it, no? > > > +#define CSUM_TCP 0x02 > > +#define CSUM_UDP 0x04 > > and these IP_PAYLOAD, regardless the payload protocol. We have to distinguish TCP and UDP. > > > +#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)) { > ... Regards, Bin
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |