static lagopus_result_t channel_mgr_channel_add_internal(const char *bridge_name, uint64_t dpid, struct addrunion *addr, struct channel **channel) { lagopus_result_t ret; struct channel *chan = NULL; char ipaddr[INET6_ADDRSTRLEN+1]; char key[MAIN_KEY_LEN]; if (addrunion_ipaddr_str_get(addr, ipaddr, sizeof(ipaddr)) == NULL) { return LAGOPUS_RESULT_ANY_FAILURES; } MAKE_MAIN_HASH(key, ipaddr, addr, bridge_name); ret = channel_add_internal(key, addr, &chan); if (ret != LAGOPUS_RESULT_OK) { return ret; } ret = channel_set_dpid(key, dpid); if (ret != LAGOPUS_RESULT_OK) { channel_mgr_channel_delete(bridge_name, addr); } else { *channel = chan; } return ret; }
static int controller_func_internal(const char *bridge_str, const char *controller_str, uint16_t type, lagopus_result_t (*func)(struct bridge *, uint64_t dpid, struct addrunion *)) { struct bridge *bridge; struct addrunion addr; lagopus_result_t result; uint64_t dpid = 0x00; /* Lookup bridge. */ bridge = dpmgr_bridge_lookup(dpmgr, bridge_str); if (! bridge) { return CONFIG_FAILURE; } result = dpmgr_bridge_dpid_lookup(dpmgr, bridge_str, &dpid); if (result != LAGOPUS_RESULT_OK ) { return CONFIG_FAILURE; } addrunion_ipv4_set(&addr, controller_str); if (type == CONFSYS_MSG_TYPE_SET) { struct channel *chan; /* Add controller to dpmgr. */ dpmgr_controller_add(dpmgr, bridge_str, controller_str); /* Register channel to dpmgr. */ result = func(bridge, dpid, &addr); if (result != LAGOPUS_RESULT_OK) { lagopus_perror(result); return CONFIG_FAILURE; } /* Lookup channel from channel mgr and return. */ result = channel_mgr_channel_lookup(bridge, &addr, &chan); if (result != LAGOPUS_RESULT_OK) { lagopus_perror(result); return CONFIG_FAILURE; } } else if (type == CONFSYS_MSG_TYPE_UNSET) { /* Delete controller from dpmgr. */ dpmgr_controller_delete(dpmgr, bridge_str, controller_str); /* Remove channel from channel mgr. */ result = channel_mgr_channel_delete(bridge, &addr); if (result != LAGOPUS_RESULT_OK) { lagopus_perror(result); return CONFIG_FAILURE; } } return CONFIG_SUCCESS; }
lagopus_result_t channel_mgr_channel_tls_add(const char *bridge_name, uint64_t dpid, struct addrunion *addr) { lagopus_result_t ret; struct channel *chan = NULL; ret = channel_mgr_channel_add_internal(bridge_name, dpid, addr, &chan); if (ret != LAGOPUS_RESULT_OK) { return ret; } lagopus_msg_debug(10, "channel %p protocol set\n", chan); ret = channel_protocol_set(chan, PROTOCOL_TLS); if (ret != LAGOPUS_RESULT_OK) { channel_mgr_channel_delete(bridge_name, addr); return ret; } lagopus_msg_debug(10, "channel %p enabled\n", chan); channel_enable(chan); 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); }