Support the up and coming dhcpcd-9.
[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 #ifndef DHCPCD_OSOCKET
46 #define DHCPCD_OSOCKET          "/var/run/dhcpcd.sock"
47 #endif
48 #ifndef DHCPCD_UNPRIV_OSOCKET
49 #define DHCPCD_UNPRIV_OSOCKET   "/var/run/dhcpcd.unpriv.sock"
50 #endif
51
52 #ifndef WPA_CTRL_DIR
53 #define WPA_CTRL_DIR            "/var/run/wpa_supplicant"
54 #endif
55
56 #ifndef DHCPCD_TMP_DIR
57 #define DHCPCD_TMP_DIR          "/tmp/dhcpcd"
58 #endif
59 #ifndef DHCPCD_TMP_DIR_PERM
60 #define DHCPCD_TMP_DIR_PERM     0700
61 #endif
62
63 #define DHCPCD_RETRYOPEN        100     /* milliseconds */
64 #define DHCPCD_WPA_PING         500     /* milliseconds */
65 #define DHCPCD_WPA_SCAN_LONG    60000   /* milliseconds */
66 #define DHCPCD_WPA_SCAN_SHORT   5000    /* milliseconds */
67 #define DHCPCD_WI_HIST_MAX      10      /* Recall 10 scans for averages */
68
69 /* Each non printable byte of the SSID is represented as \000 */
70 #define IF_SSIDSIZE             ((32 * 4) + 1)
71 #define IF_BSSIDSIZE            64
72 #define FLAGSIZE                64
73 #define TYPESIZE                8
74 #define REASONSIZE              16
75
76 #define WPA_FREQ_IS_2G(f)       ((f) >= 2402 && (f) <= 2472)
77 #define WPA_FREQ_IS_5G(f)       ((f) >= 5170 && (f) <= 5835)
78
79 #define DHC_UNKNOWN              0
80 #define DHC_DOWN                 1
81 #define DHC_OPENED               2
82 #define DHC_INITIALISED          3
83 #define DHC_DISCONNECTED         4
84 #define DHC_CONNECTING           5
85 #define DHC_AF_WAITING           6
86 #define DHC_CONNECTED            7
87 #define DHC_MAX                  8
88 extern const char * const dhcpcd_cstates[];
89
90 #define DHT_UNKNOWN              0
91 #define DHT_LINK                 1
92 #define DHT_DHCP                 2
93 #define DHT_IPV4                 2
94 #define DHT_IPV4LL               3
95 #define DHT_IPV6                 4
96 #define DHT_RA                   5
97 #define DHT_DHCP6                6
98 #define DHT_MAX                  7
99
100 #define DHS_UNKNOWN              0
101 #define DHS_DUMP                 1
102 #define DHS_TEST                 2
103 #define DHS_STOPPED              3
104 #define DHS_FAIL                 4
105 #define DHS_STOP                 5
106 #define DHS_PREINIT              6
107 #define DHS_DEPARTED             7
108 #define DHS_NOCARRIER            8
109 #define DHS_NAK                  9
110 #define DHS_EXPIRE              10
111 #define DHS_RECONFIGURE         11
112 #define DHS_CARRIER             12
113 #define DHS_STATIC              13
114 #define DHS_3RDPARTY            14
115 #define DHS_IPV4LL              15
116 #define DHS_INFORM              16
117 #define DHS_BOUND               17
118 #define DHS_RENEW               18
119 #define DHS_REBIND              19
120 #define DHS_REBOOT              20
121 #define DHS_ROUTERADVERT        21
122 #define DHS_DELEGATED           22
123 #define DHR_MAX                 23
124
125 typedef struct dhcpcd_wi_avs {
126         int value;
127         int average;
128 } DHCPCD_WI_AV;
129
130 typedef struct dhcpcd_wi_scan {
131         struct dhcpcd_wi_scan *next;
132         char bssid[IF_BSSIDSIZE];
133         unsigned int flags;
134 #define WSF_SECURE              0x001
135 #define WSF_PSK                 0x002
136 #define WSF_WEP                 0x010
137 #define WSF_WPA                 0x020
138 #define WSF_2G                  0x100
139 #define WSF_5G                  0x200
140         int frequency;
141         DHCPCD_WI_AV quality;
142         DHCPCD_WI_AV noise;
143         DHCPCD_WI_AV level;
144         DHCPCD_WI_AV strength;
145         char ssid[IF_SSIDSIZE];
146         char wpa_flags[FLAGSIZE];
147 } DHCPCD_WI_SCAN;
148
149 #ifdef IN_LIBDHCPCD
150 typedef struct dhcpcd_if {
151         struct dhcpcd_if *next;
152         const char *ifname;
153         unsigned int type;
154         unsigned int state;
155         const char *reason;
156
157         unsigned int ifflags;
158         bool up;
159         bool wireless;
160         const char *ssid;
161         int freq;
162
163         char *data;
164         size_t data_len;
165
166         char *last_message;
167
168         struct dhcpcd_connection *con;
169 } DHCPCD_IF;
170 #else
171 typedef struct dhcpcd_if {
172         struct dhcpcd_if *next;
173         const char *ifname;
174         unsigned int type;
175         unsigned int state;
176         const char *reason;
177
178         unsigned int ifflags;
179         bool up;
180         bool wireless;
181         const char *ssid;
182         int freq;
183 } DHCPCD_IF;
184 #endif
185
186 typedef struct dhcpcd_config {
187         struct dhcpcd_config *next;
188         char *option;
189         char *value;
190 } DHCPCD_OPTION;
191
192 #ifdef IN_LIBDHCPCD
193 typedef struct dhcpcd_wi_hist {
194         struct dhcpcd_wi_hist *next;
195         char ifname[IF_NAMESIZE];
196         char bssid[IF_BSSIDSIZE];
197         int quality;
198         int noise;
199         int level;
200         int strength;
201 } DHCPCD_WI_HIST;
202
203 typedef struct dhcpcd_wpa {
204         struct dhcpcd_wpa *next;
205         char ifname[IF_NAMESIZE];
206         unsigned int status;
207         int command_fd;
208         char *command_path;
209         int listen_fd;
210         char *listen_path;
211         bool attached;
212         struct dhcpcd_connection *con;
213 } DHCPCD_WPA;
214
215 typedef struct dhcpcd_connection {
216         struct dhcpcd_connection *next;
217         bool open;
218         bool privileged;
219         int command_fd;
220         int listen_fd;
221         const char *progname;
222
223         DHCPCD_IF *interfaces;
224         DHCPCD_WPA *wpa;
225         DHCPCD_WI_HIST *wi_history;
226
227         void (*if_cb)(DHCPCD_IF *, void *);
228         void *if_context;
229         void (*status_cb)(struct dhcpcd_connection *,
230             unsigned int, const char *, void *);
231         void *status_context;
232         bool wpa_started;
233         void (*wi_scanresults_cb)(DHCPCD_WPA *, void *);
234         void *wi_scanresults_context;
235         void (*wpa_status_cb)(DHCPCD_WPA *, unsigned int, const char *, void *);
236         void *wpa_status_context;
237
238         char *buf;
239         size_t buflen;
240
241         char *version;
242         bool terminate_commands;
243         char *error;
244         int err;
245         int errors;
246         unsigned int status;
247         bool af_waiting;
248
249         char *cffile;
250 } DHCPCD_CONNECTION;
251
252 #else
253 typedef void *DHCPCD_CONFIG;
254 typedef void *DHCPCD_WPA;
255 typedef void *DHCPCD_CONNECTION;
256 #endif
257
258 DHCPCD_CONNECTION * dhcpcd_new(void);
259 const char * dhcpcd_version(DHCPCD_CONNECTION *);
260 void dhcpcd_set_progname(DHCPCD_CONNECTION *, const char *);
261 const char * dhcpcd_get_progname(const DHCPCD_CONNECTION *);
262 unsigned int dhcpcd_status(DHCPCD_CONNECTION *, const char **);
263 bool dhcpcd_af_waiting(const DHCPCD_CONNECTION *);
264 const char * dhcpcd_cffile(DHCPCD_CONNECTION *);
265 bool dhcpcd_realloc(DHCPCD_CONNECTION *, size_t);
266 int dhcpcd_open(DHCPCD_CONNECTION *, bool priv);
267 void dhcpcd_close(DHCPCD_CONNECTION *);
268 void dhcpcd_free(DHCPCD_CONNECTION *);
269 void dhcpcd_set_if_callback(DHCPCD_CONNECTION *,
270     void (*)(DHCPCD_IF *, void *), void *);
271 void dhcpcd_set_status_callback(DHCPCD_CONNECTION *,
272     void (*)(DHCPCD_CONNECTION *, unsigned int, const char *, void *), void *);
273 int dhcpcd_get_fd(DHCPCD_CONNECTION *);
274 bool dhcpcd_privileged(DHCPCD_CONNECTION *);
275 void dhcpcd_dispatch(DHCPCD_CONNECTION *);
276 DHCPCD_IF * dhcpcd_interfaces(DHCPCD_CONNECTION *);
277 char **dhcpcd_interface_names(DHCPCD_CONNECTION *, size_t *);
278 void dhcpcd_freev(char **);
279 char **dhcpcd_interface_names_sorted(DHCPCD_CONNECTION *);
280 DHCPCD_IF * dhcpcd_get_if(DHCPCD_CONNECTION *, const char *, unsigned int);
281 DHCPCD_CONNECTION * dhcpcd_if_connection(DHCPCD_IF *);
282 const char *dhcpcd_get_value(const DHCPCD_IF *, const char *);
283 const char *dhcpcd_get_prefix_value(const DHCPCD_IF *, const char *,
284     const char *);
285 ssize_t dhcpcd_encode_string_escape(char *, size_t, const char *, size_t);
286 ssize_t dhcpcd_decode_string_escape(char *, size_t, const char *);
287 ssize_t dhcpcd_decode_hex(char *, size_t, const char *);
288 char * dhcpcd_if_message(DHCPCD_IF *, bool *);
289
290 ssize_t dhcpcd_command(DHCPCD_CONNECTION *, const char *, char **);
291 ssize_t dhcpcd_command_arg(DHCPCD_CONNECTION *, const char *, const char *,
292     char **);
293 #define dhcpcd_rebind(c, i)     dhcpcd_command_arg((c), "-n", (i), NULL)
294 #define dhcpcd_release(c, i)    dhcpcd_command_arg((c), "-k", (i), NULL)
295
296 void dhcpcd_wpa_start(DHCPCD_CONNECTION *);
297 DHCPCD_WPA *dhcpcd_wpa_find(DHCPCD_CONNECTION *, const char *);
298 DHCPCD_WPA *dhcpcd_wpa_new(DHCPCD_CONNECTION *, const char *);
299 DHCPCD_CONNECTION *dhcpcd_wpa_connection(DHCPCD_WPA *);
300 int dhcpcd_wpa_open(DHCPCD_WPA *);
301 void dhcpcd_wpa_close(DHCPCD_WPA *);
302 void dhcpcd_wpa_dispatch(DHCPCD_WPA *);
303 int dhcpcd_wpa_get_fd(DHCPCD_WPA *);
304 DHCPCD_IF *dhcpcd_wpa_if(DHCPCD_WPA *);
305 void dhcpcd_wpa_if_event(DHCPCD_IF *);
306 void dhcpcd_wpa_set_scan_callback(DHCPCD_CONNECTION *,
307     void (*)(DHCPCD_WPA *, void *), void *);
308 void dhcpcd_wpa_set_status_callback(DHCPCD_CONNECTION *,
309     void (*)(DHCPCD_WPA *, unsigned int, const char *, void *), void *);
310 int dhcpcd_wi_scan_compare(DHCPCD_WI_SCAN *a, DHCPCD_WI_SCAN *b);
311 DHCPCD_WI_SCAN * dhcpcd_wi_scans(DHCPCD_IF *);
312 bool dhcpcd_wi_associated(DHCPCD_IF *i, DHCPCD_WI_SCAN *s);
313 void dhcpcd_wi_scans_free(DHCPCD_WI_SCAN *);
314 void dhcpcd_wi_history_clear(DHCPCD_CONNECTION *);
315 bool dhcpcd_wpa_set_network(DHCPCD_WPA *, int, const char *, const char *);
316 int dhcpcd_wpa_find_network_new(DHCPCD_WPA *, const char *);
317 bool dhcpcd_wpa_command(DHCPCD_WPA *, const char *);
318 bool dhcpcd_wpa_command_arg(DHCPCD_WPA *, const char *, const char *);
319 unsigned int dhcpcd_wpa_status(DHCPCD_WPA *, const char **);
320 int dhcpcd_wpa_freq(DHCPCD_WPA *);
321 #define WST_BSSID       0x01
322 #define WST_FLAGS       0x02
323 #define WST_FREQ        0x03
324 int dhcpcd_wi_print_tooltip(char *, size_t, DHCPCD_WI_SCAN *, unsigned int);
325
326 bool dhcpcd_wpa_ping(DHCPCD_WPA *);
327 bool dhcpcd_wpa_can_background_scan(DHCPCD_WPA *);
328 bool dhcpcd_wpa_scan(DHCPCD_WPA *);
329 bool dhcpcd_wpa_reconfigure(DHCPCD_WPA *);
330 bool dhcpcd_wpa_reassociate(DHCPCD_WPA *);
331 bool dhcpcd_wpa_disconnect(DHCPCD_WPA *);
332 bool dhcpcd_wpa_config_write(DHCPCD_WPA *);
333 int dhcpcd_wpa_network_find_new(DHCPCD_WPA *, const char *);
334 bool dhcpcd_wpa_network_disable(DHCPCD_WPA *, int);
335 bool dhcpcd_wpa_network_enable(DHCPCD_WPA *, int);
336 bool dhcpcd_wpa_network_select(DHCPCD_WPA *, int);
337 bool dhcpcd_wpa_network_remove(DHCPCD_WPA *, int);
338 char * dhcpcd_wpa_network_get(DHCPCD_WPA *, int, const char *);
339 bool dhcpcd_wpa_network_set(DHCPCD_WPA *, int, const char *, const char *);
340
341 #define DHCPCD_WPA_SUCCESS       0
342 #define DHCPCD_WPA_ERR          -1
343 #define DHCPCD_WPA_ERR_SET      -2
344 #define DHCPCD_WPA_ERR_SET_PSK  -3
345 #define DHCPCD_WPA_ERR_ENABLE   -4
346 #define DHCPCD_WPA_ERR_WRITE    -5
347 #define DHCPCD_WPA_ERR_SELECT   -6
348 #define DHCPCD_WPA_ERR_ASSOC    -7
349 #define DHCPCD_WPA_ERR_DISCONN  -8
350 #define DHCPCD_WPA_ERR_RECONF   -9
351 int dhcpcd_wpa_configure(DHCPCD_WPA *w, DHCPCD_WI_SCAN *s, const char *p);
352 int dhcpcd_wpa_select(DHCPCD_WPA *w, DHCPCD_WI_SCAN *s);
353
354 char ** dhcpcd_config_blocks(DHCPCD_CONNECTION *, const char *);
355 DHCPCD_OPTION *dhcpcd_config_read(DHCPCD_CONNECTION *,
356     const char *, const char *);
357 void dhcpcd_config_free(DHCPCD_OPTION *);
358 const char * dhcpcd_config_get(DHCPCD_OPTION *, const char *);
359 const char * dhcpcd_config_get_static(DHCPCD_OPTION *, const char *);
360 bool dhcpcd_config_set(DHCPCD_OPTION **, const char *, const char *);
361 bool dhcpcd_config_set_static(DHCPCD_OPTION **, const char *, const char *);
362 bool dhcpcd_config_writeable(DHCPCD_CONNECTION *con);
363 bool dhcpcd_config_write(DHCPCD_CONNECTION *,
364     const char *, const char *, const DHCPCD_OPTION *);
365
366 #ifdef __cplusplus
367 }
368 #endif
369
370 #endif