aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStanislav Zaikin <zstaseg@gmail.com>2022-07-21 19:06:26 +0200
committerStanislav Zaikin <zstaseg@gmail.com>2023-01-23 21:01:06 +0100
commit139b2da5c533a84faca0ae1bf5b37c3185d9d4fb (patch)
tree872b69e16be5cd683aea0555fe157a8024644102
parent3b5ab65bd3a821dd82acfc34069293ff39dc1ef7 (diff)
vppapigen: enable codegen for stream message types
Enable codegen for C type from 'rpc A returns B stream C' notation Type: improvement Change-Id: I05cfce71c385d414d7b177a080009628bc8c8fad Signed-off-by: Stanislav Zaikin <zstaseg@gmail.com>
-rw-r--r--src/plugins/linux-cp/lcp.api4
-rw-r--r--src/plugins/linux-cp/lcp_api.c10
-rwxr-xr-x[-rw-r--r--]src/tools/vppapigen/vppapigen_c.py30
-rw-r--r--src/vnet/interface_api.c32
4 files changed, 51 insertions, 25 deletions
diff --git a/src/plugins/linux-cp/lcp.api b/src/plugins/linux-cp/lcp.api
index 1e9db3d02f4..ca36fe50eb9 100644
--- a/src/plugins/linux-cp/lcp.api
+++ b/src/plugins/linux-cp/lcp.api
@@ -105,13 +105,13 @@ define lcp_itf_pair_add_del_v2_reply
@param context - sender context, to match reply w/ request
@param sw_if_index - interface to use as filter (~0 == "all")
*/
-define lcp_itf_pair_get
+autoendian define lcp_itf_pair_get
{
u32 client_index;
u32 context;
u32 cursor;
};
-define lcp_itf_pair_get_reply
+autoendian define lcp_itf_pair_get_reply
{
u32 context;
i32 retval;
diff --git a/src/plugins/linux-cp/lcp_api.c b/src/plugins/linux-cp/lcp_api.c
index e7edf559958..638d9f796d1 100644
--- a/src/plugins/linux-cp/lcp_api.c
+++ b/src/plugins/linux-cp/lcp_api.c
@@ -133,11 +133,11 @@ send_lcp_itf_pair_details (index_t lipi, vl_api_registration_t *rp,
vl_api_lcp_itf_pair_details_t *rmp;
lcp_itf_pair_t *lcp_pair = lcp_itf_pair_get (lipi);
- REPLY_MACRO_DETAILS4 (
+ REPLY_MACRO_DETAILS4_END (
VL_API_LCP_ITF_PAIR_DETAILS, rp, context, ({
- rmp->phy_sw_if_index = ntohl (lcp_pair->lip_phy_sw_if_index);
- rmp->host_sw_if_index = ntohl (lcp_pair->lip_host_sw_if_index);
- rmp->vif_index = ntohl (lcp_pair->lip_vif_index);
+ rmp->phy_sw_if_index = lcp_pair->lip_phy_sw_if_index;
+ rmp->host_sw_if_index = lcp_pair->lip_host_sw_if_index;
+ rmp->vif_index = lcp_pair->lip_vif_index;
rmp->host_if_type = api_encode_host_type (lcp_pair->lip_host_type);
memcpy_s (rmp->host_if_name, sizeof (rmp->host_if_name),
@@ -156,7 +156,7 @@ vl_api_lcp_itf_pair_get_t_handler (vl_api_lcp_itf_pair_get_t *mp)
vl_api_lcp_itf_pair_get_reply_t *rmp;
i32 rv = 0;
- REPLY_AND_DETAILS_MACRO (
+ REPLY_AND_DETAILS_MACRO_END (
VL_API_LCP_ITF_PAIR_GET_REPLY, lcp_itf_pair_pool,
({ send_lcp_itf_pair_details (cursor, rp, mp->context); }));
}
diff --git a/src/tools/vppapigen/vppapigen_c.py b/src/tools/vppapigen/vppapigen_c.py
index 5ca2ed51ff6..26a348f3910 100644..100755
--- a/src/tools/vppapigen/vppapigen_c.py
+++ b/src/tools/vppapigen/vppapigen_c.py
@@ -1250,6 +1250,11 @@ static inline void vl_api_{name}_t_endian (vl_api_{name}_t *a)
output += signature.format(name=t.name)
+ # make Array type appear before the others:
+ # some arrays have dynamic length, and we want to iterate over
+ # them before changing endiann for the length field
+ t.block.sort(key=lambda x: x.type)
+
for o in t.block:
output += endianfun_obj(o)
output += "}\n\n"
@@ -1576,6 +1581,31 @@ def generate_c_boilerplate(services, defines, counters, file_crc, module, stream
except KeyError:
pass
+ try:
+ if s.stream:
+ d = define_hash[s.stream_message]
+ write(
+ " c = (vl_msg_api_msg_config_t) "
+ "{{.id = VL_API_{ID} + msg_id_base,\n"
+ ' .name = "{n}",\n'
+ " .handler = 0,\n"
+ " .endian = vl_api_{n}_t_endian,\n"
+ " .format_fn = vl_api_{n}_t_format,\n"
+ " .traced = 1,\n"
+ " .replay = 1,\n"
+ " .tojson = vl_api_{n}_t_tojson,\n"
+ " .fromjson = vl_api_{n}_t_fromjson,\n"
+ " .calc_size = vl_api_{n}_t_calc_size,\n"
+ " .is_autoendian = {auto}}};\n".format(
+ n=s.stream_message,
+ ID=s.stream_message.upper(),
+ auto=d.autoendian,
+ )
+ )
+ write(" vl_msg_api_config (&c);\n")
+ except KeyError:
+ pass
+
write(" return msg_id_base;\n")
write("}\n")
diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c
index 5766f2ca21f..288af78b2be 100644
--- a/src/vnet/interface_api.c
+++ b/src/vnet/interface_api.c
@@ -1228,24 +1228,20 @@ send_interface_tx_placement_details (vnet_hw_if_tx_queue_t **all_queues,
n_bits = clib_bitmap_count_set_bits (bitmap);
u32 n = n_bits * sizeof (u32);
- /*
- * FIXME: Use the REPLY_MACRO_DETAILS5_END once endian handler is registered
- * and available.
- */
- REPLY_MACRO_DETAILS5 (
- VL_API_SW_INTERFACE_TX_PLACEMENT_DETAILS, n, rp, context, ({
- rmp->sw_if_index = clib_host_to_net_u32 (hw_if->sw_if_index);
- rmp->queue_id = clib_host_to_net_u32 (q[0]->queue_id);
- rmp->shared = q[0]->shared_queue;
- rmp->array_size = clib_host_to_net_u32 (n_bits);
-
- v = clib_bitmap_first_set (bitmap);
- for (u32 i = 0; i < n_bits; i++)
- {
- rmp->threads[i] = clib_host_to_net_u32 (v);
- v = clib_bitmap_next_set (bitmap, v + 1);
- }
- }));
+ REPLY_MACRO_DETAILS5_END (VL_API_SW_INTERFACE_TX_PLACEMENT_DETAILS, n, rp,
+ context, ({
+ rmp->sw_if_index = hw_if->sw_if_index;
+ rmp->queue_id = q[0]->queue_id;
+ rmp->shared = q[0]->shared_queue;
+ rmp->array_size = n_bits;
+
+ v = clib_bitmap_first_set (bitmap);
+ for (u32 i = 0; i < n_bits; i++)
+ {
+ rmp->threads[i] = v;
+ v = clib_bitmap_next_set (bitmap, v + 1);
+ }
+ }));
}
static void