From 283cd2e9afcab1407d5614d79da4354790fa059a Mon Sep 17 00:00:00 2001 From: Ole Troan Date: Wed, 12 Jun 2019 14:28:14 +0200 Subject: api: string type to convert to vector Previous use of strndup() required user to remember to call free(). Now return a vector pointing directly to the API message string. Of course user must remember to copy the string out if lifetime is longer than API message lifetime. Change-Id: Ib5e2b3d52d258e1a42ea9ea9a9e04abbe360e2bf Type: fix Signed-off-by: Ole Troan --- src/plugins/http_static/http_static.c | 16 ++++---- src/plugins/http_static/http_static_test.c | 1 + src/plugins/map/map.c | 21 +++++------ src/plugins/map/map.h | 4 +- src/plugins/map/map_api.c | 16 ++++---- src/plugins/nat/nat_api.c | 1 + src/vat/api_format.c | 28 +++++++------- src/vlibapi/api_types.h | 27 -------------- src/vlibapi/api_types_inlines.h | 59 ++++++++++++++++++++++++++++++ src/vnet/ip/punt_api.c | 1 + src/vpp/api/api.c | 1 + src/vpp/api/custom_dump.c | 1 + 12 files changed, 105 insertions(+), 71 deletions(-) create mode 100644 src/vlibapi/api_types_inlines.h diff --git a/src/plugins/http_static/http_static.c b/src/plugins/http_static/http_static.c index 41601f96321..d380665f1e2 100644 --- a/src/plugins/http_static/http_static.c +++ b/src/plugins/http_static/http_static.c @@ -22,6 +22,7 @@ #include #include #include +#include /* define message IDs */ #include @@ -66,16 +67,13 @@ static void vl_api_http_static_enable_t_handler vl_api_http_static_enable_reply_t *rmp; http_static_main_t *hmp = &http_static_main; int rv; - u8 *www_root; - u8 *uri; + u8 *www_root = 0; + u8 *uri = 0; char *p = (char *) &mp->www_root; - www_root = - format (0, "%s%c", vl_api_from_api_string_c ((vl_api_string_t *) p), 0), - p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t); - uri = - format (0, "%s%c", vl_api_from_api_string_c ((vl_api_string_t *) p), 0); - + www_root = vl_api_from_api_to_vec ((vl_api_string_t *) p); + p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t); + uri = vl_api_from_api_to_vec ((vl_api_string_t *) p); rv = http_static_server_enable_api (ntohl (mp->fifo_size), @@ -83,6 +81,8 @@ static void vl_api_http_static_enable_t_handler ntohl (mp->prealloc_fifos), ntohl (mp->private_segment_size), www_root, uri); + vec_free (www_root); + vec_free (uri); REPLY_MACRO (VL_API_HTTP_STATIC_ENABLE_REPLY); } diff --git a/src/plugins/http_static/http_static_test.c b/src/plugins/http_static/http_static_test.c index 0720463cf63..ec715725148 100644 --- a/src/plugins/http_static/http_static_test.c +++ b/src/plugins/http_static/http_static_test.c @@ -18,6 +18,7 @@ #include #include #include +#include uword unformat_sw_if_index (unformat_input_t * input, va_list * args); diff --git a/src/plugins/map/map.c b/src/plugins/map/map.c index c2e821aa2e0..9d89382ad17 100644 --- a/src/plugins/map/map.c +++ b/src/plugins/map/map.c @@ -60,15 +60,14 @@ map_main_t map_main; /* - * Save usre-assigned MAP domain names ("tags") in a vector of + * Save user-assigned MAP domain names ("tags") in a vector of * extra domain information. */ static void -map_save_extras (u32 map_domain_index, char *tag) +map_save_extras (u32 map_domain_index, u8 * tag) { map_main_t *mm = &map_main; map_domain_extra_t *de; - u32 len; if (map_domain_index == ~0) return; @@ -80,9 +79,7 @@ map_save_extras (u32 map_domain_index, char *tag) if (!tag) return; - len = strlen (tag) + 1; - de->tag = clib_mem_alloc (len); - clib_memcpy (de->tag, tag, len); + de->tag = vec_dup (tag); } @@ -91,7 +88,7 @@ map_free_extras (u32 map_domain_index) { map_main_t *mm = &map_main; map_domain_extra_t *de; - char *tag; + u8 *tag; if (map_domain_index == ~0) return; @@ -101,7 +98,7 @@ map_free_extras (u32 map_domain_index) if (!tag) return; - clib_mem_free (tag); + vec_free (tag); de->tag = 0; } @@ -116,7 +113,7 @@ map_create_domain (ip4_address_t * ip4_prefix, u8 ea_bits_len, u8 psid_offset, u8 psid_length, - u32 * map_domain_index, u16 mtu, u8 flags, char *tag) + u32 * map_domain_index, u16 mtu, u8 flags, u8 * tag) { u8 suffix_len, suffix_shift; map_main_t *mm = &map_main; @@ -566,7 +563,7 @@ map_add_domain_command_fn (vlib_main_t * vm, num_m_args++; else if (unformat (line_input, "mtu %d", &mtu)) num_m_args++; - else if (unformat (line_input, "tag %s", &tag)) + else if (unformat (line_input, "tag %v", &tag)) ; else { @@ -585,7 +582,7 @@ map_add_domain_command_fn (vlib_main_t * vm, map_create_domain (&ip4_prefix, ip4_prefix_len, &ip6_prefix, ip6_prefix_len, &ip6_src, ip6_src_len, ea_bits_len, psid_offset, psid_length, &map_domain_index, - mtu, flags, (char *) tag); + mtu, flags, tag); done: unformat_free (line_input); @@ -938,7 +935,7 @@ format_map_domain (u8 * s, va_list * args) de = vec_elt_at_index (mm->domain_extras, map_domain_index); s = format (s, - "[%d] tag {%s} ip4-pfx %U/%d ip6-pfx %U/%d ip6-src %U/%d " + "[%d] tag {%v} ip4-pfx %U/%d ip6-pfx %U/%d ip6-src %U/%d " "ea-bits-len %d psid-offset %d psid-len %d mtu %d %s", map_domain_index, de->tag, format_ip4_address, &d->ip4_prefix, d->ip4_prefix_len, diff --git a/src/plugins/map/map.h b/src/plugins/map/map.h index a692b641768..abafb4e21fe 100644 --- a/src/plugins/map/map.h +++ b/src/plugins/map/map.h @@ -36,7 +36,7 @@ int map_create_domain (ip4_address_t * ip4_prefix, u8 ip4_prefix_len, ip6_address_t * ip6_prefix, u8 ip6_prefix_len, ip6_address_t * ip6_src, u8 ip6_src_len, u8 ea_bits_len, u8 psid_offset, u8 psid_length, - u32 * map_domain_index, u16 mtu, u8 flags, char *tag); + u32 * map_domain_index, u16 mtu, u8 flags, u8 * tag); int map_delete_domain (u32 map_domain_index); int map_add_del_psid (u32 map_domain_index, u16 psid, ip6_address_t * tep, bool is_add); @@ -137,7 +137,7 @@ STATIC_ASSERT ((sizeof (map_domain_t) <= CLIB_CACHE_LINE_BYTES), */ typedef struct { - char *tag; /* Probably a user-assigned domain name. */ + u8 *tag; /* Probably a user-assigned domain name. */ } map_domain_extra_t; #define MAP_REASS_INDEX_NONE ((u16)0xffff) diff --git a/src/plugins/map/map_api.c b/src/plugins/map/map_api.c index a6b461db107..5619b24c9aa 100644 --- a/src/plugins/map/map_api.c +++ b/src/plugins/map/map_api.c @@ -22,6 +22,7 @@ #include #include #include +#include #define vl_typedefs /* define message structures */ #include @@ -53,7 +54,8 @@ vl_api_map_add_domain_t_handler (vl_api_map_add_domain_t * mp) int rv = 0; u32 index; u8 flags = 0; - + u8 *vtag = 0; + vtag = vl_api_from_api_to_vec (&mp->tag); rv = map_create_domain ((ip4_address_t *) & mp->ip4_prefix.prefix, mp->ip4_prefix.len, @@ -61,8 +63,8 @@ vl_api_map_add_domain_t_handler (vl_api_map_add_domain_t * mp) mp->ip6_prefix.len, (ip6_address_t *) & mp->ip6_src.prefix, mp->ip6_src.len, mp->ea_bits_len, mp->psid_offset, - mp->psid_length, &index, ntohs (mp->mtu), flags, - vl_api_from_api_string_c (&mp->tag)); + mp->psid_length, &index, ntohs (mp->mtu), flags, vtag); + vec_free (vtag); /* *INDENT-OFF* */ REPLY_MACRO2(VL_API_MAP_ADD_DOMAIN_REPLY, @@ -118,15 +120,11 @@ vl_api_map_domain_dump_t_handler (vl_api_map_domain_dump_t * mp) /* *INDENT-OFF* */ pool_foreach(d, mm->domains, ({ - u32 len; - map_domain_index = d - mm->domains; de = vec_elt_at_index(mm->domain_extras, map_domain_index); - len = strnlen_s(de->tag, 64); - /* Make sure every field is initiated (or don't skip the clib_memset()) */ - rmp = vl_msg_api_alloc (sizeof (*rmp) + len); + rmp = vl_msg_api_alloc (sizeof (*rmp) + vec_len(de->tag)); rmp->_vl_msg_id = htons(VL_API_MAP_DOMAIN_DETAILS + mm->msg_id_base); rmp->context = mp->context; @@ -143,7 +141,7 @@ vl_api_map_domain_dump_t_handler (vl_api_map_domain_dump_t * mp) rmp->flags = d->flags; rmp->mtu = htons(d->mtu); - vl_api_to_api_string (len, de->tag, &rmp->tag ); + vl_api_vec_to_api_string (de->tag, &rmp->tag ); vl_api_send_msg (reg, (u8 *) rmp); })); diff --git a/src/plugins/nat/nat_api.c b/src/plugins/nat/nat_api.c index 1dad4e42728..7c1445f90c8 100644 --- a/src/plugins/nat/nat_api.c +++ b/src/plugins/nat/nat_api.c @@ -32,6 +32,7 @@ #include #include #include +#include #define vl_api_nat44_lb_addr_port_t_endian vl_noop_handler #define vl_api_nat44_add_del_lb_static_mapping_t_endian vl_noop_handler diff --git a/src/vat/api_format.c b/src/vat/api_format.c index 60d66be368d..5eb44c99b5d 100644 --- a/src/vat/api_format.c +++ b/src/vat/api_format.c @@ -58,6 +58,7 @@ #include "vat/json_format.h" #include #include +#include #include #include @@ -1299,30 +1300,31 @@ static void vl_api_show_version_reply_t_handler if (retval >= 0) { - char *s; + u8 *s = 0; char *p = (char *) &mp->program; - s = vl_api_from_api_string_c ((vl_api_string_t *) p); - errmsg (" program: %s\n", s); - free (s); + s = vl_api_from_api_to_vec ((vl_api_string_t *) p); + errmsg (" program: %v\n", s); + vec_free (s); p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t); - s = vl_api_from_api_string_c ((vl_api_string_t *) p); - errmsg (" version: %s\n", s); - free (s); + s = vl_api_from_api_to_vec ((vl_api_string_t *) p); + errmsg (" version: %v\n", s); + vec_free (s); p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t); - s = vl_api_from_api_string_c ((vl_api_string_t *) p); - errmsg (" build date: %s\n", s); - free (s); + s = vl_api_from_api_to_vec ((vl_api_string_t *) p); + errmsg (" build date: %v\n", s); + vec_free (s); p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t); - s = vl_api_from_api_string_c ((vl_api_string_t *) p); - errmsg ("build directory: %s\n", s); - free (s); + s = vl_api_from_api_to_vec ((vl_api_string_t *) p); + vec_free (s); + + errmsg ("build directory: %v\n", s); } vam->retval = retval; vam->result_ready = 1; diff --git a/src/vlibapi/api_types.h b/src/vlibapi/api_types.h index 406ccfa6745..0289a417c79 100644 --- a/src/vlibapi/api_types.h +++ b/src/vlibapi/api_types.h @@ -31,31 +31,4 @@ typedef struct u8 buf[0]; } __attribute__ ((packed)) vl_api_string_t; -static inline int -vl_api_to_api_string (u32 len, const char *buf, vl_api_string_t * str) -{ - memcpy(str->buf, buf, len); - str->length = htonl (len); - return len + sizeof (u32); -} - -/* Return a pointer to the API string (not nul terminated */ -static inline u8 * -vl_api_from_api_string (vl_api_string_t * astr) -{ - return astr->buf; -} - -static inline u32 -vl_api_string_len (vl_api_string_t * astr) -{ - return ntohl (astr->length); -} - -static inline char * -vl_api_from_api_string_c (vl_api_string_t *astr) -{ - return strndup((char *)astr->buf, ntohl (astr->length)); -} - #endif diff --git a/src/vlibapi/api_types_inlines.h b/src/vlibapi/api_types_inlines.h new file mode 100644 index 00000000000..a26d91b5558 --- /dev/null +++ b/src/vlibapi/api_types_inlines.h @@ -0,0 +1,59 @@ +/* + *------------------------------------------------------------------ + * api_types.h + * + * Copyright (c) 2018 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. + *------------------------------------------------------------------ + */ + +static inline int +vl_api_to_api_string (u32 len, const char *buf, vl_api_string_t * str) +{ + clib_memcpy_fast(str->buf, buf, len); + str->length = htonl (len); + return len + sizeof (u32); +} + +static inline int +vl_api_vec_to_api_string (const u8 *vec, vl_api_string_t * str) +{ + u32 len = vec_len(vec); + clib_memcpy(str->buf, vec, len); + str->length = htonl (len); + return len + sizeof (u32); +} + +/* Return a pointer to the API string (not nul terminated */ +static inline u8 * +vl_api_from_api_string (vl_api_string_t * astr) +{ + return astr->buf; +} + +static inline u32 +vl_api_string_len (vl_api_string_t * astr) +{ + return ntohl (astr->length); +} + +/* + * Returns a new vector. Remember to free it after use. + */ +static inline u8 * +vl_api_from_api_to_vec (vl_api_string_t *astr) +{ + u8 *v = 0; + vec_add(v, astr->buf, ntohl(astr->length)); + return v; +} diff --git a/src/vnet/ip/punt_api.c b/src/vnet/ip/punt_api.c index b356886a56f..946a0010a0c 100644 --- a/src/vnet/ip/punt_api.c +++ b/src/vnet/ip/punt_api.c @@ -21,6 +21,7 @@ #include #include #include +#include #include diff --git a/src/vpp/api/api.c b/src/vpp/api/api.c index 80449c64adc..b6e7c848764 100644 --- a/src/vpp/api/api.c +++ b/src/vpp/api/api.c @@ -60,6 +60,7 @@ #include #include +#include #define vl_typedefs /* define message structures */ #include diff --git a/src/vpp/api/custom_dump.c b/src/vpp/api/custom_dump.c index 2c2c7ab06fc..4d764d40d16 100644 --- a/src/vpp/api/custom_dump.c +++ b/src/vpp/api/custom_dump.c @@ -49,6 +49,7 @@ #include #include +#include #include -- cgit 1.2.3-korg