Add support for STATIC6
[dhcpcd-ui] / src / libdhcpcd / dhcpcd.h
1 /*
2  * libdhcpcd
3  * Copyright 2009-2015 Roy Marples <roy@marples.name>
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26
27 #ifndef DHCPCD_H
28 #define DHCPCD_H
29
30 #include <net/if.h>
31 #include <netinet/in.h>
32
33 #include <stdbool.h>
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 #ifndef DHCPCD_SOCKET
40 #define DHCPCD_SOCKET           "/var/run/dhcpcd.sock"
41 #endif
42 #ifndef DHCPCD_UNPRIV_SOCKET
43 #define DHCPCD_UNPRIV_SOCKET    "/var/run/dhcpcd.unpriv.sock"
44 #endif
45
46 #ifndef WPA_CTRL_DIR
47 #define WPA_CTRL_DIR            "/var/run/wpa_supplicant"
48 #endif
49
50 #ifndef DHCPCD_TMP_DIR
51 #define DHCPCD_TMP_DIR          "/tmp/dhcpcd"
52 #endif
53 #ifndef DHCPCD_TMP_DIR_PERM
54 #define DHCPCD_TMP_DIR_PERM     0700
55 #endif
56
57 #define DHCPCD_RETRYOPEN        100     /* milliseconds */
58 #define DHCPCD_WPA_PING         500     /* milliseconds */
59 #define DHCPCD_WPA_SCAN_LONG    60000   /* milliseconds */
60 #define DHCPCD_WPA_SCAN_SHORT   5000    /* milliseconds */
61 #define DHCPCD_WI_HIST_MAX      10      /* Recall 10 scans for averages */
62
63 /* Each non printable byte of the SSID is represented as \000 */
64 #define IF_SSIDSIZE             ((32 * 4) + 1)
65 #define IF_BSSIDSIZE            64
66 #define FLAGSIZE                64
67 #define TYPESIZE                8
68 #define REASONSIZE              16
69
70 #define DHC_UNKNOWN              0
71 #define DHC_DOWN                 1
72 #define DHC_OPENED               2
73 #define DHC_INITIALISED          3
74 #define DHC_DISCONNECTED         4
75 #define DHC_CONNECTING           5
76 #define DHC_AF_WAITING           6
77 #define DHC_CONNECTED            7
78 #define DHC_MAX                  8
79 extern const char * const dhcpcd_cstates[];
80
81 #define DHT_UNKNOWN              0
82 #define DHT_LINK                 1
83 #define DHT_DHCP                 2
84 #define DHT_IPV4                 2
85 #define DHT_IPV4LL               3
86 #define DHT_IPV6                 4
87 #define DHT_RA                   5
88 #define DHT_DHCP6                6
89 #define DHT_MAX                  7
90
91 #define DHS_UNKNOWN              0
92 #define DHS_DUMP                 1
93 #define DHS_TEST                 2
94 #define DHS_STOPPED              3
95 #define DHS_FAIL                 4
96 #define DHS_STOP                 5
97 #define DHS_PREINIT              6
98 #define DHS_DEPARTED             7
99 #define DHS_NOCARRIER            8
100 #define DHS_NAK                  9
101 #define DHS_EXPIRE              10
102 #define DHS_RECONFIGURE         11
103 #define DHS_CARRIER             12
104 #define DHS_STATIC              13
105 #define DHS_3RDPARTY            14
106 #define DHS_IPV4LL              15
107 #define DHS_INFORM              16
108 #define DHS_BOUND               17
109 #define DHS_RENEW               18
110 #define DHS_REBIND              19
111 #define DHS_REBOOT              20
112 #define DHS_ROUTERADVERT        21
113 #define DHS_DELEGATED           22
114 #define DHR_MAX                 23
115
116 typedef struct dhcpcd_wi_avs {
117         int value;
118         int average;
119 } DHCPCD_WI_AV;
120
121 typedef struct dhcpcd_wi_scan {
122         struct dhcpcd_wi_scan *next;
123         char bssid[IF_BSSIDSIZE];
124         int flags;
125 #define WSF_SECURE              0x01
126 #define WSF_PSK                 0x02
127 #define WSF_WEP                 0x10
128 #define WSF_WPA                 0x20
129         int frequency;
130         DHCPCD_WI_AV quality;
131         DHCPCD_WI_AV noise;
132         DHCPCD_WI_AV level;
133         DHCPCD_WI_AV strength;
134         char ssid[IF_SSIDSIZE];
135         char wpa_flags[FLAGSIZE];
136 } DHCPCD_WI_SCAN;
137
138 #ifdef IN_LIBDHCPCD
139 typedef struct dhcpcd_if {
140         struct dhcpcd_if *next;
141         const char *ifname;
142         unsigned int type;
143         unsigned int state;
144         const char *reason;
145
146         unsigned int ifflags;
147         bool up;
148         bool wireless;
149         const char *ssid;
150
151         char *data;
152         size_t data_len;
153
154         char *last_message;
155
156         struct dhcpcd_connection *con;
157 } DHCPCD_IF;
158 #else
159 typedef struct dhcpcd_if {
160         struct dhcpcd_if *next;
161         const char *ifname;
162         unsigned int type;
163         unsigned int state;
164         const char *reason;
165
166         unsigned int ifflags;
167         bool up;
168         bool wireless;
169         const char *ssid;
170 } DHCPCD_IF;
171 #endif
172
173 typedef struct dhcpcd_config {
174         struct dhcpcd_config *next;
175         char *option;
176         char *value;
177 } DHCPCD_OPTION;
178
179 #ifdef IN_LIBDHCPCD
180 typedef struct dhcpcd_wi_hist {
181         struct dhcpcd_wi_hist *next;
182         char ifname[IF_NAMESIZE];
183         char bssid[IF_BSSIDSIZE];
184         int quality;
185         int noise;
186         int level;
187         int strength;
188 } DHCPCD_WI_HIST;
189
190 typedef struct dhcpcd_wpa {
191         struct dhcpcd_wpa *next;
192         char ifname[IF_NAMESIZE];
193         unsigned int status;
194         int command_fd;
195         char *command_path;
196         int listen_fd;
197         char *listen_path;
198         bool attached;
199         struct dhcpcd_connection *con;
200 } DHCPCD_WPA;
201
202 typedef struct dhcpcd_connection {
203         struct dhcpcd_connection *next;
204         bool open;
205         bool privileged;
206         int command_fd;
207         int listen_fd;
208         const char *progname;
209
210         DHCPCD_IF *interfaces;
211         DHCPCD_WPA *wpa;
212         DHCPCD_WI_HIST *wi_history;
213
214         void (*if_cb)(DHCPCD_IF *, void *);
215         void *if_context;
216         void (*status_cb)(struct dhcpcd_connection *,
217             unsigned int, const char *, void *);
218         void *status_context;
219         bool wpa_started;
220         void (*wi_scanresults_cb)(DHCPCD_WPA *, void *);
221         void *wi_scanresults_context;
222         void (*wpa_status_cb)(DHCPCD_WPA *, unsigned int, const char *, void *);
223         void *wpa_status_context;
224
225         char *buf;
226         size_t buflen;
227
228         char *version;
229         bool terminate_commands;
230         char *error;
231         int err;
232         int errors;
233         unsigned int status;
234         bool af_waiting;
235
236         char *cffile;
237 } DHCPCD_CONNECTION;
238
239 #else
240 typedef void *DHCPCD_CONFIG;
241 typedef void *DHCPCD_WPA;
242 typedef void *DHCPCD_CONNECTION;
243 #endif
244
245 DHCPCD_CONNECTION * dhcpcd_new(void);
246 const char * dhcpcd_version(DHCPCD_CONNECTION *);
247 void dhcpcd_set_progname(DHCPCD_CONNECTION *, const char *);
248 const char * dhcpcd_get_progname(const DHCPCD_CONNECTION *);
249 unsigned int dhcpcd_status(DHCPCD_CONNECTION *, const char **);
250 bool dhcpcd_af_waiting(const DHCPCD_CONNECTION *);
251 const char * dhcpcd_cffile(DHCPCD_CONNECTION *);
252 bool dhcpcd_realloc(DHCPCD_CONNECTION *, size_t);
253 int dhcpcd_open(DHCPCD_CONNECTION *, bool priv);
254 void dhcpcd_close(DHCPCD_CONNECTION *);
255 void dhcpcd_free(DHCPCD_CONNECTION *);
256 void dhcpcd_set_if_callback(DHCPCD_CONNECTION *,
257     void (*)(DHCPCD_IF *, void *), void *);
258 void dhcpcd_set_status_callback(DHCPCD_CONNECTION *,
259     void (*)(DHCPCD_CONNECTION *, unsigned int, const char *, void *), void *);
260 int dhcpcd_get_fd(DHCPCD_CONNECTION *);
261 bool dhcpcd_privileged(DHCPCD_CONNECTION *);
262 void dhcpcd_dispatch(DHCPCD_CONNECTION *);
263 DHCPCD_IF * dhcpcd_interfaces(DHCPCD_CONNECTION *);
264 char **dhcpcd_interface_names(DHCPCD_CONNECTION *, size_t *);
265 void dhcpcd_freev(char **);
266 char **dhcpcd_interface_names_sorted(DHCPCD_CONNECTION *);
267 DHCPCD_IF * dhcpcd_get_if(DHCPCD_CONNECTION *, const char *, unsigned int);
268 DHCPCD_CONNECTION * dhcpcd_if_connection(DHCPCD_IF *);
269 const char *dhcpcd_get_value(const DHCPCD_IF *, const char *);
270 const char *dhcpcd_get_prefix_value(const DHCPCD_IF *, const char *,
271     const char *);
272 ssize_t dhcpcd_encode_string_escape(char *, size_t, const char *, size_t);
273 ssize_t dhcpcd_decode_string_escape(char *, size_t, const char *);
274 ssize_t dhcpcd_decode_hex(char *, size_t, const char *);
275 char * dhcpcd_if_message(DHCPCD_IF *, bool *);
276
277 ssize_t dhcpcd_command(DHCPCD_CONNECTION *, const char *, char **);
278 ssize_t dhcpcd_command_arg(DHCPCD_CONNECTION *, const char *, const char *,
279     char **);
280 #define dhcpcd_rebind(c, i)     dhcpcd_command_arg((c), "-n", (i), NULL)
281 #define dhcpcd_release(c, i)    dhcpcd_command_arg((c), "-k", (i), NULL)
282
283 void dhcpcd_wpa_start(DHCPCD_CONNECTION *);
284 DHCPCD_WPA *dhcpcd_wpa_find(DHCPCD_CONNECTION *, const char *);
285 DHCPCD_WPA *dhcpcd_wpa_new(DHCPCD_CONNECTION *, const char *);
286 DHCPCD_CONNECTION *dhcpcd_wpa_connection(DHCPCD_WPA *);
287 int dhcpcd_wpa_open(DHCPCD_WPA *);
288 void dhcpcd_wpa_close(DHCPCD_WPA *);
289 void dhcpcd_wpa_dispatch(DHCPCD_WPA *);
290 int dhcpcd_wpa_get_fd(DHCPCD_WPA *);
291 DHCPCD_IF *dhcpcd_wpa_if(DHCPCD_WPA *);
292 void dhcpcd_wpa_if_event(DHCPCD_IF *);
293 void dhcpcd_wpa_set_scan_callback(DHCPCD_CONNECTION *,
294     void (*)(DHCPCD_WPA *, void *), void *);
295 void dhcpcd_wpa_set_status_callback(DHCPCD_CONNECTION *,
296     void (*)(DHCPCD_WPA *, unsigned int, const char *, void *), void *);
297 int dhcpcd_wi_scan_compare(DHCPCD_WI_SCAN *a, DHCPCD_WI_SCAN *b);
298 DHCPCD_WI_SCAN * dhcpcd_wi_scans(DHCPCD_IF *);
299 bool dhcpcd_wi_associated(DHCPCD_IF *i, DHCPCD_WI_SCAN *s);
300 void dhcpcd_wi_scans_free(DHCPCD_WI_SCAN *);
301 void dhcpcd_wi_history_clear(DHCPCD_CONNECTION *);
302 bool dhcpcd_wpa_set_network(DHCPCD_WPA *, int, const char *, const char *);
303 int dhcpcd_wpa_find_network_new(DHCPCD_WPA *, const char *);
304 bool dhcpcd_wpa_command(DHCPCD_WPA *, const char *);
305 bool dhcpcd_wpa_command_arg(DHCPCD_WPA *, const char *, const char *);
306 unsigned int dhcpcd_wpa_status(DHCPCD_WPA *, const char **);
307
308 bool dhcpcd_wpa_ping(DHCPCD_WPA *);
309 bool dhcpcd_wpa_can_background_scan(DHCPCD_WPA *);
310 bool dhcpcd_wpa_scan(DHCPCD_WPA *);
311 bool dhcpcd_wpa_reconfigure(DHCPCD_WPA *);
312 bool dhcpcd_wpa_reassociate(DHCPCD_WPA *);
313 bool dhcpcd_wpa_disconnect(DHCPCD_WPA *);
314 bool dhcpcd_wpa_config_write(DHCPCD_WPA *);
315 int dhcpcd_wpa_network_find_new(DHCPCD_WPA *, const char *);
316 bool dhcpcd_wpa_network_disable(DHCPCD_WPA *, int);
317 bool dhcpcd_wpa_network_enable(DHCPCD_WPA *, int);
318 bool dhcpcd_wpa_network_select(DHCPCD_WPA *, int);
319 bool dhcpcd_wpa_network_remove(DHCPCD_WPA *, int);
320 char * dhcpcd_wpa_network_get(DHCPCD_WPA *, int, const char *);
321 bool dhcpcd_wpa_network_set(DHCPCD_WPA *, int, const char *, const char *);
322
323 #define DHCPCD_WPA_SUCCESS       0
324 #define DHCPCD_WPA_ERR          -1
325 #define DHCPCD_WPA_ERR_SET      -2
326 #define DHCPCD_WPA_ERR_SET_PSK  -3
327 #define DHCPCD_WPA_ERR_ENABLE   -4
328 #define DHCPCD_WPA_ERR_WRITE    -5
329 #define DHCPCD_WPA_ERR_SELECT   -6
330 #define DHCPCD_WPA_ERR_ASSOC    -7
331 #define DHCPCD_WPA_ERR_DISCONN  -8
332 #define DHCPCD_WPA_ERR_RECONF   -9
333 int dhcpcd_wpa_configure(DHCPCD_WPA *w, DHCPCD_WI_SCAN *s, const char *p);
334 int dhcpcd_wpa_select(DHCPCD_WPA *w, DHCPCD_WI_SCAN *s);
335
336 char ** dhcpcd_config_blocks(DHCPCD_CONNECTION *, const char *);
337 DHCPCD_OPTION *dhcpcd_config_read(DHCPCD_CONNECTION *,
338     const char *, const char *);
339 void dhcpcd_config_free(DHCPCD_OPTION *);
340 const char * dhcpcd_config_get(DHCPCD_OPTION *, const char *);
341 const char * dhcpcd_config_get_static(DHCPCD_OPTION *, const char *);
342 bool dhcpcd_config_set(DHCPCD_OPTION **, const char *, const char *);
343 bool dhcpcd_config_set_static(DHCPCD_OPTION **, const char *, const char *);
344 bool dhcpcd_config_writeable(DHCPCD_CONNECTION *con);
345 bool dhcpcd_config_write(DHCPCD_CONNECTION *,
346     const char *, const char *, const DHCPCD_OPTION *);
347
348 #ifdef __cplusplus
349 }
350 #endif
351
352 #endif