Add suppport for setting IPv4 configuration method
[platform/upstream/connman.git] / src / ipconfig.c
1 /*
2  *
3  *  Connection Manager
4  *
5  *  Copyright (C) 2007-2009  Intel Corporation. All rights reserved.
6  *
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.
10  *
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.
15  *
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
19  *
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <gdbus.h>
27
28 #include "connman.h"
29
30 struct connman_ipconfig {
31         gint refcount;
32         enum connman_ipconfig_method method;
33 };
34
35 /**
36  * connman_ipconfig_create:
37  *
38  * Allocate a new ipconfig structure.
39  *
40  * Returns: a newly-allocated #connman_ipconfig structure
41  */
42 struct connman_ipconfig *connman_ipconfig_create(void)
43 {
44         struct connman_ipconfig *ipconfig;
45
46         DBG("");
47
48         ipconfig = g_try_new0(struct connman_ipconfig, 1);
49         if (ipconfig == NULL)
50                 return NULL;
51
52         DBG("ipconfig %p", ipconfig);
53
54         return ipconfig;
55 }
56
57 /**
58  * connman_ipconfig_ref:
59  * @ipconfig: ipconfig structure
60  *
61  * Increase reference counter of ipconfig
62  */
63 struct connman_ipconfig *connman_ipconfig_ref(struct connman_ipconfig *ipconfig)
64 {
65         g_atomic_int_inc(&ipconfig->refcount);
66
67         return ipconfig;
68 }
69
70 /**
71  * connman_ipconfig_unref:
72  * @ipconfig: ipconfig structure
73  *
74  * Decrease reference counter of ipconfig
75  */
76 void connman_ipconfig_unref(struct connman_ipconfig *ipconfig)
77 {
78         if (g_atomic_int_dec_and_test(&ipconfig->refcount) == TRUE) {
79                 g_free(ipconfig);
80         }
81 }
82
83 const char *__connman_ipconfig_method2string(enum connman_ipconfig_method method)
84 {
85         switch (method) {
86         case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
87                 return "unknown";
88         case CONNMAN_IPCONFIG_METHOD_OFF:
89                 return "off";
90         case CONNMAN_IPCONFIG_METHOD_STATIC:
91                 return "static";
92         case CONNMAN_IPCONFIG_METHOD_DHCP:
93                 return "dhcp";
94         }
95
96         return "unknown";
97 }
98
99 enum connman_ipconfig_method __connman_ipconfig_string2method(const char *method)
100 {
101         if (g_strcmp0(method, "off") == 0)
102                 return CONNMAN_IPCONFIG_METHOD_OFF;
103         else if (g_strcmp0(method, "static") == 0)
104                 return CONNMAN_IPCONFIG_METHOD_STATIC;
105         else if (g_strcmp0(method, "dhcp") == 0)
106                 return CONNMAN_IPCONFIG_METHOD_DHCP;
107         else
108                 return CONNMAN_IPCONFIG_METHOD_UNKNOWN;
109 }
110
111 int __connman_ipconfig_set_ipv4(struct connman_ipconfig *ipconfig,
112                                 const char *key, DBusMessageIter *value)
113 {
114         int type = dbus_message_iter_get_arg_type(value);
115
116         DBG("ipconfig %p key %s type %d", ipconfig, key, type);
117
118         if (g_strcmp0(key, "Method") == 0) {
119                 const char *method;
120
121                 if (type != DBUS_TYPE_STRING)
122                         return -EINVAL;
123
124                 dbus_message_iter_get_basic(value, &method);
125
126                 ipconfig->method = __connman_ipconfig_string2method(method);
127         } else
128                 return -EINVAL;
129
130         return 0;
131 }
132
133 static GSList *driver_list = NULL;
134
135 static gint compare_priority(gconstpointer a, gconstpointer b)
136 {
137         const struct connman_ipconfig_driver *driver1 = a;
138         const struct connman_ipconfig_driver *driver2 = b;
139
140         return driver2->priority - driver1->priority;
141 }
142
143 /**
144  * connman_ipconfig_driver_register:
145  * @driver: IP configuration driver
146  *
147  * Register a new IP configuration driver
148  *
149  * Returns: %0 on success
150  */
151 int connman_ipconfig_driver_register(struct connman_ipconfig_driver *driver)
152 {
153         DBG("driver %p name %s", driver, driver->name);
154
155         driver_list = g_slist_insert_sorted(driver_list, driver,
156                                                         compare_priority);
157
158         return 0;
159 }
160
161 /**
162  * connman_ipconfig_driver_unregister:
163  * @driver: IP configuration driver
164  *
165  * Remove a previously registered IP configuration driver.
166  */
167 void connman_ipconfig_driver_unregister(struct connman_ipconfig_driver *driver)
168 {
169         DBG("driver %p name %s", driver, driver->name);
170
171         driver_list = g_slist_remove(driver_list, driver);
172 }