static GDHCPServer *dhcp_server_start(const char *bridge, const char *router, const char* subnet, const char *start_ip, const char *end_ip, unsigned int lease_time, const char *dns) { GDHCPServerError error; GDHCPServer *dhcp_server; int index; DBG(""); index = connman_inet_ifindex(bridge); if (index < 0) return NULL; dhcp_server = g_dhcp_server_new(G_DHCP_IPV4, index, &error); if (dhcp_server == NULL) { dhcp_server_error(error); return NULL; } g_dhcp_server_set_debug(dhcp_server, dhcp_server_debug, "DHCP server"); g_dhcp_server_set_lease_time(dhcp_server, lease_time); g_dhcp_server_set_option(dhcp_server, G_DHCP_SUBNET, subnet); g_dhcp_server_set_option(dhcp_server, G_DHCP_ROUTER, router); g_dhcp_server_set_option(dhcp_server, G_DHCP_DNS_SERVER, dns); g_dhcp_server_set_ip_range(dhcp_server, start_ip, end_ip); g_dhcp_server_start(dhcp_server); return dhcp_server; }
int main(int argc, char *argv[]) { struct sigaction sa; GDHCPServerError error; GDHCPServer *dhcp_server; int index; if (argc < 2) { printf("Usage: dhcp-server-test <interface index>\n"); exit(0); } index = atoi(argv[1]); printf("Create DHCP server for interface %d\n", index); dhcp_server = g_dhcp_server_new(G_DHCP_IPV4, index, &error); if (dhcp_server == NULL) { handle_error(error); exit(0); } g_dhcp_server_set_debug(dhcp_server, dhcp_debug, "DHCP"); g_dhcp_server_set_lease_time(dhcp_server, 3600); g_dhcp_server_set_option(dhcp_server, G_DHCP_SUBNET, "255.255.0.0"); g_dhcp_server_set_option(dhcp_server, G_DHCP_ROUTER, "192.168.0.2"); g_dhcp_server_set_option(dhcp_server, G_DHCP_DNS_SERVER, "192.168.0.3"); g_dhcp_server_set_ip_range(dhcp_server, "192.168.0.101", "192.168.0.102"); main_loop = g_main_loop_new(NULL, FALSE); printf("Start DHCP Server operation\n"); g_dhcp_server_start(dhcp_server); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_term; sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); g_main_loop_run(main_loop); g_dhcp_server_unref(dhcp_server); g_main_loop_unref(main_loop); return 0; }
static int start_dhcp_server(struct connman_peer *peer) { const char *start_ip, *end_ip; GDHCPServerError dhcp_error; const char *broadcast; const char *gateway; const char *subnet; int prefixlen; int index; int err; DBG(""); err = -ENOMEM; if (peer->sub_device) index = connman_device_get_index(peer->sub_device); else index = connman_device_get_index(peer->device); peer->ip_pool = __connman_ippool_create(index, 2, 1, NULL, NULL); if (!peer->ip_pool) goto error; gateway = __connman_ippool_get_gateway(peer->ip_pool); subnet = __connman_ippool_get_subnet_mask(peer->ip_pool); broadcast = __connman_ippool_get_broadcast(peer->ip_pool); start_ip = __connman_ippool_get_start_ip(peer->ip_pool); end_ip = __connman_ippool_get_end_ip(peer->ip_pool); prefixlen = connman_ipaddress_calc_netmask_len(subnet); err = __connman_inet_modify_address(RTM_NEWADDR, NLM_F_REPLACE | NLM_F_ACK, index, AF_INET, gateway, NULL, prefixlen, broadcast); if (err < 0) goto error; peer->dhcp_server = g_dhcp_server_new(G_DHCP_IPV4, index, &dhcp_error); if (!peer->dhcp_server) goto error; g_dhcp_server_set_debug(peer->dhcp_server, dhcp_server_debug, "Peer DHCP server"); g_dhcp_server_set_lease_time(peer->dhcp_server, 3600); g_dhcp_server_set_option(peer->dhcp_server, G_DHCP_SUBNET, subnet); g_dhcp_server_set_option(peer->dhcp_server, G_DHCP_ROUTER, gateway); g_dhcp_server_set_option(peer->dhcp_server, G_DHCP_DNS_SERVER, NULL); g_dhcp_server_set_ip_range(peer->dhcp_server, start_ip, end_ip); err = g_dhcp_server_start(peer->dhcp_server); if (err < 0) goto error; g_timeout_add_seconds(0, dhcp_server_started, connman_peer_ref(peer)); return 0; error: stop_dhcp_server(peer); return err; }