summaryrefslogtreecommitdiffstats
path: root/hicn-plugin/src/faces
diff options
context:
space:
mode:
authorMauro Sardara <msardara@cisco.com>2020-11-09 19:56:31 +0100
committerMauro Sardara <msardara@cisco.com>2020-11-10 12:34:12 +0000
commitf87f19fa389a1edea861faaabc972d508a58985c (patch)
tree9305042a486c234e61d048ea43f59fc36da63147 /hicn-plugin/src/faces
parentc1de1ea148175650dfeab648d946e3266fdee117 (diff)
[HICN-651] Offload checksum computation to VPP.
Signed-off-by: Mauro Sardara <msardara@cisco.com> Change-Id: I42d69455542f3def0076fe58020f8f10347ef83f
Diffstat (limited to 'hicn-plugin/src/faces')
-rw-r--r--hicn-plugin/src/faces/face_node.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/hicn-plugin/src/faces/face_node.c b/hicn-plugin/src/faces/face_node.c
index e1fd81ca0..fd8649e6b 100644
--- a/hicn-plugin/src/faces/face_node.c
+++ b/hicn-plugin/src/faces/face_node.c
@@ -558,19 +558,34 @@ hicn_face_rewrite_interest (vlib_main_t * vm, vlib_buffer_t * b0,
/* return; */
hicn_header_t *hicn = vlib_buffer_get_current (b0);
+ size_t l3_header_size = sizeof(ip6_header_t);
//hicn_face_ip_t *ip_face = (hicn_face_ip_t *) face->data;
ip46_address_t temp_addr;
ip46_address_reset (&temp_addr);
hicn_type_t type = hicn_get_buffer (b0)->type;
- hicn_ops_vft[type.l1]->rewrite_interest (type, &hicn->protocol,
- &face->nat_addr, &temp_addr);
+ int ret = hicn_ops_vft[type.l1]->rewrite_interest (type, &hicn->protocol,
+ &face->nat_addr, &temp_addr);
- if (ip46_address_is_ip4(&face->nat_addr))
+ if (ip46_address_is_ip4(&face->nat_addr)) {
b0->flags |= VNET_BUFFER_F_OFFLOAD_IP_CKSUM;
+ l3_header_size = sizeof(ip4_header_t);
+ }
+
+ if (ret == HICN_LIB_ERROR_REWRITE_CKSUM_REQUIRED) {
+ b0->flags |= VNET_BUFFER_F_OFFLOAD_TCP_CKSUM;
- b0->flags |= VNET_BUFFER_F_OFFLOAD_TCP_CKSUM;
+ /* Make sure l3_hdr_offset and l4_hdr_offset are set */
+ if (!(b0->flags & VNET_BUFFER_F_L3_HDR_OFFSET_VALID)) {
+ b0->flags |= VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
+ vnet_buffer (b0)->l3_hdr_offset = b0->current_data;
+ }
+ if (!(b0->flags & VNET_BUFFER_F_L4_HDR_OFFSET_VALID)) {
+ b0->flags |= VNET_BUFFER_F_L4_HDR_OFFSET_VALID;
+ vnet_buffer (b0)->l4_hdr_offset = vnet_buffer (b0)->l3_hdr_offset + l3_header_size;
+ }
+ }
ASSERT(face->flags & HICN_FACE_FLAGS_FACE);