void test_ofp_padding_add_null(void) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; uint16_t pad_length = 0; ret = ofp_padding_add(NULL, pad_length); TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_INVALID_ARGS, ret, "ofp_padding_add(null) error."); }
static lagopus_result_t ofp_padding_add_normal_wrap(uint16_t length, uint16_t pad_length, uint16_t ret_length) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; struct pbuf *test_pbuf; struct pbuf *ret_pbuf; /* Create test data. */ test_pbuf = pbuf_alloc(ret_length); memset(test_pbuf->data, 0, length); test_pbuf->plen = (size_t) (ret_length - length); test_pbuf->putp += length; ret_pbuf = pbuf_alloc(ret_length); memset(ret_pbuf->data, 0, ret_length); ret_pbuf->plen = 0; ret_pbuf->putp += ret_length; /* Call func. */ ret = ofp_padding_add(test_pbuf, pad_length); if (ret == LAGOPUS_RESULT_OK) { TEST_ASSERT_EQUAL_MESSAGE(0, test_pbuf->plen, "packet length error."); TEST_ASSERT_EQUAL_MESSAGE(ret_length, test_pbuf->putp - test_pbuf->getp, "packet data length error."); TEST_ASSERT_EQUAL_MESSAGE(0, memcmp(test_pbuf->data, ret_pbuf->data, ret_length), "packet data error."); } /* free. */ pbuf_free(test_pbuf); pbuf_free(ret_pbuf); return ret; }
/* SEND */ STATIC lagopus_result_t ofp_packet_in_create(struct packet_in *packet_in, struct pbuf **pbuf) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; uint16_t miss_send_len; uint16_t length = 0; uint16_t remain_length = 0; uint16_t match_total_len = 0; uint8_t tmp_version = 0x00; uint32_t tmp_xid = 0x00; uint16_t tmp_length = 0; if (packet_in != NULL && packet_in->data != NULL && pbuf != NULL) { /* alloc */ *pbuf = pbuf_alloc(OFP_PACKET_MAX_SIZE); if (*pbuf != NULL) { pbuf_plen_set(*pbuf, OFP_PACKET_MAX_SIZE); /* set total_len. */ ret = pbuf_length_get(packet_in->data, &length); if (ret == LAGOPUS_RESULT_OK) { packet_in->ofp_packet_in.total_len = length; /* Fill in header. */ /* tmp_* is replaced later. */ ofp_header_set(&packet_in->ofp_packet_in.header, tmp_version, OFPT_PACKET_IN, tmp_length, tmp_xid); ret = ofp_packet_in_encode(*pbuf, &packet_in->ofp_packet_in); if (ret == LAGOPUS_RESULT_OK) { ret = ofp_match_list_encode(NULL, *pbuf, &packet_in->match_list, &match_total_len); if (ret == LAGOPUS_RESULT_OK) { /* Cut packet. */ remain_length = (uint16_t) pbuf_plen_get(*pbuf); if (packet_in->ofp_packet_in.buffer_id == OFP_NO_BUFFER) { miss_send_len = remain_length; } else { miss_send_len = packet_in->miss_send_len; } if (length < miss_send_len) { miss_send_len = length; } /* exist data */ if (miss_send_len != 0) { /* add padding */ ret = ofp_padding_add(*pbuf, OFP_PACKET_IN_PAD); if (ret == LAGOPUS_RESULT_OK) { /* Cut packet. (remain_length) */ if (miss_send_len + OFP_PACKET_IN_PAD > remain_length) { miss_send_len = remain_length; } if (pbuf_plen_check(*pbuf, miss_send_len) != LAGOPUS_RESULT_OK) { lagopus_msg_warning("FAILED : over data length.\n"); ret = LAGOPUS_RESULT_OUT_OF_RANGE; } else { /* copy data. */ ret = pbuf_copy_with_length(*pbuf, packet_in->data, miss_send_len); if (ret == LAGOPUS_RESULT_OK) { pbuf_plen_reset(*pbuf); } else { lagopus_msg_warning("FAILED (%s).\n", lagopus_error_get_string(ret)); } } } else { lagopus_msg_warning("FAILED : over padding length.\n"); } } else { ret = LAGOPUS_RESULT_OK; } } else { lagopus_msg_warning("FAILED (%s).\n", lagopus_error_get_string(ret)); } } else { lagopus_msg_warning("FAILED (%s).\n", lagopus_error_get_string(ret)); } } else { lagopus_msg_warning("FAILED (%s).\n", lagopus_error_get_string(ret)); } } else { lagopus_msg_warning("Can't allocate pbuf.\n"); ret = LAGOPUS_RESULT_NO_MEMORY; } /* free. */ if (ret != LAGOPUS_RESULT_OK && *pbuf != NULL) { pbuf_free(*pbuf); *pbuf = NULL; } } else { ret = LAGOPUS_RESULT_INVALID_ARGS; } return ret; }