static lagopus_result_t ofp_role_generation_id_check_wrap(struct channel **channels, struct ofp_header *xid_headers) { bool rt; uint64_t dpid = 0xabc; (void) channels; (void) xid_headers; /* new generation_id. */ rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0x10); TEST_ASSERT_EQUAL_MESSAGE(true, rt, "ofp_role_generation_id_check error."); /* same generation_id. */ rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0x10); TEST_ASSERT_EQUAL_MESSAGE(true, rt, "ofp_role_generation_id_check error."); /* small generation_id. */ rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0x0f); TEST_ASSERT_EQUAL_MESSAGE(false, rt, "ofp_role_generation_id_check error."); /* role is OFPCR_ROLE_EQUAL (small generation_id). */ rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_EQUAL, 0x0f); TEST_ASSERT_EQUAL_MESSAGE(true, rt, "ofp_role_generation_id_check error."); /* same small generation_id. */ rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0x0f); TEST_ASSERT_EQUAL_MESSAGE(false, rt, "ofp_role_generation_id_check error."); /* large generation_id. */ rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0x11); TEST_ASSERT_EQUAL_MESSAGE(true, rt, "ofp_role_generation_id_check error."); /* minus generation_id. */ rt = ofp_role_generation_id_check(dpid, OFPCR_ROLE_SLAVE, 0xfffffffffffffffe); TEST_ASSERT_EQUAL_MESSAGE(false, rt, "ofp_role_generation_id_check error."); return LAGOPUS_RESULT_OK; }
lagopus_result_t ofp_role_request_handle(struct channel *channel, struct pbuf *pbuf, struct ofp_header *xid_header, struct ofp_error *error) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; struct ofp_role_request role_request; struct ofp_role_request modified_role_request; struct pbuf *send_pbuf = NULL; uint64_t dpid; if (channel != NULL && pbuf != NULL && xid_header != NULL && error != NULL) { /* Parse packet. */ ret = ofp_role_request_decode(pbuf, &role_request); if (ret == LAGOPUS_RESULT_OK) { /* dump trace. */ role_request_trace(&role_request); ret = role_check(role_request.role, error); if (ret == LAGOPUS_RESULT_OK) { dpid = channel_dpid_get(channel); if (ofp_role_generation_id_check(dpid, role_request.role, role_request.generation_id) == true) { /* copy role request. */ modified_role_request = role_request; ret = ofp_role_channel_update(channel, &modified_role_request, dpid); if (ret == LAGOPUS_RESULT_OK) { /* Reply send.*/ ret = ofp_role_reply_create(channel, &send_pbuf, xid_header, &modified_role_request); if (ret == LAGOPUS_RESULT_OK) { channel_send_packet(channel, send_pbuf); } 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("bad generation_id.\n"); ofp_error_set(error, OFPET_ROLE_REQUEST_FAILED, OFPRRFC_STALE); ret = LAGOPUS_RESULT_OFP_ERROR; } if (ret != LAGOPUS_RESULT_OK && send_pbuf != NULL) { channel_pbuf_list_unget(channel, send_pbuf); } } } else { lagopus_msg_warning("FAILED (%s).\n", lagopus_error_get_string(ret)); ofp_error_set(error, OFPET_BAD_REQUEST, OFPBRC_BAD_LEN); ret = LAGOPUS_RESULT_OFP_ERROR; } } else { ret = LAGOPUS_RESULT_INVALID_ARGS; } return ret; }