Mercurial > hg > waaad
changeset 303:b2902fc18fef
Update bufferize function for unknown / unparsed AVPs
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Thu, 08 Jan 2009 14:14:27 +0900 |
parents | a660025a3243 |
children | a9eb3f7fc273 |
files | waaad/message.c |
diffstat | 1 files changed, 61 insertions(+), 41 deletions(-) [+] |
line wrap: on
line diff
--- a/waaad/message.c Thu Jan 08 13:55:12 2009 +0900 +++ b/waaad/message.c Thu Jan 08 14:14:27 2009 +0900 @@ -741,13 +741,14 @@ static int _msg_buf_avp(unsigned char * buffer, size_t buflen, size_t * offset, _msg_avp_t * avp) { dict_avp_data_t dictdata; + size_t offsetini; TRACE_ENTRY("%p %d %p %p", buffer, buflen, offset, avp); if ((buflen - *offset) < avp->avp_public.avp_len) return ENOSPC; - CHECK_FCT( dict_getval(avp->avp_model, &dictdata) ); + offsetini = *offset; /* Write the header */ PUT_in_buf_32(avp->avp_public.avp_code, buffer + *offset); @@ -757,54 +758,73 @@ buffer[*offset] = avp->avp_public.avp_flags; *offset += 4; - if (avp->avp_public.avp_flags & AVP_FLAG_VENDOR) { PUT_in_buf_32(avp->avp_public.avp_vendor, buffer + *offset); *offset += 4; } /* Then we must write the AVP value */ - switch (dictdata.avp_basetype) { - case AVP_TYPE_GROUPED: - return _msg_buf_chain(buffer, buflen, offset, &_C(avp)->children); - - case AVP_TYPE_OCTETSTRING: - memcpy(&buffer[*offset], avp->avp_public.avp_data->os.data, avp->avp_public.avp_data->os.len); - *offset += PAD4(avp->avp_public.avp_data->os.len); - break; + + if (avp->avp_model == NULL) { + /* In the case where we don't know the type of AVP, just copy the raw data or source */ + CHECK_PARAMS( avp->avp_source || avp->avp_rawdata ); - case AVP_TYPE_INTEGER32: - PUT_in_buf_32(avp->avp_public.avp_data->i32, buffer + *offset); - *offset += 4; - break; - - case AVP_TYPE_INTEGER64: - PUT_in_buf_64(avp->avp_public.avp_data->i64, buffer + *offset); - *offset += 8; - break; + if ( avp->avp_source != NULL ) { + /* the message was not parsed completely */ + memcpy(&buffer[*offset], avp->avp_source, avp->avp_public.avp_len + offsetini - *offset); + *offset = PAD4(avp->avp_public.avp_len + offsetini); + } else { + /* the content is stored in rawdata */ + memcpy(&buffer[*offset], avp->avp_rawdata, avp->avp_rawlen); + *offset += PAD4(avp->avp_rawlen); + } - case AVP_TYPE_UNSIGNED32: - PUT_in_buf_32(avp->avp_public.avp_data->u32, buffer + *offset); - *offset += 4; - break; - - case AVP_TYPE_UNSIGNED64: - PUT_in_buf_64(avp->avp_public.avp_data->u64, buffer + *offset); - *offset += 8; - break; - - case AVP_TYPE_FLOAT32: - PUT_in_buf_32(avp->avp_public.avp_data->u32, buffer + *offset); - *offset += 4; - break; - - case AVP_TYPE_FLOAT64: - PUT_in_buf_64(avp->avp_public.avp_data->u64, buffer + *offset); - *offset += 8; - break; - - default: - ASSERT(0); + } else { + /* The AVP is defined in the dictionary */ + CHECK_FCT( dict_getval(avp->avp_model, &dictdata) ); + + switch (dictdata.avp_basetype) { + case AVP_TYPE_GROUPED: + return _msg_buf_chain(buffer, buflen, offset, &_C(avp)->children); + + case AVP_TYPE_OCTETSTRING: + memcpy(&buffer[*offset], avp->avp_public.avp_data->os.data, avp->avp_public.avp_data->os.len); + *offset += PAD4(avp->avp_public.avp_data->os.len); + break; + + case AVP_TYPE_INTEGER32: + PUT_in_buf_32(avp->avp_public.avp_data->i32, buffer + *offset); + *offset += 4; + break; + + case AVP_TYPE_INTEGER64: + PUT_in_buf_64(avp->avp_public.avp_data->i64, buffer + *offset); + *offset += 8; + break; + + case AVP_TYPE_UNSIGNED32: + PUT_in_buf_32(avp->avp_public.avp_data->u32, buffer + *offset); + *offset += 4; + break; + + case AVP_TYPE_UNSIGNED64: + PUT_in_buf_64(avp->avp_public.avp_data->u64, buffer + *offset); + *offset += 8; + break; + + case AVP_TYPE_FLOAT32: + PUT_in_buf_32(avp->avp_public.avp_data->u32, buffer + *offset); + *offset += 4; + break; + + case AVP_TYPE_FLOAT64: + PUT_in_buf_64(avp->avp_public.avp_data->u64, buffer + *offset); + *offset += 8; + break; + + default: + ASSERT(0); + } } return 0; }