lagopus_result_t ofp_meter_features_request_handle(struct channel *channel, struct pbuf *pbuf, struct ofp_header *xid_header, struct ofp_error *error) { lagopus_result_t res = LAGOPUS_RESULT_ANY_FAILURES; uint64_t dpid; struct ofp_meter_features ofp_meter_features; struct pbuf_list *send_pbuf_list = NULL; /* check params */ if (channel != NULL && pbuf != NULL && xid_header != NULL && error != NULL) { if (pbuf_plen_equal_check(pbuf, 0) == LAGOPUS_RESULT_OK) { /* get datas */ memset(&ofp_meter_features, 0, sizeof(ofp_meter_features)); dpid = channel_dpid_get(channel); res = ofp_meter_features_get(dpid, &ofp_meter_features, error); if (res == LAGOPUS_RESULT_OK) { /* create desc reply. */ res = ofp_meter_features_reply_create(channel, &send_pbuf_list, &ofp_meter_features, xid_header); if (res == LAGOPUS_RESULT_OK) { /* send desc reply */ res = channel_send_packet_list(channel, send_pbuf_list); if (res != LAGOPUS_RESULT_OK) { lagopus_msg_warning("Socket write error (%s).\n", lagopus_error_get_string(res)); } } else { lagopus_msg_warning("reply creation failed, (%s).\n", lagopus_error_get_string(res)); } /* free. */ if (send_pbuf_list != NULL) { pbuf_list_free(send_pbuf_list); } } } else { lagopus_msg_warning("over packet length.\n"); ofp_error_set(error, OFPET_BAD_REQUEST, OFPBRC_BAD_LEN); res = LAGOPUS_RESULT_OFP_ERROR; } } else { res = LAGOPUS_RESULT_INVALID_ARGS; } return res; }
/* Group Features Request packet receive. */ lagopus_result_t ofp_group_features_request_handle(struct channel *channel, struct pbuf *pbuf, struct ofp_header *xid_header, struct ofp_error *error) { lagopus_result_t ret; uint64_t dpid; struct ofp_group_features group_features; struct pbuf_list *pbuf_list = NULL; if (channel != NULL && pbuf != NULL && xid_header != NULL && error != NULL) { if (pbuf_plen_equal_check(pbuf, 0) == LAGOPUS_RESULT_OK) { dpid = channel_dpid_get(channel); ret = ofp_group_features_get(dpid, &group_features, error); if (ret == LAGOPUS_RESULT_OK) { ret = ofp_group_features_reply_create(channel, &pbuf_list, &group_features, xid_header); if (ret == LAGOPUS_RESULT_OK) { /* write packets. */ ret = channel_send_packet_list(channel, pbuf_list); if (ret != LAGOPUS_RESULT_OK) { lagopus_msg_warning("Can't write\n"); } } 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("over packet length.\n"); ofp_error_set(error, OFPET_BAD_REQUEST, OFPBRC_BAD_LEN); ret = LAGOPUS_RESULT_OFP_ERROR; } /* free. */ if (pbuf_list != NULL) { pbuf_list_free(pbuf_list); } } else { ret = LAGOPUS_RESULT_INVALID_ARGS; } return ret; }
/* Experimenter multipart packet receive. */ lagopus_result_t ofp_experimenter_mp_request_handle(struct channel *channel, struct pbuf *pbuf, struct ofp_header *xid_header) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; struct pbuf_list *pbuf_list = NULL; struct ofp_experimenter_multipart_header exper_req; if (channel != NULL && pbuf != NULL && xid_header != NULL) { /* Parse packet. */ ret = ofp_experimenter_multipart_header_decode(pbuf, &exper_req); if (ret == LAGOPUS_RESULT_OK) { /* Experimenter request reply. */ ret = ofp_experimenter_mp_reply_create(channel, &pbuf_list, xid_header, &exper_req); if (ret == LAGOPUS_RESULT_OK) { ret = channel_send_packet_list(channel, pbuf_list); if (ret != LAGOPUS_RESULT_OK) { lagopus_msg_warning("Can't write.\n"); ret = LAGOPUS_RESULT_OFP_ERROR; } } else { lagopus_msg_warning("FAILED (%s).\n", lagopus_error_get_string(ret)); } } else { lagopus_msg_warning("FAILED (%s).\n", lagopus_error_get_string(ret)); ret = LAGOPUS_RESULT_OFP_ERROR; } /* free. */ if (pbuf_list != NULL) { pbuf_list_free(pbuf_list); } } else { ret = LAGOPUS_RESULT_INVALID_ARGS; } return ret; }
/* Desc Request packet receive. */ lagopus_result_t ofp_desc_request_handle(struct channel *channel, struct pbuf *pbuf, struct ofp_header *xid_header, struct ofp_error *error) { lagopus_result_t res = LAGOPUS_RESULT_ANY_FAILURES; uint64_t dpid; struct ofp_desc ofp_desc; struct pbuf_list *send_pbuf_list = NULL; /* check params */ if (channel != NULL && pbuf != NULL && xid_header != NULL && error != NULL) { dpid = channel_dpid_get(channel); /* get datas */ memset(&ofp_desc, 0, sizeof(ofp_desc)); res = ofp_desc_get(dpid, &ofp_desc, error); if (res == LAGOPUS_RESULT_OK) { /* create desc reply. */ res = ofp_desc_reply_create(channel, &send_pbuf_list, &ofp_desc, xid_header); if (res == LAGOPUS_RESULT_OK) { /* send desc reply */ res = channel_send_packet_list(channel, send_pbuf_list); if (res != LAGOPUS_RESULT_OK) { lagopus_msg_warning("Socket write error (%s).\n", lagopus_error_get_string(res)); } } else { lagopus_msg_warning("reply creation failed, (%s).\n", lagopus_error_get_string(res)); } pbuf_list_free(send_pbuf_list); } } else { res = LAGOPUS_RESULT_INVALID_ARGS; } return res; }