5 * Copyright (C) 2007-2010 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
30 #define CONNMAN_API_SUBJECT_TO_CHANGE
31 #include <connman/plugin.h>
32 #include <connman/dhcp.h>
33 #include <connman/utsname.h>
34 #include <connman/log.h>
38 static void no_lease_cb(GDHCPClient *dhcp_client, gpointer user_data)
40 struct connman_dhcp *dhcp = user_data;
42 DBG("No Lease Available!");
44 connman_dhcp_fail(dhcp);
47 static void lease_available_cb(GDHCPClient *dhcp_client, gpointer user_data)
49 struct connman_dhcp *dhcp = user_data;
50 GList *list, *option = NULL;
51 char *address, *nameservers;
54 address = g_dhcp_client_get_address(dhcp_client);
56 connman_dhcp_set_value(dhcp, "Address", address);
58 option = g_dhcp_client_get_option(dhcp_client, G_DHCP_SUBNET);
60 connman_dhcp_set_value(dhcp, "Netmask", (char *) option->data);
62 option = g_dhcp_client_get_option(dhcp_client, G_DHCP_DNS_SERVER);
63 for (list = option; list; list = list->next)
64 ns_strlen += strlen((char *) list->data) + 2;
65 nameservers = g_try_malloc0(ns_strlen);
67 char *ns_index = nameservers;
69 for (list = option; list; list = list->next) {
70 sprintf(ns_index, "%s ", (char *) list->data);
71 ns_index += strlen((char *) list->data) + 1;
74 connman_dhcp_set_value(dhcp, "Nameserver", nameservers);
78 option = g_dhcp_client_get_option(dhcp_client, G_DHCP_ROUTER);
80 connman_dhcp_set_value(dhcp, "Gateway", (char *) option->data);
82 option = g_dhcp_client_get_option(dhcp_client, G_DHCP_HOST_NAME);
84 connman_dhcp_set_value(dhcp, "Hostname", (char *) option->data);
86 connman_dhcp_bound(dhcp);
89 static int dhcp_request(struct connman_dhcp *dhcp)
91 GDHCPClient *dhcp_client;
92 GDHCPClientError error;
97 index = connman_dhcp_get_index(dhcp);
99 dhcp_client = g_dhcp_client_new(G_DHCP_IPV4, index, &error);
100 if (error != G_DHCP_CLIENT_ERROR_NONE)
103 g_dhcp_client_set_send(dhcp_client, G_DHCP_HOST_NAME,
104 connman_utsname_get_hostname());
106 g_dhcp_client_set_request(dhcp_client, G_DHCP_HOST_NAME);
107 g_dhcp_client_set_request(dhcp_client, G_DHCP_SUBNET);
108 g_dhcp_client_set_request(dhcp_client, G_DHCP_DNS_SERVER);
109 g_dhcp_client_set_request(dhcp_client, G_DHCP_NTP_SERVER);
110 g_dhcp_client_set_request(dhcp_client, G_DHCP_ROUTER);
112 g_dhcp_client_register_event(dhcp_client,
113 G_DHCP_CLIENT_EVENT_LEASE_AVAILABLE,
114 lease_available_cb, dhcp);
116 g_dhcp_client_register_event(dhcp_client,
117 G_DHCP_CLIENT_EVENT_NO_LEASE, no_lease_cb, dhcp);
119 connman_dhcp_set_data(dhcp, dhcp_client);
121 g_dhcp_client_ref(dhcp_client);
123 return g_dhcp_client_start(dhcp_client);
126 static int dhcp_release(struct connman_dhcp *dhcp)
128 GDHCPClient *dhcp_client = connman_dhcp_get_data(dhcp);
130 DBG("dhcp %p", dhcp);
132 g_dhcp_client_stop(dhcp_client);
133 g_dhcp_client_unref(dhcp_client);
138 static struct connman_dhcp_driver dhcp_driver = {
140 .priority = CONNMAN_DHCP_PRIORITY_DEFAULT,
141 .request = dhcp_request,
142 .release = dhcp_release,
145 static int dhcp_init(void)
147 return connman_dhcp_driver_register(&dhcp_driver);
150 static void dhcp_exit(void)
152 connman_dhcp_driver_unregister(&dhcp_driver);
155 CONNMAN_PLUGIN_DEFINE(dhcp, "Generic DHCP plugin", VERSION,
156 CONNMAN_PLUGIN_PRIORITY_LOW, dhcp_init, dhcp_exit)