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;
 }
"Welcome to our mercurial repository"