4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
23 * Copyright (c) 2016, Chris Fraire <cfraire@me.com>.
27 * This file contains data structures and APIs of libnwam.
28 * Implementation is MT safe.
41 #include <sys/types.h>
42 #include <sys/socket.h>
45 * Note - several interface functions below are not utilized in ON, but are
46 * used by the GNOME nwam-manager. One example is nwam_enm_get_name().
53 /* nwam FMRI and properties */
54 #define NWAM_FMRI "svc:/network/physical:nwam"
55 #define NWAM_PG "nwamd"
56 #define NWAM_PROP_ACTIVE_NCP "active_ncp"
58 /* nwam flags used for read/commit */
59 /* Block waiting for commit if necessary */
60 #define NWAM_FLAG_BLOCKING 0x00000001
61 /* Committed object must be new */
62 #define NWAM_FLAG_CREATE 0x00000002
63 /* Tell destroy functions not to free handle */
64 #define NWAM_FLAG_DO_NOT_FREE 0x00000004
65 /* Object is being enabled/disabled */
66 #define NWAM_FLAG_ENTITY_ENABLE 0x00000008
67 /* Known WLAN being read, committed or destroyed */
68 #define NWAM_FLAG_ENTITY_KNOWN_WLAN 0x00000010
70 /* nwam flags used for selecting ncu type for walk */
71 #define NWAM_FLAG_NCU_TYPE_LINK 0x00000001ULL << 32
72 #define NWAM_FLAG_NCU_TYPE_INTERFACE 0x00000002ULL << 32
73 #define NWAM_FLAG_NCU_TYPE_ALL (NWAM_FLAG_NCU_TYPE_LINK | \
74 NWAM_FLAG_NCU_TYPE_INTERFACE)
76 /* nwam flags used for selecting ncu class for walk */
77 #define NWAM_FLAG_NCU_CLASS_PHYS 0x00000100ULL << 32
78 #define NWAM_FLAG_NCU_CLASS_IP 0x00010000ULL << 32
79 #define NWAM_FLAG_NCU_CLASS_ALL_LINK NWAM_FLAG_NCU_CLASS_PHYS
80 #define NWAM_FLAG_NCU_CLASS_ALL_INTERFACE NWAM_FLAG_NCU_CLASS_IP
81 #define NWAM_FLAG_NCU_CLASS_ALL (NWAM_FLAG_NCU_CLASS_ALL_INTERFACE | \
82 NWAM_FLAG_NCU_CLASS_ALL_LINK)
83 #define NWAM_FLAG_NCU_TYPE_CLASS_ALL (NWAM_FLAG_NCU_CLASS_ALL | \
84 NWAM_FLAG_NCU_TYPE_ALL)
86 /* flags used for selecting activation for walk */
87 #define NWAM_FLAG_ACTIVATION_MODE_MANUAL 0x000000001ULL << 32
88 #define NWAM_FLAG_ACTIVATION_MODE_SYSTEM 0x000000002ULL << 32
89 #define NWAM_FLAG_ACTIVATION_MODE_PRIORITIZED 0x000000004ULL << 32
90 #define NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ANY 0x000000008ULL << 32
91 #define NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ALL 0x000000010ULL << 32
92 #define NWAM_FLAG_ACTIVATION_MODE_ALL (NWAM_FLAG_ACTIVATION_MODE_MANUAL |\
93 NWAM_FLAG_ACTIVATION_MODE_SYSTEM |\
94 NWAM_FLAG_ACTIVATION_MODE_PRIORITIZED |\
95 NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ANY |\
96 NWAM_FLAG_ACTIVATION_MODE_CONDITIONAL_ALL)
98 /* Walk known WLANs in order of priority (lowest first) */
99 #define NWAM_FLAG_KNOWN_WLAN_WALK_PRIORITY_ORDER 0x000010000ULL << 32
100 /* Do not perform priority collision checking for known WLANs */
101 #define NWAM_FLAG_KNOWN_WLAN_NO_COLLISION_CHECK 0x000020000ULL << 32
103 /* nwam return codes */
105 NWAM_SUCCESS
, /* No error occured */
106 NWAM_LIST_END
, /* End of list reached */
107 NWAM_INVALID_HANDLE
, /* Entity handle is invalid */
108 NWAM_HANDLE_UNBOUND
, /* Handle not bound to entity */
109 NWAM_INVALID_ARG
, /* Argument is invalid */
110 NWAM_PERMISSION_DENIED
, /* Insufficient privileges for action */
111 NWAM_NO_MEMORY
, /* Out of memory */
112 NWAM_ENTITY_EXISTS
, /* Entity already exists */
113 NWAM_ENTITY_IN_USE
, /* Entity in use */
114 NWAM_ENTITY_COMMITTED
, /* Entity already committed */
115 NWAM_ENTITY_NOT_FOUND
, /* Entity not found */
116 NWAM_ENTITY_TYPE_MISMATCH
, /* Entity type mismatch */
117 NWAM_ENTITY_INVALID
, /* Validation of entity failed */
118 NWAM_ENTITY_INVALID_MEMBER
, /* Entity member invalid */
119 NWAM_ENTITY_INVALID_STATE
, /* Entity is not in appropriate state */
120 NWAM_ENTITY_INVALID_VALUE
, /* Validation of entity value failed */
121 NWAM_ENTITY_MISSING_MEMBER
, /* Required member is missing */
122 NWAM_ENTITY_NO_VALUE
, /* No value associated with entity */
123 NWAM_ENTITY_MULTIPLE_VALUES
, /* Multiple values for entity */
124 NWAM_ENTITY_READ_ONLY
, /* Entity is marked read only */
125 NWAM_ENTITY_NOT_DESTROYABLE
, /* Entity cannot be destroyed */
126 NWAM_ENTITY_NOT_MANUAL
, /* Entity cannot be manually enabled/disabled */
127 NWAM_WALK_HALTED
, /* Callback function returned nonzero */
128 NWAM_ERROR_BIND
, /* Could not bind to backend */
129 NWAM_ERROR_BACKEND_INIT
, /* Could not initialize backend */
130 NWAM_ERROR_INTERNAL
/* Internal error */
133 #define NWAM_MAX_NAME_LEN 128
134 #define NWAM_MAX_VALUE_LEN 256
135 #define NWAM_MAX_FMRI_LEN NWAM_MAX_VALUE_LEN
136 #define NWAM_MAX_NUM_VALUES 32
137 #define NWAM_MAX_NUM_PROPERTIES 32
139 /* used for getting and setting of properties */
141 NWAM_VALUE_TYPE_BOOLEAN
,
142 NWAM_VALUE_TYPE_INT64
,
143 NWAM_VALUE_TYPE_UINT64
,
144 NWAM_VALUE_TYPE_STRING
,
145 NWAM_VALUE_TYPE_UNKNOWN
148 /* Holds values of various types for getting and setting of properties */
149 /* Forward definition */
151 typedef struct nwam_value
*nwam_value_t
;
153 /* Value-related functions. */
154 extern nwam_error_t
nwam_value_create_boolean(boolean_t
, nwam_value_t
*);
155 extern nwam_error_t
nwam_value_create_boolean_array(boolean_t
*, uint_t
,
157 extern nwam_error_t
nwam_value_create_int64(int64_t, nwam_value_t
*);
158 extern nwam_error_t
nwam_value_create_int64_array(int64_t *, uint_t
,
160 extern nwam_error_t
nwam_value_create_uint64(uint64_t, nwam_value_t
*);
161 extern nwam_error_t
nwam_value_create_uint64_array(uint64_t *, uint_t
,
163 extern nwam_error_t
nwam_value_create_string(char *, nwam_value_t
*);
164 extern nwam_error_t
nwam_value_create_string_array(char **, uint_t
,
167 extern nwam_error_t
nwam_value_get_boolean(nwam_value_t
, boolean_t
*);
168 extern nwam_error_t
nwam_value_get_boolean_array(nwam_value_t
, boolean_t
**,
170 extern nwam_error_t
nwam_value_get_int64(nwam_value_t
, int64_t *);
171 extern nwam_error_t
nwam_value_get_int64_array(nwam_value_t
, int64_t **,
173 extern nwam_error_t
nwam_value_get_uint64(nwam_value_t
, uint64_t *);
174 extern nwam_error_t
nwam_value_get_uint64_array(nwam_value_t
, uint64_t **,
176 extern nwam_error_t
nwam_value_get_string(nwam_value_t
, char **);
177 extern nwam_error_t
nwam_value_get_string_array(nwam_value_t
, char ***,
180 extern nwam_error_t
nwam_value_get_type(nwam_value_t
, nwam_value_type_t
*);
181 extern nwam_error_t
nwam_value_get_numvalues(nwam_value_t
, uint_t
*);
183 extern void nwam_value_free(nwam_value_t
);
184 extern nwam_error_t
nwam_value_copy(nwam_value_t
, nwam_value_t
*);
186 extern nwam_error_t
nwam_uint64_get_value_string(const char *, uint64_t,
188 extern nwam_error_t
nwam_value_string_get_uint64(const char *, const char *,
192 * To retrieve a localized error string
194 extern const char *nwam_strerror(nwam_error_t
);
197 * State and auxiliary state describe the state of ENMs, NCUs and locations.
200 NWAM_STATE_UNINITIALIZED
= 0x0,
201 NWAM_STATE_INITIALIZED
= 0x1,
202 NWAM_STATE_OFFLINE
= 0x2,
203 NWAM_STATE_OFFLINE_TO_ONLINE
= 0x4,
204 NWAM_STATE_ONLINE_TO_OFFLINE
= 0x8,
205 NWAM_STATE_ONLINE
= 0x10,
206 NWAM_STATE_MAINTENANCE
= 0x20,
207 NWAM_STATE_DEGRADED
= 0x40,
208 NWAM_STATE_DISABLED
= 0x80
211 #define NWAM_STATE_ANY (NWAM_STATE_UNINITIALIZED | \
212 NWAM_STATE_INITIALIZED | \
213 NWAM_STATE_OFFLINE | \
214 NWAM_STATE_OFFLINE_TO_ONLINE | \
215 NWAM_STATE_ONLINE_TO_OFFLINE | \
216 NWAM_STATE_ONLINE | \
217 NWAM_STATE_MAINTENANCE | \
218 NWAM_STATE_DEGRADED | \
222 * The auxiliary state denotes specific reasons why an object is in a particular
223 * state (e.g. "script failed", "disabled by administrator", "waiting for DHCP
227 /* General auxiliary states */
228 NWAM_AUX_STATE_UNINITIALIZED
,
229 NWAM_AUX_STATE_INITIALIZED
,
230 NWAM_AUX_STATE_CONDITIONS_NOT_MET
,
231 NWAM_AUX_STATE_MANUAL_DISABLE
,
232 NWAM_AUX_STATE_METHOD_FAILED
,
233 NWAM_AUX_STATE_METHOD_MISSING
,
234 NWAM_AUX_STATE_METHOD_RUNNING
,
235 NWAM_AUX_STATE_INVALID_CONFIG
,
236 NWAM_AUX_STATE_ACTIVE
,
237 /* Link-specific auxiliary states */
238 NWAM_AUX_STATE_LINK_WIFI_SCANNING
,
239 NWAM_AUX_STATE_LINK_WIFI_NEED_SELECTION
,
240 NWAM_AUX_STATE_LINK_WIFI_NEED_KEY
,
241 NWAM_AUX_STATE_LINK_WIFI_CONNECTING
,
242 /* IP interface-specific auxiliary states */
243 NWAM_AUX_STATE_IF_WAITING_FOR_ADDR
,
244 NWAM_AUX_STATE_IF_DHCP_TIMED_OUT
,
245 NWAM_AUX_STATE_IF_DUPLICATE_ADDR
,
246 /* Common link/interface auxiliary states */
249 NWAM_AUX_STATE_NOT_FOUND
252 /* Activation modes */
254 NWAM_ACTIVATION_MODE_MANUAL
,
255 NWAM_ACTIVATION_MODE_SYSTEM
,
256 NWAM_ACTIVATION_MODE_CONDITIONAL_ANY
,
257 NWAM_ACTIVATION_MODE_CONDITIONAL_ALL
,
258 NWAM_ACTIVATION_MODE_PRIORITIZED
259 } nwam_activation_mode_t
;
262 * Conditions are of the form
264 * ncu|enm|loc name is|is-not active
265 * ip-address is|is-not|is-in-range|is-not-in-range ipaddr[/prefixlen]
266 * advertised-domain is|is-not|contains|does-not-contain string
267 * system-domain is|is-not|contains|does-not-contain string
268 * essid is|is-not|contains|does-not-contain string
269 * bssid is|is-not <string>
274 NWAM_CONDITION_IS_NOT
,
275 NWAM_CONDITION_IS_IN_RANGE
,
276 NWAM_CONDITION_IS_NOT_IN_RANGE
,
277 NWAM_CONDITION_CONTAINS
,
278 NWAM_CONDITION_DOES_NOT_CONTAIN
282 NWAM_CONDITION_OBJECT_TYPE_NCP
,
283 NWAM_CONDITION_OBJECT_TYPE_NCU
,
284 NWAM_CONDITION_OBJECT_TYPE_ENM
,
285 NWAM_CONDITION_OBJECT_TYPE_LOC
,
286 NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS
,
287 NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN
,
288 NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN
,
289 NWAM_CONDITION_OBJECT_TYPE_ESSID
,
290 NWAM_CONDITION_OBJECT_TYPE_BSSID
291 } nwam_condition_object_type_t
;
294 * Activation condition-related functions that convert activation
295 * values to an appropriate string and back.
297 extern nwam_error_t
nwam_condition_to_condition_string(
298 nwam_condition_object_type_t
, nwam_condition_t
, const char *, char **);
299 extern nwam_error_t
nwam_condition_string_to_condition(const char *,
300 nwam_condition_object_type_t
*, nwam_condition_t
*, char **);
303 * Only one location can be active at one time. As a
304 * consequence, if the activation conditions of multiple
305 * locations are satisfied, we need to compare activation
306 * conditions to see if one is more specific than another.
308 * The following heuristics are applied to rate an
309 * activation condition:
310 * - "is" is the most specific condition
311 * - it is followed by "is-in-range" and "contains"
312 * - "is-not-in-range" and "does-not-contain" are next
313 * - finally "is-not" is least specific
315 * Regarding the objects these conditions apply to:
316 * - NCU, ENM and locations are most specific
317 * - system-domain is next
318 * - advertised-domain is next
319 * - IP address is next
320 * - wireless BSSID is next
321 * - wireless ESSID is least specific
324 extern nwam_error_t
nwam_condition_rate(nwam_condition_object_type_t
,
325 nwam_condition_t
, uint64_t *);
328 * Location definitions.
331 #define NWAM_LOC_NAME_AUTOMATIC "Automatic"
332 #define NWAM_LOC_NAME_NO_NET "NoNet"
333 #define NWAM_LOC_NAME_LEGACY "Legacy"
335 #define NWAM_LOC_NAME_PRE_DEFINED(name) \
336 (strcasecmp(name, NWAM_LOC_NAME_AUTOMATIC) == 0 || \
337 strcasecmp(name, NWAM_LOC_NAME_NO_NET) == 0 || \
338 strcasecmp(name, NWAM_LOC_NAME_LEGACY) == 0)
340 /* Forward definition */
343 typedef struct nwam_handle
*nwam_loc_handle_t
;
345 /* Location properties */
348 NWAM_NAMESERVICES_DNS
,
349 NWAM_NAMESERVICES_FILES
,
350 NWAM_NAMESERVICES_NIS
,
351 NWAM_NAMESERVICES_LDAP
352 } nwam_nameservices_t
;
355 NWAM_CONFIGSRC_MANUAL
,
359 #define NWAM_LOC_PROP_ACTIVATION_MODE "activation-mode"
360 #define NWAM_LOC_PROP_CONDITIONS "conditions"
361 #define NWAM_LOC_PROP_ENABLED "enabled"
363 /* Nameservice location properties */
364 #define NWAM_LOC_PROP_NAMESERVICES "nameservices"
365 #define NWAM_LOC_PROP_NAMESERVICES_CONFIG_FILE "nameservices-config-file"
366 #define NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC "dns-nameservice-configsrc"
367 #define NWAM_LOC_PROP_DNS_NAMESERVICE_DOMAIN "dns-nameservice-domain"
368 #define NWAM_LOC_PROP_DNS_NAMESERVICE_SERVERS "dns-nameservice-servers"
369 #define NWAM_LOC_PROP_DNS_NAMESERVICE_SEARCH "dns-nameservice-search"
370 #define NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC "nis-nameservice-configsrc"
371 #define NWAM_LOC_PROP_NIS_NAMESERVICE_SERVERS "nis-nameservice-servers"
372 #define NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC "ldap-nameservice-configsrc"
373 #define NWAM_LOC_PROP_LDAP_NAMESERVICE_SERVERS "ldap-nameservice-servers"
374 #define NWAM_LOC_PROP_DEFAULT_DOMAIN "default-domain"
377 #define NWAM_LOC_PROP_NFSV4_DOMAIN "nfsv4-domain"
379 /* IPfilter configuration */
380 #define NWAM_LOC_PROP_IPFILTER_CONFIG_FILE "ipfilter-config-file"
381 #define NWAM_LOC_PROP_IPFILTER_V6_CONFIG_FILE "ipfilter-v6-config-file"
382 #define NWAM_LOC_PROP_IPNAT_CONFIG_FILE "ipnat-config-file"
383 #define NWAM_LOC_PROP_IPPOOL_CONFIG_FILE "ippool-config-file"
385 /* IPsec configuration */
386 #define NWAM_LOC_PROP_IKE_CONFIG_FILE "ike-config-file"
387 #define NWAM_LOC_PROP_IPSECPOLICY_CONFIG_FILE "ipsecpolicy-config-file"
390 * NCP/NCU definitions.
393 #define NWAM_NCP_NAME_AUTOMATIC "Automatic"
394 #define NWAM_NCP_NAME_USER "User"
396 #define NWAM_NCP_AUTOMATIC(name) \
397 (strcasecmp(name, NWAM_NCP_NAME_AUTOMATIC) == 0)
399 typedef struct nwam_handle
*nwam_ncp_handle_t
;
401 typedef struct nwam_handle
*nwam_ncu_handle_t
;
404 NWAM_NCU_TYPE_UNKNOWN
= -1,
406 NWAM_NCU_TYPE_INTERFACE
,
411 NWAM_NCU_CLASS_UNKNOWN
= -1,
419 NWAM_ADDRSRC_AUTOCONF
,
424 NWAM_PRIORITY_MODE_EXCLUSIVE
,
425 NWAM_PRIORITY_MODE_SHARED
,
426 NWAM_PRIORITY_MODE_ALL
427 } nwam_priority_mode_t
;
429 /* NCU properties common to all type/classes */
430 #define NWAM_NCU_PROP_TYPE "type"
431 #define NWAM_NCU_PROP_CLASS "class"
432 #define NWAM_NCU_PROP_PARENT_NCP "parent"
433 #define NWAM_NCU_PROP_ACTIVATION_MODE "activation-mode"
434 #define NWAM_NCU_PROP_ENABLED "enabled"
435 #define NWAM_NCU_PROP_PRIORITY_GROUP "priority-group"
436 #define NWAM_NCU_PROP_PRIORITY_MODE "priority-mode"
438 /* Link NCU properties */
439 #define NWAM_NCU_PROP_LINK_MAC_ADDR "link-mac-addr"
440 #define NWAM_NCU_PROP_LINK_AUTOPUSH "link-autopush"
441 #define NWAM_NCU_PROP_LINK_MTU "link-mtu"
443 /* IP NCU properties */
444 #define NWAM_NCU_PROP_IP_VERSION "ip-version"
445 #define NWAM_NCU_PROP_IPV4_ADDRSRC "ipv4-addrsrc"
446 #define NWAM_NCU_PROP_IPV4_ADDR "ipv4-addr"
447 #define NWAM_NCU_PROP_IPV4_DEFAULT_ROUTE "ipv4-default-route"
448 #define NWAM_NCU_PROP_IPV6_ADDRSRC "ipv6-addrsrc"
449 #define NWAM_NCU_PROP_IPV6_ADDR "ipv6-addr"
450 #define NWAM_NCU_PROP_IPV6_DEFAULT_ROUTE "ipv6-default-route"
451 #define NWAM_NCU_PROP_IP_PRIMARY "ip-primary"
452 #define NWAM_NCU_PROP_IP_REQHOST "ip-reqhost"
454 /* Some properties should only be set on creation */
455 #define NWAM_NCU_PROP_SETONCE(prop) \
456 (strcmp(prop, NWAM_NCU_PROP_TYPE) == 0 || \
457 strcmp(prop, NWAM_NCU_PROP_CLASS) == 0 || \
458 strcmp(prop, NWAM_NCU_PROP_PARENT_NCP) == 0)
463 typedef struct nwam_handle
*nwam_enm_handle_t
;
465 #define NWAM_ENM_PROP_ACTIVATION_MODE "activation-mode"
466 #define NWAM_ENM_PROP_CONDITIONS "conditions"
467 #define NWAM_ENM_PROP_ENABLED "enabled"
469 /* FMRI associated with ENM */
470 #define NWAM_ENM_PROP_FMRI "fmri"
472 /* Start/stop scripts associated with ENM */
473 #define NWAM_ENM_PROP_START "start"
474 #define NWAM_ENM_PROP_STOP "stop"
477 * Known Wireless LAN info (known WLAN) definitions.
480 typedef struct nwam_handle
*nwam_known_wlan_handle_t
;
482 #define NWAM_KNOWN_WLAN_PROP_BSSIDS "bssids"
483 #define NWAM_KNOWN_WLAN_PROP_PRIORITY "priority"
484 #define NWAM_KNOWN_WLAN_PROP_KEYNAME "keyname"
485 #define NWAM_KNOWN_WLAN_PROP_KEYSLOT "keyslot"
486 #define NWAM_KNOWN_WLAN_PROP_SECURITY_MODE "security-mode"
492 /* Create a location */
493 extern nwam_error_t
nwam_loc_create(const char *, nwam_loc_handle_t
*);
495 /* Copy a location */
496 extern nwam_error_t
nwam_loc_copy(nwam_loc_handle_t
, const char *,
497 nwam_loc_handle_t
*);
499 /* Read a location from persistent storage */
500 extern nwam_error_t
nwam_loc_read(const char *, uint64_t,
501 nwam_loc_handle_t
*);
503 /* Validate in-memory representation of a location */
504 extern nwam_error_t
nwam_loc_validate(nwam_loc_handle_t
, const char **);
506 /* Commit in-memory representation of a location to persistent storage */
507 extern nwam_error_t
nwam_loc_commit(nwam_loc_handle_t
, uint64_t);
509 /* Destroy a location in persistent storage */
510 extern nwam_error_t
nwam_loc_destroy(nwam_loc_handle_t
, uint64_t);
512 /* Free in-memory representation of a location */
513 extern void nwam_loc_free(nwam_loc_handle_t
);
515 /* read all locs from persistent storage and walk through each at a time */
516 extern nwam_error_t
nwam_walk_locs(int (*)(nwam_loc_handle_t
, void *), void *,
519 /* get/set loc name */
520 extern nwam_error_t
nwam_loc_get_name(nwam_loc_handle_t
, char **);
521 extern nwam_error_t
nwam_loc_set_name(nwam_loc_handle_t
, const char *);
522 extern boolean_t
nwam_loc_can_set_name(nwam_loc_handle_t
);
524 /* activate/deactivate loc */
525 extern nwam_error_t
nwam_loc_enable(nwam_loc_handle_t
);
526 extern nwam_error_t
nwam_loc_disable(nwam_loc_handle_t
);
528 /* walk all properties of an in-memory loc */
529 extern nwam_error_t
nwam_loc_walk_props(nwam_loc_handle_t
,
530 int (*)(const char *, nwam_value_t
, void *),
531 void *, uint64_t, int *);
533 /* delete/get/set validate loc property */
534 extern nwam_error_t
nwam_loc_delete_prop(nwam_loc_handle_t
,
536 extern nwam_error_t
nwam_loc_get_prop_value(nwam_loc_handle_t
,
537 const char *, nwam_value_t
*);
538 extern nwam_error_t
nwam_loc_set_prop_value(nwam_loc_handle_t
,
539 const char *, nwam_value_t
);
540 extern nwam_error_t
nwam_loc_validate_prop(nwam_loc_handle_t
, const char *,
543 /* Get the read-only value for a particular loc property */
544 extern nwam_error_t
nwam_loc_prop_read_only(const char *, boolean_t
*);
546 /* Whether the property is multi-valued or not */
547 extern nwam_error_t
nwam_loc_prop_multivalued(const char *, boolean_t
*);
549 /* Retrieve data type */
550 extern nwam_error_t
nwam_loc_get_prop_type(const char *, nwam_value_type_t
*);
552 /* Retrieve description */
553 extern nwam_error_t
nwam_loc_get_prop_description(const char *, const char **);
555 /* get default loc props */
556 extern nwam_error_t
nwam_loc_get_default_proplist(const char ***, uint_t
*);
558 /* get sstate of loc from nwamd */
559 extern nwam_error_t
nwam_loc_get_state(nwam_loc_handle_t
, nwam_state_t
*,
562 /* Get whether the loc has manual activation-mode or not */
563 extern nwam_error_t
nwam_loc_is_manual(nwam_loc_handle_t
, boolean_t
*);
570 extern nwam_error_t
nwam_ncp_create(const char *, uint64_t,
571 nwam_ncp_handle_t
*);
573 /* Read an ncp from persistent storage */
574 extern nwam_error_t
nwam_ncp_read(const char *, uint64_t, nwam_ncp_handle_t
*);
576 /* Make a copy of existing ncp */
577 extern nwam_error_t
nwam_ncp_copy(nwam_ncp_handle_t
, const char *,
578 nwam_ncp_handle_t
*);
581 extern nwam_error_t
nwam_walk_ncps(int (*)(nwam_ncp_handle_t
, void *),
582 void *, uint64_t, int *);
585 extern nwam_error_t
nwam_ncp_get_name(nwam_ncp_handle_t
, char **);
587 /* Get the read-only value for this ncp */
588 extern nwam_error_t
nwam_ncp_get_read_only(nwam_ncp_handle_t
, boolean_t
*);
591 extern nwam_error_t
nwam_ncp_destroy(nwam_ncp_handle_t
, uint64_t);
594 * Walk all ncus associated with ncp. Specific types/classes of ncu can
595 * be selected via flags, or all via NWAM_FLAG_ALL.
597 extern nwam_error_t
nwam_ncp_walk_ncus(nwam_ncp_handle_t
,
598 int(*)(nwam_ncu_handle_t
, void *), void *, uint64_t, int *);
601 extern nwam_error_t
nwam_ncp_enable(nwam_ncp_handle_t
);
603 /* Free in-memory representation of ncp */
604 extern void nwam_ncp_free(nwam_ncp_handle_t
);
606 /* Get state of NCP from nwamd */
607 extern nwam_error_t
nwam_ncp_get_state(nwam_ncp_handle_t
, nwam_state_t
*,
610 /* Get the active priority-group */
611 extern nwam_error_t
nwam_ncp_get_active_priority_group(int64_t *);
613 /* Create an ncu or read it from persistent storage */
614 extern nwam_error_t
nwam_ncu_create(nwam_ncp_handle_t
, const char *,
615 nwam_ncu_type_t
, nwam_ncu_class_t
, nwam_ncu_handle_t
*);
616 extern nwam_error_t
nwam_ncu_read(nwam_ncp_handle_t
, const char *,
617 nwam_ncu_type_t
, uint64_t, nwam_ncu_handle_t
*);
619 /* Destroy an ncu in persistent storage or free the in-memory representation */
620 extern nwam_error_t
nwam_ncu_destroy(nwam_ncu_handle_t
, uint64_t);
621 extern void nwam_ncu_free(nwam_ncu_handle_t
);
623 /* make a copy of existing ncu */
624 extern nwam_error_t
nwam_ncu_copy(nwam_ncu_handle_t
, const char *,
625 nwam_ncu_handle_t
*);
627 /* Commit ncu changes to persistent storage */
628 extern nwam_error_t
nwam_ncu_commit(nwam_ncu_handle_t
, uint64_t);
630 /* activate/deactivate an individual NCU (must be part of the active NCP) */
631 extern nwam_error_t
nwam_ncu_enable(nwam_ncu_handle_t
);
632 extern nwam_error_t
nwam_ncu_disable(nwam_ncu_handle_t
);
634 /* Get state of NCU from nwamd */
635 extern nwam_error_t
nwam_ncu_get_state(nwam_ncu_handle_t
, nwam_state_t
*,
639 extern nwam_error_t
nwam_ncu_get_ncu_type(nwam_ncu_handle_t
, nwam_ncu_type_t
*);
642 extern nwam_error_t
nwam_ncu_get_ncu_class(nwam_ncu_handle_t
,
645 /* Validate ncu content */
646 extern nwam_error_t
nwam_ncu_validate(nwam_ncu_handle_t
, const char **);
648 /* Walk all properties in in-memory representation of ncu */
649 extern nwam_error_t
nwam_ncu_walk_props(nwam_ncu_handle_t
,
650 int (*)(const char *, nwam_value_t
, void *),
651 void *, uint64_t, int *);
653 /* Get/set name of ncu, get parent ncp */
654 extern nwam_error_t
nwam_ncu_get_name(nwam_ncu_handle_t
, char **);
655 extern nwam_error_t
nwam_ncu_name_to_typed_name(const char *, nwam_ncu_type_t
,
657 extern nwam_error_t
nwam_ncu_typed_name_to_name(const char *, nwam_ncu_type_t
*,
659 extern nwam_error_t
nwam_ncu_get_default_proplist(nwam_ncu_type_t
,
660 nwam_ncu_class_t
, const char ***, uint_t
*);
661 extern nwam_error_t
nwam_ncu_get_ncp(nwam_ncu_handle_t
, nwam_ncp_handle_t
*);
663 /* delete/get/set/validate property from/in in-memory representation of ncu */
664 extern nwam_error_t
nwam_ncu_delete_prop(nwam_ncu_handle_t
,
666 extern nwam_error_t
nwam_ncu_get_prop_value(nwam_ncu_handle_t
,
667 const char *, nwam_value_t
*);
668 extern nwam_error_t
nwam_ncu_set_prop_value(nwam_ncu_handle_t
,
669 const char *, nwam_value_t
);
671 extern nwam_error_t
nwam_ncu_validate_prop(nwam_ncu_handle_t
, const char *,
674 /* Retrieve data type */
675 extern nwam_error_t
nwam_ncu_get_prop_type(const char *, nwam_value_type_t
*);
676 /* Retrieve prop description */
677 extern nwam_error_t
nwam_ncu_get_prop_description(const char *, const char **);
679 /* Get the read-only value from the handle or parent NCP */
680 extern nwam_error_t
nwam_ncu_get_read_only(nwam_ncu_handle_t
, boolean_t
*);
682 /* Get the read-only value for a particular NCU property */
683 extern nwam_error_t
nwam_ncu_prop_read_only(const char *, boolean_t
*);
685 /* Whether the property is multi-valued or not */
686 extern nwam_error_t
nwam_ncu_prop_multivalued(const char *, boolean_t
*);
688 /* Get whether the NCU has manual activation-mode or not */
689 extern nwam_error_t
nwam_ncu_is_manual(nwam_ncu_handle_t
, boolean_t
*);
691 /* Get the flag from the given class for walks */
692 extern uint64_t nwam_ncu_class_to_flag(nwam_ncu_class_t
);
694 /* Get the NCU type from the given class */
695 extern nwam_ncu_type_t
nwam_ncu_class_to_type(nwam_ncu_class_t
);
699 * Obtain a specific enm handle, either be creating a new enm
700 * or reading an existing one from persistent storage.
702 extern nwam_error_t
nwam_enm_create(const char *, const char *,
703 nwam_enm_handle_t
*);
704 extern nwam_error_t
nwam_enm_read(const char *, uint64_t, nwam_enm_handle_t
*);
706 /* Make a copy of existing enm */
707 extern nwam_error_t
nwam_enm_copy(nwam_enm_handle_t
, const char *,
708 nwam_enm_handle_t
*);
711 * Obtain handles for all existing enms. Caller-specified callback
712 * function will be called once for each enm, passing the handle and
713 * the caller-specified arg.
715 extern nwam_error_t
nwam_walk_enms(int (*)(nwam_enm_handle_t
, void *), void *,
719 * Commit an enm to persistent storage. Does not free the handle.
721 extern nwam_error_t
nwam_enm_commit(nwam_enm_handle_t
, uint64_t);
724 * Remove an enm from persistent storage.
726 extern nwam_error_t
nwam_enm_destroy(nwam_enm_handle_t
, uint64_t);
731 extern void nwam_enm_free(nwam_enm_handle_t
);
734 * Validate an enm, or a specific enm property. If validating
735 * an entire enm, the invalid property type is returned.
737 extern nwam_error_t
nwam_enm_validate(nwam_enm_handle_t
, const char **);
738 extern nwam_error_t
nwam_enm_validate_prop(nwam_enm_handle_t
, const char *,
741 /* Retrieve data type */
742 extern nwam_error_t
nwam_enm_get_prop_type(const char *, nwam_value_type_t
*);
743 /* Retrieve prop description */
744 extern nwam_error_t
nwam_enm_get_prop_description(const char *, const char **);
747 * Delete/get/set enm property values.
749 extern nwam_error_t
nwam_enm_delete_prop(nwam_enm_handle_t
,
751 extern nwam_error_t
nwam_enm_get_prop_value(nwam_enm_handle_t
,
752 const char *, nwam_value_t
*);
753 extern nwam_error_t
nwam_enm_set_prop_value(nwam_enm_handle_t
,
754 const char *, nwam_value_t
);
756 extern nwam_error_t
nwam_enm_get_default_proplist(const char ***, uint_t
*);
758 /* Get the read-only value for a particular ENM property */
759 extern nwam_error_t
nwam_enm_prop_read_only(const char *, boolean_t
*);
761 /* Whether the property is multi-valued or not */
762 extern nwam_error_t
nwam_enm_prop_multivalued(const char *, boolean_t
*);
765 * Walk all properties of a specific enm. For each property, specified
766 * callback function is called. Caller is responsible for freeing memory
767 * allocated for each property.
769 extern nwam_error_t
nwam_enm_walk_props(nwam_enm_handle_t
,
770 int (*)(const char *, nwam_value_t
, void *),
771 void *, uint64_t, int *);
774 * Get/set the name of an enm. When getting the name, the library will
775 * allocate a buffer; the caller is responsible for freeing the memory.
777 extern nwam_error_t
nwam_enm_get_name(nwam_enm_handle_t
, char **);
778 extern nwam_error_t
nwam_enm_set_name(nwam_enm_handle_t
, const char *);
779 extern boolean_t
nwam_enm_can_set_name(nwam_enm_handle_t
);
784 extern nwam_error_t
nwam_enm_enable(nwam_enm_handle_t
);
785 extern nwam_error_t
nwam_enm_disable(nwam_enm_handle_t
);
788 * Get state of ENM from nwamd.
790 extern nwam_error_t
nwam_enm_get_state(nwam_enm_handle_t
, nwam_state_t
*,
794 * Get whether the ENM has manual activation-mode or not.
796 extern nwam_error_t
nwam_enm_is_manual(nwam_enm_handle_t
, boolean_t
*);
799 * Known Wireless LAN (WLAN) info.
802 /* Create a known WLAN */
803 extern nwam_error_t
nwam_known_wlan_create(const char *,
804 nwam_known_wlan_handle_t
*);
806 /* Read a known WLAN from persistent storage */
807 extern nwam_error_t
nwam_known_wlan_read(const char *, uint64_t,
808 nwam_known_wlan_handle_t
*);
811 * Destroy a known WLAN in persistent storage or free the in-memory
814 extern nwam_error_t
nwam_known_wlan_destroy(nwam_known_wlan_handle_t
, uint64_t);
815 extern void nwam_known_wlan_free(nwam_known_wlan_handle_t
);
817 /* make a copy of existing known WLAN */
818 extern nwam_error_t
nwam_known_wlan_copy(nwam_known_wlan_handle_t
, const char *,
819 nwam_known_wlan_handle_t
*);
821 /* Commit known WLAN changes to persistent storage */
822 extern nwam_error_t
nwam_known_wlan_commit(nwam_known_wlan_handle_t
, uint64_t);
824 /* Validate known WLAN content */
825 extern nwam_error_t
nwam_known_wlan_validate(nwam_known_wlan_handle_t
,
828 /* Walk known WLANs */
829 extern nwam_error_t nwam_walk_known_wlans
830 (int(*)(nwam_known_wlan_handle_t
, void *), void *, uint64_t, int *);
832 /* get/set known WLAN name */
833 extern nwam_error_t
nwam_known_wlan_get_name(nwam_known_wlan_handle_t
, char **);
834 extern nwam_error_t
nwam_known_wlan_set_name(nwam_known_wlan_handle_t
,
836 extern boolean_t
nwam_known_wlan_can_set_name(nwam_known_wlan_handle_t
);
838 /* walk all properties of an in-memory known WLAN */
839 extern nwam_error_t
nwam_known_wlan_walk_props(nwam_known_wlan_handle_t
,
840 int (*)(const char *, nwam_value_t
, void *),
841 void *, uint64_t, int *);
843 /* delete/get/set/validate known WLAN property */
844 extern nwam_error_t
nwam_known_wlan_delete_prop(nwam_known_wlan_handle_t
,
846 extern nwam_error_t
nwam_known_wlan_get_prop_value(nwam_known_wlan_handle_t
,
847 const char *, nwam_value_t
*);
848 extern nwam_error_t
nwam_known_wlan_set_prop_value(nwam_known_wlan_handle_t
,
849 const char *, nwam_value_t
);
850 extern nwam_error_t
nwam_known_wlan_validate_prop(nwam_known_wlan_handle_t
,
851 const char *, nwam_value_t
);
853 /* Retrieve data type */
854 extern nwam_error_t
nwam_known_wlan_get_prop_type(const char *,
855 nwam_value_type_t
*);
856 /* Retrieve prop description */
857 extern nwam_error_t
nwam_known_wlan_get_prop_description(const char *,
860 /* get default known WLAN props */
861 extern nwam_error_t
nwam_known_wlan_get_default_proplist(const char ***,
864 /* Whether the property is multi-valued or not */
865 extern nwam_error_t
nwam_known_wlan_prop_multivalued(const char *, boolean_t
*);
867 /* Add a bssid to the known WLANs */
868 extern nwam_error_t
nwam_known_wlan_add_to_known_wlans(const char *,
869 const char *, uint32_t, uint_t
, const char *);
871 /* Remove a bssid from known WLANs */
872 extern nwam_error_t
nwam_known_wlan_remove_from_known_wlans(const char *,
873 const char *, const char *);
876 * nwam_wlan_t is used for scan/need choice/need key events and by
877 * nwam_wlan_get_scan_results(). The following fields are valid:
879 * - for scan and need choice event, ESSID, BSSID, signal strength, security
880 * mode, speed, channel, bsstype, key index, and if we already have a key
881 * (have_key), if the WLAN is the current selection (selected) and
882 * if the current WLAN is connected (connected).
883 * - for need key events, ESSID, security mode, have_key, selected and connected
884 * values are set. The rest of the fields are not set since multiple WLANs
885 * may match the ESSID and have different speeds, channels etc. If an
886 * ESSID/BSSID selection is specified, the BSSID will be set also.
890 char nww_essid
[NWAM_MAX_NAME_LEN
];
891 char nww_bssid
[NWAM_MAX_NAME_LEN
];
892 char nww_signal_strength
[NWAM_MAX_NAME_LEN
];
893 uint32_t nww_security_mode
; /* a dladm_wlan_secmode_t */
894 uint32_t nww_speed
; /* a dladm_wlan_speed_t */
895 uint32_t nww_channel
; /* a dladm_wlan_channel_t */
896 uint32_t nww_bsstype
; /* a dladm_wlan_bsstype_t */
898 boolean_t nww_have_key
;
899 boolean_t nww_selected
;
900 boolean_t nww_connected
;
904 * Active WLAN definitions. Used to scan WLANs/choose a WLAN/set a WLAN key.
906 extern nwam_error_t
nwam_wlan_scan(const char *);
907 extern nwam_error_t
nwam_wlan_get_scan_results(const char *, uint_t
*,
909 extern nwam_error_t
nwam_wlan_select(const char *, const char *, const char *,
910 uint32_t, boolean_t
);
911 extern nwam_error_t
nwam_wlan_set_key(const char *, const char *, const char *,
912 uint32_t, uint_t
, const char *);
915 * Event notification definitions
917 #define NWAM_EVENT_TYPE_NOOP 0
918 #define NWAM_EVENT_TYPE_INIT 1
919 #define NWAM_EVENT_TYPE_SHUTDOWN 2
920 #define NWAM_EVENT_TYPE_OBJECT_ACTION 3
921 #define NWAM_EVENT_TYPE_OBJECT_STATE 4
922 #define NWAM_EVENT_TYPE_PRIORITY_GROUP 5
923 #define NWAM_EVENT_TYPE_INFO 6
924 #define NWAM_EVENT_TYPE_WLAN_SCAN_REPORT 7
925 #define NWAM_EVENT_TYPE_WLAN_NEED_CHOICE 8
926 #define NWAM_EVENT_TYPE_WLAN_NEED_KEY 9
927 #define NWAM_EVENT_TYPE_WLAN_CONNECTION_REPORT 10
928 #define NWAM_EVENT_TYPE_IF_ACTION 11
929 #define NWAM_EVENT_TYPE_IF_STATE 12
930 #define NWAM_EVENT_TYPE_LINK_ACTION 13
931 #define NWAM_EVENT_TYPE_LINK_STATE 14
932 #define NWAM_EVENT_MAX NWAM_EVENT_TYPE_LINK_STATE
934 #define NWAM_EVENT_STATUS_OK 0
935 #define NWAM_EVENT_STATUS_NOT_HANDLED 1
937 #define NWAM_EVENT_NETWORK_OBJECT_UNDEFINED 0
938 #define NWAM_EVENT_NETWORK_OBJECT_LINK 1
939 #define NWAM_EVENT_NETWORK_OBJECT_INTERFACE 2
941 #define NWAM_EVENT_REQUEST_UNDEFINED 0
942 #define NWAM_EVENT_REQUEST_WLAN 1
943 #define NWAM_EVENT_REQUEST_KEY 2
946 * Actions for nwamd to perform, used in conjunction with
947 * nwam_request_type_t in nwam_door_arg_t.
948 * Add string representations to nwam_action_to_string() in libnwam_util.c.
951 NWAM_ACTION_UNKNOWN
= -1,
961 NWAM_OBJECT_TYPE_UNKNOWN
= -1,
962 NWAM_OBJECT_TYPE_NCP
= 0,
963 NWAM_OBJECT_TYPE_NCU
= 1,
964 NWAM_OBJECT_TYPE_LOC
= 2,
965 NWAM_OBJECT_TYPE_ENM
= 3,
966 NWAM_OBJECT_TYPE_KNOWN_WLAN
= 4
967 } nwam_object_type_t
;
969 typedef struct nwam_event
*nwam_event_t
;
975 struct nwam_event_object_action
{
976 nwam_object_type_t nwe_object_type
;
977 char nwe_name
[NWAM_MAX_NAME_LEN
];
978 char nwe_parent
[NWAM_MAX_NAME_LEN
];
979 nwam_action_t nwe_action
;
982 struct nwam_event_object_state
{
983 nwam_object_type_t nwe_object_type
;
984 char nwe_name
[NWAM_MAX_NAME_LEN
];
985 char nwe_parent
[NWAM_MAX_NAME_LEN
];
986 nwam_state_t nwe_state
;
987 nwam_aux_state_t nwe_aux_state
;
990 struct nwam_event_priority_group_info
{
991 int64_t nwe_priority
;
992 } nwe_priority_group_info
;
994 struct nwam_event_info
{
995 char nwe_message
[NWAM_MAX_VALUE_LEN
];
999 * wlan_info stores both scan results and the single
1000 * WLAN we require a key for in the case of _WLAN_NEED_KEY
1001 * events. For _WLAN_CONNECTION_REPORT events, it stores
1002 * the WLAN the connection succeeded/failed for, indicating
1003 * success/failure using the 'connected' boolean.
1005 struct nwam_event_wlan_info
{
1006 char nwe_name
[NWAM_MAX_NAME_LEN
];
1007 boolean_t nwe_connected
;
1008 uint16_t nwe_num_wlans
;
1009 nwam_wlan_t nwe_wlans
[1];
1011 * space may be allocated by user here for the
1016 struct nwam_event_if_action
{
1017 char nwe_name
[NWAM_MAX_NAME_LEN
];
1018 nwam_action_t nwe_action
;
1021 struct nwam_event_if_state
{
1022 char nwe_name
[NWAM_MAX_NAME_LEN
];
1024 uint32_t nwe_addr_valid
; /* boolean */
1025 uint32_t nwe_addr_added
; /* boolean */
1026 struct sockaddr_storage nwe_addr
;
1027 struct sockaddr_storage nwe_netmask
;
1030 struct nwam_event_link_state
{
1031 char nwe_name
[NWAM_MAX_NAME_LEN
];
1032 boolean_t nwe_link_up
;
1033 /* link_state_t from sys/mac.h */
1036 struct nwam_event_link_action
{
1037 char nwe_name
[NWAM_MAX_NAME_LEN
];
1038 nwam_action_t nwe_action
;
1043 /* NWAM client functions, used to register/unregister and receive events */
1044 extern nwam_error_t
nwam_events_init(void);
1045 extern void nwam_events_fini(void);
1046 extern nwam_error_t
nwam_event_wait(nwam_event_t
*);
1047 extern void nwam_event_free(nwam_event_t
);
1049 /* Event-related string conversion functions */
1050 extern const char *nwam_action_to_string(nwam_action_t
);
1051 extern const char *nwam_event_type_to_string(int);
1052 extern const char *nwam_state_to_string(nwam_state_t
);
1053 extern const char *nwam_aux_state_to_string(nwam_aux_state_t
);
1055 extern const char *nwam_object_type_to_string(nwam_object_type_t
);
1056 extern nwam_object_type_t
nwam_string_to_object_type(const char *);
1058 /* Utility strtok_r-like function */
1059 extern char *nwam_tokenize_by_unescaped_delim(char *, char, char **);
1065 #endif /* _LIBNWAM_H */