/*
* Copyright (c) 2015 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.
*/
/*
* buffer_node.h: VLIB buffer handling node helper macros/inlines
*
* Copyright (c) 2008 Eliot Dresselhaus
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef included_vlib_buffer_node_h
#define included_vlib_buffer_node_h
/** \file
vlib buffer/node functions
*/
/** \brief Finish enqueueing two buffers forward in the graph.
Standard dual loop boilerplate element. This is a MACRO,
with MULTIPLE SIDE EFFECTS. In the ideal case,
next_index == next0 == next1
,
which means that the speculative enqueue at the top of the dual loop
has correctly dealt with both packets. In that case, the macro does
nothing at all.
@param vm vlib_main_t pointer, varies by thread
@param node current node vlib_node_runtime_t pointer
@param next_index speculated next index used for both packets
@param to_next speculated vector pointer used for both packets
@param n_left_to_next number of slots left in speculated vector
@param bi0 first buffer index
@param bi1 second buffer index
@param next0 actual next index to be used for the first packet
@param next1 actual next index to be used for the second packet
@return @c next_index -- speculative next index to be used for future packets
@return @c to_next -- speculative frame to be used for future packets
@return @c n_left_to_next -- number of slots left in speculative frame
*/
#define vlib_validate_buffer_enqueue_x2(vm,node,next_index,to_next,n_left_to_next,bi0,bi1,next0,next1) \
do { \
int enqueue_code = (next0 != next_index) + 2*(next1 != next_index); \
\
if (PREDICT_FALSE (enqueue_code != 0)) \
{ \
switch (enqueue_code) \
{ \
case 1: \
/* A B A */ \
to_next[-2] = bi1; \
to_next -= 1; \
n_left_to_next += 1; \
vlib_set_next_frame_buffer (vm, node, next0, bi0); \
break; \
\
case 2: \
/* A A B */ \
to_next -= 1; \
n_left_to_next += 1; \
vlib_set_next_frame_buffer (vm, node, next1, bi1); \
break; \
\
case 3: \
/* A B B or A B C */ \
to_next -= 2; \
n_left_to_next += 2; \
vlib_set_next_frame_buffer (vm, node, next0, bi0); \
vlib_set_next_frame_buffer (vm, node, next1, bi1); \
if (next0 == next1) \
{ \
vlib_put_next_frame (vm, node, next_index, \
n_left_to_next); \
next_index = next1; \
vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next); \
} \
} \
} \
} while (0)
/** \brief Finish enqueueing four buffers forward in the graph.
Standard quad loop boilerplate element. This is a MACRO,
with MULTIPLE SIDE EFFECTS. In the ideal case,
next_index == next0 == next1 == next2 == next3
,
which means that the speculative enqueue at the top of the quad loop
has correctly dealt with all four packets. In that case, the macro does
nothing at all.
@param vm vlib_main_t pointer, varies by thread
@param node current node vlib_node_runtime_t pointer
@param next_index speculated next index used for both packets
@param to_next speculated vector pointer used for both packets
@param n_left_to_next number of slots left in speculated vector
@param bi0 first buffer index
@param bi1 second buffer index
@param bi2 third buffer index
@param bi3 fourth buffer index
@param next0 actual next index to be used for the first packet
@param next1 actual nex
# Copyright (c) 2015 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.
# To specify directories to find sources, build/packages/*.mk
# and build/platforms.mk
# SOURCE_PATH = PATH1 PATH2 ...