lagopus_result_t ofp_role_channel_update(struct channel *channel, struct ofp_role_request *role_request, uint64_t dpid) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; uint32_t current_role; if (channel != NULL && role_request != NULL) { current_role = channel_role_get(channel); /* Not change. */ if (role_request->role == current_role || role_request->role == OFPCR_ROLE_NOCHANGE) { lagopus_msg_debug(1, "Role not change (%u).\n", role_request->role); role_request->role = current_role; ret = LAGOPUS_RESULT_OK; } else { if (current_role == OFPCR_ROLE_MASTER) { /* every other master controller to slave. */ channel_mgr_dpid_iterate(dpid, change_master2slave, NULL); } channel_role_set(channel, role_request->role); ret = LAGOPUS_RESULT_OK; } } 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; 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 channel_mgr_channel_lookup_by_channel_id(uint64_t dpid, uint64_t channel_id, struct channel **chan) { lagopus_result_t ret; struct channel_id_vars v; v.channel_id = channel_id; v.channel = NULL; channel_mgr_dpid_iterate(dpid, channel_id_eq, &v); if (v.channel == NULL) { ret = LAGOPUS_RESULT_NOT_FOUND; } else { ret = LAGOPUS_RESULT_OK; } *chan = v.channel; 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; }
void test_channel_tcp(void) { int sock4, sock6; socklen_t size; struct sockaddr_in sin; lagopus_ip_address_t *addr4 = NULL; lagopus_ip_address_t *addr6 = NULL; struct channel_list *chan_list ; struct channel *chan4, *chan6, *chan = NULL; lagopus_result_t ret; int cnt; printf("test_channel_tcp in\n"); channel_mgr_initialize(); ret = channel_mgr_channels_lookup_by_dpid(dpid, &chan_list ); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_NOT_FOUND, ret); TEST_ASSERT_EQUAL(NULL, chan_list ); ret = lagopus_ip_address_create("127.0.0.1", true, &addr4); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = lagopus_ip_address_create("::1", false, &addr6); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_mgr_channel_add(bridge_name, dpid, addr4); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_mgr_channel_add(bridge_name, dpid, addr6); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_mgr_channel_add(bridge_name, dpid, addr4); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_ALREADY_EXISTS, ret); ret = channel_mgr_channel_lookup(bridge_name, addr4, &chan4); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_EQUAL(0, channel_id_get(chan4)); ret = channel_port_set(chan4, 10022); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_local_port_set(chan4, 20022); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_local_addr_set(chan4, addr4); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_mgr_channel_add(bridge_name, dpid, addr6); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_ALREADY_EXISTS, ret); ret = channel_mgr_channel_lookup(bridge_name, addr6, &chan6); TEST_ASSERT_EQUAL(1, channel_id_get(chan6)); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_port_set(chan6, 10023); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_local_port_set(chan6, 20023); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_local_addr_set(chan6, addr6); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_mgr_channel_lookup_by_channel_id(dpid, 1, &chan); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_NOT_EQUAL(NULL, chan); ret = channel_mgr_channel_lookup_by_channel_id(dpid, 9999, &chan); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_NOT_FOUND, ret); TEST_ASSERT_EQUAL(NULL, chan); cnt = 0; ret = channel_mgr_channels_lookup_by_dpid(dpid, &chan_list ); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_list_iterate(chan_list , channel_count, &cnt); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_EQUAL(2, cnt); cnt = 0; ret = channel_mgr_dpid_iterate(dpid, channel_count, &cnt); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); TEST_ASSERT_EQUAL(2, cnt); run = true; size = sizeof(sin); printf("accept in\n"); sock4 = accept(s4, (struct sockaddr *)&sin, &size); TEST_ASSERT_NOT_EQUAL(-1, sock4); sock6 = accept(s6, (struct sockaddr *)&sin, &size); TEST_ASSERT_NOT_EQUAL(-1, sock6); ret = channel_mgr_channel_lookup(bridge_name, addr4, &chan4); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); channel_refs_get(chan4); ret = channel_mgr_channel_delete(bridge_name, addr4); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); channel_refs_put(chan4); ret = channel_mgr_channel_delete(bridge_name, addr4); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_mgr_channel_lookup(bridge_name, addr4, &chan4); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_NOT_FOUND, ret); ret = channel_mgr_channel_delete(bridge_name, addr6); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); ret = channel_mgr_channel_lookup(bridge_name, addr6, &chan6); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_NOT_FOUND, ret); TEST_ASSERT_FALSE(channel_mgr_has_alive_channel_by_dpid(dpid)); ret = channel_mgr_event_upcall(); TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, ret); lagopus_ip_address_destroy(addr4); lagopus_ip_address_destroy(addr6); close(sock4); close(sock6); }