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/map/map.c | 21 +++++++++------------ src/plugins/map/map.h | 4 ++-- src/plugins/map/map_api.c | 16 +++++++--------- 3 files changed, 18 insertions(+), 23 deletions(-) (limited to 'src/plugins/map') 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); })); -- cgit 1.2.3-korg