diff options
author | Mauro Sardara <msardara@cisco.com> | 2020-03-24 17:34:14 +0000 |
---|---|---|
committer | Mauro Sardara <msardara@cisco.com> | 2020-09-14 17:31:15 +0000 |
commit | 88509fe353767cbde707c3e3b1f29392957819f3 (patch) | |
tree | cccd51bac7966cd3138c525e8075d90341184a66 /hicn-plugin/src/data_fwd.h | |
parent | d875ae92a7fa1eaab3bc2616aeeedfc64a81fea4 (diff) |
[HICN-574] Host stack plugin for VPP.
Signed-off-by: Mauro Sardara <msardara@cisco.com>
Change-Id: I8d8fdffef31a7013265d6529c5f52f3d5ec70d18
Signed-off-by: Mauro Sardara <msardara@cisco.com>
Signed-off-by: Mauro <you@example.com>
Signed-off-by: Mauro Sardara <msardara@cisco.com>
Diffstat (limited to 'hicn-plugin/src/data_fwd.h')
-rw-r--r-- | hicn-plugin/src/data_fwd.h | 214 |
1 files changed, 0 insertions, 214 deletions
diff --git a/hicn-plugin/src/data_fwd.h b/hicn-plugin/src/data_fwd.h deleted file mode 100644 index d95f564c3..000000000 --- a/hicn-plugin/src/data_fwd.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2017-2020 Cisco and/or its affiliates. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __HICN_DATA_FWD_H__ -#define __HICN_DATA_FWD_H__ - -#include <vlib/buffer.h> - -#include "pcs.h" - -/** - * @file data_fwd.h - * - * This is the node encoutered by data packets after the hicn-data-pcslookup. - * This node has two goals: 1) clone/copy the vlib buffer as many time as the number - * of faces stored in the pit entry, 2) store a clone/copy of the vlib buffer in the CS. - * Unless there are memory issue (no more vlib buffer available to perform cloning/copy), - * a single vlib buffer received might results in several vlib buffer sent to the next - * vlib node (hicn4-iface-output or hicn6-iface-output). - * - * It must be noted that cloning is possible only if the lentgh of the data pointed by - * the vlib buffer is at least 256 bytes. This is due to an imposition in the vpp source - * code. In all the other cases the vlib buffer is copied. Cloning is performed by advancing - * the vlib buffer of 256 bytes and a new vlib buffer is created and chained in from of the received - * buffer. Additionally, the 256 bytes removed (advanced) from the received vlib buffer are - * copied in the head vlib buffer. In case of multiple cloning for the same vlib buffer, this - * mechanism allows us to have a different hICN header for each clone (+ the same additional bytes - * due to the vpp restriction on cloning). - */ - - -/* Trace context struct */ -typedef struct -{ - u32 next_index; - u32 sw_if_index; - u8 pkt_type; - u8 packet_data[64]; -} hicn_data_fwd_trace_t; - -typedef enum -{ - HICN_DATA_FWD_NEXT_V4_LOOKUP, - HICN_DATA_FWD_NEXT_V6_LOOKUP, - HICN_DATA_FWD_NEXT_IFACE4_OUT, - HICN_DATA_FWD_NEXT_IFACE6_OUT, - HICN_DATA_FWD_NEXT_ERROR_DROP, - HICN_DATA_FWD_N_NEXT, -} hicn_data_fwd_next_t; - -/** - * @brief Create a maximum of 256 clones of buffer and store them - * in the supplied array. Unlike the original function in the vlib - * library, we don't prevent cloning if n_buffer==1 and if - * s->current_length <= head_end_offset + CLIB_CACHE_LINE_BYTES * 2. - * - * @param vm - (vlib_main_t *) vlib main data structure pointer - * @param src_buffer - (u32) source buffer index - * @param buffers - (u32 * ) buffer index array - * @param n_buffers - (u16) number of buffer clones requested (<=256) - * @param head_end_offset - (u16) offset relative to current position - * where packet head ends - * @return - (u16) number of buffers actually cloned, may be - * less than the number requested or zero - */ -always_inline u16 -vlib_buffer_clone_256_2 (vlib_main_t * vm, u32 src_buffer, u32 * buffers, - u16 n_buffers, u16 head_end_offset) -{ - u16 i; - vlib_buffer_t *s = vlib_get_buffer (vm, src_buffer); - - ASSERT (n_buffers); - ASSERT (n_buffers <= 256); - - if (s->current_length <= head_end_offset + CLIB_CACHE_LINE_BYTES * 2) - { - for (i = 0; i < n_buffers; i++) - { - vlib_buffer_t *d; - d = vlib_buffer_copy (vm, s); - if (d == 0) - return i; - buffers[i] = vlib_get_buffer_index (vm, d); - } - return n_buffers; - } - n_buffers = vlib_buffer_alloc_from_pool (vm, buffers, n_buffers, - s->buffer_pool_index); - - for (i = 0; i < n_buffers; i++) - { - vlib_buffer_t *d = vlib_get_buffer (vm, buffers[i]); - d->current_data = s->current_data; - d->current_length = head_end_offset; - d->trace_handle = s->trace_handle; - - d->total_length_not_including_first_buffer = s->current_length - - head_end_offset; - if (PREDICT_FALSE (s->flags & VLIB_BUFFER_NEXT_PRESENT)) - { - d->total_length_not_including_first_buffer += - s->total_length_not_including_first_buffer; - } - d->flags = s->flags | VLIB_BUFFER_NEXT_PRESENT; - d->flags &= ~VLIB_BUFFER_EXT_HDR_VALID; - d->trace_handle = s->trace_handle; - clib_memcpy_fast (d->opaque, s->opaque, sizeof (s->opaque)); - clib_memcpy_fast (d->opaque2, s->opaque2, sizeof (s->opaque2)); - clib_memcpy_fast (vlib_buffer_get_current (d), - vlib_buffer_get_current (s), head_end_offset); - d->next_buffer = src_buffer; - } - vlib_buffer_advance (s, head_end_offset); - s->ref_count = n_buffers; - while (s->flags & VLIB_BUFFER_NEXT_PRESENT) - { - s = vlib_get_buffer (vm, s->next_buffer); - s->ref_count = n_buffers; - } - - return n_buffers; -} - -/** - * @brief Create multiple clones of buffer and store them - * in the supplied array. Unlike the function in the vlib library, - * we allow src_buffer to have ref_count != 0. - * - * @param vm - (vlib_main_t *) vlib main data structure pointer - * @param src_buffer - (u32) source buffer index - * @param buffers - (u32 * ) buffer index array - * @param n_buffers - (u16) number of buffer clones requested (<=256) - * @param head_end_offset - (u16) offset relative to current position - * where packet head ends - * @return - (u16) number of buffers actually cloned, may be - * less than the number requested or zero - */ -always_inline u16 -vlib_buffer_clone2 (vlib_main_t * vm, u32 src_buffer, u32 * buffers, - u16 n_buffers, u16 head_end_offset) -{ - vlib_buffer_t *s = vlib_get_buffer (vm, src_buffer); - - /* - * total_length_not_including_first_buffer is not initialized to 0 - * when a buffer is used. - */ - if (PREDICT_TRUE (s->next_buffer == 0)) - s->total_length_not_including_first_buffer = 0; - - u16 n_cloned = 0; - u8 n_clone_src = 255 - s->ref_count; - - /* - * We need to copy src for all the clones that cannot be chained in - * the src_buffer - */ - /* MAX(ref_count) = 256 */ - if (n_buffers > n_clone_src) - { - vlib_buffer_t *copy; - /* Ok to call the original vlib_buffer_copy. */ - copy = vlib_buffer_copy (vm, s); - n_cloned += vlib_buffer_clone (vm, - vlib_get_buffer_index (vm, copy), - buffers, - n_buffers - n_clone_src, - head_end_offset); - n_buffers -= n_cloned; - } - /* - * vlib_buffer_clone_256 check if ref_count is 0. We force it to be - * 0 before calling the function and we retore it to the right value - * after the function has been called - */ - u8 tmp_ref_count = s->ref_count; - - s->ref_count = 1; - /* - * The regular vlib_buffer_clone_256 does copy if we need to clone - * only one packet. While this is not a problem per se, it adds - * complexity to the code, especially because we need to add 1 to - * ref_count when the packet is cloned. - */ - n_cloned += vlib_buffer_clone_256_2 (vm, - src_buffer, - (buffers + n_cloned), - n_buffers, head_end_offset); - - s->ref_count += (tmp_ref_count - 1); - - return n_cloned; -} - -#endif /* //__HICN_DATA_FWD_H__ */ - -/* - * fd.io coding-style-patch-verification: ON - * - * Local Variables: eval: (c-set-style "gnu") End: - */ |