lagopus_result_t ofp_role_channel_write(struct pbuf *pbuf, uint64_t dpid, uint8_t type, uint8_t reason) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; if (pbuf != NULL) { struct role_write_vars v; v.type = type; v.reason = reason; v.pbuf = pbuf; v.ret = LAGOPUS_RESULT_ANY_FAILURES; channel_mgr_dpid_iterate(dpid, ofp_role_write, (void *) &v); ret = v.ret; } else { ret = LAGOPUS_RESULT_INVALID_ARGS; } if (ret == LAGOPUS_RESULT_OK && pbuf != NULL) { /* move getp to putp. */ pbuf_getp_set(pbuf, pbuf_putp_get(pbuf)); } return ret; }
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; }
lagopus_result_t ofp_role_channel_write(struct pbuf *pbuf, uint64_t dpid, uint8_t type, uint8_t reason) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; if (pbuf != NULL) { struct role_write_vars v; v.type = type; v.reason = reason; v.pbuf = pbuf; v.ret = LAGOPUS_RESULT_ANY_FAILURES; ret = channel_mgr_dpid_iterate(dpid, ofp_role_write, (void *) &v); if (ret != LAGOPUS_RESULT_OK) { if (ret == LAGOPUS_RESULT_NOT_OPERATIONAL || ret == LAGOPUS_RESULT_NOT_FOUND) { lagopus_msg_info("Channel is not alive, drop asynchronous message(%s)\n", ofp_type_str(v.type)); /* Not send packet. */ ret = LAGOPUS_RESULT_OK; } else { ret = v.ret; } } } else { ret = LAGOPUS_RESULT_INVALID_ARGS; } if (ret == LAGOPUS_RESULT_OK && pbuf != NULL) { /* move getp to putp. */ pbuf_getp_set(pbuf, pbuf_putp_get(pbuf)); } return ret; }
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; }