Esempio n. 1
0
uint8_t *msg_serialize_stat_msg(adm_stat_msg_t *msg, uint32_t *len)
{
	uint8_t *result = NULL;
	uint8_t *cursor = NULL;

	uint8_t *code = NULL;
	uint32_t code_size = 0;

	uint8_t *list = NULL;
	uint32_t list_size = 0;

	Sdnv time;

	DTNMP_DEBUG_ENTRY("msg_serialize_stat_msg","(0x%x, 0x%x)",
			          (unsigned long)msg, (unsigned long) len);

	/* Step 0: Sanity Checks. */
	if((msg == NULL) || (len == NULL))
	{
		DTNMP_DEBUG_ERR("msg_serialize_stat_msg","Bad Args",NULL);
		DTNMP_DEBUG_EXIT("msg_serialize_stat_msg","->NULL",NULL);
		return NULL;
	}


	/* STEP 3: Serialize the Code. */
	if((code = mid_serialize(msg->code, &code_size)) == NULL)
	{
		DTNMP_DEBUG_ERR("msg_serialize_stat_msg","Can't serialize code.",
				         NULL);
		DTNMP_DEBUG_EXIT("msg_serialize_stat_msg","->NULL",NULL);
		return NULL;
	}

	/* STEP 4: Serialize the MID Collection. */
	if((list = midcol_serialize(msg->generators, &list_size)) == NULL)
	{
		DTNMP_DEBUG_ERR("msg_serialize_stat_msg","Can't serialize code.",
				         NULL);
		MRELEASE(code);
		DTNMP_DEBUG_EXIT("msg_serialize_stat_msg","->NULL",NULL);
		return NULL;

	}

	/* Step 5: Build the timestamp SDNV. */
	encodeSdnv(&time, msg->time);

	/* STEP 6: Figure out the size of the entire message. */
	*len = code_size + list_size + time.length;


	/* STEP 7: Allocate the serialized message. */
	if((result = (uint8_t*)MTAKE(*len)) == NULL)
	{
		DTNMP_DEBUG_ERR("msg_serialize_stat_msg","Can't alloc %d bytes", *len);
		*len = 0;
		MRELEASE(code);
		MRELEASE(list);
		DTNMP_DEBUG_EXIT("msg_serialize_stat_msg","->NULL",NULL);
		return NULL;
	}

	/* Step 8: Populate the serialized message. */
	cursor = result;

	memcpy(cursor,code,code_size);
	cursor += code_size;
	MRELEASE(code);

	memcpy(cursor, time.text, time.length);
	cursor += time.length;

	memcpy(cursor, list, list_size);
	cursor += list_size;
	MRELEASE(list);

	/* Step 9: Last sanity check. */
	if((cursor - result) != *len)
	{
		DTNMP_DEBUG_ERR("msg_serialize_stat_msg","Wrote %d bytes but alloc %d",
				(unsigned long) (cursor - result), *len);
		*len = 0;
		MRELEASE(result);

		DTNMP_DEBUG_EXIT("msg_serialize_stat_msg","->NULL",NULL);
		return NULL;
	}

	DTNMP_DEBUG_EXIT("msg_serialize_stat_msg","->0x%x",(unsigned long)result);
	return result;
}
Esempio n. 2
0
uint8_t *ctrl_serialize(ctrl_exec_t *ctrl, uint32_t *len)
{
	uint8_t *result = NULL;
	uint8_t *cursor = NULL;

	Sdnv time_sdnv;
	Sdnv status_sdnv;

	uint8_t *contents = NULL;
	uint32_t contents_len = 0;

	AMP_DEBUG_ENTRY("ctrl_serialize","(0x%x, 0x%x)",
			          (unsigned long)ctrl, (unsigned long) len);

	/* Step 0: Sanity Checks. */
	if((ctrl == NULL) || (len == NULL))
	{
		AMP_DEBUG_ERR("ctrl_serialize","Bad Args",NULL);
		AMP_DEBUG_EXIT("ctrl_serialize","->NULL",NULL);
		return NULL;
	}

	*len = 0;

	/* Step 1: Serialize contents individually. */
	encodeSdnv(&time_sdnv, ctrl->time);

	encodeSdnv(&status_sdnv, ctrl->status);

	if((contents = mid_serialize(ctrl->mid, &contents_len)) == NULL)
	{
		AMP_DEBUG_ERR("ctrl_serialize","Can't serialize MID.",NULL);

		AMP_DEBUG_EXIT("ctrl_serialize","->NULL",NULL);
		return NULL;
	}

	/* Step 2: Figure out the length. */
	*len = time_sdnv.length + status_sdnv.length + sizeof(eid_t) + contents_len;

	/* STEP 3: Allocate the serialized message. */
	if((result = (uint8_t*)STAKE(*len)) == NULL)
	{
		AMP_DEBUG_ERR("ctrl_serialize","Can't alloc %d bytes", *len);
		*len = 0;
		SRELEASE(contents);

		AMP_DEBUG_EXIT("ctrl_serialize","->NULL",NULL);
		return NULL;
	}

	/* Step 4: Populate the serialized message. */
	cursor = result;

	memcpy(cursor,time_sdnv.text,time_sdnv.length);
	cursor += time_sdnv.length;

	memcpy(cursor,status_sdnv.text,status_sdnv.length);
	cursor += status_sdnv.length;

	memcpy(cursor,&(ctrl->sender),sizeof(eid_t));
	cursor += sizeof(eid_t);

	memcpy(cursor, contents, contents_len);
	cursor += contents_len;
	SRELEASE(contents);

	/* Step 5: Last sanity check. */
	if((cursor - result) != *len)
	{
		AMP_DEBUG_ERR("ctrl_serialize","Wrote %d bytes but allcated %d",
				(unsigned long) (cursor - result), *len);
		*len = 0;
		SRELEASE(result);

		AMP_DEBUG_EXIT("ctrl_serialize","->NULL",NULL);
		return NULL;
	}

	AMP_DEBUG_EXIT("ctrl_serialize","->0x%x",(unsigned long)result);
	return result;
}