1*11767SAnurag.Maskey@Sun.COM# 2*11767SAnurag.Maskey@Sun.COM# CDDL HEADER START 3*11767SAnurag.Maskey@Sun.COM# 4*11767SAnurag.Maskey@Sun.COM# The contents of this file are subject to the terms of the 5*11767SAnurag.Maskey@Sun.COM# Common Development and Distribution License (the "License"). 6*11767SAnurag.Maskey@Sun.COM# You may not use this file except in compliance with the License. 7*11767SAnurag.Maskey@Sun.COM# 8*11767SAnurag.Maskey@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*11767SAnurag.Maskey@Sun.COM# or http://www.opensolaris.org/os/licensing. 10*11767SAnurag.Maskey@Sun.COM# See the License for the specific language governing permissions 11*11767SAnurag.Maskey@Sun.COM# and limitations under the License. 12*11767SAnurag.Maskey@Sun.COM# 13*11767SAnurag.Maskey@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each 14*11767SAnurag.Maskey@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*11767SAnurag.Maskey@Sun.COM# If applicable, add the following below this CDDL HEADER, with the 16*11767SAnurag.Maskey@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying 17*11767SAnurag.Maskey@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner] 18*11767SAnurag.Maskey@Sun.COM# 19*11767SAnurag.Maskey@Sun.COM# CDDL HEADER END 20*11767SAnurag.Maskey@Sun.COM# 21*11767SAnurag.Maskey@Sun.COM# 22*11767SAnurag.Maskey@Sun.COM# Copyright 2010 Sun Microsystems, Inc. All rights reserved. 23*11767SAnurag.Maskey@Sun.COM# Use is subject to license terms. 24*11767SAnurag.Maskey@Sun.COM# 25*11767SAnurag.Maskey@Sun.COM# lib/libnwam/README 26*11767SAnurag.Maskey@Sun.COM# 27*11767SAnurag.Maskey@Sun.COM 28*11767SAnurag.Maskey@Sun.COMNAME 29*11767SAnurag.Maskey@Sun.COM libnwam - Network Auto-Magic (NWAM) configuration and event 30*11767SAnurag.Maskey@Sun.COM management library 31*11767SAnurag.Maskey@Sun.COM 32*11767SAnurag.Maskey@Sun.COMDESCRIPTION 33*11767SAnurag.Maskey@Sun.COM 34*11767SAnurag.Maskey@Sun.COMThe libnwam library is provided so that the various consumers of 35*11767SAnurag.Maskey@Sun.COMNetwork Auto-Magic (NWAM) configuration information - i.e. the NWAM 36*11767SAnurag.Maskey@Sun.COMGUI, the nwamcfg CLI and the NWAM daemon - have a consistent interface 37*11767SAnurag.Maskey@Sun.COMfor retrieving and updating NWAM-related configuration data, abstracted 38*11767SAnurag.Maskey@Sun.COMfrom the actual manner in which the data is persistently stored. It 39*11767SAnurag.Maskey@Sun.COMprovides functionality to interact with the key components of NWAM 40*11767SAnurag.Maskey@Sun.COMconfiguration, as described below. Additionally the library provides 41*11767SAnurag.Maskey@Sun.COMfunctionality for system events to flow from the NWAM daemon to a 42*11767SAnurag.Maskey@Sun.COMclient (like the GUI panel applet). 43*11767SAnurag.Maskey@Sun.COM 44*11767SAnurag.Maskey@Sun.COMEach of these configuration components is referred to as an 'entity'. 45*11767SAnurag.Maskey@Sun.COM 46*11767SAnurag.Maskey@Sun.COMNetwork Configuration Units (NCUs): units that specify either link or 47*11767SAnurag.Maskey@Sun.COMinterface (IP) configuration. An NCP consists of a set of NCUs, one for 48*11767SAnurag.Maskey@Sun.COMeach datalink (physical, tunnel, aggregation etc), and one for each IP 49*11767SAnurag.Maskey@Sun.COMinterface. 50*11767SAnurag.Maskey@Sun.COM 51*11767SAnurag.Maskey@Sun.COMNetwork Configuration Profiles (NCPs): A network configuration profile (NCP) 52*11767SAnurag.Maskey@Sun.COMcomprises of a set of NCUs specifying configuration preferences to be applied 53*11767SAnurag.Maskey@Sun.COMwhen that profile is active. 54*11767SAnurag.Maskey@Sun.COM 55*11767SAnurag.Maskey@Sun.COMLocations: A location consists of additional configuration preferences 56*11767SAnurag.Maskey@Sun.COMto be applied when basic IP configuration is complete. Information 57*11767SAnurag.Maskey@Sun.COMsuch as name service specification, proxies, etc. can be specified. 58*11767SAnurag.Maskey@Sun.COM 59*11767SAnurag.Maskey@Sun.COMExternal Network Modifiers (ENMs): units that specify an external service 60*11767SAnurag.Maskey@Sun.COMor executable that modifies the network configuration. Properties of an 61*11767SAnurag.Maskey@Sun.COMENM include an FMRI or Start and Stop exec strings, an optional environment 62*11767SAnurag.Maskey@Sun.COMwhich will be activated when the ENM is started, an activation type specifying 63*11767SAnurag.Maskey@Sun.COMwhen the ENM should be started (e.g. on user input, dependent on an NCU-- 64*11767SAnurag.Maskey@Sun.COMeither requiring or excluding a particular NCU, or always-on). Each ENM 65*11767SAnurag.Maskey@Sun.COMalso has a read-only state property, which indicates whether or not the 66*11767SAnurag.Maskey@Sun.COMENM has been activated by nwam. 67*11767SAnurag.Maskey@Sun.COM 68*11767SAnurag.Maskey@Sun.COMKnown WiFi Networks (known WLANs): units that specify configuration 69*11767SAnurag.Maskey@Sun.COMdata associated with known WiFi access points that the user visits. If 70*11767SAnurag.Maskey@Sun.COMa WLAN found by scanning is one of the known WLANs, NWAM will automatically 71*11767SAnurag.Maskey@Sun.COMconnect. Priorities associated with known WLANs can also be manipulated 72*11767SAnurag.Maskey@Sun.COMallowing users to prioritize particular WLANs. 73*11767SAnurag.Maskey@Sun.COM 74*11767SAnurag.Maskey@Sun.COMEvents 75*11767SAnurag.Maskey@Sun.COM 76*11767SAnurag.Maskey@Sun.COMThe event interface allows a client of NWAM (usu. the GUI) to subscribe 77*11767SAnurag.Maskey@Sun.COMto a stream of system events such as link and interface up/down, 78*11767SAnurag.Maskey@Sun.COMwireless scans, and times when NWAM needs the user to be queried. 79*11767SAnurag.Maskey@Sun.COM 80*11767SAnurag.Maskey@Sun.COMEvents types are in libnwam.h as NWAM_EVENTS_* and the actual bodies of 81*11767SAnurag.Maskey@Sun.COMthe events are in nwam_events_msg_t. The semantics of the events have 82*11767SAnurag.Maskey@Sun.COMbeen simplified so that none require response. They are all 83*11767SAnurag.Maskey@Sun.COMnotification. 84*11767SAnurag.Maskey@Sun.COM 85*11767SAnurag.Maskey@Sun.COMNWAM_EVENTS_SOURCE_{DEAD,BACK} provide notification that the nwam 86*11767SAnurag.Maskey@Sun.COMdaemon has died or has reappeared. These are synthetic events in that 87*11767SAnurag.Maskey@Sun.COMthey come from the library and not from nwamd. 88*11767SAnurag.Maskey@Sun.COM 89*11767SAnurag.Maskey@Sun.COMNWAM_EVENTS_NO_MAGIC provides notification that nwam couldn't make a 90*11767SAnurag.Maskey@Sun.COMdetermination of what to do without user guidance. This event provides 91*11767SAnurag.Maskey@Sun.COMinformation that can be used to ask the user if he wants to pick a 92*11767SAnurag.Maskey@Sun.COMwireless lan although in some cases nwam might have no idea what is 93*11767SAnurag.Maskey@Sun.COMintended. 94*11767SAnurag.Maskey@Sun.COM 95*11767SAnurag.Maskey@Sun.COMNWAM_EVENTS_IF_{STATE,REMOVED} provide information about changes in 96*11767SAnurag.Maskey@Sun.COMinterface state or the removal of an interface. 97*11767SAnurag.Maskey@Sun.COM 98*11767SAnurag.Maskey@Sun.COMNWAM_EVENTS_LINK_{STATE, REMOVED} provides information about changes in 99*11767SAnurag.Maskey@Sun.COMlink state or the removal of a link. 100*11767SAnurag.Maskey@Sun.COM 101*11767SAnurag.Maskey@Sun.COMNWAM_EVENTS_SCAN_REPORT is used to communicate information about 102*11767SAnurag.Maskey@Sun.COMwireless networks encountered. 103*11767SAnurag.Maskey@Sun.COM 104*11767SAnurag.Maskey@Sun.COMPersistent configuration state of entities is stored in project-private 105*11767SAnurag.Maskey@Sun.COM/etc/nwam configuration files, and the details of storage are hidden 106*11767SAnurag.Maskey@Sun.COMfrom libnwam consumers. 107*11767SAnurag.Maskey@Sun.COM 108*11767SAnurag.Maskey@Sun.COMAccess to entities is attained via an entity-specific handle. These 109*11767SAnurag.Maskey@Sun.COMhandles can be obtained via calls to nwam_<entity>_create() or 110*11767SAnurag.Maskey@Sun.COMnwam_<entity>_read(), and freed (in memory) via calls to nwam_<entity>_free(). 111*11767SAnurag.Maskey@Sun.COMnwam_<entity>_create() will create an in-memory representation of the 112*11767SAnurag.Maskey@Sun.COMentity, but that entity will not be stored until nwam_<entity>_commit() is 113*11767SAnurag.Maskey@Sun.COMcalled. Persistently stored entitites are retrieved via nwam_<entity>_read(), 114*11767SAnurag.Maskey@Sun.COMcan be modified in-memory, and later persistently committed to storage 115*11767SAnurag.Maskey@Sun.COMvia nwam_<entity>_commit(). Entities can also be copied with 116*11767SAnurag.Maskey@Sun.COMnwam_<entity>_copy(). 117*11767SAnurag.Maskey@Sun.COM 118*11767SAnurag.Maskey@Sun.COMAll changes made after binding a handle to an entity, and prior to calling 119*11767SAnurag.Maskey@Sun.COMnwam_<entity>_commit() are carried out on the in-memory representation of that 120*11767SAnurag.Maskey@Sun.COMentity. nwam_<entity>_commit() updates persistent storage in an all-or-none 121*11767SAnurag.Maskey@Sun.COMtransactional manner, applying the (possibly changed) in-memory representation 122*11767SAnurag.Maskey@Sun.COMto persistent storage atomically. 123*11767SAnurag.Maskey@Sun.COM 124*11767SAnurag.Maskey@Sun.COMTo destroy an entity in persistent storage, nwam_<entity>_destroy() is 125*11767SAnurag.Maskey@Sun.COMused. This is distinct from nwam_<entity>_free(), which simply frees 126*11767SAnurag.Maskey@Sun.COMthe in-memory representation - destroy both removes the object from 127*11767SAnurag.Maskey@Sun.COMpersistent storage, and frees it in memory. 128*11767SAnurag.Maskey@Sun.COM 129*11767SAnurag.Maskey@Sun.COMTo summarize, the pattern of interactions with an entity is 130*11767SAnurag.Maskey@Sun.COM - nwam_<entity>_read(), nwam_<entity>_create() or nwam_<entity>_copy() 131*11767SAnurag.Maskey@Sun.COM - possibly modify entity properties 132*11767SAnurag.Maskey@Sun.COM - nwam_<entity>_commit() or nwam_<entity>_destroy() 133*11767SAnurag.Maskey@Sun.COM - nwam_<entity>_handle_free() 134*11767SAnurag.Maskey@Sun.COM 135*11767SAnurag.Maskey@Sun.COMUnless otherwise stated functions in libnwam are MT-safe. The 136*11767SAnurag.Maskey@Sun.COMatomicity of _commit() and _read() operations is guaranteed - i.e. 137*11767SAnurag.Maskey@Sun.COM_commit() is guaranteed to deliver all property changes to persistent 138*11767SAnurag.Maskey@Sun.COMstorage, while _read() is guaranteed to read a consistent view of the 139*11767SAnurag.Maskey@Sun.COMentity (i.e. _read() cannot collide with another entity _commit()ting 140*11767SAnurag.Maskey@Sun.COMchanges). However, it is possible that a _read() will retrieve an 141*11767SAnurag.Maskey@Sun.COMoutdated view of an entity, if after the _read() completes, another 142*11767SAnurag.Maskey@Sun.COMentity _commit()s changes. In other words, lost updates are possible. 143*11767SAnurag.Maskey@Sun.COMThese are permitted given the nature of the entities changing NWAM 144*11767SAnurag.Maskey@Sun.COMconfiguration (the CLI and GUI) - it seems intuitive that the most 145*11767SAnurag.Maskey@Sun.COMrecent update best captures user intent. 146*11767SAnurag.Maskey@Sun.COM 147*11767SAnurag.Maskey@Sun.COMEntity validation on an in-memory representation can be explicitly requested 148*11767SAnurag.Maskey@Sun.COMvia a call to nwam_<entity>_validate(), and individual property values 149*11767SAnurag.Maskey@Sun.COMcan be validated via nwam_<entity>_validate_prop(). 150*11767SAnurag.Maskey@Sun.COM 151*11767SAnurag.Maskey@Sun.COMStorage and retrieval of properties is done via nwam_<entity>_set_prop_value() 152*11767SAnurag.Maskey@Sun.COMand nwam_<entity>_get_prop_value(). These functions require an nwam_value_t as 153*11767SAnurag.Maskey@Sun.COMa parameter, which is created via the nwam_value_create_<type>() family 154*11767SAnurag.Maskey@Sun.COMof functions. Data can be retrieved from the nwam_value_t via the 155*11767SAnurag.Maskey@Sun.COMnwam_value_get_<type>() family of functions. Once a property has been 156*11767SAnurag.Maskey@Sun.COMset, the associated nwam_value_t can be immediately freed. For retrieval, 157*11767SAnurag.Maskey@Sun.COMthe nwam_value_t should be freed when the value(s) are no longer needed. 158*11767SAnurag.Maskey@Sun.COMA property can also be delete with nwam_<entity>_delete_prop(). 159*11767SAnurag.Maskey@Sun.COM 160*11767SAnurag.Maskey@Sun.COMImplicit validation occurs as part of the nwam_<entity>_set_prop_value() 161*11767SAnurag.Maskey@Sun.COMand nwam_<entity>_commit() functions. 162*11767SAnurag.Maskey@Sun.COM 163*11767SAnurag.Maskey@Sun.COMINTERFACES 164*11767SAnurag.Maskey@Sun.COM 165*11767SAnurag.Maskey@Sun.COMFor error handling: 166*11767SAnurag.Maskey@Sun.COM 167*11767SAnurag.Maskey@Sun.COMconst char *nwam_strerror(nwam_error_t error); 168*11767SAnurag.Maskey@Sun.COM 169*11767SAnurag.Maskey@Sun.COMFor values: 170*11767SAnurag.Maskey@Sun.COM 171*11767SAnurag.Maskey@Sun.COMValues can be any of the following types: 172*11767SAnurag.Maskey@Sun.COM 173*11767SAnurag.Maskey@Sun.COM NWAM_VALUE_TYPE_BOOLEAN 174*11767SAnurag.Maskey@Sun.COM NWAM_VALUE_TYPE_UINT64 175*11767SAnurag.Maskey@Sun.COM NWAM_VALUE_TYPE_INT64 176*11767SAnurag.Maskey@Sun.COM NWAM_VALUE_TYPE_STRING 177*11767SAnurag.Maskey@Sun.COM 178*11767SAnurag.Maskey@Sun.COMand are possibly multi-valued. An nwam_value_t must be created in order 179*11767SAnurag.Maskey@Sun.COMto set property values in libnwam, this is done via the follwing functions: 180*11767SAnurag.Maskey@Sun.COM 181*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_create_boolean(boolean_t, nwam_value_t *); 182*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_create_boolean_array(boolean_t *, uint_t, 183*11767SAnurag.Maskey@Sun.COM nwam_value_t *); 184*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_create_uint64(uint64_t, nwam_value_t *); 185*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_create_uint64_array(uint64_t *, uint_t, nwam_value_t *); 186*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_create_int64(int64_t, nwam_value_t *); 187*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_create_int64_array(int64_t *, uint_t, nwam_value_t *); 188*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_create_string(char *, nwam_value_t *); 189*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_create_string_array(char **, uint_t, nwam_value_t *); 190*11767SAnurag.Maskey@Sun.COM 191*11767SAnurag.Maskey@Sun.COMValues are returned from the _get_prop_value() functions, and the data 192*11767SAnurag.Maskey@Sun.COMcontained in them can be retrieved via the following functions: 193*11767SAnurag.Maskey@Sun.COM 194*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_get_boolean(nwam_value_t, boolean_t *); 195*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_get_boolean_array(nwam_value_t, boolean_t **, uint_t *); 196*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_get_uint64(nwam_value_t, uint64_t *); 197*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_get_uint64_array(nwam_value_t, uint64_t **, uint_t *); 198*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_get_int64(nwam_value_t, int64_t *); 199*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_get_int64_array(nwam_value_t, int64_t **, uint_t *); 200*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_get_string(nwam_value_t, char **); 201*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_get_string_array(nwam_value_t, char ***, uint_t *); 202*11767SAnurag.Maskey@Sun.COM 203*11767SAnurag.Maskey@Sun.COMType and number of value can be retrieved via: 204*11767SAnurag.Maskey@Sun.COM 205*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_get_type(nwam_value_t, nwam_value_type_t *); 206*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_value_get_numvalues(nwam_value_t, uint_t *); 207*11767SAnurag.Maskey@Sun.COM 208*11767SAnurag.Maskey@Sun.COMand a value is freed using: 209*11767SAnurag.Maskey@Sun.COM 210*11767SAnurag.Maskey@Sun.COMvoid nwam_value_free(nwam_value_t); 211*11767SAnurag.Maskey@Sun.COM 212*11767SAnurag.Maskey@Sun.COMFor property setting, a typical set of events is to create the value, 213*11767SAnurag.Maskey@Sun.COMcall the appropriate set_prop_value() function, then free the value (values 214*11767SAnurag.Maskey@Sun.COMcan be safely freed prior to commit). For retrieval, the type and 215*11767SAnurag.Maskey@Sun.COMnumber of values usually need to be tested before calling the appropriate 216*11767SAnurag.Maskey@Sun.COMretrieval function. In this case, the value should not be freed until 217*11767SAnurag.Maskey@Sun.COMthe associated data is no longer needed. 218*11767SAnurag.Maskey@Sun.COM 219*11767SAnurag.Maskey@Sun.COMNCUs, locations and ENMs can all specify conditional activation conditions. 220*11767SAnurag.Maskey@Sun.COMInterfaces are provided to convert a conditional activation predicate into 221*11767SAnurag.Maskey@Sun.COMa string, or from a string to a parsed set of variables that comprise the 222*11767SAnurag.Maskey@Sun.COMcondition. Additionally a function is provided to rate the specificity of 223*11767SAnurag.Maskey@Sun.COMthe activation condition, used to compare location conditions to choose 224*11767SAnurag.Maskey@Sun.COMthe most specific condition to activate in the case where the activation 225*11767SAnurag.Maskey@Sun.COMconditions of multiple locations are specified. 226*11767SAnurag.Maskey@Sun.COM 227*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_condition_to_condition_string(nwam_condition_object_type_t, 228*11767SAnurag.Maskey@Sun.COM nwam_condition_t, const char *, char **); 229*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_condition_string_to_condition(const char *, 230*11767SAnurag.Maskey@Sun.COM nwam_condition_object_type_t *, nwam_condition_t *, char **); 231*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_condition_rate(nwam_condition_object_type_t, 232*11767SAnurag.Maskey@Sun.COM nwam_condition_t, uint64_t *); 233*11767SAnurag.Maskey@Sun.COM 234*11767SAnurag.Maskey@Sun.COMFor NCP entities: 235*11767SAnurag.Maskey@Sun.COM 236*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncp_create(const char *name, uint64_t flags, 237*11767SAnurag.Maskey@Sun.COM nwam_ncp_handle_t *ncp); 238*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncp_read(const char *name, uint64_t flags, 239*11767SAnurag.Maskey@Sun.COM nwam_ncp_handle_t *ncp); 240*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncp_copy(nwam_ncp_handle_t ncp, const char *newname, 241*11767SAnurag.Maskey@Sun.COM nwam_ncp_handle_t *newncp); 242*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncp_walk_ncus(nwam_ncp_handle_t ncp, 243*11767SAnurag.Maskey@Sun.COM int(*cb)(nwam_ncu_handle_t, void *), void *data, uint64_t flags, int *ret); 244*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncp_get_name(nwam_ncp_handle_t ncp, char **name); 245*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncp_activate(nwam_ncp_handle_t ncp); 246*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncp_deactivate(nwam_ncp_handle_t ncp); 247*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncp_destroy(nwam_ncp_handle_t ncp, uint64_t flags); 248*11767SAnurag.Maskey@Sun.COMvoid nwam_ncp_free(nwam_ncp_handle_t ncp); 249*11767SAnurag.Maskey@Sun.COM 250*11767SAnurag.Maskey@Sun.COMSince the NCP simply consists of the NCUs that comprise it, there is 251*11767SAnurag.Maskey@Sun.COMno NCP-specific commit() function - we simply read the NCP, walk the 252*11767SAnurag.Maskey@Sun.COMconstituent NCUs, reading, changing or committing them in turn. The 253*11767SAnurag.Maskey@Sun.COMwalk can be modified via the flags option to only select specific NCU types 254*11767SAnurag.Maskey@Sun.COMand classes. 255*11767SAnurag.Maskey@Sun.COM 256*11767SAnurag.Maskey@Sun.COMEach NCP has a set of NCUs associated with it, each of which is created/modifed 257*11767SAnurag.Maskey@Sun.COMusing the functions below. 258*11767SAnurag.Maskey@Sun.COM 259*11767SAnurag.Maskey@Sun.COMFor NCU entities: 260*11767SAnurag.Maskey@Sun.COM 261*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_create(nwam_ncp_handle_t ncp, const char *name, 262*11767SAnurag.Maskey@Sun.COM nwam_ncu_type_t type, nwam_ncu_class_t class, nwam_ncu_handle_t *ncu); 263*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_read(nwam_ncp_handle_t ncp, const char *name, 264*11767SAnurag.Maskey@Sun.COM nwam_ncu_type_t type, uint64_t flags, nwam_ncu_handle_t *ncu); 265*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_copy(nwam_ncu_handle_t ncu, const char *newname, 266*11767SAnurag.Maskey@Sun.COM nwam_ncu_handle_t *newncu); 267*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_commit(nwam_ncu_handle_t ncu, uint64_t flags); 268*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_destroy(nwam_ncu_handle_t ncu, uint64_t flags); 269*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_free(nwam_ncu_handle_t ncu); 270*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_validate(nwam_ncu_handle_t ncu, const char **errprop); 271*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_get_prop_value(nwam_ncu_handle_t ncu, const char *prop, 272*11767SAnurag.Maskey@Sun.COM nwam_value_t *value); 273*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_get_prop_description(const char *prop, 274*11767SAnurag.Maskey@Sun.COM const char **description); 275*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_delete_prop(nwam_ncu_handle_t ncu, const char *prop); 276*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_set_prop_value(nwam_ncu_handle_t ncu, const char *prop, 277*11767SAnurag.Maskey@Sun.COM nwam_value_t value); 278*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_get_name(nwam_ncu_handle_t ncu, char **name); 279*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_set_name(nwam_ncu_handle_t ncu, const char *name); 280*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_get_read_only(nwam_ncu_handle_t ncu, boolean_t *readp); 281*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_validate_prop(nwam_ncu_handle_t ncu, const char *prop, 282*11767SAnurag.Maskey@Sun.COM nwam_value_t value); 283*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_walk_props(nwam_ncu_handle_t ncu, 284*11767SAnurag.Maskey@Sun.COM int (*func)(void *, const char *, nwam_value_t), void *data, 285*11767SAnurag.Maskey@Sun.COM uint64_t flags, int *ret); 286*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_prop_get_type(const char *prop, 287*11767SAnurag.Maskey@Sun.COM nwam_value_type_t *value_type); 288*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_ncu_get_ncp(nwam_ncu_handle_t ncu, nwam_ncp_handle_t *ncp); 289*11767SAnurag.Maskey@Sun.COM 290*11767SAnurag.Maskey@Sun.COMNCUs are manipulated via an nwam_ncu_handle_t. 291*11767SAnurag.Maskey@Sun.COM 292*11767SAnurag.Maskey@Sun.COMEach NCU has a set of properties associated with it. Each property can 293*11767SAnurag.Maskey@Sun.COMhave mutiple values associated with it, which are set or retrieved via an 294*11767SAnurag.Maskey@Sun.COMnwam_value_t. The approach is similar to that used for Locations, with 295*11767SAnurag.Maskey@Sun.COMthe difference that read/commit/destroy must specify an NCP. Only two 296*11767SAnurag.Maskey@Sun.COMNCPs are supported at present, the automatic and user NCPs. Modification 297*11767SAnurag.Maskey@Sun.COMof the former is restricted to nwamd itself, and attempts to modify 298*11767SAnurag.Maskey@Sun.COMthe automatic NCP's consituent NCUs will result in an NWAM_ENTITY_READ_ONLY 299*11767SAnurag.Maskey@Sun.COMerror. 300*11767SAnurag.Maskey@Sun.COM 301*11767SAnurag.Maskey@Sun.COMFor Location entities: 302*11767SAnurag.Maskey@Sun.COM 303*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_create(const char *name, nwam_loc_handle_t *loc); 304*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_read(const char *name, uint64_t flags, 305*11767SAnurag.Maskey@Sun.COM nwam_loc_handle_t *loc); 306*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_copy(nwam_loc_handle_t loc, const char *newname, 307*11767SAnurag.Maskey@Sun.COM nwam_loc_handle_t *newloc); 308*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_walk_locs(int (*cb)(nwam_loc_handle_t loc, void *arg), 309*11767SAnurag.Maskey@Sun.COM void *arg, uint64_t flags, int *cbretp); 310*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_commit(nwam_loc_handle_t loc, uint64_t flags); 311*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_destroy(nwam_loc_handle_t loc, uint64_t flags); 312*11767SAnurag.Maskey@Sun.COMvoid nwam_loc_free(nwam_loc_handle_t loc); 313*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_validate(nwam_loc_handle_t loc, const char *errprop); 314*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_walk_props(nwam_loc_handle_t loc, 315*11767SAnurag.Maskey@Sun.COM int (*cb)(const char *, nwam_value_t **, void *), 316*11767SAnurag.Maskey@Sun.COM void *arg, uint64_t flags, int *cbret); 317*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_validate_prop(nwam_loc_handle_t loc, 318*11767SAnurag.Maskey@Sun.COM const char *prop, nwam_value_t value); 319*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_prop_get_type(const char *prop, 320*11767SAnurag.Maskey@Sun.COM nwam_value_type_t *value_type); 321*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_get_prop_value(nwam_loc_handle_t loc, const char *prop, 322*11767SAnurag.Maskey@Sun.COM nwam_value_t *value); 323*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_get_prop_description(const char *prop, 324*11767SAnurag.Maskey@Sun.COM const char **description); 325*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_delete_prop(nwam_loc_handle_t loc, const char *prop); 326*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_set_prop_value(nwam_loc_handle_t loc, const char *prop, 327*11767SAnurag.Maskey@Sun.COM nwam_value_t value); 328*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_get_name(nwam_loc_handle_t loc, char **name); 329*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_set_name(nwam_loc_handle_t loc, const char *name); 330*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_activate(nwam_loc_handle_t loc); 331*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_loc_deactivate(nwam_loc_handle_t loc); 332*11767SAnurag.Maskey@Sun.COM 333*11767SAnurag.Maskey@Sun.COMLocations are manipulated via an nwam_loc_handle_t. 334*11767SAnurag.Maskey@Sun.COM 335*11767SAnurag.Maskey@Sun.COMA loc handle maps to an in-memory representation of a location; operations via 336*11767SAnurag.Maskey@Sun.COMthis interface manipulate the in-memory data. In-memory data is read from 337*11767SAnurag.Maskey@Sun.COMpersistant storage via the nwam_loc_read() or nwam_walk_locs() functions, and 338*11767SAnurag.Maskey@Sun.COMwritten out to persistent storage via the nwam_loc_commit() function. A loc 339*11767SAnurag.Maskey@Sun.COMmay be permanently removed from persistent storage with the nwam_loc_destroy() 340*11767SAnurag.Maskey@Sun.COMfunction. Interactions with persistent storage will be nonblocking by default; 341*11767SAnurag.Maskey@Sun.COMthis behavior can be changed by passing the NWAM_FLAG_BLOCKING in the flags 342*11767SAnurag.Maskey@Sun.COMparameter. 343*11767SAnurag.Maskey@Sun.COM 344*11767SAnurag.Maskey@Sun.COMA typical sequence would be to allocate a loc handle, either by creating a 345*11767SAnurag.Maskey@Sun.COMnew loc (nwam_loc_create()) or by reading one from persistent storage (nwam_ 346*11767SAnurag.Maskey@Sun.COMloc_read() or nwam_walk_locs()). The various set/get/walk/validate/(de)activate 347*11767SAnurag.Maskey@Sun.COMfunctions may then be used to manipulate the loc; any changes made may then be 348*11767SAnurag.Maskey@Sun.COMcommitted to persistent storage via nwam_loc_commit(). A call to nwam_loc_ 349*11767SAnurag.Maskey@Sun.COMfree() is required to release in-memory resources associated with the handle. 350*11767SAnurag.Maskey@Sun.COM 351*11767SAnurag.Maskey@Sun.COMThe flags parameter in the walk functions allows filtering of the locs that 352*11767SAnurag.Maskey@Sun.COMwill be examined, depending on the state of each loc. Passing in 353*11767SAnurag.Maskey@Sun.COMNWAM_FLAG_STATE_ALL will examine all locs; specific state flags are defined 354*11767SAnurag.Maskey@Sun.COMin <libnwam.h>. 355*11767SAnurag.Maskey@Sun.COM 356*11767SAnurag.Maskey@Sun.COMLike NCUs, each loc has a set of properties associated with it. Loc properties 357*11767SAnurag.Maskey@Sun.COMare stored in nwam_value_t structures; see the Values section for how to store/ 358*11767SAnurag.Maskey@Sun.COMretrieve using these. 359*11767SAnurag.Maskey@Sun.COM 360*11767SAnurag.Maskey@Sun.COMFor ENM entities: 361*11767SAnurag.Maskey@Sun.COM 362*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_create(const char *name, const char *fmri, 363*11767SAnurag.Maskey@Sun.COM nwam_enm_handle_t *enm); 364*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_read(const char *name, uint64_t flags, 365*11767SAnurag.Maskey@Sun.COM nwam_enm_handle_t *enm); 366*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_copy(nwam_enm_handle_t enm, const char *newname, 367*11767SAnurag.Maskey@Sun.COM nwam_enm_handle_t *newenm); 368*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_walk_enms(int (*cb)(nwam_enm_handle_t enm, void *arg), 369*11767SAnurag.Maskey@Sun.COM void *arg, uint64_t flags, int *cbretp); 370*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_commit(nwam_enm_handle_t enm, uint64_t flags); 371*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_destroy(nwam_enm_handle_t enm, uint64_t flags); 372*11767SAnurag.Maskey@Sun.COMvoid nwam_enm_free(nwam_enm_handle_t enm); 373*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_validate(nwam_enm_handle_t enm, const char *errprop); 374*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_walk_props(nwam_enm_handle_t enm, 375*11767SAnurag.Maskey@Sun.COM int (*cb)(const char *, nwam_value_t **, void *), 376*11767SAnurag.Maskey@Sun.COM void *arg, uint64_t flags, int *cbret); 377*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_validate_prop(nwam_enm_handle_t enm, 378*11767SAnurag.Maskey@Sun.COM const char *prop, nwam_value_t value); 379*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_prop_get_type(const char *prop, 380*11767SAnurag.Maskey@Sun.COM nwam_value_type_t *value_type); 381*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_get_prop_value(nwam_enm_handle_t enm, const char *prop, 382*11767SAnurag.Maskey@Sun.COM nwam_value_t *value); 383*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_get_prop_description(const char *prop, 384*11767SAnurag.Maskey@Sun.COM const char **description); 385*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_delete_prop(nwam_enm_handle_t enm, const char *prop); 386*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_set_prop_value(nwam_enm_handle_t enm, const char *prop, 387*11767SAnurag.Maskey@Sun.COM nwam_value_t value); 388*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_get_name(nwam_enm_handle_t enm, char **name); 389*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_set_name(nwam_enm_handle_t enm, const char *name); 390*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_activate(nwam_enm_handle_t enm); 391*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_enm_deactivate(nwam_enm_handle_t enm); 392*11767SAnurag.Maskey@Sun.COM 393*11767SAnurag.Maskey@Sun.COMENMs are manipulated via an nwam_enm_handle_t, in a similar manner to 394*11767SAnurag.Maskey@Sun.COMNCUs and locations. 395*11767SAnurag.Maskey@Sun.COM 396*11767SAnurag.Maskey@Sun.COMThe flags parameter in the walk functions allows filtering of the ENMs that 397*11767SAnurag.Maskey@Sun.COMwill be examined, depending on the state of each ENM. Passing in 398*11767SAnurag.Maskey@Sun.COMNWAM_FLAG_STATE_ALL will examine all ENMs; specific state flags are defined 399*11767SAnurag.Maskey@Sun.COMin <libnwam.h>. 400*11767SAnurag.Maskey@Sun.COM 401*11767SAnurag.Maskey@Sun.COMLike NCUs, each ENM has a set of properties associated with it. ENM properties 402*11767SAnurag.Maskey@Sun.COMare all single valued, though the interface is aligned with the NCU interface, 403*11767SAnurag.Maskey@Sun.COMwhich allows for multi-valued properties. ENM properties are stored in 404*11767SAnurag.Maskey@Sun.COMnwam_value_t structures; see the Values section for how to store/retrieve 405*11767SAnurag.Maskey@Sun.COMusing these. 406*11767SAnurag.Maskey@Sun.COM 407*11767SAnurag.Maskey@Sun.COMFor known WLAN entities: 408*11767SAnurag.Maskey@Sun.COM 409*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_create(const char *name, 410*11767SAnurag.Maskey@Sun.COM nwam_known_wlan_handle_t *kwhp); 411*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_read(const char *name, uint64_t flags, 412*11767SAnurag.Maskey@Sun.COM nwam_known_wlan_handle_t *kwhp); 413*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_copy(nwam_known_wlan_handle_t kwh, 414*11767SAnurag.Maskey@Sun.COM const char *newname, nwam_known_wlan_handle_t *newkwh); 415*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_walk_known_wlans(int (*cb)(nwam_known_wlan_handle_t, void *), 416*11767SAnurag.Maskey@Sun.COM void *arg, uint64_t flags, int *cbretp); 417*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_commit(nwam_known_wlan_handle_t kwh, 418*11767SAnurag.Maskey@Sun.COM uint64_t flags); 419*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_destroy(nwam_known_wlan_handle_t kwh, 420*11767SAnurag.Maskey@Sun.COM uint64_t flags); 421*11767SAnurag.Maskey@Sun.COMvoid nwam_known_wlan_free(nwam_known_wlan_handle_t kwh); 422*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_validate(nwam_known_wlan_handle_t kwh, 423*11767SAnurag.Maskey@Sun.COM const char *errprop); 424*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_walk_props(nwam_known_wlan_handle_t kwh, 425*11767SAnurag.Maskey@Sun.COM int (*cb)(const char *, nwam_value_t **, void *), 426*11767SAnurag.Maskey@Sun.COM void *arg, uint64_t flags, int *cbret); 427*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_validate_prop(nwam_known_wlan_handle_t kwh, 428*11767SAnurag.Maskey@Sun.COM const char *prop, nwam_value_t value); 429*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_prop_get_type(const char *prop, 430*11767SAnurag.Maskey@Sun.COM nwam_value_type_t *value_type); 431*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_get_prop_value(nwam_known_wlan_handle_t kwh, 432*11767SAnurag.Maskey@Sun.COM const char *prop, nwam_value_t *value); 433*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_get_prop_description(const char *prop, 434*11767SAnurag.Maskey@Sun.COM const char **description); 435*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_delete_prop(nwam_known_wlan_handle_t kwh, 436*11767SAnurag.Maskey@Sun.COM const char *prop); 437*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_set_prop_value(nwam_known_wlan_handle_t kwh, 438*11767SAnurag.Maskey@Sun.COM const char *prop, nwam_value_t value); 439*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_get_name(nwam_known_wlan_handle_t kwh, 440*11767SAnurag.Maskey@Sun.COM char **name); 441*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_set_name(nwam_known_wlan_handle_t kwh, 442*11767SAnurag.Maskey@Sun.COM const char *name); 443*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_add_to_known_wlan(const char *essid, 444*11767SAnurag.Maskey@Sun.COM const char *bssid); 445*11767SAnurag.Maskey@Sun.COMnwam_error_t nwam_known_wlan_remove_from_known_wlan(const char *essid, 446*11767SAnurag.Maskey@Sun.COM const char *bssid); 447*11767SAnurag.Maskey@Sun.COM 448*11767SAnurag.Maskey@Sun.COMKnown WLANs are manipulated via an nwam_known_wlan_handle_t, in a similar 449*11767SAnurag.Maskey@Sun.COMmanner to NCUs, locations and ENMs. 450*11767SAnurag.Maskey@Sun.COM 451*11767SAnurag.Maskey@Sun.COMLike ENMs, each known WLAN has a set of properties associated with it. 452*11767SAnurag.Maskey@Sun.COMKnown WLAN properties are stored in nwam_value_t structures; see the Values 453*11767SAnurag.Maskey@Sun.COMsection for how to store/retrieve using these. 454*11767SAnurag.Maskey@Sun.COM 455*11767SAnurag.Maskey@Sun.COMFor WLANs, we define a set of functions to ask nwamd to initiate a scan, 456*11767SAnurag.Maskey@Sun.COMselect a WLAN (and possibly add it to the known WLAN list) or set a WLAN 457*11767SAnurag.Maskey@Sun.COMkey: 458*11767SAnurag.Maskey@Sun.COM 459*11767SAnurag.Maskey@Sun.COM 460*11767SAnurag.Maskey@Sun.COMextern nwam_error_t nwam_wlan_scan(const char *linkname); 461*11767SAnurag.Maskey@Sun.COMextern nwam_error_t nwam_wlan_get_scan_results(const char *linkname, 462*11767SAnurag.Maskey@Sun.COM uint_t *num_resultsp, nwam_wlan_t **wlansp); 463*11767SAnurag.Maskey@Sun.COMextern nwam_error_t nwam_wlan_select(const char *linkname, 464*11767SAnurag.Maskey@Sun.COM const char *essid, const char *bssid, boolean_t add_to_known_wlans); 465*11767SAnurag.Maskey@Sun.COMextern nwam_error_t nwam_wlan_set_key(const char *linkname, const char *essid, 466*11767SAnurag.Maskey@Sun.COM const char *bssid, uint32_t security_mode, uint_t keyslot, const char *key); 467*11767SAnurag.Maskey@Sun.COM 468*11767SAnurag.Maskey@Sun.COMFor Events: 469*11767SAnurag.Maskey@Sun.COM 470*11767SAnurag.Maskey@Sun.COMtypedef struct nwam_event { 471*11767SAnurag.Maskey@Sun.COM uint32_t type; 472*11767SAnurag.Maskey@Sun.COM 473*11767SAnurag.Maskey@Sun.COM union { 474*11767SAnurag.Maskey@Sun.COM struct { 475*11767SAnurag.Maskey@Sun.COM nwam_object_type_t object_type; 476*11767SAnurag.Maskey@Sun.COM char name[NWAM_MAX_NAME_LEN]; 477*11767SAnurag.Maskey@Sun.COM nwam_action_t action; 478*11767SAnurag.Maskey@Sun.COM } object_action; 479*11767SAnurag.Maskey@Sun.COM 480*11767SAnurag.Maskey@Sun.COM 481*11767SAnurag.Maskey@Sun.COM ... and so on for each message ... 482*11767SAnurag.Maskey@Sun.COM 483*11767SAnurag.Maskey@Sun.COM } data; 484*11767SAnurag.Maskey@Sun.COM 485*11767SAnurag.Maskey@Sun.COM} *nwam_event_t; 486*11767SAnurag.Maskey@Sun.COM 487*11767SAnurag.Maskey@Sun.COMtype comes from the set of constants NWAM_EVENT_TYPE_*. 488*11767SAnurag.Maskey@Sun.COM 489*11767SAnurag.Maskey@Sun.COMRegistration and cancellation of registration are done via 490*11767SAnurag.Maskey@Sun.COM_init and _fini functions: 491*11767SAnurag.Maskey@Sun.COM 492*11767SAnurag.Maskey@Sun.COMextern nwam_error_t nwam_events_init(void); 493*11767SAnurag.Maskey@Sun.COMextern void nwam_events_fini(void); 494*11767SAnurag.Maskey@Sun.COM 495*11767SAnurag.Maskey@Sun.COMEvents can then be recieved by calling nwam_event_wait(): 496*11767SAnurag.Maskey@Sun.COM 497*11767SAnurag.Maskey@Sun.COMextern nwam_error_t nwam_event_wait(nwam_event_t *); 498*11767SAnurag.Maskey@Sun.COM 499*11767SAnurag.Maskey@Sun.COMThe event can then be processed, and free via nwam_event_free(); 500*11767SAnurag.Maskey@Sun.COM 501*11767SAnurag.Maskey@Sun.COMRETURN VALUES 502*11767SAnurag.Maskey@Sun.COM 503*11767SAnurag.Maskey@Sun.COMAll functions return an nwam_error_t if they return an error. Possible 504*11767SAnurag.Maskey@Sun.COMerrors are: 505*11767SAnurag.Maskey@Sun.COM 506*11767SAnurag.Maskey@Sun.COM NWAM_SUCCESS No error occured 507*11767SAnurag.Maskey@Sun.COM NWAM_LIST_END End of list 508*11767SAnurag.Maskey@Sun.COM NWAM_INVALID_HANDLE Entity handle is invalid 509*11767SAnurag.Maskey@Sun.COM NWAM_HANDLE_UNBOUND Handle not bound to entity 510*11767SAnurag.Maskey@Sun.COM NWAM_INVALID_ARG Argument is invalid 511*11767SAnurag.Maskey@Sun.COM NWAM_PERMISSION_DENIED Insufficient privileges for action 512*11767SAnurag.Maskey@Sun.COM NWAM_NO_MEMORY Out of memory 513*11767SAnurag.Maskey@Sun.COM NWAM_ENTITY_EXISTS Entity already exists 514*11767SAnurag.Maskey@Sun.COM NWAM_ENTITY_IN_USE Another user is interacting with entity 515*11767SAnurag.Maskey@Sun.COM NWAM_ENTITY_COMMITTED Entity already committed 516*11767SAnurag.Maskey@Sun.COM NWAM_ENTITY_NOT_FOUND Entity not found 517*11767SAnurag.Maskey@Sun.COM NWAM_ENTITY_TYPE_MISMATCH Entity value-type mismatch 518*11767SAnurag.Maskey@Sun.COM NWAM_ENTITY_INVALID Validation of entity failed 519*11767SAnurag.Maskey@Sun.COM NWAM_ENTITY_INVALID_MEMBER Entity member invalid 520*11767SAnurag.Maskey@Sun.COM NWAM_ENTITY_INVALID_VALUE Validation of entity value failed 521*11767SAnurag.Maskey@Sun.COM NWAM_ENTITY_NO_VALUE No value associated with entity 522*11767SAnurag.Maskey@Sun.COM NWAM_ENTITY_MULTIPLE_VALUES, Multiple values for entity 523*11767SAnurag.Maskey@Sun.COM NWAM_ENTITY_READ_ONLY, Entity is marked read only 524*11767SAnurag.Maskey@Sun.COM NWAM_WALK_HALTED, Callback function returned nonzero 525*11767SAnurag.Maskey@Sun.COM NWAM_ERROR_BIND, Could not bind to backend 526*11767SAnurag.Maskey@Sun.COM NWAM_ERROR_BACKEND_INIT, Could not initialize backend 527*11767SAnurag.Maskey@Sun.COM NWAM_ERROR_INTERNAL Internal error 528*11767SAnurag.Maskey@Sun.COM 529*11767SAnurag.Maskey@Sun.COMFILES 530*11767SAnurag.Maskey@Sun.COM /lib/libnwam.so.1 shared object 531*11767SAnurag.Maskey@Sun.COM 532*11767SAnurag.Maskey@Sun.COMATTRIBUTES 533*11767SAnurag.Maskey@Sun.COM 534*11767SAnurag.Maskey@Sun.COM 535*11767SAnurag.Maskey@Sun.COMSEE ALSO 536*11767SAnurag.Maskey@Sun.COM nwamd(1M), nwamcfg(1M), nwamadm(1M) 537