Don't rely on the interface being up to background scan.
[dhcpcd-ui] / src / libdhcpcd / dhcpcd.h
1 /*
2  * libdhcpcd
3  * Copyright 2009-2014 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 #define DHCPCD_RETRYOPEN        100     /* milliseconds */
51 #define DHCPCD_WPA_PING         500     /* milliseconds */
52 #define DHCPCD_WPA_SCAN_LONG    60000   /* milliseconds */
53 #define DHCPCD_WPA_SCAN_SHORT   5000    /* milliseconds */
54 #define DHCPCD_WI_HIST_MAX      10      /* Recall 10 scans for averages */
55
56 /* Each non printable byte of the SSID is represented as \000 */
57 #define IF_SSIDSIZE             ((32 * 4) + 1)
58 #define IF_BSSIDSIZE            64
59 #define FLAGSIZE                64
60 #define TYPESIZE                8
61 #define REASONSIZE              16
62
63 typedef struct dhcpcd_wi_avs {
64         int value;
65         int average;
66 } DHCPCD_WI_AV;
67
68 typedef struct dhcpcd_wi_scan {
69         struct dhcpcd_wi_scan *next;
70         char bssid[IF_BSSIDSIZE];
71         int flags;
72 #define WSF_SECURE              0x01
73 #define WSF_PSK                 0x02
74 #define WSF_WEP                 0x10
75 #define WSF_WPA                 0x20
76         int frequency;
77         DHCPCD_WI_AV quality;
78         DHCPCD_WI_AV noise;
79         DHCPCD_WI_AV level;
80         DHCPCD_WI_AV strength;
81         char ssid[IF_SSIDSIZE];
82         char wpa_flags[FLAGSIZE];
83 } DHCPCD_WI_SCAN;
84
85 #ifdef IN_LIBDHCPCD
86 typedef struct dhcpcd_if {
87         struct dhcpcd_if *next;
88         const char *ifname;
89         const char *type;
90         const char *reason;
91
92         unsigned int flags;
93         bool up;
94         bool wireless;
95         const char *ssid;
96
97         char *data;
98         size_t data_len;
99
100         char *last_message;
101
102         struct dhcpcd_connection *con;
103 } DHCPCD_IF;
104 #else
105 typedef struct dhcpcd_if {
106         struct dhcpcd_if *next;
107         const char *ifname;
108         const char *type;
109         const char *reason;
110
111         int flags;
112         bool up;
113         bool wireless;
114         const char *ssid;
115 } DHCPCD_IF;
116 #endif
117
118 typedef struct dhcpcd_config {
119         struct dhcpcd_config *next;
120         char *option;
121         char *value;
122 } DHCPCD_OPTION;
123
124 #ifdef IN_LIBDHCPCD
125 typedef struct dhcpcd_wi_hist {
126         struct dhcpcd_wi_hist *next;
127         char ifname[IF_NAMESIZE];
128         char bssid[IF_BSSIDSIZE];
129         int quality;
130         int noise;
131         int level;
132         int strength;
133 } DHCPCD_WI_HIST;
134
135 typedef struct dhcpcd_wpa {
136         struct dhcpcd_wpa *next;
137         char ifname[IF_NAMESIZE];
138         bool open;
139         int command_fd;
140         char *command_path;
141         int listen_fd;
142         char *listen_path;
143         bool attached;
144         struct dhcpcd_connection *con;
145 } DHCPCD_WPA;
146
147 typedef struct dhcpcd_connection {
148         struct dhcpcd_connection *next;
149         bool open;
150         bool privileged;
151         int command_fd;
152         int listen_fd;
153         const char *progname;
154
155         DHCPCD_IF *interfaces;
156         DHCPCD_WPA *wpa;
157         DHCPCD_WI_HIST *wi_history;
158
159         void (*if_cb)(DHCPCD_IF *, void *);
160         void *if_context;
161         void (*status_cb)(struct dhcpcd_connection *, const char *, void *);
162         void *status_context;
163         bool wpa_started;
164         void (*wi_scanresults_cb)(DHCPCD_WPA *, void *);
165         void *wi_scanresults_context;
166         void (*wpa_status_cb)(DHCPCD_WPA *, const char *, void *);
167         void *wpa_status_context;
168
169         char *buf;
170         size_t buflen;
171
172         char *version;
173         bool terminate_commands;
174         char *error;
175         int err;
176         int errors;
177         const char *status;
178
179         char *cffile;
180 } DHCPCD_CONNECTION;
181
182 #else
183 typedef void *DHCPCD_CONFIG;
184 typedef void *DHCPCD_WPA;
185 typedef void *DHCPCD_CONNECTION;
186 #endif
187
188 DHCPCD_CONNECTION * dhcpcd_new(void);
189 const char * dhcpcd_version(DHCPCD_CONNECTION *);
190 void dhcpcd_set_progname(DHCPCD_CONNECTION *, const char *);
191 const char * dhcpcd_get_progname(const DHCPCD_CONNECTION *);
192 const char * dhcpcd_status(DHCPCD_CONNECTION *);
193 const char * dhcpcd_cffile(DHCPCD_CONNECTION *);
194 bool dhcpcd_realloc(DHCPCD_CONNECTION *, size_t);
195 int dhcpcd_open(DHCPCD_CONNECTION *, bool priv);
196 void dhcpcd_close(DHCPCD_CONNECTION *);
197 void dhcpcd_free(DHCPCD_CONNECTION *);
198 void dhcpcd_set_if_callback(DHCPCD_CONNECTION *,
199     void (*)(DHCPCD_IF *, void *), void *);
200 void dhcpcd_set_status_callback(DHCPCD_CONNECTION *,
201     void (*)(DHCPCD_CONNECTION *, const char *, void *), void *);
202 int dhcpcd_get_fd(DHCPCD_CONNECTION *);
203 bool dhcpcd_privileged(DHCPCD_CONNECTION *);
204 void dhcpcd_dispatch(DHCPCD_CONNECTION *);
205 DHCPCD_IF * dhcpcd_interfaces(DHCPCD_CONNECTION *);
206 char **dhcpcd_interface_names(DHCPCD_CONNECTION *, size_t *);
207 void dhcpcd_freev(char **);
208 char **dhcpcd_interface_names_sorted(DHCPCD_CONNECTION *);
209 DHCPCD_IF * dhcpcd_get_if(DHCPCD_CONNECTION *, const char *, const char *);
210 DHCPCD_CONNECTION * dhcpcd_if_connection(DHCPCD_IF *);
211 const char *dhcpcd_get_value(const DHCPCD_IF *, const char *);
212 const char *dhcpcd_get_prefix_value(const DHCPCD_IF *, const char *,
213     const char *);
214 ssize_t dhcpcd_encode_string_escape(char *, size_t, const char *, size_t);
215 ssize_t dhcpcd_decode_string_escape(char *, size_t, const char *);
216 ssize_t dhcpcd_decode_hex(char *, size_t, const char *);
217 char * dhcpcd_if_message(DHCPCD_IF *, bool *);
218
219 ssize_t dhcpcd_command(DHCPCD_CONNECTION *, const char *, char **);
220 ssize_t dhcpcd_command_arg(DHCPCD_CONNECTION *, const char *, const char *,
221     char **);
222 #define dhcpcd_rebind(c, i)     dhcpcd_command_arg((c), "-n", (i), NULL)
223 #define dhcpcd_release(c, i)    dhcpcd_command_arg((c), "-k", (i), NULL)
224
225 void dhcpcd_wpa_start(DHCPCD_CONNECTION *);
226 DHCPCD_WPA *dhcpcd_wpa_find(DHCPCD_CONNECTION *, const char *);
227 DHCPCD_WPA *dhcpcd_wpa_new(DHCPCD_CONNECTION *, const char *);
228 DHCPCD_CONNECTION *dhcpcd_wpa_connection(DHCPCD_WPA *);
229 int dhcpcd_wpa_open(DHCPCD_WPA *);
230 void dhcpcd_wpa_close(DHCPCD_WPA *);
231 void dhcpcd_wpa_dispatch(DHCPCD_WPA *);
232 int dhcpcd_wpa_get_fd(DHCPCD_WPA *);
233 DHCPCD_IF *dhcpcd_wpa_if(DHCPCD_WPA *);
234 void dhcpcd_wpa_if_event(DHCPCD_IF *);
235 void dhcpcd_wpa_set_scan_callback(DHCPCD_CONNECTION *,
236     void (*)(DHCPCD_WPA *, void *), void *);
237 void dhcpcd_wpa_set_status_callback(DHCPCD_CONNECTION *,
238     void (*)(DHCPCD_WPA *, const char *, void *), void *);
239 int dhcpcd_wi_scan_compare(DHCPCD_WI_SCAN *a, DHCPCD_WI_SCAN *b);
240 DHCPCD_WI_SCAN * dhcpcd_wi_scans(DHCPCD_IF *);
241 bool dhcpcd_wi_associated(DHCPCD_IF *i, DHCPCD_WI_SCAN *s);
242 void dhcpcd_wi_scans_free(DHCPCD_WI_SCAN *);
243 void dhcpcd_wi_history_clear(DHCPCD_CONNECTION *);
244 bool dhcpcd_wpa_set_network(DHCPCD_WPA *, int, const char *, const char *);
245 int dhcpcd_wpa_find_network_new(DHCPCD_WPA *, const char *);
246 bool dhcpcd_wpa_command(DHCPCD_WPA *, const char *);
247 bool dhcpcd_wpa_command_arg(DHCPCD_WPA *, const char *, const char *);
248
249 bool dhcpcd_wpa_ping(DHCPCD_WPA *);
250 bool dhcpcd_wpa_scan(DHCPCD_WPA *);
251 bool dhcpcd_wpa_reconfigure(DHCPCD_WPA *);
252 bool dhcpcd_wpa_reassociate(DHCPCD_WPA *);
253 bool dhcpcd_wpa_disconnect(DHCPCD_WPA *);
254 bool dhcpcd_wpa_config_write(DHCPCD_WPA *);
255 int dhcpcd_wpa_network_find_new(DHCPCD_WPA *, const char *);
256 bool dhcpcd_wpa_network_disable(DHCPCD_WPA *, int);
257 bool dhcpcd_wpa_network_enable(DHCPCD_WPA *, int);
258 bool dhcpcd_wpa_network_select(DHCPCD_WPA *, int);
259 bool dhcpcd_wpa_network_remove(DHCPCD_WPA *, int);
260 char * dhcpcd_wpa_network_get(DHCPCD_WPA *, int, const char *);
261 bool dhcpcd_wpa_network_set(DHCPCD_WPA *, int, const char *, const char *);
262
263 #define DHCPCD_WPA_SUCCESS       0
264 #define DHCPCD_WPA_ERR          -1
265 #define DHCPCD_WPA_ERR_SET      -2
266 #define DHCPCD_WPA_ERR_SET_PSK  -3
267 #define DHCPCD_WPA_ERR_ENABLE   -4
268 #define DHCPCD_WPA_ERR_WRITE    -5
269 #define DHCPCD_WPA_ERR_SELECT   -6
270 #define DHCPCD_WPA_ERR_ASSOC    -7
271 #define DHCPCD_WPA_ERR_DISCONN  -8
272 #define DHCPCD_WPA_ERR_RECONF   -9
273 int dhcpcd_wpa_configure(DHCPCD_WPA *w, DHCPCD_WI_SCAN *s, const char *p);
274 int dhcpcd_wpa_select(DHCPCD_WPA *w, DHCPCD_WI_SCAN *s);
275
276 char ** dhcpcd_config_blocks(DHCPCD_CONNECTION *, const char *);
277 DHCPCD_OPTION *dhcpcd_config_read(DHCPCD_CONNECTION *,
278     const char *, const char *);
279 void dhcpcd_config_free(DHCPCD_OPTION *);
280 const char * dhcpcd_config_get(DHCPCD_OPTION *, const char *);
281 const char * dhcpcd_config_get_static(DHCPCD_OPTION *, const char *);
282 bool dhcpcd_config_set(DHCPCD_OPTION **, const char *, const char *);
283 bool dhcpcd_config_set_static(DHCPCD_OPTION **, const char *, const char *);
284 bool dhcpcd_config_writeable(DHCPCD_CONNECTION *con);
285 bool dhcpcd_config_write(DHCPCD_CONNECTION *,
286     const char *, const char *, const DHCPCD_OPTION *);
287
288 #ifdef __cplusplus
289 }
290 #endif
291
292 #endif