lagopus_result_t ofp_header_packet_set(struct channel *channel, struct pbuf *pbuf) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; uint16_t cur_length; pbuf_info_t cur_pbuf_info; pbuf_info_t update_pbuf_info; struct ofp_header header; if (channel != NULL && pbuf != NULL) { /* Store current pbuf info. */ pbuf_info_store(pbuf, &cur_pbuf_info); ret = pbuf_length_get(pbuf, &cur_length); if (ret == LAGOPUS_RESULT_OK) { /* Update pbuf info for ofp_header_decode_sneak. */ pbuf_getp_set(&update_pbuf_info, pbuf_data_get(pbuf)); pbuf_putp_set(&update_pbuf_info, pbuf_data_get(pbuf) + sizeof(struct ofp_header)); pbuf_plen_set(&update_pbuf_info, sizeof(struct ofp_header)); pbuf_info_load(pbuf, &update_pbuf_info); ret = ofp_header_decode_sneak(pbuf, &header); if (ret == LAGOPUS_RESULT_OK) { /* Update pbuf info for ofp_header_create. */ pbuf_reset(pbuf); pbuf_plen_set(pbuf, (size_t) cur_length); ret = ofp_header_create(channel, header.type, NULL, &header, pbuf); if (ret == LAGOPUS_RESULT_OK) { /* Load pbuf info. */ pbuf_info_load(pbuf, &cur_pbuf_info); } 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 { return LAGOPUS_RESULT_INVALID_ARGS; } return ret; }
lagopus_result_t ofp_header_length_set(struct pbuf *pbuf, uint16_t length) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; pbuf_info_t cur_pbuf_info; pbuf_info_t update_pbuf_info; struct ofp_header header; if (pbuf != NULL) { /* Store current pbuf info. */ pbuf_info_store(pbuf, &cur_pbuf_info); /* Update pbuf info for ofp_header_decode_sneak. */ pbuf_getp_set(&update_pbuf_info, pbuf_data_get(pbuf)); pbuf_putp_set(&update_pbuf_info, pbuf_data_get(pbuf) + sizeof(struct ofp_header)); pbuf_plen_set(&update_pbuf_info, sizeof(struct ofp_header)); pbuf_info_load(pbuf, &update_pbuf_info); ret = ofp_header_decode_sneak(pbuf, &header); if (ret == LAGOPUS_RESULT_OK) { /* Set length.*/ header.length = length; /* Update pbuf info for ofp_header_encode. */ pbuf_reset(pbuf); pbuf_plen_set(pbuf, sizeof(struct ofp_header)); ret = ofp_header_encode(pbuf, &header); if (ret == LAGOPUS_RESULT_OK) { /* Load pbuf info. */ pbuf_info_load(pbuf, &cur_pbuf_info); } 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 { ret = LAGOPUS_RESULT_INVALID_ARGS; } return ret; }
void test_pbuf_info_store_load_normal(void) { struct pbuf *pbuf = pbuf_alloc(PBUF_LENGTH); pbuf_info_t pbuf_info; /* create test data */ pbuf->getp = pbuf->data + 1; pbuf->putp = pbuf->data + 3; pbuf->plen = 2; /* call store func. */ pbuf_info_store(pbuf, &pbuf_info); TEST_ASSERT_EQUAL_MESSAGE(pbuf->data + 1, pbuf_getp_get(&pbuf_info), "getp error."); TEST_ASSERT_EQUAL_MESSAGE(pbuf->data + 3, pbuf_putp_get(&pbuf_info), "putp error."); TEST_ASSERT_EQUAL_MESSAGE(2, pbuf_plen_get(&pbuf_info), "plen error."); /* create test data */ pbuf_reset(pbuf); /* check reset. */ TEST_ASSERT_EQUAL_MESSAGE(pbuf->data, pbuf_getp_get(pbuf), "getp error."); TEST_ASSERT_EQUAL_MESSAGE(pbuf->data, pbuf_putp_get(pbuf), "putp error."); TEST_ASSERT_EQUAL_MESSAGE(0, pbuf_plen_get(pbuf), "plen error."); /* call load func. */ pbuf_info_load(pbuf, &pbuf_info); TEST_ASSERT_EQUAL_MESSAGE(pbuf->data + 1, pbuf_getp_get(pbuf), "getp error."); TEST_ASSERT_EQUAL_MESSAGE(pbuf->data + 3, pbuf_putp_get(pbuf), "putp error."); TEST_ASSERT_EQUAL_MESSAGE(2, pbuf_plen_get(pbuf), "plen error."); /* after. */ pbuf_free(pbuf); }
lagopus_result_t ofp_header_mp_copy(struct pbuf *dst_pbuf, struct pbuf *src_pbuf) { struct ofp_multipart_reply mp_reply; lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; pbuf_info_t cur_src_pbuf_info; pbuf_info_t cur_dst_pbuf_info; pbuf_info_t update_pbuf_info; uint16_t cur_src_length = 0; if (dst_pbuf != NULL && src_pbuf != NULL) { /* Store current dst/src_pbuf info. */ pbuf_info_store(dst_pbuf, &cur_dst_pbuf_info); pbuf_info_store(src_pbuf, &cur_src_pbuf_info); ret = pbuf_length_get(src_pbuf, &cur_src_length); if (ret == LAGOPUS_RESULT_OK) { /* Update src_pbuf info for ofp_multipart_reply_decode. */ pbuf_getp_set(&update_pbuf_info, pbuf_data_get(src_pbuf)); pbuf_putp_set(&update_pbuf_info, pbuf_data_get(src_pbuf) + sizeof(struct ofp_multipart_reply)); pbuf_plen_set(&update_pbuf_info, sizeof(struct ofp_multipart_reply)); pbuf_info_load(src_pbuf, &update_pbuf_info); ret = ofp_multipart_reply_decode(src_pbuf, &mp_reply); if (ret == LAGOPUS_RESULT_OK) { /* Set length/flag in src_pbuf. */ mp_reply.header.length = cur_src_length; mp_reply.flags = OFPMPF_REPLY_MORE; /* Update src_pbuf info for ofp_multipart_reply_encode. */ pbuf_reset(src_pbuf); pbuf_plen_set(src_pbuf, sizeof(struct ofp_multipart_reply)); ret = ofp_multipart_reply_encode(src_pbuf, &mp_reply); if (ret == LAGOPUS_RESULT_OK) { /* Set length/flag in dst_pbuf. */ mp_reply.header.length = sizeof(struct ofp_multipart_reply); mp_reply.flags = 0; /* Update dst_pbuf info for ofp_multipart_reply_encode. */ pbuf_reset(dst_pbuf); pbuf_plen_set(dst_pbuf, pbuf_plen_get(&cur_dst_pbuf_info)); ret = ofp_multipart_reply_encode(dst_pbuf, &mp_reply); if (ret == LAGOPUS_RESULT_OK) { /* Load pbuf info. */ pbuf_info_load(src_pbuf, &cur_src_pbuf_info); } 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("FAILED (%s).\n", lagopus_error_get_string(ret)); } } else { ret = LAGOPUS_RESULT_INVALID_ARGS; } return ret; }