static void test_ippool_exhaust0(void) { struct connman_ippool *pool; const char *gateway; const char *broadcast; const char *subnet_mask; const char *start_ip; const char *end_ip; GSList *list = NULL, *it; int i = 0; __connman_ippool_init(); /* Allocate all possible pools */ /* * Number of addresses * 24-bit block 10.0.0.0 – 10.255.255.255 16,777,216 * 20-bit block 172.16.0.0 – 172.31.255.255 1,048,576 * 16-bit block 192.168.0.0 – 192.168.255.255 65,536 * * Total 17,891,328 * * Total numbers of 256 blocks: 69,888 */ while (TRUE) { pool = __connman_ippool_create(23, 1, 100, NULL, NULL); if (pool == NULL) break; i += 1; g_assert(i < 69888); list = g_slist_prepend(list, pool); gateway = __connman_ippool_get_gateway(pool); broadcast = __connman_ippool_get_broadcast(pool); subnet_mask = __connman_ippool_get_subnet_mask(pool); start_ip = __connman_ippool_get_start_ip(pool); end_ip = __connman_ippool_get_end_ip(pool); g_assert(gateway); g_assert(broadcast); g_assert(subnet_mask); g_assert(start_ip); g_assert(end_ip); } LOG("Number of blocks %d", i); for (it = list; it != NULL; it = it->next) { pool = it->data; __connman_ippool_unref(pool); } g_slist_free(list); __connman_ippool_cleanup(); }
static void test_case_1(void) { struct connman_ippool *pool; int i; __connman_ippool_init(); pool = __connman_ippool_create(23, 1, 500, NULL, NULL); g_assert(pool == NULL); for (i = 0; i < 100000; i++) { pool = __connman_ippool_create(23, 1, 20, NULL, NULL); g_assert(pool); __connman_ippool_unref(pool); } __connman_ippool_cleanup(); }
static void test_case_2(void) { struct connman_ippool *pool; const char *gateway; const char *broadcast; const char *subnet_mask; const char *start_ip; const char *end_ip; int i; __connman_ippool_init(); /* Test the IP range */ for (i = 1; i < 254; i++) { pool = __connman_ippool_create(23, 1, i, NULL, NULL); g_assert(pool); gateway = __connman_ippool_get_gateway(pool); broadcast = __connman_ippool_get_broadcast(pool); subnet_mask = __connman_ippool_get_subnet_mask(pool); start_ip = __connman_ippool_get_start_ip(pool); end_ip = __connman_ippool_get_end_ip(pool); g_assert(gateway); g_assert(broadcast); g_assert(subnet_mask); g_assert(start_ip); g_assert(end_ip); LOG("\n\tIP range %s --> %s\n" "\tgateway %s broadcast %s mask %s", start_ip, end_ip, gateway, broadcast, subnet_mask); __connman_ippool_unref(pool); } __connman_ippool_cleanup(); }
int main(int argc, char *argv[]) { GOptionContext *context; GError *error = NULL; DBusConnection *conn; DBusError err; guint signal; #ifdef NEED_THREADS if (g_thread_supported() == FALSE) g_thread_init(NULL); #endif context = g_option_context_new(NULL); g_option_context_add_main_entries(context, options, NULL); if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) { if (error != NULL) { g_printerr("%s\n", error->message); g_error_free(error); } else g_printerr("An unknown error occurred\n"); exit(1); } g_option_context_free(context); if (option_version == TRUE) { printf("%s\n", VERSION); exit(0); } if (option_detach == TRUE) { if (daemon(0, 0)) { perror("Can't start daemon"); exit(1); } } if (mkdir(STATEDIR, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) { if (errno != EEXIST) perror("Failed to create state directory"); } if (mkdir(STORAGEDIR, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) { if (errno != EEXIST) perror("Failed to create storage directory"); } umask(0077); main_loop = g_main_loop_new(NULL, FALSE); #ifdef NEED_THREADS if (dbus_threads_init_default() == FALSE) { fprintf(stderr, "Can't init usage of threads\n"); exit(1); } #endif signal = setup_signalfd(); dbus_error_init(&err); conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, CONNMAN_SERVICE, &err); if (conn == NULL) { if (dbus_error_is_set(&err) == TRUE) { fprintf(stderr, "%s\n", err.message); dbus_error_free(&err); } else fprintf(stderr, "Can't register with system bus\n"); exit(1); } g_dbus_set_disconnect_function(conn, disconnect_callback, NULL, NULL); __connman_log_init(argv[0], option_debug, option_detach, option_backtrace, "Connection Manager", VERSION); __connman_dbus_init(conn); if (option_config == NULL) config_init(CONFIGMAINFILE); else config_init(option_config); __connman_inotify_init(); __connman_technology_init(); __connman_notifier_init(); __connman_agent_init(); __connman_service_init(); __connman_provider_init(); __connman_network_init(); __connman_device_init(option_device, option_nodevice); __connman_ippool_init(); __connman_iptables_init(); __connman_firewall_init(); __connman_nat_init(); __connman_tethering_init(); __connman_counter_init(); __connman_manager_init(); __connman_config_init(); __connman_stats_init(); __connman_clock_init(); __connman_resolver_init(option_dnsproxy); __connman_ipconfig_init(); __connman_rtnl_init(); __connman_task_init(); __connman_proxy_init(); __connman_detect_init(); __connman_session_init(); __connman_timeserver_init(); __connman_connection_init(); __connman_plugin_init(option_plugin, option_noplugin); __connman_rtnl_start(); __connman_dhcp_init(); __connman_dhcpv6_init(); __connman_wpad_init(); __connman_wispr_init(); __connman_rfkill_init(); g_free(option_config); g_free(option_device); g_free(option_plugin); g_free(option_nodevice); g_free(option_noplugin); #ifdef SYSTEMD /* Tell systemd that we have started up */ if( option_systemd ) sd_notify(0, "READY=1"); #endif g_main_loop_run(main_loop); g_source_remove(signal); __connman_rfkill_cleanup(); __connman_wispr_cleanup(); __connman_wpad_cleanup(); __connman_dhcpv6_cleanup(); __connman_dhcp_cleanup(); __connman_session_cleanup(); __connman_plugin_cleanup(); __connman_provider_cleanup(); __connman_connection_cleanup(); __connman_timeserver_cleanup(); __connman_detect_cleanup(); __connman_proxy_cleanup(); __connman_task_cleanup(); __connman_rtnl_cleanup(); __connman_resolver_cleanup(); __connman_clock_cleanup(); __connman_stats_cleanup(); __connman_config_cleanup(); __connman_manager_cleanup(); __connman_counter_cleanup(); __connman_tethering_cleanup(); __connman_nat_cleanup(); __connman_firewall_cleanup(); __connman_iptables_cleanup(); __connman_ippool_cleanup(); __connman_device_cleanup(); __connman_network_cleanup(); __connman_service_cleanup(); __connman_agent_cleanup(); __connman_ipconfig_cleanup(); __connman_notifier_cleanup(); __connman_technology_cleanup(); __connman_inotify_cleanup(); __connman_dbus_cleanup(); __connman_log_cleanup(option_backtrace); dbus_connection_unref(conn); g_main_loop_unref(main_loop); if (connman_settings.pref_timeservers != NULL) g_strfreev(connman_settings.pref_timeservers); g_free(connman_settings.auto_connect); g_free(connman_settings.preferred_techs); g_strfreev(connman_settings.fallback_nameservers); g_strfreev(connman_settings.blacklisted_interfaces); g_strfreev(connman_settings.tethering_technologies); g_free(option_debug); return 0; }
static void test_case_6(void) { struct connman_ippool *pool; const char *gateway; const char *broadcast; const char *subnet_mask; const char *start_ip; const char *end_ip; int flag; __connman_ippool_init(); /* Test the IP range collision */ flag = 0; start_ip = "192.168.1.2"; __connman_ippool_newaddr(25, start_ip, 24); g_assert(flag == 0); flag = 0; start_ip = "192.168.0.2"; __connman_ippool_newaddr(25, start_ip, 24); g_assert(flag == 0); /* pool should return 192.168.2.1 now */ pool = __connman_ippool_create(26, 1, 100, collision_cb, &flag); g_assert(pool); gateway = __connman_ippool_get_gateway(pool); broadcast = __connman_ippool_get_broadcast(pool); subnet_mask = __connman_ippool_get_subnet_mask(pool); start_ip = __connman_ippool_get_start_ip(pool); end_ip = __connman_ippool_get_end_ip(pool); g_assert(gateway); g_assert(broadcast); g_assert(subnet_mask); g_assert(start_ip); g_assert(end_ip); g_assert_cmpstr(gateway, ==, "192.168.2.1"); g_assert_cmpstr(broadcast, ==, "192.168.2.255"); g_assert_cmpstr(subnet_mask, ==, "255.255.255.0"); g_assert_cmpstr(start_ip, ==, "192.168.2.1"); g_assert_cmpstr(end_ip, ==, "192.168.2.101"); LOG("\n\tIP range %s --> %s\n" "\tgateway %s broadcast %s mask %s", start_ip, end_ip, gateway, broadcast, subnet_mask); __connman_ippool_unref(pool); /* * Now create the pool again, we should not get collision * with existing allocated address. */ /* pool should return 192.168.3.1 now */ flag = 0; pool = __connman_ippool_create(23, 1, 100, collision_cb, &flag); g_assert(pool); gateway = __connman_ippool_get_gateway(pool); broadcast = __connman_ippool_get_broadcast(pool); subnet_mask = __connman_ippool_get_subnet_mask(pool); start_ip = __connman_ippool_get_start_ip(pool); end_ip = __connman_ippool_get_end_ip(pool); g_assert(gateway); g_assert(broadcast); g_assert(subnet_mask); g_assert(start_ip); g_assert(end_ip); g_assert_cmpstr(gateway, ==, "192.168.3.1"); g_assert_cmpstr(broadcast, ==, "192.168.3.255"); g_assert_cmpstr(subnet_mask, ==, "255.255.255.0"); g_assert_cmpstr(start_ip, ==, "192.168.3.1"); g_assert_cmpstr(end_ip, ==, "192.168.3.101"); LOG("\n\tIP range %s --> %s\n" "\tgateway %s broadcast %s mask %s", start_ip, end_ip, gateway, broadcast, subnet_mask); g_assert(flag == 0); flag = 0; start_ip = "192.168.3.2"; __connman_ippool_newaddr(25, start_ip, 24); g_assert(flag == 1); __connman_ippool_unref(pool); __connman_ippool_cleanup(); }
static void test_case_4(void) { struct connman_ippool *pool; const char *gateway; const char *broadcast; const char *subnet_mask; const char *start_ip; const char *end_ip; int flag; __connman_ippool_init(); /* Test the IP range collision */ flag = 0; pool = __connman_ippool_create(23, 1, 100, collision_cb, &flag); g_assert(pool); gateway = __connman_ippool_get_gateway(pool); broadcast = __connman_ippool_get_broadcast(pool); subnet_mask = __connman_ippool_get_subnet_mask(pool); start_ip = __connman_ippool_get_start_ip(pool); end_ip = __connman_ippool_get_end_ip(pool); g_assert(gateway); g_assert(broadcast); g_assert(subnet_mask); g_assert(start_ip); g_assert(end_ip); LOG("\n\tIP range %s --> %s\n" "\tgateway %s broadcast %s mask %s", start_ip, end_ip, gateway, broadcast, subnet_mask); __connman_ippool_newaddr(23, start_ip, 24); g_assert(flag == 0); __connman_ippool_newaddr(42, start_ip, 16); g_assert(flag == 1); __connman_ippool_unref(pool); flag = 0; pool = __connman_ippool_create(23, 1, 100, collision_cb, &flag); g_assert(pool); gateway = __connman_ippool_get_gateway(pool); broadcast = __connman_ippool_get_broadcast(pool); subnet_mask = __connman_ippool_get_subnet_mask(pool); start_ip = __connman_ippool_get_start_ip(pool); end_ip = __connman_ippool_get_end_ip(pool); g_assert(gateway); g_assert(broadcast); g_assert(subnet_mask); g_assert(start_ip); g_assert(end_ip); LOG("\n\tIP range %s --> %s\n" "\tgateway %s broadcast %s mask %s", start_ip, end_ip, gateway, broadcast, subnet_mask); __connman_ippool_newaddr(45, start_ip, 22); g_assert(flag == 1); __connman_ippool_unref(pool); __connman_ippool_cleanup(); }
static void test_case_3(void) { struct connman_ippool *pool; const char *gateway; const char *broadcast; const char *subnet_mask; const char *start_ip; const char *end_ip; GSList *list = NULL, *it; int i = 0; __connman_ippool_init(); /* * Number of addresses * 24-bit block 10.0.0.0 – 10.255.255.255 16,777,216 * 20-bit block 172.16.0.0 – 172.31.255.255 1,048,576 * 16-bit block 192.168.0.0 – 192.168.255.255 65,536 * * Total 17,891,328 * * Total numbers of 256 blocks: 69,888 */ /* * Completely exhaust the first two pools because they are a bit * too large. */ __connman_ippool_newaddr(45, "10.0.0.1", 8); __connman_ippool_newaddr(46, "172.16.0.1", 11); while (TRUE) { pool = __connman_ippool_create(23, 1, 100, NULL, NULL); if (pool == NULL) break; i += 1; list = g_slist_prepend(list, pool); gateway = __connman_ippool_get_gateway(pool); broadcast = __connman_ippool_get_broadcast(pool); subnet_mask = __connman_ippool_get_subnet_mask(pool); start_ip = __connman_ippool_get_start_ip(pool); end_ip = __connman_ippool_get_end_ip(pool); g_assert(gateway); g_assert(broadcast); g_assert(subnet_mask); g_assert(start_ip); g_assert(end_ip); } g_assert(i == 255); LOG("Number of blocks %d", i); for (it = list; it != NULL; it = it->next) { pool = it->data; __connman_ippool_unref(pool); } g_slist_free(list); __connman_ippool_cleanup(); }