
The VPP API auto-generated endian conversion functions are intended to be symmetrical. They are used both by the API client and the API server. Called on send to convert from host endian to network endian and on receive to convert back. For variable length arrays, we have to iterate over the array and call a more specific handler for the array type. Unfortunately the length of the array is part of the api definition, and if it's endian swapped prior to the for loop, unexpected behaviour will ensue. There was an earlier fix, for some specific messages, but unfortunately that only fixed the problem from the VPP (server) side. This adds a new parameters to the endian handler, so the boundary argument to the loop can be treated differently depending on if this message is to the network or from the network. Type: fix Change-Id: I43011aed384e3b847579a1dd2c390867ae17a9ad Signed-off-by: Ole Troan <otroan@employees.org>
37 lines
1.1 KiB
C
37 lines
1.1 KiB
C
/*
|
|
* Copyright (c) 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 included_vat2_helpers_h
|
|
#define included_vat2_helpers_h
|
|
|
|
#include <vlibmemory/vlib.api_types.h>
|
|
|
|
/* For control ping */
|
|
#define vl_endianfun
|
|
#include <vlibmemory/memclnt.api.h>
|
|
#undef vl_endianfun
|
|
|
|
static inline void
|
|
vat2_control_ping (u32 context)
|
|
{
|
|
vl_api_control_ping_t mp = {0};
|
|
mp._vl_msg_id = vac_get_msg_index(VL_API_CONTROL_PING_CRC);
|
|
mp.context = context;
|
|
vl_api_control_ping_t_endian (&mp, 1 /* to network */);
|
|
vac_write((char *)&mp, sizeof(mp));
|
|
}
|
|
|
|
#endif
|