5 * Copyright (C) 2007-2009 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
33 enum connman_dhcp_state state;
35 struct connman_element *element;
37 struct connman_dhcp_driver *driver;
43 * @dhcp: DHCP structure
45 * Increase reference counter of DHCP
47 struct connman_dhcp *connman_dhcp_ref(struct connman_dhcp *dhcp)
49 g_atomic_int_inc(&dhcp->refcount);
56 * @dhcp: DHCP structure
58 * Decrease reference counter of DHCP
60 void connman_dhcp_unref(struct connman_dhcp *dhcp)
62 if (g_atomic_int_dec_and_test(&dhcp->refcount) == TRUE)
67 * connman_dhcp_get_index:
68 * @dhcp: DHCP structure
70 * Get network index of DHCP
72 int connman_dhcp_get_index(struct connman_dhcp *dhcp)
78 * connman_dhcp_get_interface:
79 * @dhcp: DHCP structure
81 * Get network interface of DHCP
83 char *connman_dhcp_get_interface(struct connman_dhcp *dhcp)
85 return connman_inet_ifname(dhcp->index);
90 * @dhcp: DHCP structure
92 * Report successful bound of the interface
94 void connman_dhcp_bound(struct connman_dhcp *dhcp)
99 static GSList *driver_list = NULL;
101 static gint compare_priority(gconstpointer a, gconstpointer b)
103 const struct connman_dhcp_driver *driver1 = a;
104 const struct connman_dhcp_driver *driver2 = b;
106 return driver2->priority - driver1->priority;
110 * connman_dhcp_driver_register:
111 * @driver: DHCP driver definition
113 * Register a new DHCP driver
115 * Returns: %0 on success
117 int connman_dhcp_driver_register(struct connman_dhcp_driver *driver)
119 DBG("driver %p name %s", driver, driver->name);
121 driver_list = g_slist_insert_sorted(driver_list, driver,
128 * connman_dhcp_driver_unregister:
129 * @driver: DHCP driver definition
131 * Remove a previously registered DHCP driver
133 void connman_dhcp_driver_unregister(struct connman_dhcp_driver *driver)
135 DBG("driver %p name %s", driver, driver->name);
137 driver_list = g_slist_remove(driver_list, driver);
140 static int dhcp_probe(struct connman_element *element)
142 struct connman_dhcp *dhcp;
145 DBG("element %p name %s", element, element->name);
147 dhcp = g_try_new0(struct connman_dhcp, 1);
152 dhcp->index = element->index;
153 dhcp->state = CONNMAN_DHCP_STATE_IDLE;
155 dhcp->element = element;
157 connman_element_set_data(element, dhcp);
159 for (list = driver_list; list; list = list->next) {
160 struct connman_dhcp_driver *driver = list->data;
162 DBG("driver %p name %s", driver, driver->name);
164 if (driver->request(dhcp) == 0) {
165 dhcp->driver = driver;
170 if (dhcp->driver == NULL) {
171 connman_dhcp_unref(dhcp);
178 static void dhcp_remove(struct connman_element *element)
180 struct connman_dhcp *dhcp = connman_element_get_data(element);
182 DBG("element %p name %s", element, element->name);
184 connman_element_set_data(element, NULL);
187 dhcp->driver->release(dhcp);
191 connman_dhcp_unref(dhcp);
194 static struct connman_driver dhcp_driver = {
196 .type = CONNMAN_ELEMENT_TYPE_DHCP,
197 .priority = CONNMAN_DRIVER_PRIORITY_LOW,
199 .remove = dhcp_remove,
202 int __connman_dhcp_init(void)
204 return connman_driver_register(&dhcp_driver);
207 void __connman_dhcp_cleanup(void)
209 connman_driver_unregister(&dhcp_driver);