osaf/libs/core/common/saf_edu.c | 33 +-------- osaf/libs/core/include/ncsencdec_pub.h | 2 + osaf/libs/core/leap/hj_enc.c | 100 ++++++++++++++++++++++++++++++-- 3 files changed, 100 insertions(+), 35 deletions(-)
Currently, ncs_edp_sanamet encodes a SaNameT by storing the length in 2 bytes, followed by a fixed char array of length SA_MAX_NAME_LENGTH. This patch adds long DN support by: 1) if length < SA_MAX_NAME_LENGTH, encode as present 2) if length >= SA_MAX_NAME_LENGTH, encode as a variable string like ncs_edp_string diff --git a/osaf/libs/core/common/saf_edu.c b/osaf/libs/core/common/saf_edu.c --- a/osaf/libs/core/common/saf_edu.c +++ b/osaf/libs/core/common/saf_edu.c @@ -57,36 +57,15 @@ uint32_t ncs_edp_sanamet(EDU_HDL *hdl, EDU_TKN *edu_tkn, NCSCONTEXT ptr, uint32_t *ptr_data_len, EDU_BUF_ENV *buf_env, EDP_OP_TYPE op, EDU_ERR *o_err) { - uint32_t rc = NCSCC_RC_SUCCESS; - SaNameT *struct_ptr = NULL, **d_ptr = NULL; - - EDU_INST_SET saname_rules[] = { - {EDU_START, ncs_edp_sanamet, 0, 0, 0, sizeof(SaNameT), 0, NULL}, - {EDU_EXEC, m_NCS_EDP_SAUINT16T, 0, 0, 0, - (long)&((SaNameT *)0)->length, 0, NULL}, - {EDU_EXEC, ncs_edp_uns8, EDQ_ARRAY, 0, 0, - (long)&((SaNameT *)0)->value, SA_MAX_NAME_LENGTH, NULL}, - {EDU_END, 0, 0, 0, 0, 0, 0, NULL}, - }; - if (op == EDP_OP_TYPE_ENC) { - struct_ptr = (SaNameT *)ptr; + const SaNameT *name = ptr; + osaf_encode_sanamet(buf_env->info.uba, name); } else if (op == EDP_OP_TYPE_DEC) { - d_ptr = (SaNameT **)ptr; - if (*d_ptr == NULL) { - *d_ptr = m_MMGR_ALLOC_EDP_SANAMET; - if (*d_ptr == NULL) { - *o_err = EDU_ERR_MEM_FAIL; - return NCSCC_RC_FAILURE; - } - } - memset(*d_ptr, '\0', sizeof(SaNameT)); - struct_ptr = *d_ptr; - } else { - struct_ptr = ptr; + SaNameT *name = *(SaNameT**)ptr; + osaf_decode_sanamet(buf_env->info.uba, name); } - rc = m_NCS_EDU_RUN_RULES(hdl, edu_tkn, saname_rules, struct_ptr, ptr_data_len, buf_env, op, o_err); - return rc; + + return NCSCC_RC_SUCCESS; } /***************************************************************************** diff --git a/osaf/libs/core/include/ncsencdec_pub.h b/osaf/libs/core/include/ncsencdec_pub.h --- a/osaf/libs/core/include/ncsencdec_pub.h +++ b/osaf/libs/core/include/ncsencdec_pub.h @@ -153,6 +153,8 @@ void osaf_encode_uint64(NCS_UBAID *ub, u void osaf_decode_uint64(NCS_UBAID *ub, uint64_t *to); void osaf_encode_sanamet(NCS_UBAID *ub, const SaNameT *name); void osaf_decode_sanamet(NCS_UBAID *ub, SaNameT *name); +void osaf_encode_sanamet_o2(NCS_UBAID *ub, SaConstStringT name); +void osaf_encode_saconststring(NCS_UBAID *ub, SaConstStringT str); void osaf_encode_satimet(NCS_UBAID *ub, SaTimeT time); void osaf_decode_satimet(NCS_UBAID *ub, SaTimeT *time); void osaf_encode_bool(NCS_UBAID *ub, bool value); diff --git a/osaf/libs/core/leap/hj_enc.c b/osaf/libs/core/leap/hj_enc.c --- a/osaf/libs/core/leap/hj_enc.c +++ b/osaf/libs/core/leap/hj_enc.c @@ -42,6 +42,9 @@ ******************************************************************************* */ +#ifndef SA_EXTENDED_NAME_SOURCE +#define SA_EXTENDED_NAME_SOURCE +#endif #include <ncsgl_defs.h> #include "ncs_osprm.h" @@ -49,6 +52,7 @@ #include "ncssysf_def.h" #include "ncssysf_mem.h" #include "ncs_svd.h" +#include "osaf_extended_name.h" /** A NULL os implies "count" number of zeros... **/ @@ -374,18 +378,49 @@ void osaf_decode_uint64(NCS_UBAID *ub, u void osaf_encode_sanamet(NCS_UBAID *ub, const SaNameT *name) { - int i; - osaf_encode_uint16(ub, name->length); - for (i = 0; i < SA_MAX_NAME_LENGTH; i++) - osaf_encode_uint8(ub, name->value[i]); + TRACE_ENTER(); + + SaConstStringT str = osaf_extended_name_borrow(name); + TRACE("str %s (%zu)", str, osaf_extended_name_length(name)); + osaf_encode_sanamet_o2(ub, str); + + TRACE_LEAVE(); } void osaf_decode_sanamet(NCS_UBAID *ub, SaNameT *name) { - int i; - osaf_decode_uint16(ub, &name->length); - for (i = 0; i < SA_MAX_NAME_LENGTH; i++) - osaf_decode_uint8(ub, &name->value[i]); + TRACE_ENTER(); + + SaStringT str; + uint16_t len; + + // get the length of the SaNameT + osaf_decode_uint16(ub, &len); + osafassert(len < 65535); + + if (len < SA_MAX_UNEXTENDED_NAME_LENGTH) { + // string is encoded as a fixed 256 char array + str = (SaStringT)malloc(SA_MAX_UNEXTENDED_NAME_LENGTH * sizeof(char)); + osafassert(str != NULL); + + uint8_t *p8 = decode_flatten_space(ub, (uint8_t*)str, SA_MAX_UNEXTENDED_NAME_LENGTH); + memcpy(str, p8, SA_MAX_UNEXTENDED_NAME_LENGTH * sizeof(char)); + ncs_dec_skip_space(ub, SA_MAX_UNEXTENDED_NAME_LENGTH); + } else { + str = (SaStringT)malloc((len + 1) * sizeof(char)); + osafassert(str != NULL); + + uint8_t *p8 = decode_flatten_space(ub, (uint8_t*)str, len); + memcpy(str, p8, len * sizeof(char)); + ncs_dec_skip_space(ub, len); + + str[len] = '\0'; + } + TRACE("str: %s (%u)", str, len); + osaf_extended_name_alloc(str, name); + free(str); + + TRACE_LEAVE(); } void osaf_encode_saclmnodeaddresst(NCS_UBAID *ub, const SaClmNodeAddressT *addr) @@ -408,6 +443,55 @@ void osaf_decode_saclmnodeaddresst(NCS_U } } +void osaf_encode_sanamet_o2(NCS_UBAID *ub, SaConstStringT name) +{ + TRACE_ENTER(); + + int i; + const size_t len = strlen(name); + + if (len < SA_MAX_UNEXTENDED_NAME_LENGTH) { + // encode a fixed 256 char string, to ensure + // we are backwards compatible + osaf_encode_uint16(ub, len); + + for (i = 0; i < len; i++) { + osaf_encode_uint8(ub, name[i]); + } + + // need to encode SA_MAX_UNEXTENDED_NAME_LENGTH characters to remain + // compatible with legacy osaf_decode_sanamet() [without long DN support] + for (i = len; i < SA_MAX_UNEXTENDED_NAME_LENGTH; i++) { + osaf_encode_uint8(ub, 0); + } + } else { + // encode as a variable string + osaf_encode_saconststring(ub, name); + } + + TRACE_LEAVE(); +} + +void osaf_encode_saconststring(NCS_UBAID *ub, SaConstStringT str) +{ + size_t len = strlen(str); + + TRACE_ENTER2("%s (%zu)", str, len); + + // len is encoded in 16 bits, max length is 2^16 + // this is done to remain compatible with ncs_edp_string + osafassert(len < 65535); + osaf_encode_uint16(ub, len); + + // encode 'str' + uint8_t *p8 = encode_reserve_space(ub, len); + osafassert(p8); + memcpy(p8, str, len * sizeof(char)); + ncs_enc_claim_space(ub, len); + + TRACE_LEAVE(); +} + void osaf_encode_satimet(NCS_UBAID *ub, SaTimeT time) { osaf_encode_uint64(ub, time); ------------------------------------------------------------------------------ Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San Francisco, CA to explore cutting-edge tech and listen to tech luminaries present their vision of the future. This family event has something for everyone, including kids. Get more information and register today. http://sdm.link/attshape _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel