b058d92ea9
This patch adds a framework that allows GSO on tunneled packets. Furthermore, it leverages that framework to provide GSO support for VxLAN-encapsulated packets. Supported VxLAN packets must have an outer IPv4 header (prepended by an optional VLAN tag), and contain an inner TCP/IPv4 packet (with an optional inner VLAN tag). VxLAN GSO doesn't check if input packets have correct checksums and doesn't update checksums for output packets. Additionally, it doesn't process IP fragmented packets. As with TCP/IPv4 GSO, VxLAN GSO uses a two-segment MBUF to organize each output packet, which mandates support for multi-segment mbufs in the TX functions of the NIC driver. Also, if a packet is GSOed, VxLAN GSO reduces its MBUF refcnt by 1. As a result, when all of its GSO'd segments are freed, the packet is freed automatically. Signed-off-by: Mark Kavanagh <mark.b.kavanagh@intel.com> Signed-off-by: Jiayu Hu <jiayu.hu@intel.com> Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
76 lines
3.0 KiB
C
76 lines
3.0 KiB
C
/*-
|
|
* BSD LICENSE
|
|
*
|
|
* Copyright(c) 2017 Intel Corporation. All rights reserved.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
* * Neither the name of Intel Corporation nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef _GSO_TUNNEL_TCP4_H_
|
|
#define _GSO_TUNNEL_TCP4_H_
|
|
|
|
#include <stdint.h>
|
|
#include <rte_mbuf.h>
|
|
|
|
/**
|
|
* Segment a tunneling packet with inner TCP/IPv4 headers. This function
|
|
* doesn't check if the input packet has correct checksums, and doesn't
|
|
* update checksums for output GSO segments. Furthermore, it doesn't
|
|
* process IP fragment packets.
|
|
*
|
|
* @param pkt
|
|
* The packet mbuf to segment.
|
|
* @param gso_size
|
|
* The max length of a GSO segment, measured in bytes.
|
|
* @param ipid_delta
|
|
* The increasing unit of IP ids.
|
|
* @param direct_pool
|
|
* MBUF pool used for allocating direct buffers for output segments.
|
|
* @param indirect_pool
|
|
* MBUF pool used for allocating indirect buffers for output segments.
|
|
* @param pkts_out
|
|
* Pointer array used to store the MBUF addresses of output GSO
|
|
* segments, when it succeeds. If the memory space in pkts_out is
|
|
* insufficient, it fails and returns -EINVAL.
|
|
* @param nb_pkts_out
|
|
* The max number of items that 'pkts_out' can keep.
|
|
*
|
|
* @return
|
|
* - The number of GSO segments filled in pkts_out on success.
|
|
* - Return -ENOMEM if run out of memory in MBUF pools.
|
|
* - Return -EINVAL for invalid parameters.
|
|
*/
|
|
int gso_tunnel_tcp4_segment(struct rte_mbuf *pkt,
|
|
uint16_t gso_size,
|
|
uint8_t ipid_delta,
|
|
struct rte_mempool *direct_pool,
|
|
struct rte_mempool *indirect_pool,
|
|
struct rte_mbuf **pkts_out,
|
|
uint16_t nb_pkts_out);
|
|
#endif
|