vlib: refactor checksum offload support
Type: refactor This patch refactors the offload flags in vlib_buffer_t. There are two main reasons behind this refactoring. First, offload flags are insufficient to represent outer and inner headers offloads. Second, room for these flags in first cacheline of vlib_buffer_t is also limited. This patch introduces a generic offload flag in first cacheline. And detailed offload flags in 2nd cacheline of the structure for performance optimization. Change-Id: Icc363a142fb9208ec7113ab5bbfc8230181f6004 Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
This commit is contained in:

committed by
Damjan Marion

parent
99c6dc6a7a
commit
6809538e64
@ -44,18 +44,17 @@
|
||||
#include <vnet/gso/hdr_offset_parser.h>
|
||||
|
||||
static_always_inline void
|
||||
vnet_calc_ip4_checksums (vlib_main_t * vm, vlib_buffer_t * b,
|
||||
ip4_header_t * ip4, tcp_header_t * th,
|
||||
udp_header_t * uh)
|
||||
vnet_calc_ip4_checksums (vlib_main_t *vm, vlib_buffer_t *b, ip4_header_t *ip4,
|
||||
tcp_header_t *th, udp_header_t *uh, u32 oflags)
|
||||
{
|
||||
if (b->flags & VNET_BUFFER_F_OFFLOAD_IP_CKSUM)
|
||||
if (oflags & VNET_BUFFER_OFFLOAD_F_IP_CKSUM)
|
||||
ip4->checksum = ip4_header_checksum (ip4);
|
||||
if (b->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM)
|
||||
if (oflags & VNET_BUFFER_OFFLOAD_F_TCP_CKSUM)
|
||||
{
|
||||
th->checksum = 0;
|
||||
th->checksum = ip4_tcp_udp_compute_checksum (vm, b, ip4);
|
||||
}
|
||||
if (b->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM)
|
||||
if (oflags & VNET_BUFFER_OFFLOAD_F_UDP_CKSUM)
|
||||
{
|
||||
uh->checksum = 0;
|
||||
uh->checksum = ip4_tcp_udp_compute_checksum (vm, b, ip4);
|
||||
@ -63,17 +62,16 @@ vnet_calc_ip4_checksums (vlib_main_t * vm, vlib_buffer_t * b,
|
||||
}
|
||||
|
||||
static_always_inline void
|
||||
vnet_calc_ip6_checksums (vlib_main_t * vm, vlib_buffer_t * b,
|
||||
ip6_header_t * ip6, tcp_header_t * th,
|
||||
udp_header_t * uh)
|
||||
vnet_calc_ip6_checksums (vlib_main_t *vm, vlib_buffer_t *b, ip6_header_t *ip6,
|
||||
tcp_header_t *th, udp_header_t *uh, u32 oflags)
|
||||
{
|
||||
int bogus;
|
||||
if (b->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM)
|
||||
if (oflags & VNET_BUFFER_OFFLOAD_F_TCP_CKSUM)
|
||||
{
|
||||
th->checksum = 0;
|
||||
th->checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b, ip6, &bogus);
|
||||
}
|
||||
if (b->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM)
|
||||
if (oflags & VNET_BUFFER_OFFLOAD_F_UDP_CKSUM)
|
||||
{
|
||||
uh->checksum = 0;
|
||||
uh->checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b, ip6, &bogus);
|
||||
@ -88,6 +86,7 @@ vnet_calc_checksums_inline (vlib_main_t * vm, vlib_buffer_t * b,
|
||||
ip6_header_t *ip6;
|
||||
tcp_header_t *th;
|
||||
udp_header_t *uh;
|
||||
u32 oflags = vnet_buffer2 (b)->oflags;
|
||||
|
||||
ASSERT (!(is_ip4 && is_ip6));
|
||||
|
||||
@ -98,16 +97,16 @@ vnet_calc_checksums_inline (vlib_main_t * vm, vlib_buffer_t * b,
|
||||
|
||||
if (is_ip4)
|
||||
{
|
||||
vnet_calc_ip4_checksums (vm, b, ip4, th, uh);
|
||||
vnet_calc_ip4_checksums (vm, b, ip4, th, uh, oflags);
|
||||
}
|
||||
else if (is_ip6)
|
||||
{
|
||||
vnet_calc_ip6_checksums (vm, b, ip6, th, uh);
|
||||
vnet_calc_ip6_checksums (vm, b, ip6, th, uh, oflags);
|
||||
}
|
||||
|
||||
b->flags &= ~VNET_BUFFER_F_OFFLOAD_TCP_CKSUM;
|
||||
b->flags &= ~VNET_BUFFER_F_OFFLOAD_UDP_CKSUM;
|
||||
b->flags &= ~VNET_BUFFER_F_OFFLOAD_IP_CKSUM;
|
||||
vnet_buffer_offload_flags_clear (b, (VNET_BUFFER_OFFLOAD_F_IP_CKSUM |
|
||||
VNET_BUFFER_OFFLOAD_F_UDP_CKSUM |
|
||||
VNET_BUFFER_OFFLOAD_F_TCP_CKSUM));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user