On 20 April 2017 at 19:43, Alin Serdean <[email protected]> wrote:
> Until now we only needed to compute software checksums on net buffer lists > containing a single net buffer. > > This patch allows the software checksums to be applied on a net buffer list > with multiple net buffers. The hard assumption for this, is the net > buffers are > part of the same connection. The position of the offsets is pointed by the > layers parameter. > > This will be useful for introducing support ip fragments in conntrack. > > Signed-off-by: Alin Gabriel Serdean <[email protected]> > Applied, thanks! > --- > datapath-windows/ovsext/Offload.c | 105 ++++++++++++++++++++---------- > -------- > 1 file changed, 54 insertions(+), 51 deletions(-) > > diff --git a/datapath-windows/ovsext/Offload.c b/datapath-windows/ovsext/ > Offload.c > index f3ab0e1..65d3b67 100644 > --- a/datapath-windows/ovsext/Offload.c > +++ b/datapath-windows/ovsext/Offload.c > @@ -647,7 +647,9 @@ OvsCalculateUDPChecksum(PNET_BUFFER_LIST curNbl, > * OvsApplySWChecksumOnNB -- > * > * This function calculates and sets the required software offloads given > by > - * csumInfo for a given NBL(nbl) with a single NB. > + * csumInfo for a given NBL(nbl). If the given net buffer list 'nbl' > + * has multiple net buffers, we assume that they are part of the same > + * connection with the same offsets defined in 'layers'. > * > */ > NDIS_STATUS > @@ -661,60 +663,61 @@ OvsApplySWChecksumOnNB(POVS_PACKET_HDR_INFO layers, > UINT32 packetLength = 0; > ASSERT(nbl != NULL); > > - curNb = NET_BUFFER_LIST_FIRST_NB(nbl); > - ASSERT(curNb->Next == NULL); > - packetLength = NET_BUFFER_DATA_LENGTH(curNb); > - curMdl = NET_BUFFER_CURRENT_MDL(curNb); > - bufferStart = (PUINT8)MmGetSystemAddressForMdlSafe(curMdl, > - LowPagePriority); > - if (!bufferStart) { > - return NDIS_STATUS_RESOURCES; > - } > + for (curNb = NET_BUFFER_LIST_FIRST_NB(nbl); curNb != NULL; > + curNb = curNb->Next) { > + packetLength = NET_BUFFER_DATA_LENGTH(curNb); > + curMdl = NET_BUFFER_CURRENT_MDL(curNb); > + bufferStart = (PUINT8)MmGetSystemAddressForMdlSafe(curMdl, > + > LowPagePriority); > + if (!bufferStart) { > + return NDIS_STATUS_RESOURCES; > + } > > - bufferStart += NET_BUFFER_CURRENT_MDL_OFFSET(curNb); > + bufferStart += NET_BUFFER_CURRENT_MDL_OFFSET(curNb); > > - if (layers->isIPv4) { > - IPHdr *ip = (IPHdr *)(bufferStart + layers->l3Offset); > + if (layers->isIPv4) { > + IPHdr *ip = (IPHdr *)(bufferStart + layers->l3Offset); > > - if (csumInfo->Transmit.IpHeaderChecksum) { > - ip->check = 0; > - ip->check = IPChecksum((UINT8 *)ip, 4 * ip->ihl, 0); > - } > + if (csumInfo->Transmit.IpHeaderChecksum) { > + ip->check = 0; > + ip->check = IPChecksum((UINT8 *)ip, 4 * ip->ihl, 0); > + } > > - if (layers->isTcp && csumInfo->Transmit.TcpChecksum) { > - UINT16 csumLength = (UINT16)(packetLength - layers->l4Offset); > - TCPHdr *tcp = (TCPHdr *)(bufferStart + layers->l4Offset); > - tcp->check = IPPseudoChecksum(&ip->saddr, &ip->daddr, > - IPPROTO_TCP, csumLength); > - tcp->check = CalculateChecksumNB(curNb, csumLength, > - (UINT32)(layers->l4Offset)); > - } else if (layers->isUdp && csumInfo->Transmit.UdpChecksum) { > - UINT16 csumLength = (UINT16)(packetLength - layers->l4Offset); > - UDPHdr *udp = (UDPHdr *)((PCHAR)ip + sizeof *ip); > - udp->check = IPPseudoChecksum(&ip->saddr, &ip->daddr, > - IPPROTO_UDP, csumLength); > - udp->check = CalculateChecksumNB(curNb, csumLength, > - (UINT32)(layers->l4Offset)); > - } > - } else if (layers->isIPv6) { > - IPv6Hdr *ip = (IPv6Hdr *)(bufferStart + layers->l3Offset); > - > - if (layers->isTcp && csumInfo->Transmit.TcpChecksum) { > - UINT16 csumLength = (UINT16)(packetLength - layers->l4Offset); > - TCPHdr *tcp = (TCPHdr *)(bufferStart + layers->l4Offset); > - tcp->check = IPv6PseudoChecksum((UINT32 *) &ip->saddr, > - (UINT32 *) &ip->daddr, > - IPPROTO_TCP, csumLength); > - tcp->check = CalculateChecksumNB(curNb, csumLength, > - (UINT32)(layers->l4Offset)); > - } else if (layers->isUdp && csumInfo->Transmit.UdpChecksum) { > - UINT16 csumLength = (UINT16)(packetLength - layers->l4Offset); > - UDPHdr *udp = (UDPHdr *)((PCHAR)ip + sizeof *ip); > - udp->check = IPv6PseudoChecksum((UINT32 *) &ip->saddr, > - (UINT32 *) &ip->daddr, > - IPPROTO_UDP, csumLength); > - udp->check = CalculateChecksumNB(curNb, csumLength, > - (UINT32)(layers->l4Offset)); > + if (layers->isTcp && csumInfo->Transmit.TcpChecksum) { > + UINT16 csumLength = (UINT16)(packetLength - > layers->l4Offset); > + TCPHdr *tcp = (TCPHdr *)(bufferStart + layers->l4Offset); > + tcp->check = IPPseudoChecksum(&ip->saddr, &ip->daddr, > + IPPROTO_TCP, csumLength); > + tcp->check = CalculateChecksumNB(curNb, csumLength, > + > (UINT32)(layers->l4Offset)); > + } else if (layers->isUdp && csumInfo->Transmit.UdpChecksum) { > + UINT16 csumLength = (UINT16)(packetLength - > layers->l4Offset); > + UDPHdr *udp = (UDPHdr *)((PCHAR)ip + sizeof *ip); > + udp->check = IPPseudoChecksum(&ip->saddr, &ip->daddr, > + IPPROTO_UDP, csumLength); > + udp->check = CalculateChecksumNB(curNb, csumLength, > + > (UINT32)(layers->l4Offset)); > + } > + } else if (layers->isIPv6) { > + IPv6Hdr *ip = (IPv6Hdr *)(bufferStart + layers->l3Offset); > + > + if (layers->isTcp && csumInfo->Transmit.TcpChecksum) { > + UINT16 csumLength = (UINT16)(packetLength - > layers->l4Offset); > + TCPHdr *tcp = (TCPHdr *)(bufferStart + layers->l4Offset); > + tcp->check = IPv6PseudoChecksum((UINT32 *) &ip->saddr, > + (UINT32 *) &ip->daddr, > + IPPROTO_TCP, csumLength); > + tcp->check = CalculateChecksumNB(curNb, csumLength, > + > (UINT32)(layers->l4Offset)); > + } else if (layers->isUdp && csumInfo->Transmit.UdpChecksum) { > + UINT16 csumLength = (UINT16)(packetLength - > layers->l4Offset); > + UDPHdr *udp = (UDPHdr *)((PCHAR)ip + sizeof *ip); > + udp->check = IPv6PseudoChecksum((UINT32 *) &ip->saddr, > + (UINT32 *) &ip->daddr, > + IPPROTO_UDP, csumLength); > + udp->check = CalculateChecksumNB(curNb, csumLength, > + > (UINT32)(layers->l4Offset)); > + } > } > } > > -- > 2.10.2.windows.1 > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
