111767SAnurag.Maskey@Sun.COM /*
211767SAnurag.Maskey@Sun.COM * CDDL HEADER START
311767SAnurag.Maskey@Sun.COM *
411767SAnurag.Maskey@Sun.COM * The contents of this file are subject to the terms of the
511767SAnurag.Maskey@Sun.COM * Common Development and Distribution License (the "License").
611767SAnurag.Maskey@Sun.COM * You may not use this file except in compliance with the License.
711767SAnurag.Maskey@Sun.COM *
811767SAnurag.Maskey@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
911767SAnurag.Maskey@Sun.COM * or http://www.opensolaris.org/os/licensing.
1011767SAnurag.Maskey@Sun.COM * See the License for the specific language governing permissions
1111767SAnurag.Maskey@Sun.COM * and limitations under the License.
1211767SAnurag.Maskey@Sun.COM *
1311767SAnurag.Maskey@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
1411767SAnurag.Maskey@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1511767SAnurag.Maskey@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
1611767SAnurag.Maskey@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
1711767SAnurag.Maskey@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
1811767SAnurag.Maskey@Sun.COM *
1911767SAnurag.Maskey@Sun.COM * CDDL HEADER END
2011767SAnurag.Maskey@Sun.COM */
2111767SAnurag.Maskey@Sun.COM
2211767SAnurag.Maskey@Sun.COM /*
2311767SAnurag.Maskey@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
2411767SAnurag.Maskey@Sun.COM * Use is subject to license terms.
2511767SAnurag.Maskey@Sun.COM */
2611767SAnurag.Maskey@Sun.COM
2711767SAnurag.Maskey@Sun.COM #include <assert.h>
2811767SAnurag.Maskey@Sun.COM #include <ctype.h>
2911767SAnurag.Maskey@Sun.COM #include <libgen.h>
3011767SAnurag.Maskey@Sun.COM #include <netdb.h>
3111767SAnurag.Maskey@Sun.COM #include <sys/param.h>
3211767SAnurag.Maskey@Sun.COM #include <sys/types.h>
3311767SAnurag.Maskey@Sun.COM #include <sys/stat.h>
3411767SAnurag.Maskey@Sun.COM #include <sys/socket.h>
3511767SAnurag.Maskey@Sun.COM #include <netinet/in.h>
3611767SAnurag.Maskey@Sun.COM #include <arpa/inet.h>
3711767SAnurag.Maskey@Sun.COM #include <stdio.h>
3811767SAnurag.Maskey@Sun.COM #include <stdlib.h>
3911767SAnurag.Maskey@Sun.COM #include <strings.h>
4011767SAnurag.Maskey@Sun.COM #include <unistd.h>
4111767SAnurag.Maskey@Sun.COM #include <libdladm.h>
4211767SAnurag.Maskey@Sun.COM
4311767SAnurag.Maskey@Sun.COM #include "libnwam_impl.h"
4411767SAnurag.Maskey@Sun.COM #include <libnwam_priv.h>
4511767SAnurag.Maskey@Sun.COM #include <libnwam.h>
4611767SAnurag.Maskey@Sun.COM
4711767SAnurag.Maskey@Sun.COM /*
4811767SAnurag.Maskey@Sun.COM * Functions to support creating, modifying, destroying, querying the
4911767SAnurag.Maskey@Sun.COM * state of and changing the state of NCP (Network Configuration Profiles)
5011767SAnurag.Maskey@Sun.COM * and the NCUs (Network Configuration Units) that are contained in those
5111767SAnurag.Maskey@Sun.COM * NCP objects. An NCP is simply a container for a set of NCUs which represent
5211767SAnurag.Maskey@Sun.COM * the datalink and interface configuration preferences for the system.
5311767SAnurag.Maskey@Sun.COM * An NCP can consist a set of prioritized link NCUs, e.g. wired links preferred
5411767SAnurag.Maskey@Sun.COM * over wireless, a set of manually enabled/diasbled NCUs, or a combination
5511767SAnurag.Maskey@Sun.COM * of both. Interface NCUs inherit activation from their underlying links,
5611767SAnurag.Maskey@Sun.COM * so if wired is preferred over wireless and a cable is plugged in,
5711767SAnurag.Maskey@Sun.COM * the wired link NCU will be active, as will the IP interface NCU above it.
5811767SAnurag.Maskey@Sun.COM */
5911767SAnurag.Maskey@Sun.COM
6011767SAnurag.Maskey@Sun.COM /*
6111767SAnurag.Maskey@Sun.COM * The NCU property table is used to mapping property types to property name
6211767SAnurag.Maskey@Sun.COM * strings, their associated value types etc. The table is used for validation
6311767SAnurag.Maskey@Sun.COM * purposes, and for commit()ing and read()ing NCUs.
6411767SAnurag.Maskey@Sun.COM */
6511767SAnurag.Maskey@Sun.COM
6611767SAnurag.Maskey@Sun.COM static nwam_error_t valid_type(nwam_value_t);
6711767SAnurag.Maskey@Sun.COM static nwam_error_t valid_class(nwam_value_t);
6811767SAnurag.Maskey@Sun.COM static nwam_error_t valid_ncp(nwam_value_t);
6911767SAnurag.Maskey@Sun.COM static nwam_error_t valid_priority_mode(nwam_value_t);
7011767SAnurag.Maskey@Sun.COM static nwam_error_t valid_ncu_activation_mode(nwam_value_t);
7111767SAnurag.Maskey@Sun.COM static nwam_error_t valid_link_autopush(nwam_value_t);
7211767SAnurag.Maskey@Sun.COM static nwam_error_t valid_link_mtu(nwam_value_t);
7311767SAnurag.Maskey@Sun.COM static nwam_error_t valid_ip_version(nwam_value_t);
7411767SAnurag.Maskey@Sun.COM static nwam_error_t valid_addrsrc_v4(nwam_value_t);
7511767SAnurag.Maskey@Sun.COM static nwam_error_t valid_addrsrc_v6(nwam_value_t);
7611767SAnurag.Maskey@Sun.COM
7711767SAnurag.Maskey@Sun.COM struct nwam_prop_table_entry ncu_prop_table_entries[] = {
7811767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_TYPE, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1, 1, valid_type,
7911767SAnurag.Maskey@Sun.COM "specifies the NCU type - valid values are \'datalink\' and \'ip\'",
8011767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_ALL, NWAM_FLAG_NCU_CLASS_ALL},
8111767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_CLASS, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1, 1,
8211767SAnurag.Maskey@Sun.COM valid_class,
8311767SAnurag.Maskey@Sun.COM "specifies the NCU class - valid values are "
8411767SAnurag.Maskey@Sun.COM "\'phys\' and \'ip\'",
8511767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_ALL, NWAM_FLAG_NCU_CLASS_ALL},
8611767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_PARENT_NCP, NWAM_VALUE_TYPE_STRING, B_FALSE, 1, 1,
8711767SAnurag.Maskey@Sun.COM valid_ncp,
8811767SAnurag.Maskey@Sun.COM "specifies the parent NCP name",
8911767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_ALL, NWAM_FLAG_NCU_CLASS_ALL},
9011767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_ACTIVATION_MODE, NWAM_VALUE_TYPE_UINT64, B_FALSE, 1, 1,
9111767SAnurag.Maskey@Sun.COM valid_ncu_activation_mode,
9211767SAnurag.Maskey@Sun.COM "specifies the NCU activation mode - valid values are:\n"
9311767SAnurag.Maskey@Sun.COM "\'prioritized\' and \'manual\'",
9411767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_LINK, NWAM_FLAG_NCU_CLASS_ALL_LINK},
9511767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_ENABLED, NWAM_VALUE_TYPE_BOOLEAN, B_TRUE, 0, 1,
9611767SAnurag.Maskey@Sun.COM nwam_valid_boolean,
9711767SAnurag.Maskey@Sun.COM "specifies if manual NCU is to be enabled",
9811767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_ALL, NWAM_FLAG_NCU_CLASS_ALL},
9911767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_PRIORITY_GROUP, NWAM_VALUE_TYPE_UINT64, B_FALSE, 0, 1,
10011767SAnurag.Maskey@Sun.COM nwam_valid_uint64,
10111767SAnurag.Maskey@Sun.COM "specifies the priority grouping of NCUs - lower values are "
10211767SAnurag.Maskey@Sun.COM "prioritized, negative values are invalid",
10311767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_LINK, NWAM_FLAG_NCU_CLASS_ALL_LINK},
10411767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_PRIORITY_MODE, NWAM_VALUE_TYPE_UINT64, B_FALSE, 0, 1,
10511767SAnurag.Maskey@Sun.COM valid_priority_mode,
10611767SAnurag.Maskey@Sun.COM "specifies the mode of prioritization - valid values are:\n"
10711767SAnurag.Maskey@Sun.COM "\'exclusive\', \'shared\' and \'all\'",
10811767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_LINK, NWAM_FLAG_NCU_CLASS_ALL_LINK},
10911767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_LINK_MAC_ADDR, NWAM_VALUE_TYPE_STRING, B_FALSE, 0, 1,
11011767SAnurag.Maskey@Sun.COM nwam_valid_mac_addr,
11111767SAnurag.Maskey@Sun.COM "specifies MAC address of form aa:bb:cc:dd:ee:ff for the link",
11211767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_LINK, NWAM_FLAG_NCU_CLASS_ALL_LINK},
11311767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_LINK_AUTOPUSH, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
11411767SAnurag.Maskey@Sun.COM NWAM_MAX_NUM_VALUES, valid_link_autopush,
11511767SAnurag.Maskey@Sun.COM "specifies modules to autopush on link",
11611767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_LINK, NWAM_FLAG_NCU_CLASS_ALL_LINK},
11711767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_LINK_MTU, NWAM_VALUE_TYPE_UINT64, B_FALSE, 0, 1,
11811767SAnurag.Maskey@Sun.COM valid_link_mtu,
11911767SAnurag.Maskey@Sun.COM "specifies MTU for link",
12011767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_LINK, NWAM_FLAG_NCU_CLASS_ALL_LINK},
12111767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_IP_VERSION, NWAM_VALUE_TYPE_UINT64, B_FALSE, 0,
12211767SAnurag.Maskey@Sun.COM NWAM_MAX_NUM_VALUES, valid_ip_version,
12311767SAnurag.Maskey@Sun.COM "specifies IP versions for IP NCU - valid values are:\n"
12411767SAnurag.Maskey@Sun.COM "\'ipv4\' and \'ipv6\'",
12511767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_INTERFACE, NWAM_FLAG_NCU_CLASS_ALL_INTERFACE},
12611767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_IPV4_ADDRSRC, NWAM_VALUE_TYPE_UINT64, B_FALSE, 0,
12711767SAnurag.Maskey@Sun.COM NWAM_MAX_NUM_VALUES, valid_addrsrc_v4,
12811767SAnurag.Maskey@Sun.COM "specifies IPv4 address source(s) - valid values are:\n"
12911767SAnurag.Maskey@Sun.COM "\'dhcp\' and \'static\'",
13011767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_INTERFACE, NWAM_FLAG_NCU_CLASS_ALL_INTERFACE},
13111767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_IPV4_ADDR, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
13211767SAnurag.Maskey@Sun.COM NWAM_MAX_NUM_VALUES, nwam_valid_host_v4,
13311767SAnurag.Maskey@Sun.COM "specifies static IPv4 host address(es)",
13411767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_INTERFACE, NWAM_FLAG_NCU_CLASS_ALL_INTERFACE},
13511767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_IPV4_DEFAULT_ROUTE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
13611767SAnurag.Maskey@Sun.COM 1, nwam_valid_route_v4,
13711767SAnurag.Maskey@Sun.COM "specifies per-interface default IPv4 route",
13811767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_INTERFACE, NWAM_FLAG_NCU_CLASS_ALL_INTERFACE},
13911767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_IPV6_ADDRSRC, NWAM_VALUE_TYPE_UINT64, B_FALSE, 0,
14011767SAnurag.Maskey@Sun.COM NWAM_MAX_NUM_VALUES, valid_addrsrc_v6,
14111767SAnurag.Maskey@Sun.COM "specifies IPv6 address source(s) - valid values are:\n"
14211767SAnurag.Maskey@Sun.COM "\'dhcp\', \'autoconf\' and \'static\'.\n"
14311767SAnurag.Maskey@Sun.COM "\'dhcp\' and \'autoconf\' are mandatory values.",
14411767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_INTERFACE, NWAM_FLAG_NCU_CLASS_ALL_INTERFACE},
14511767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_IPV6_ADDR, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
14611767SAnurag.Maskey@Sun.COM NWAM_MAX_NUM_VALUES, nwam_valid_host_v6,
14711767SAnurag.Maskey@Sun.COM "specifies static IPv6 host address(es)",
14811767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_INTERFACE, NWAM_FLAG_NCU_CLASS_ALL_INTERFACE},
14911767SAnurag.Maskey@Sun.COM {NWAM_NCU_PROP_IPV6_DEFAULT_ROUTE, NWAM_VALUE_TYPE_STRING, B_FALSE, 0,
15011767SAnurag.Maskey@Sun.COM 1, nwam_valid_route_v6,
15111767SAnurag.Maskey@Sun.COM "specifies per-interface default IPv6 route",
15211767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_INTERFACE, NWAM_FLAG_NCU_CLASS_ALL_INTERFACE}
15311767SAnurag.Maskey@Sun.COM };
15411767SAnurag.Maskey@Sun.COM
15511767SAnurag.Maskey@Sun.COM #define NWAM_NUM_NCU_PROPS (sizeof (ncu_prop_table_entries) / \
15611767SAnurag.Maskey@Sun.COM sizeof (*ncu_prop_table_entries))
15711767SAnurag.Maskey@Sun.COM
15811767SAnurag.Maskey@Sun.COM struct nwam_prop_table ncu_prop_table =
15911767SAnurag.Maskey@Sun.COM { NWAM_NUM_NCU_PROPS, ncu_prop_table_entries };
16011767SAnurag.Maskey@Sun.COM
16111767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncp_get_name(nwam_ncp_handle_t ncph,char ** namep)16211767SAnurag.Maskey@Sun.COM nwam_ncp_get_name(nwam_ncp_handle_t ncph, char **namep)
16311767SAnurag.Maskey@Sun.COM {
16411767SAnurag.Maskey@Sun.COM return (nwam_get_name(ncph, namep));
16511767SAnurag.Maskey@Sun.COM }
16611767SAnurag.Maskey@Sun.COM
16711767SAnurag.Maskey@Sun.COM static nwam_error_t
nwam_ncp_name_to_file(const char * name,char ** filename)16811767SAnurag.Maskey@Sun.COM nwam_ncp_name_to_file(const char *name, char **filename)
16911767SAnurag.Maskey@Sun.COM {
17011767SAnurag.Maskey@Sun.COM assert(name != NULL && filename != NULL);
17111767SAnurag.Maskey@Sun.COM
17211767SAnurag.Maskey@Sun.COM if ((*filename = malloc(MAXPATHLEN)) == NULL)
17311767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY);
17411767SAnurag.Maskey@Sun.COM
17511767SAnurag.Maskey@Sun.COM (void) snprintf(*filename, MAXPATHLEN, "%s%s%s%s", NWAM_CONF_DIR,
17611767SAnurag.Maskey@Sun.COM NWAM_NCP_CONF_FILE_PRE, name, NWAM_NCP_CONF_FILE_SUF);
17711767SAnurag.Maskey@Sun.COM
17811767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
17911767SAnurag.Maskey@Sun.COM }
18011767SAnurag.Maskey@Sun.COM
18111767SAnurag.Maskey@Sun.COM /* ARGSUSED1 */
18211767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncp_create(const char * name,uint64_t flags,nwam_ncp_handle_t * ncphp)18311767SAnurag.Maskey@Sun.COM nwam_ncp_create(const char *name, uint64_t flags, nwam_ncp_handle_t *ncphp)
18411767SAnurag.Maskey@Sun.COM {
18511767SAnurag.Maskey@Sun.COM nwam_error_t err;
18611767SAnurag.Maskey@Sun.COM char *ncpfile;
18711767SAnurag.Maskey@Sun.COM
18811767SAnurag.Maskey@Sun.COM if ((err = nwam_handle_create(NWAM_OBJECT_TYPE_NCP, name, ncphp))
18911767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
19011767SAnurag.Maskey@Sun.COM return (err);
19111767SAnurag.Maskey@Sun.COM
19211767SAnurag.Maskey@Sun.COM /* Create empty container for NCUs */
19311767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_name_to_file(name, &ncpfile))
19411767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) {
19511767SAnurag.Maskey@Sun.COM nwam_free(*ncphp);
19611767SAnurag.Maskey@Sun.COM *ncphp = NULL;
19711767SAnurag.Maskey@Sun.COM return (err);
19811767SAnurag.Maskey@Sun.COM }
19911767SAnurag.Maskey@Sun.COM
20011767SAnurag.Maskey@Sun.COM if ((err = nwam_commit(ncpfile, *ncphp, flags)) != NWAM_SUCCESS) {
20111767SAnurag.Maskey@Sun.COM nwam_free(*ncphp);
20211767SAnurag.Maskey@Sun.COM *ncphp = NULL;
20311767SAnurag.Maskey@Sun.COM }
20411767SAnurag.Maskey@Sun.COM
20511767SAnurag.Maskey@Sun.COM free(ncpfile);
20611767SAnurag.Maskey@Sun.COM
20711767SAnurag.Maskey@Sun.COM return (err);
20811767SAnurag.Maskey@Sun.COM }
20911767SAnurag.Maskey@Sun.COM
21011767SAnurag.Maskey@Sun.COM /* Used by libnwam_files.c */
21111767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncp_file_to_name(const char * path,char ** name)21211767SAnurag.Maskey@Sun.COM nwam_ncp_file_to_name(const char *path, char **name)
21311767SAnurag.Maskey@Sun.COM {
21411767SAnurag.Maskey@Sun.COM char path_copy[MAXPATHLEN];
21511767SAnurag.Maskey@Sun.COM char *filename, *suffix;
21611767SAnurag.Maskey@Sun.COM
21711767SAnurag.Maskey@Sun.COM assert(path != NULL && name != NULL);
21811767SAnurag.Maskey@Sun.COM
21911767SAnurag.Maskey@Sun.COM /* Make a copy as basename(3c) may modify string */
22011767SAnurag.Maskey@Sun.COM (void) strlcpy(path_copy, path, MAXPATHLEN);
22111767SAnurag.Maskey@Sun.COM
22211767SAnurag.Maskey@Sun.COM if ((*name = malloc(NWAM_MAX_NAME_LEN)) == NULL)
22311767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY);
22411767SAnurag.Maskey@Sun.COM
22511767SAnurag.Maskey@Sun.COM if ((filename = basename(path_copy)) == NULL) {
22611767SAnurag.Maskey@Sun.COM free(*name);
22711767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID);
22811767SAnurag.Maskey@Sun.COM }
22911767SAnurag.Maskey@Sun.COM
23011767SAnurag.Maskey@Sun.COM /* Ensure filename begins/ends with right prefix/suffix */
23111767SAnurag.Maskey@Sun.COM if (sscanf(filename, NWAM_NCP_CONF_FILE_PRE "%256[^\n]s", *name) < 1) {
23211767SAnurag.Maskey@Sun.COM free(*name);
23311767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID);
23411767SAnurag.Maskey@Sun.COM }
23511767SAnurag.Maskey@Sun.COM suffix = *name + strlen(*name) - strlen(NWAM_NCP_CONF_FILE_SUF);
23611767SAnurag.Maskey@Sun.COM if (strstr(*name, NWAM_NCP_CONF_FILE_SUF) != suffix) {
23711767SAnurag.Maskey@Sun.COM free(*name);
23811767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID);
23911767SAnurag.Maskey@Sun.COM }
24011767SAnurag.Maskey@Sun.COM suffix[0] = '\0';
24111767SAnurag.Maskey@Sun.COM
24211767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
24311767SAnurag.Maskey@Sun.COM }
24411767SAnurag.Maskey@Sun.COM
24511767SAnurag.Maskey@Sun.COM /* ARGSUSED1 */
24611767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncp_read(const char * name,uint64_t flags,nwam_ncp_handle_t * ncphp)24711767SAnurag.Maskey@Sun.COM nwam_ncp_read(const char *name, uint64_t flags, nwam_ncp_handle_t *ncphp)
24811767SAnurag.Maskey@Sun.COM {
24911767SAnurag.Maskey@Sun.COM char *filename;
25011767SAnurag.Maskey@Sun.COM nwam_error_t err;
25111767SAnurag.Maskey@Sun.COM
25211767SAnurag.Maskey@Sun.COM assert(name != NULL && ncphp != NULL);
25311767SAnurag.Maskey@Sun.COM
25411767SAnurag.Maskey@Sun.COM /* try to read the associated ncp configuration */
25511767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_name_to_file(name, &filename)) != NWAM_SUCCESS) {
25611767SAnurag.Maskey@Sun.COM *ncphp = NULL;
25711767SAnurag.Maskey@Sun.COM return (err);
25811767SAnurag.Maskey@Sun.COM }
25911767SAnurag.Maskey@Sun.COM
26011767SAnurag.Maskey@Sun.COM err = nwam_read(NWAM_OBJECT_TYPE_NCP, filename, name, flags, ncphp);
26111767SAnurag.Maskey@Sun.COM free(filename);
26211767SAnurag.Maskey@Sun.COM return (err);
26311767SAnurag.Maskey@Sun.COM }
26411767SAnurag.Maskey@Sun.COM
26511767SAnurag.Maskey@Sun.COM static nwam_error_t
nwam_ncu_get_parent_ncp_name(nwam_ncu_handle_t ncuh,char ** parentnamep)26611767SAnurag.Maskey@Sun.COM nwam_ncu_get_parent_ncp_name(nwam_ncu_handle_t ncuh, char **parentnamep)
26711767SAnurag.Maskey@Sun.COM {
26811767SAnurag.Maskey@Sun.COM nwam_value_t parentval = NULL;
26911767SAnurag.Maskey@Sun.COM char *parentname;
27011767SAnurag.Maskey@Sun.COM nwam_error_t err;
27111767SAnurag.Maskey@Sun.COM
27211767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_prop_value(ncuh, NWAM_NCU_PROP_PARENT_NCP,
27311767SAnurag.Maskey@Sun.COM &parentval)) != NWAM_SUCCESS ||
27411767SAnurag.Maskey@Sun.COM (err = nwam_value_get_string(parentval, &parentname))
27511767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS ||
27611767SAnurag.Maskey@Sun.COM (*parentnamep = strdup(parentname)) == NULL) {
27711767SAnurag.Maskey@Sun.COM if (parentval != NULL)
27811767SAnurag.Maskey@Sun.COM nwam_value_free(parentval);
27911767SAnurag.Maskey@Sun.COM *parentnamep = NULL;
28011767SAnurag.Maskey@Sun.COM return (err);
28111767SAnurag.Maskey@Sun.COM }
28211767SAnurag.Maskey@Sun.COM nwam_value_free(parentval);
28311767SAnurag.Maskey@Sun.COM
28411767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
28511767SAnurag.Maskey@Sun.COM }
28611767SAnurag.Maskey@Sun.COM
28711767SAnurag.Maskey@Sun.COM static int
nwam_ncp_copy_callback(nwam_ncu_handle_t oldncuh,void * arg)28811767SAnurag.Maskey@Sun.COM nwam_ncp_copy_callback(nwam_ncu_handle_t oldncuh, void *arg)
28911767SAnurag.Maskey@Sun.COM {
29011767SAnurag.Maskey@Sun.COM nwam_error_t err;
29111767SAnurag.Maskey@Sun.COM nwam_ncu_handle_t newncuh = NULL;
29211767SAnurag.Maskey@Sun.COM char *oldparent;
29311767SAnurag.Maskey@Sun.COM char *oldfilename = NULL, *newfilename = NULL;
29411767SAnurag.Maskey@Sun.COM nwam_ncp_handle_t newncph = (nwam_ncp_handle_t)arg;
29511767SAnurag.Maskey@Sun.COM nwam_value_t newparentval;
29611767SAnurag.Maskey@Sun.COM
29711767SAnurag.Maskey@Sun.COM /* Get filenames for the new and old NCU's */
29811767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_parent_ncp_name(oldncuh, &oldparent))
29911767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
30011767SAnurag.Maskey@Sun.COM return (err);
30111767SAnurag.Maskey@Sun.COM err = nwam_ncp_name_to_file(oldparent, &oldfilename);
30211767SAnurag.Maskey@Sun.COM free(oldparent);
30311767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS)
30411767SAnurag.Maskey@Sun.COM return (err);
30511767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_name_to_file(newncph->nwh_name, &newfilename))
30611767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
30711767SAnurag.Maskey@Sun.COM goto fail;
30811767SAnurag.Maskey@Sun.COM
30911767SAnurag.Maskey@Sun.COM /* new NCU name (and typedname) is the same as the old name */
31011767SAnurag.Maskey@Sun.COM if ((err = nwam_handle_create(NWAM_OBJECT_TYPE_NCU, oldncuh->nwh_name,
31111767SAnurag.Maskey@Sun.COM &newncuh)) != NWAM_SUCCESS)
31211767SAnurag.Maskey@Sun.COM goto fail;
31311767SAnurag.Maskey@Sun.COM /* Duplicate the old NCU's data */
31411767SAnurag.Maskey@Sun.COM if ((err = nwam_dup_object_list(oldncuh->nwh_data,
31511767SAnurag.Maskey@Sun.COM &(newncuh->nwh_data))) != NWAM_SUCCESS)
31611767SAnurag.Maskey@Sun.COM goto fail;
31711767SAnurag.Maskey@Sun.COM
31811767SAnurag.Maskey@Sun.COM /* Update the parent property for the new NCU */
31911767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_string(newncph->nwh_name, &newparentval))
32011767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
32111767SAnurag.Maskey@Sun.COM goto fail;
32211767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value(newncuh->nwh_data, NWAM_NCU_PROP_PARENT_NCP,
32311767SAnurag.Maskey@Sun.COM newparentval);
32411767SAnurag.Maskey@Sun.COM nwam_value_free(newparentval);
32511767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS)
32611767SAnurag.Maskey@Sun.COM goto fail;
32711767SAnurag.Maskey@Sun.COM
32811767SAnurag.Maskey@Sun.COM /* Save the new NCU */
32911767SAnurag.Maskey@Sun.COM err = nwam_commit(newfilename, newncuh, 0);
33011767SAnurag.Maskey@Sun.COM
33111767SAnurag.Maskey@Sun.COM fail:
33211767SAnurag.Maskey@Sun.COM free(oldfilename);
33311767SAnurag.Maskey@Sun.COM free(newfilename);
33411767SAnurag.Maskey@Sun.COM nwam_ncu_free(newncuh);
33511767SAnurag.Maskey@Sun.COM return (err);
33611767SAnurag.Maskey@Sun.COM }
33711767SAnurag.Maskey@Sun.COM
33811767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncp_copy(nwam_ncp_handle_t oldncph,const char * newname,nwam_ncp_handle_t * newncphp)33911767SAnurag.Maskey@Sun.COM nwam_ncp_copy(nwam_ncp_handle_t oldncph, const char *newname,
34011767SAnurag.Maskey@Sun.COM nwam_ncp_handle_t *newncphp)
34111767SAnurag.Maskey@Sun.COM {
34211767SAnurag.Maskey@Sun.COM nwam_ncp_handle_t ncph;
34311767SAnurag.Maskey@Sun.COM nwam_error_t err;
34411767SAnurag.Maskey@Sun.COM int cb_ret;
34511767SAnurag.Maskey@Sun.COM
34611767SAnurag.Maskey@Sun.COM assert(oldncph != NULL && newname != NULL && newncphp != NULL);
34711767SAnurag.Maskey@Sun.COM
34811767SAnurag.Maskey@Sun.COM /* check if newname NCP already exists */
34911767SAnurag.Maskey@Sun.COM if (nwam_ncp_read(newname, 0, &ncph) == NWAM_SUCCESS) {
35011767SAnurag.Maskey@Sun.COM nwam_ncp_free(ncph);
35111767SAnurag.Maskey@Sun.COM *newncphp = NULL;
35211767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_EXISTS);
35311767SAnurag.Maskey@Sun.COM }
35411767SAnurag.Maskey@Sun.COM
35511767SAnurag.Maskey@Sun.COM /* create new handle */
35611767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_create(newname, 0, newncphp)) != NWAM_SUCCESS)
35711767SAnurag.Maskey@Sun.COM return (err);
35811767SAnurag.Maskey@Sun.COM
35911767SAnurag.Maskey@Sun.COM err = nwam_ncp_walk_ncus(oldncph, nwam_ncp_copy_callback, *newncphp,
36011767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_CLASS_ALL, &cb_ret);
36111767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) {
36211767SAnurag.Maskey@Sun.COM /* remove the NCP even if any NCU's had already been copied */
36311767SAnurag.Maskey@Sun.COM (void) nwam_ncp_destroy(*newncphp, 0);
36411767SAnurag.Maskey@Sun.COM *newncphp = NULL;
36511767SAnurag.Maskey@Sun.COM if (err == NWAM_WALK_HALTED)
36611767SAnurag.Maskey@Sun.COM return (cb_ret);
36711767SAnurag.Maskey@Sun.COM else
36811767SAnurag.Maskey@Sun.COM return (err);
36911767SAnurag.Maskey@Sun.COM }
37011767SAnurag.Maskey@Sun.COM
37111767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
37211767SAnurag.Maskey@Sun.COM }
37311767SAnurag.Maskey@Sun.COM
37411767SAnurag.Maskey@Sun.COM /*
37511767SAnurag.Maskey@Sun.COM * Convert type to flag
37611767SAnurag.Maskey@Sun.COM */
37711767SAnurag.Maskey@Sun.COM static uint64_t
nwam_ncu_type_to_flag(nwam_ncu_type_t type)37811767SAnurag.Maskey@Sun.COM nwam_ncu_type_to_flag(nwam_ncu_type_t type)
37911767SAnurag.Maskey@Sun.COM {
38011767SAnurag.Maskey@Sun.COM switch (type) {
38111767SAnurag.Maskey@Sun.COM case NWAM_NCU_TYPE_LINK:
38211767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_NCU_TYPE_LINK);
38311767SAnurag.Maskey@Sun.COM case NWAM_NCU_TYPE_INTERFACE:
38411767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_NCU_TYPE_INTERFACE);
38511767SAnurag.Maskey@Sun.COM case NWAM_NCU_TYPE_ANY:
38611767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_NCU_TYPE_ALL);
38711767SAnurag.Maskey@Sun.COM default:
38811767SAnurag.Maskey@Sun.COM return (0);
38911767SAnurag.Maskey@Sun.COM }
39011767SAnurag.Maskey@Sun.COM }
39111767SAnurag.Maskey@Sun.COM
39211767SAnurag.Maskey@Sun.COM /*
39311767SAnurag.Maskey@Sun.COM * Convert class to flag
39411767SAnurag.Maskey@Sun.COM */
39511767SAnurag.Maskey@Sun.COM uint64_t
nwam_ncu_class_to_flag(nwam_ncu_class_t class)39611767SAnurag.Maskey@Sun.COM nwam_ncu_class_to_flag(nwam_ncu_class_t class)
39711767SAnurag.Maskey@Sun.COM {
39811767SAnurag.Maskey@Sun.COM switch (class) {
39911767SAnurag.Maskey@Sun.COM case NWAM_NCU_CLASS_PHYS:
40011767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_NCU_CLASS_PHYS);
40111767SAnurag.Maskey@Sun.COM case NWAM_NCU_CLASS_IP:
40211767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_NCU_CLASS_IP);
40311767SAnurag.Maskey@Sun.COM case NWAM_NCU_CLASS_ANY:
40411767SAnurag.Maskey@Sun.COM return (NWAM_FLAG_NCU_CLASS_ALL);
40511767SAnurag.Maskey@Sun.COM default:
40611767SAnurag.Maskey@Sun.COM return (0);
40711767SAnurag.Maskey@Sun.COM }
40811767SAnurag.Maskey@Sun.COM }
40911767SAnurag.Maskey@Sun.COM
41011767SAnurag.Maskey@Sun.COM /*
41111767SAnurag.Maskey@Sun.COM * Infer NCU type from NCU class
41211767SAnurag.Maskey@Sun.COM */
41311767SAnurag.Maskey@Sun.COM nwam_ncu_type_t
nwam_ncu_class_to_type(nwam_ncu_class_t class)41411767SAnurag.Maskey@Sun.COM nwam_ncu_class_to_type(nwam_ncu_class_t class)
41511767SAnurag.Maskey@Sun.COM {
41611767SAnurag.Maskey@Sun.COM switch (class) {
41711767SAnurag.Maskey@Sun.COM case NWAM_NCU_CLASS_PHYS:
41811767SAnurag.Maskey@Sun.COM return (NWAM_NCU_TYPE_LINK);
41911767SAnurag.Maskey@Sun.COM case NWAM_NCU_CLASS_IP:
42011767SAnurag.Maskey@Sun.COM return (NWAM_NCU_TYPE_INTERFACE);
42111767SAnurag.Maskey@Sun.COM case NWAM_NCU_CLASS_ANY:
42211767SAnurag.Maskey@Sun.COM return (NWAM_NCU_TYPE_ANY);
42311767SAnurag.Maskey@Sun.COM default:
42411767SAnurag.Maskey@Sun.COM return (NWAM_NCU_TYPE_UNKNOWN);
42511767SAnurag.Maskey@Sun.COM }
42611767SAnurag.Maskey@Sun.COM }
42711767SAnurag.Maskey@Sun.COM
42811767SAnurag.Maskey@Sun.COM /*
42911767SAnurag.Maskey@Sun.COM * Make ncp active, deactivating any other active ncp.
43011767SAnurag.Maskey@Sun.COM */
43111767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncp_enable(nwam_ncp_handle_t ncph)43211767SAnurag.Maskey@Sun.COM nwam_ncp_enable(nwam_ncp_handle_t ncph)
43311767SAnurag.Maskey@Sun.COM {
43411767SAnurag.Maskey@Sun.COM nwam_error_t err;
43511767SAnurag.Maskey@Sun.COM char *name;
43611767SAnurag.Maskey@Sun.COM
43711767SAnurag.Maskey@Sun.COM assert(ncph != NULL);
43811767SAnurag.Maskey@Sun.COM
43911767SAnurag.Maskey@Sun.COM err = nwam_enable(NULL, ncph);
44011767SAnurag.Maskey@Sun.COM
44111767SAnurag.Maskey@Sun.COM if (err == NWAM_ERROR_BIND) {
44211767SAnurag.Maskey@Sun.COM /*
44311767SAnurag.Maskey@Sun.COM * nwamd is not running, set active_ncp property so when
44411767SAnurag.Maskey@Sun.COM * nwamd is next started, this NCP will be used.
44511767SAnurag.Maskey@Sun.COM */
44611767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_get_name(ncph, &name)) != NWAM_SUCCESS)
44711767SAnurag.Maskey@Sun.COM return (err);
44811767SAnurag.Maskey@Sun.COM
44911767SAnurag.Maskey@Sun.COM err = nwam_set_smf_string_property(NWAM_FMRI, NWAM_PG,
45011767SAnurag.Maskey@Sun.COM NWAM_PROP_ACTIVE_NCP, name);
45111767SAnurag.Maskey@Sun.COM free(name);
45211767SAnurag.Maskey@Sun.COM }
45311767SAnurag.Maskey@Sun.COM
45411767SAnurag.Maskey@Sun.COM return (err);
45511767SAnurag.Maskey@Sun.COM }
45611767SAnurag.Maskey@Sun.COM
45711767SAnurag.Maskey@Sun.COM /* Compare NCP names c1 and c2 using strcasecmp() */
45811767SAnurag.Maskey@Sun.COM static int
ncpname_cmp(const void * c1,const void * c2)45911767SAnurag.Maskey@Sun.COM ncpname_cmp(const void *c1, const void *c2)
46011767SAnurag.Maskey@Sun.COM {
46111767SAnurag.Maskey@Sun.COM return (strcasecmp(*(const char **)c1, *(const char **)c2));
46211767SAnurag.Maskey@Sun.COM }
46311767SAnurag.Maskey@Sun.COM
46411767SAnurag.Maskey@Sun.COM /* ARGSUSED1 */
46511767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_walk_ncps(int (* cb)(nwam_ncp_handle_t,void *),void * data,uint64_t flags,int * retp)46611767SAnurag.Maskey@Sun.COM nwam_walk_ncps(int (*cb)(nwam_ncp_handle_t, void *), void *data,
46711767SAnurag.Maskey@Sun.COM uint64_t flags, int *retp)
46811767SAnurag.Maskey@Sun.COM {
46911767SAnurag.Maskey@Sun.COM char *ncpname, **ncpfiles;
47011767SAnurag.Maskey@Sun.COM nwam_ncp_handle_t ncph;
47111767SAnurag.Maskey@Sun.COM nwam_error_t err;
47211767SAnurag.Maskey@Sun.COM nwam_value_t value;
47311767SAnurag.Maskey@Sun.COM void *objlist;
47411767SAnurag.Maskey@Sun.COM uint_t i, num_ncpfiles;
47511767SAnurag.Maskey@Sun.COM int ret = 0;
47611767SAnurag.Maskey@Sun.COM
47711767SAnurag.Maskey@Sun.COM assert(cb != NULL);
47811767SAnurag.Maskey@Sun.COM
47911767SAnurag.Maskey@Sun.COM if ((err = nwam_valid_flags(flags, NWAM_FLAG_BLOCKING)) != NWAM_SUCCESS)
48011767SAnurag.Maskey@Sun.COM return (err);
48111767SAnurag.Maskey@Sun.COM /*
48211767SAnurag.Maskey@Sun.COM * To get list of NCP files, call nwam_read_object_from_backend()
48311767SAnurag.Maskey@Sun.COM * with "parent" argument set to NULL. We get back an object list
48411767SAnurag.Maskey@Sun.COM * consisting of string arrays for each object type - NCP, ENM
48511767SAnurag.Maskey@Sun.COM * and location. We retrieve the NCP list, which corresponds to
48611767SAnurag.Maskey@Sun.COM * the set of NCP backend parent objects (these are files at present).
48711767SAnurag.Maskey@Sun.COM */
48811767SAnurag.Maskey@Sun.COM if ((err = nwam_read_object_from_backend(NULL, NULL, flags,
48911767SAnurag.Maskey@Sun.COM &objlist)) != NWAM_SUCCESS)
49011767SAnurag.Maskey@Sun.COM return (err);
49111767SAnurag.Maskey@Sun.COM
49211767SAnurag.Maskey@Sun.COM if ((err = nwam_get_prop_value(objlist, NWAM_NCP_OBJECT_STRING, &value))
49311767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) {
49411767SAnurag.Maskey@Sun.COM nwam_free_object_list(objlist);
49511767SAnurag.Maskey@Sun.COM return (err);
49611767SAnurag.Maskey@Sun.COM }
49711767SAnurag.Maskey@Sun.COM if ((err = nwam_value_get_string_array(value, &ncpfiles,
49811767SAnurag.Maskey@Sun.COM &num_ncpfiles)) != NWAM_SUCCESS) {
49911767SAnurag.Maskey@Sun.COM nwam_value_free(value);
50011767SAnurag.Maskey@Sun.COM nwam_free_object_list(objlist);
50111767SAnurag.Maskey@Sun.COM return (err);
50211767SAnurag.Maskey@Sun.COM }
50311767SAnurag.Maskey@Sun.COM
50411767SAnurag.Maskey@Sun.COM /* sort the NCP names alphabetically */
50511767SAnurag.Maskey@Sun.COM qsort(ncpfiles, num_ncpfiles, sizeof (char *), ncpname_cmp);
50611767SAnurag.Maskey@Sun.COM
50711767SAnurag.Maskey@Sun.COM for (i = 0; i < num_ncpfiles; i++) {
50811767SAnurag.Maskey@Sun.COM if (nwam_ncp_file_to_name(ncpfiles[i], &ncpname)
50911767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
51011767SAnurag.Maskey@Sun.COM continue;
51111767SAnurag.Maskey@Sun.COM if ((err = nwam_handle_create(NWAM_OBJECT_TYPE_NCP, ncpname,
51211767SAnurag.Maskey@Sun.COM &ncph)) != NWAM_SUCCESS) {
51311767SAnurag.Maskey@Sun.COM free(ncpname);
51411767SAnurag.Maskey@Sun.COM break;
51511767SAnurag.Maskey@Sun.COM }
51611767SAnurag.Maskey@Sun.COM ret = cb(ncph, data);
51711767SAnurag.Maskey@Sun.COM free(ncph);
51811767SAnurag.Maskey@Sun.COM free(ncpname);
51911767SAnurag.Maskey@Sun.COM if (ret != 0) {
52011767SAnurag.Maskey@Sun.COM err = NWAM_WALK_HALTED;
52111767SAnurag.Maskey@Sun.COM break;
52211767SAnurag.Maskey@Sun.COM }
52311767SAnurag.Maskey@Sun.COM }
52411767SAnurag.Maskey@Sun.COM nwam_value_free(value);
52511767SAnurag.Maskey@Sun.COM nwam_free_object_list(objlist);
52611767SAnurag.Maskey@Sun.COM
52711767SAnurag.Maskey@Sun.COM if (retp != NULL)
52811767SAnurag.Maskey@Sun.COM *retp = ret;
52911767SAnurag.Maskey@Sun.COM return (err);
53011767SAnurag.Maskey@Sun.COM }
53111767SAnurag.Maskey@Sun.COM
53211767SAnurag.Maskey@Sun.COM /*
53311767SAnurag.Maskey@Sun.COM * Checks if NCP is read-only. Only NWAM_NCP_NAME_AUTOMATIC is read-only
53411767SAnurag.Maskey@Sun.COM * for all but the netadm user (which nwamd runs as).
53511767SAnurag.Maskey@Sun.COM */
53611767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncp_get_read_only(nwam_ncp_handle_t ncph,boolean_t * readp)53711767SAnurag.Maskey@Sun.COM nwam_ncp_get_read_only(nwam_ncp_handle_t ncph, boolean_t *readp)
53811767SAnurag.Maskey@Sun.COM {
53911767SAnurag.Maskey@Sun.COM nwam_error_t err;
54011767SAnurag.Maskey@Sun.COM char *name;
54111767SAnurag.Maskey@Sun.COM
54211767SAnurag.Maskey@Sun.COM assert(ncph != NULL && readp != NULL);
54311767SAnurag.Maskey@Sun.COM
54411767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_get_name(ncph, &name)) != NWAM_SUCCESS)
54511767SAnurag.Maskey@Sun.COM return (err);
54611767SAnurag.Maskey@Sun.COM
54711767SAnurag.Maskey@Sun.COM if (NWAM_NCP_AUTOMATIC(name))
548*12036SMichael.Hunter@Sun.COM *readp = !nwam_uid_is_special();
54911767SAnurag.Maskey@Sun.COM else
55011767SAnurag.Maskey@Sun.COM *readp = B_FALSE;
55111767SAnurag.Maskey@Sun.COM
55211767SAnurag.Maskey@Sun.COM free(name);
55311767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
55411767SAnurag.Maskey@Sun.COM }
55511767SAnurag.Maskey@Sun.COM
55611767SAnurag.Maskey@Sun.COM /* Checks if NCU is writable depending on its parent */
55711767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_get_read_only(nwam_ncu_handle_t ncuh,boolean_t * readp)55811767SAnurag.Maskey@Sun.COM nwam_ncu_get_read_only(nwam_ncu_handle_t ncuh, boolean_t *readp)
55911767SAnurag.Maskey@Sun.COM {
56011767SAnurag.Maskey@Sun.COM nwam_error_t err;
56111767SAnurag.Maskey@Sun.COM nwam_ncp_handle_t ncph;
56211767SAnurag.Maskey@Sun.COM
56311767SAnurag.Maskey@Sun.COM assert(ncuh != NULL && readp != NULL);
56411767SAnurag.Maskey@Sun.COM
56511767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_ncp(ncuh, &ncph)) != NWAM_SUCCESS)
56611767SAnurag.Maskey@Sun.COM return (err);
56711767SAnurag.Maskey@Sun.COM
56811767SAnurag.Maskey@Sun.COM err = nwam_ncp_get_read_only(ncph, readp);
56911767SAnurag.Maskey@Sun.COM nwam_ncp_free(ncph);
57011767SAnurag.Maskey@Sun.COM return (err);
57111767SAnurag.Maskey@Sun.COM }
57211767SAnurag.Maskey@Sun.COM
57311767SAnurag.Maskey@Sun.COM /* Returns true if the NCP is active */
57411767SAnurag.Maskey@Sun.COM static boolean_t
nwam_ncp_is_active(nwam_ncp_handle_t ncph)57511767SAnurag.Maskey@Sun.COM nwam_ncp_is_active(nwam_ncp_handle_t ncph)
57611767SAnurag.Maskey@Sun.COM {
57711767SAnurag.Maskey@Sun.COM char *active_ncp, *name;
57811767SAnurag.Maskey@Sun.COM boolean_t ret;
57911767SAnurag.Maskey@Sun.COM
58011767SAnurag.Maskey@Sun.COM assert(ncph != NULL);
58111767SAnurag.Maskey@Sun.COM
58211767SAnurag.Maskey@Sun.COM /*
58311767SAnurag.Maskey@Sun.COM * Determine which NCP is active via the nwamd/active_ncp property
58411767SAnurag.Maskey@Sun.COM * value. This allows us to determine which NCP is active even
58511767SAnurag.Maskey@Sun.COM * if nwamd is not running.
58611767SAnurag.Maskey@Sun.COM */
58711767SAnurag.Maskey@Sun.COM if (nwam_ncp_get_name(ncph, &name) != NWAM_SUCCESS ||
58811767SAnurag.Maskey@Sun.COM nwam_get_smf_string_property(NWAM_FMRI, NWAM_PG,
58911767SAnurag.Maskey@Sun.COM NWAM_PROP_ACTIVE_NCP, &active_ncp) != NWAM_SUCCESS)
59011767SAnurag.Maskey@Sun.COM return (B_FALSE);
59111767SAnurag.Maskey@Sun.COM
59211767SAnurag.Maskey@Sun.COM ret = (strcmp(name, active_ncp) == 0);
59311767SAnurag.Maskey@Sun.COM
59411767SAnurag.Maskey@Sun.COM free(active_ncp);
59511767SAnurag.Maskey@Sun.COM free(name);
59611767SAnurag.Maskey@Sun.COM
59711767SAnurag.Maskey@Sun.COM return (ret);
59811767SAnurag.Maskey@Sun.COM }
59911767SAnurag.Maskey@Sun.COM
60011767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncp_destroy(nwam_ncp_handle_t ncph,uint64_t flags)60111767SAnurag.Maskey@Sun.COM nwam_ncp_destroy(nwam_ncp_handle_t ncph, uint64_t flags)
60211767SAnurag.Maskey@Sun.COM {
60311767SAnurag.Maskey@Sun.COM char *filename;
60411767SAnurag.Maskey@Sun.COM nwam_error_t err;
60511767SAnurag.Maskey@Sun.COM boolean_t read_only;
60611767SAnurag.Maskey@Sun.COM
60711767SAnurag.Maskey@Sun.COM assert(ncph != NULL);
60811767SAnurag.Maskey@Sun.COM
60911767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_get_read_only(ncph, &read_only)) != NWAM_SUCCESS)
61011767SAnurag.Maskey@Sun.COM return (err);
61111767SAnurag.Maskey@Sun.COM if (read_only)
61211767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_DESTROYABLE);
61311767SAnurag.Maskey@Sun.COM
61411767SAnurag.Maskey@Sun.COM if (nwam_ncp_is_active(ncph))
61511767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_IN_USE);
61611767SAnurag.Maskey@Sun.COM
61711767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_name_to_file(ncph->nwh_name, &filename))
61811767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
61911767SAnurag.Maskey@Sun.COM return (err);
62011767SAnurag.Maskey@Sun.COM
62111767SAnurag.Maskey@Sun.COM err = nwam_destroy(filename, ncph, flags);
62211767SAnurag.Maskey@Sun.COM free(filename);
62311767SAnurag.Maskey@Sun.COM
62411767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
62511767SAnurag.Maskey@Sun.COM }
62611767SAnurag.Maskey@Sun.COM
62711767SAnurag.Maskey@Sun.COM static nwam_error_t
nwam_ncu_internal_name_to_name(const char * internalname,nwam_ncu_type_t * typep,char ** namep)62811767SAnurag.Maskey@Sun.COM nwam_ncu_internal_name_to_name(const char *internalname,
62911767SAnurag.Maskey@Sun.COM nwam_ncu_type_t *typep, char **namep)
63011767SAnurag.Maskey@Sun.COM {
63111767SAnurag.Maskey@Sun.COM char *prefixstr;
63211767SAnurag.Maskey@Sun.COM
63311767SAnurag.Maskey@Sun.COM assert(internalname != NULL && namep != NULL);
63411767SAnurag.Maskey@Sun.COM
63511767SAnurag.Maskey@Sun.COM if (strncasecmp(internalname, NWAM_NCU_LINK_NAME_PRE,
63611767SAnurag.Maskey@Sun.COM strlen(NWAM_NCU_LINK_NAME_PRE)) == 0) {
63711767SAnurag.Maskey@Sun.COM prefixstr = NWAM_NCU_LINK_NAME_PRE;
63811767SAnurag.Maskey@Sun.COM *typep = NWAM_NCU_TYPE_LINK;
63911767SAnurag.Maskey@Sun.COM } else if (strncasecmp(internalname, NWAM_NCU_INTERFACE_NAME_PRE,
64011767SAnurag.Maskey@Sun.COM strlen(NWAM_NCU_INTERFACE_NAME_PRE)) == 0) {
64111767SAnurag.Maskey@Sun.COM prefixstr = NWAM_NCU_INTERFACE_NAME_PRE;
64211767SAnurag.Maskey@Sun.COM *typep = NWAM_NCU_TYPE_INTERFACE;
64311767SAnurag.Maskey@Sun.COM } else {
64411767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
64511767SAnurag.Maskey@Sun.COM }
64611767SAnurag.Maskey@Sun.COM
64711767SAnurag.Maskey@Sun.COM *namep = strdup(internalname + strlen(prefixstr));
64811767SAnurag.Maskey@Sun.COM if (*namep == NULL)
64911767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY);
65011767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
65111767SAnurag.Maskey@Sun.COM }
65211767SAnurag.Maskey@Sun.COM
65311767SAnurag.Maskey@Sun.COM /* ARGSUSED2 */
65411767SAnurag.Maskey@Sun.COM static int
ncu_selectcb(struct nwam_handle * hp,uint64_t flags,void * data)65511767SAnurag.Maskey@Sun.COM ncu_selectcb(struct nwam_handle *hp, uint64_t flags, void *data)
65611767SAnurag.Maskey@Sun.COM {
65711767SAnurag.Maskey@Sun.COM nwam_ncu_handle_t ncuh = hp;
65811767SAnurag.Maskey@Sun.COM nwam_value_t typeval = NULL, classval = NULL;
65911767SAnurag.Maskey@Sun.COM uint64_t type, class, matchflags, walkfilter;
66011767SAnurag.Maskey@Sun.COM
66111767SAnurag.Maskey@Sun.COM if (nwam_ncu_get_prop_value(ncuh, NWAM_NCU_PROP_TYPE, &typeval)
66211767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS ||
66311767SAnurag.Maskey@Sun.COM nwam_ncu_get_prop_value(ncuh, NWAM_NCU_PROP_CLASS, &classval)
66411767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) {
66511767SAnurag.Maskey@Sun.COM if (typeval != NULL)
66611767SAnurag.Maskey@Sun.COM nwam_value_free(typeval);
66711767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
66811767SAnurag.Maskey@Sun.COM }
66911767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(typeval, &type) != NWAM_SUCCESS ||
67011767SAnurag.Maskey@Sun.COM nwam_value_get_uint64(classval, &class) != NWAM_SUCCESS) {
67111767SAnurag.Maskey@Sun.COM nwam_value_free(typeval);
67211767SAnurag.Maskey@Sun.COM nwam_value_free(classval);
67311767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
67411767SAnurag.Maskey@Sun.COM }
67511767SAnurag.Maskey@Sun.COM
67611767SAnurag.Maskey@Sun.COM matchflags = nwam_ncu_type_to_flag(type) |
67711767SAnurag.Maskey@Sun.COM nwam_ncu_class_to_flag(class);
67811767SAnurag.Maskey@Sun.COM nwam_value_free(typeval);
67911767SAnurag.Maskey@Sun.COM nwam_value_free(classval);
68011767SAnurag.Maskey@Sun.COM
68111767SAnurag.Maskey@Sun.COM if ((walkfilter = (flags & NWAM_WALK_FILTER_MASK)) == 0)
68211767SAnurag.Maskey@Sun.COM walkfilter = NWAM_FLAG_NCU_TYPE_CLASS_ALL;
68311767SAnurag.Maskey@Sun.COM
68411767SAnurag.Maskey@Sun.COM if (matchflags & walkfilter)
68511767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
68611767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
68711767SAnurag.Maskey@Sun.COM }
68811767SAnurag.Maskey@Sun.COM
68911767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncp_walk_ncus(nwam_ncp_handle_t ncph,int (* cb)(nwam_ncu_handle_t,void *),void * data,uint64_t flags,int * retp)69011767SAnurag.Maskey@Sun.COM nwam_ncp_walk_ncus(nwam_ncp_handle_t ncph,
69111767SAnurag.Maskey@Sun.COM int(*cb)(nwam_ncu_handle_t, void *), void *data, uint64_t flags, int *retp)
69211767SAnurag.Maskey@Sun.COM {
69311767SAnurag.Maskey@Sun.COM char *ncpfile;
69411767SAnurag.Maskey@Sun.COM nwam_error_t err;
69511767SAnurag.Maskey@Sun.COM
69611767SAnurag.Maskey@Sun.COM assert(ncph != NULL && cb != NULL);
69711767SAnurag.Maskey@Sun.COM
69811767SAnurag.Maskey@Sun.COM if ((err = nwam_valid_flags(flags,
69911767SAnurag.Maskey@Sun.COM NWAM_FLAG_NCU_TYPE_CLASS_ALL | NWAM_FLAG_BLOCKING)) != NWAM_SUCCESS)
70011767SAnurag.Maskey@Sun.COM return (err);
70111767SAnurag.Maskey@Sun.COM
70211767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_name_to_file(ncph->nwh_name, &ncpfile))
70311767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
70411767SAnurag.Maskey@Sun.COM return (err);
70511767SAnurag.Maskey@Sun.COM
70611767SAnurag.Maskey@Sun.COM err = nwam_walk(NWAM_OBJECT_TYPE_NCU, ncpfile, cb, data, flags,
70711767SAnurag.Maskey@Sun.COM retp, ncu_selectcb);
70811767SAnurag.Maskey@Sun.COM free(ncpfile);
70911767SAnurag.Maskey@Sun.COM
71011767SAnurag.Maskey@Sun.COM return (err);
71111767SAnurag.Maskey@Sun.COM }
71211767SAnurag.Maskey@Sun.COM
71311767SAnurag.Maskey@Sun.COM void
nwam_ncp_free(nwam_ncp_handle_t ncph)71411767SAnurag.Maskey@Sun.COM nwam_ncp_free(nwam_ncp_handle_t ncph)
71511767SAnurag.Maskey@Sun.COM {
71611767SAnurag.Maskey@Sun.COM nwam_free(ncph);
71711767SAnurag.Maskey@Sun.COM }
71811767SAnurag.Maskey@Sun.COM
71911767SAnurag.Maskey@Sun.COM /*
72011767SAnurag.Maskey@Sun.COM * Are ncu type and class compatible?
72111767SAnurag.Maskey@Sun.COM */
72211767SAnurag.Maskey@Sun.COM static boolean_t
nwam_ncu_type_class_compatible(nwam_ncu_type_t type,nwam_ncu_class_t class)72311767SAnurag.Maskey@Sun.COM nwam_ncu_type_class_compatible(nwam_ncu_type_t type, nwam_ncu_class_t class)
72411767SAnurag.Maskey@Sun.COM {
72511767SAnurag.Maskey@Sun.COM switch (type) {
72611767SAnurag.Maskey@Sun.COM case NWAM_NCU_TYPE_LINK:
72711767SAnurag.Maskey@Sun.COM return (class == NWAM_NCU_CLASS_PHYS);
72811767SAnurag.Maskey@Sun.COM case NWAM_NCU_TYPE_INTERFACE:
72911767SAnurag.Maskey@Sun.COM return (class == NWAM_NCU_CLASS_IP);
73011767SAnurag.Maskey@Sun.COM default:
73111767SAnurag.Maskey@Sun.COM return (B_FALSE);
73211767SAnurag.Maskey@Sun.COM }
73311767SAnurag.Maskey@Sun.COM }
73411767SAnurag.Maskey@Sun.COM
73511767SAnurag.Maskey@Sun.COM /* Name to validate may be internal name. If so, convert it before validating */
73611767SAnurag.Maskey@Sun.COM static boolean_t
valid_ncu_name(const char * name)73711767SAnurag.Maskey@Sun.COM valid_ncu_name(const char *name)
73811767SAnurag.Maskey@Sun.COM {
73911767SAnurag.Maskey@Sun.COM char *n;
74011767SAnurag.Maskey@Sun.COM boolean_t ret;
74111767SAnurag.Maskey@Sun.COM nwam_ncu_type_t type;
74211767SAnurag.Maskey@Sun.COM
74311767SAnurag.Maskey@Sun.COM if (nwam_ncu_internal_name_to_name(name, &type, &n) == NWAM_SUCCESS) {
74411767SAnurag.Maskey@Sun.COM
74511767SAnurag.Maskey@Sun.COM ret = dladm_valid_linkname(n);
74611767SAnurag.Maskey@Sun.COM free(n);
74711767SAnurag.Maskey@Sun.COM } else {
74811767SAnurag.Maskey@Sun.COM ret = dladm_valid_linkname(name);
74911767SAnurag.Maskey@Sun.COM }
75011767SAnurag.Maskey@Sun.COM
75111767SAnurag.Maskey@Sun.COM return (ret);
75211767SAnurag.Maskey@Sun.COM }
75311767SAnurag.Maskey@Sun.COM
75411767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_create(nwam_ncp_handle_t ncph,const char * name,nwam_ncu_type_t type,nwam_ncu_class_t class,nwam_ncu_handle_t * ncuhp)75511767SAnurag.Maskey@Sun.COM nwam_ncu_create(nwam_ncp_handle_t ncph, const char *name,
75611767SAnurag.Maskey@Sun.COM nwam_ncu_type_t type, nwam_ncu_class_t class, nwam_ncu_handle_t *ncuhp)
75711767SAnurag.Maskey@Sun.COM {
75811767SAnurag.Maskey@Sun.COM nwam_ncu_handle_t ncuh;
75911767SAnurag.Maskey@Sun.COM nwam_value_t typeval = NULL, classval = NULL, parentval = NULL;
76011767SAnurag.Maskey@Sun.COM nwam_value_t enabledval = NULL;
76111767SAnurag.Maskey@Sun.COM nwam_error_t err;
76211767SAnurag.Maskey@Sun.COM boolean_t read_only;
76311767SAnurag.Maskey@Sun.COM char *typedname;
76411767SAnurag.Maskey@Sun.COM
76511767SAnurag.Maskey@Sun.COM assert(ncph != NULL && name != NULL && ncuhp != NULL);
76611767SAnurag.Maskey@Sun.COM
76711767SAnurag.Maskey@Sun.COM if (!valid_ncu_name(name))
76811767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
76911767SAnurag.Maskey@Sun.COM
77011767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_get_read_only(ncph, &read_only)) != NWAM_SUCCESS)
77111767SAnurag.Maskey@Sun.COM return (err);
77211767SAnurag.Maskey@Sun.COM if (read_only)
77311767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_READ_ONLY);
77411767SAnurag.Maskey@Sun.COM
77511767SAnurag.Maskey@Sun.COM if (nwam_ncu_read(ncph, name, type, 0, &ncuh) == NWAM_SUCCESS) {
77611767SAnurag.Maskey@Sun.COM nwam_ncu_free(ncuh);
77711767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_EXISTS);
77811767SAnurag.Maskey@Sun.COM }
77911767SAnurag.Maskey@Sun.COM
78011767SAnurag.Maskey@Sun.COM if (!valid_ncu_name(name) ||
78111767SAnurag.Maskey@Sun.COM !nwam_ncu_type_class_compatible(type, class))
78211767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
78311767SAnurag.Maskey@Sun.COM
78411767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_name_to_typed_name(name, type, &typedname))
78511767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
78611767SAnurag.Maskey@Sun.COM return (err);
78711767SAnurag.Maskey@Sun.COM
78811767SAnurag.Maskey@Sun.COM /* Create handle */
78911767SAnurag.Maskey@Sun.COM if ((err = nwam_handle_create(NWAM_OBJECT_TYPE_NCU, typedname, ncuhp))
79011767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
79111767SAnurag.Maskey@Sun.COM return (err);
79211767SAnurag.Maskey@Sun.COM free(typedname);
79311767SAnurag.Maskey@Sun.COM
79411767SAnurag.Maskey@Sun.COM /*
79511767SAnurag.Maskey@Sun.COM * Create new object list for NCU. The new NCU is initialized with
79611767SAnurag.Maskey@Sun.COM * the appropriate type and class.
79711767SAnurag.Maskey@Sun.COM */
79811767SAnurag.Maskey@Sun.COM if ((err = nwam_alloc_object_list(&(*ncuhp)->nwh_data)) != NWAM_SUCCESS)
79911767SAnurag.Maskey@Sun.COM goto finish;
80011767SAnurag.Maskey@Sun.COM
80111767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64(type, &typeval))
80211767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS ||
80311767SAnurag.Maskey@Sun.COM (err = nwam_value_create_uint64(class, &classval))
80411767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS ||
80511767SAnurag.Maskey@Sun.COM (err = nwam_value_create_string(ncph->nwh_name, &parentval))
80611767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS ||
80711767SAnurag.Maskey@Sun.COM (err = nwam_value_create_boolean(B_TRUE, &enabledval))
80811767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) {
80911767SAnurag.Maskey@Sun.COM goto finish;
81011767SAnurag.Maskey@Sun.COM }
81111767SAnurag.Maskey@Sun.COM if ((err = nwam_set_prop_value((*ncuhp)->nwh_data, NWAM_NCU_PROP_TYPE,
81211767SAnurag.Maskey@Sun.COM typeval)) != NWAM_SUCCESS ||
81311767SAnurag.Maskey@Sun.COM (err = nwam_set_prop_value((*ncuhp)->nwh_data, NWAM_NCU_PROP_CLASS,
81411767SAnurag.Maskey@Sun.COM classval)) != NWAM_SUCCESS ||
81511767SAnurag.Maskey@Sun.COM (err = nwam_set_prop_value((*ncuhp)->nwh_data,
81611767SAnurag.Maskey@Sun.COM NWAM_NCU_PROP_PARENT_NCP, parentval)) != NWAM_SUCCESS ||
81711767SAnurag.Maskey@Sun.COM (err = nwam_set_prop_value((*ncuhp)->nwh_data,
81811767SAnurag.Maskey@Sun.COM NWAM_NCU_PROP_ENABLED, enabledval)) != NWAM_SUCCESS) {
81911767SAnurag.Maskey@Sun.COM goto finish;
82011767SAnurag.Maskey@Sun.COM }
82111767SAnurag.Maskey@Sun.COM
82211767SAnurag.Maskey@Sun.COM /* Set default IP, datalink properties */
82311767SAnurag.Maskey@Sun.COM if (type == NWAM_NCU_TYPE_INTERFACE && class == NWAM_NCU_CLASS_IP) {
82411767SAnurag.Maskey@Sun.COM
82511767SAnurag.Maskey@Sun.COM uint64_t ver[] = { IPV4_VERSION, IPV6_VERSION };
82611767SAnurag.Maskey@Sun.COM uint64_t v6src[] = { NWAM_ADDRSRC_DHCP, NWAM_ADDRSRC_AUTOCONF };
82711767SAnurag.Maskey@Sun.COM uint_t vercnt = 2, v6srccnt = 2;
82811767SAnurag.Maskey@Sun.COM nwam_value_t ipver = NULL, v4addrsrc = NULL, v6addrsrc = NULL;
82911767SAnurag.Maskey@Sun.COM
83011767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64_array(ver, vercnt, &ipver))
83111767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS ||
83211767SAnurag.Maskey@Sun.COM (err = nwam_value_create_uint64(NWAM_ADDRSRC_DHCP,
83311767SAnurag.Maskey@Sun.COM &v4addrsrc)) != NWAM_SUCCESS ||
83411767SAnurag.Maskey@Sun.COM (err = nwam_value_create_uint64_array(v6src, v6srccnt,
83511767SAnurag.Maskey@Sun.COM &v6addrsrc)) != NWAM_SUCCESS) {
83611767SAnurag.Maskey@Sun.COM nwam_value_free(ipver);
83711767SAnurag.Maskey@Sun.COM nwam_value_free(v4addrsrc);
83811767SAnurag.Maskey@Sun.COM goto finish;
83911767SAnurag.Maskey@Sun.COM }
84011767SAnurag.Maskey@Sun.COM if ((err = nwam_set_prop_value((*ncuhp)->nwh_data,
84111767SAnurag.Maskey@Sun.COM NWAM_NCU_PROP_IP_VERSION, ipver)) == NWAM_SUCCESS &&
84211767SAnurag.Maskey@Sun.COM (err = nwam_set_prop_value((*ncuhp)->nwh_data,
84311767SAnurag.Maskey@Sun.COM NWAM_NCU_PROP_IPV4_ADDRSRC, v4addrsrc)) == NWAM_SUCCESS) {
84411767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value((*ncuhp)->nwh_data,
84511767SAnurag.Maskey@Sun.COM NWAM_NCU_PROP_IPV6_ADDRSRC, v6addrsrc);
84611767SAnurag.Maskey@Sun.COM }
84711767SAnurag.Maskey@Sun.COM nwam_value_free(ipver);
84811767SAnurag.Maskey@Sun.COM nwam_value_free(v4addrsrc);
84911767SAnurag.Maskey@Sun.COM nwam_value_free(v6addrsrc);
85011767SAnurag.Maskey@Sun.COM } else {
85111767SAnurag.Maskey@Sun.COM nwam_value_t actval = NULL;
85211767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_uint64(NWAM_ACTIVATION_MODE_MANUAL,
85311767SAnurag.Maskey@Sun.COM &actval)) != NWAM_SUCCESS)
85411767SAnurag.Maskey@Sun.COM goto finish;
85511767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value((*ncuhp)->nwh_data,
85611767SAnurag.Maskey@Sun.COM NWAM_NCU_PROP_ACTIVATION_MODE, actval);
85711767SAnurag.Maskey@Sun.COM nwam_value_free(actval);
85811767SAnurag.Maskey@Sun.COM }
85911767SAnurag.Maskey@Sun.COM
86011767SAnurag.Maskey@Sun.COM finish:
86111767SAnurag.Maskey@Sun.COM nwam_value_free(typeval);
86211767SAnurag.Maskey@Sun.COM nwam_value_free(classval);
86311767SAnurag.Maskey@Sun.COM nwam_value_free(parentval);
86411767SAnurag.Maskey@Sun.COM nwam_value_free(enabledval);
86511767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS) {
86611767SAnurag.Maskey@Sun.COM nwam_ncu_free(*ncuhp);
86711767SAnurag.Maskey@Sun.COM *ncuhp = NULL;
86811767SAnurag.Maskey@Sun.COM }
86911767SAnurag.Maskey@Sun.COM return (err);
87011767SAnurag.Maskey@Sun.COM }
87111767SAnurag.Maskey@Sun.COM
87211767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_read(nwam_ncp_handle_t ncph,const char * name,nwam_ncu_type_t type,uint64_t flags,nwam_ncu_handle_t * ncuhp)87311767SAnurag.Maskey@Sun.COM nwam_ncu_read(nwam_ncp_handle_t ncph, const char *name,
87411767SAnurag.Maskey@Sun.COM nwam_ncu_type_t type, uint64_t flags, nwam_ncu_handle_t *ncuhp)
87511767SAnurag.Maskey@Sun.COM {
87611767SAnurag.Maskey@Sun.COM char *ncpfile, *typedname;
87711767SAnurag.Maskey@Sun.COM nwam_error_t err, err_ip, err_link;
87811767SAnurag.Maskey@Sun.COM nwam_ncu_handle_t ncuh_ip, ncuh_link;
87911767SAnurag.Maskey@Sun.COM
88011767SAnurag.Maskey@Sun.COM assert(ncph != NULL && name != NULL && ncuhp != NULL);
88111767SAnurag.Maskey@Sun.COM
88211767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_name_to_file(ncph->nwh_name, &ncpfile))
88311767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
88411767SAnurag.Maskey@Sun.COM return (err);
88511767SAnurag.Maskey@Sun.COM
88611767SAnurag.Maskey@Sun.COM if (type == NWAM_NCU_TYPE_ANY) {
88711767SAnurag.Maskey@Sun.COM
88811767SAnurag.Maskey@Sun.COM free(ncpfile);
88911767SAnurag.Maskey@Sun.COM
89011767SAnurag.Maskey@Sun.COM /*
89111767SAnurag.Maskey@Sun.COM * If we get to this point, we have discovered that no
89211767SAnurag.Maskey@Sun.COM * NCU type is discernable from name or type arguments.
89311767SAnurag.Maskey@Sun.COM * Either exactly one NCU called name must exist of either
89411767SAnurag.Maskey@Sun.COM * type, or the operation should fail.
89511767SAnurag.Maskey@Sun.COM */
89611767SAnurag.Maskey@Sun.COM err_ip = nwam_ncu_read(ncph, name, NWAM_NCU_TYPE_INTERFACE,
89711767SAnurag.Maskey@Sun.COM flags, &ncuh_ip);
89811767SAnurag.Maskey@Sun.COM err_link = nwam_ncu_read(ncph, name, NWAM_NCU_TYPE_LINK,
89911767SAnurag.Maskey@Sun.COM flags, &ncuh_link);
90011767SAnurag.Maskey@Sun.COM
90111767SAnurag.Maskey@Sun.COM *ncuhp = NULL;
90211767SAnurag.Maskey@Sun.COM
90311767SAnurag.Maskey@Sun.COM if (err_ip == NWAM_SUCCESS && err_link == NWAM_SUCCESS) {
90411767SAnurag.Maskey@Sun.COM nwam_ncu_free(ncuh_ip);
90511767SAnurag.Maskey@Sun.COM nwam_ncu_free(ncuh_link);
90611767SAnurag.Maskey@Sun.COM err = NWAM_ENTITY_MULTIPLE_VALUES;
90711767SAnurag.Maskey@Sun.COM } else if (err_ip != NWAM_SUCCESS && err_link != NWAM_SUCCESS) {
90811767SAnurag.Maskey@Sun.COM err = NWAM_ENTITY_NOT_FOUND;
90911767SAnurag.Maskey@Sun.COM } else {
91011767SAnurag.Maskey@Sun.COM if (err_ip == NWAM_SUCCESS) {
91111767SAnurag.Maskey@Sun.COM *ncuhp = ncuh_ip;
91211767SAnurag.Maskey@Sun.COM } else {
91311767SAnurag.Maskey@Sun.COM *ncuhp = ncuh_link;
91411767SAnurag.Maskey@Sun.COM }
91511767SAnurag.Maskey@Sun.COM err = NWAM_SUCCESS;
91611767SAnurag.Maskey@Sun.COM }
91711767SAnurag.Maskey@Sun.COM
91811767SAnurag.Maskey@Sun.COM return (err);
91911767SAnurag.Maskey@Sun.COM }
92011767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_name_to_typed_name(name, type, &typedname)) !=
92111767SAnurag.Maskey@Sun.COM NWAM_SUCCESS) {
92211767SAnurag.Maskey@Sun.COM free(ncpfile);
92311767SAnurag.Maskey@Sun.COM return (err);
92411767SAnurag.Maskey@Sun.COM }
92511767SAnurag.Maskey@Sun.COM err = nwam_read(NWAM_OBJECT_TYPE_NCU, ncpfile, typedname, flags, ncuhp);
92611767SAnurag.Maskey@Sun.COM
92711767SAnurag.Maskey@Sun.COM free(typedname);
92811767SAnurag.Maskey@Sun.COM free(ncpfile);
92911767SAnurag.Maskey@Sun.COM
93011767SAnurag.Maskey@Sun.COM return (err);
93111767SAnurag.Maskey@Sun.COM }
93211767SAnurag.Maskey@Sun.COM
93311767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_get_name(nwam_ncu_handle_t ncuh,char ** namep)93411767SAnurag.Maskey@Sun.COM nwam_ncu_get_name(nwam_ncu_handle_t ncuh, char **namep)
93511767SAnurag.Maskey@Sun.COM {
93611767SAnurag.Maskey@Sun.COM nwam_ncu_type_t type;
93711767SAnurag.Maskey@Sun.COM
93811767SAnurag.Maskey@Sun.COM assert(ncuh != NULL && namep != NULL);
93911767SAnurag.Maskey@Sun.COM
94011767SAnurag.Maskey@Sun.COM return (nwam_ncu_internal_name_to_name(ncuh->nwh_name, &type, namep));
94111767SAnurag.Maskey@Sun.COM }
94211767SAnurag.Maskey@Sun.COM
94311767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_name_to_typed_name(const char * name,nwam_ncu_type_t type,char ** typednamep)94411767SAnurag.Maskey@Sun.COM nwam_ncu_name_to_typed_name(const char *name, nwam_ncu_type_t type,
94511767SAnurag.Maskey@Sun.COM char **typednamep)
94611767SAnurag.Maskey@Sun.COM {
94711767SAnurag.Maskey@Sun.COM char *prefixstr;
94811767SAnurag.Maskey@Sun.COM size_t typednamesz;
94911767SAnurag.Maskey@Sun.COM
95011767SAnurag.Maskey@Sun.COM assert(name != NULL && typednamep != NULL);
95111767SAnurag.Maskey@Sun.COM
95211767SAnurag.Maskey@Sun.COM switch (type) {
95311767SAnurag.Maskey@Sun.COM case NWAM_NCU_TYPE_INTERFACE:
95411767SAnurag.Maskey@Sun.COM prefixstr = NWAM_NCU_INTERFACE_NAME_PRE;
95511767SAnurag.Maskey@Sun.COM break;
95611767SAnurag.Maskey@Sun.COM case NWAM_NCU_TYPE_LINK:
95711767SAnurag.Maskey@Sun.COM prefixstr = NWAM_NCU_LINK_NAME_PRE;
95811767SAnurag.Maskey@Sun.COM break;
95911767SAnurag.Maskey@Sun.COM default:
96011767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
96111767SAnurag.Maskey@Sun.COM }
96211767SAnurag.Maskey@Sun.COM typednamesz = strlen(name) + strlen(prefixstr) + 1;
96311767SAnurag.Maskey@Sun.COM if ((*typednamep = malloc(typednamesz)) == NULL)
96411767SAnurag.Maskey@Sun.COM return (NWAM_NO_MEMORY);
96511767SAnurag.Maskey@Sun.COM
96611767SAnurag.Maskey@Sun.COM /* Name may be already qualified by type */
96711767SAnurag.Maskey@Sun.COM if (strncasecmp(prefixstr, name, strlen(prefixstr)) == 0) {
96811767SAnurag.Maskey@Sun.COM (void) snprintf(*typednamep, typednamesz, "%s", name);
96911767SAnurag.Maskey@Sun.COM } else {
97011767SAnurag.Maskey@Sun.COM (void) snprintf(*typednamep, typednamesz, "%s%s",
97111767SAnurag.Maskey@Sun.COM prefixstr, name);
97211767SAnurag.Maskey@Sun.COM }
97311767SAnurag.Maskey@Sun.COM
97411767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
97511767SAnurag.Maskey@Sun.COM }
97611767SAnurag.Maskey@Sun.COM
97711767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_typed_name_to_name(const char * typed_name,nwam_ncu_type_t * typep,char ** name)97811767SAnurag.Maskey@Sun.COM nwam_ncu_typed_name_to_name(const char *typed_name, nwam_ncu_type_t *typep,
97911767SAnurag.Maskey@Sun.COM char **name)
98011767SAnurag.Maskey@Sun.COM {
98111767SAnurag.Maskey@Sun.COM return (nwam_ncu_internal_name_to_name(typed_name, typep, name));
98211767SAnurag.Maskey@Sun.COM }
98311767SAnurag.Maskey@Sun.COM
98411767SAnurag.Maskey@Sun.COM void
nwam_ncu_free(nwam_ncu_handle_t ncuh)98511767SAnurag.Maskey@Sun.COM nwam_ncu_free(nwam_ncu_handle_t ncuh)
98611767SAnurag.Maskey@Sun.COM {
98711767SAnurag.Maskey@Sun.COM nwam_free(ncuh);
98811767SAnurag.Maskey@Sun.COM }
98911767SAnurag.Maskey@Sun.COM
99011767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_copy(nwam_ncu_handle_t oldncuh,const char * newname,nwam_ncu_handle_t * newncuhp)99111767SAnurag.Maskey@Sun.COM nwam_ncu_copy(nwam_ncu_handle_t oldncuh, const char *newname,
99211767SAnurag.Maskey@Sun.COM nwam_ncu_handle_t *newncuhp)
99311767SAnurag.Maskey@Sun.COM {
99411767SAnurag.Maskey@Sun.COM nwam_ncp_handle_t ncph;
99511767SAnurag.Maskey@Sun.COM nwam_ncu_handle_t ncuh;
99611767SAnurag.Maskey@Sun.COM nwam_error_t err;
99711767SAnurag.Maskey@Sun.COM nwam_value_t typeval;
99811767SAnurag.Maskey@Sun.COM uint64_t type;
99911767SAnurag.Maskey@Sun.COM char *typednewname;
100011767SAnurag.Maskey@Sun.COM
100111767SAnurag.Maskey@Sun.COM assert(oldncuh != NULL && newname != NULL && newncuhp != NULL);
100211767SAnurag.Maskey@Sun.COM
100311767SAnurag.Maskey@Sun.COM if (nwam_ncu_get_prop_value(oldncuh, NWAM_NCU_PROP_TYPE,
100411767SAnurag.Maskey@Sun.COM &typeval) != NWAM_SUCCESS) {
100511767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
100611767SAnurag.Maskey@Sun.COM }
100711767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(typeval, &type) != NWAM_SUCCESS) {
100811767SAnurag.Maskey@Sun.COM nwam_value_free(typeval);
100911767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
101011767SAnurag.Maskey@Sun.COM }
101111767SAnurag.Maskey@Sun.COM nwam_value_free(typeval);
101211767SAnurag.Maskey@Sun.COM
101311767SAnurag.Maskey@Sun.COM /* check if newname NCU already exists */
101411767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_ncp(oldncuh, &ncph)) != NWAM_SUCCESS)
101511767SAnurag.Maskey@Sun.COM return (err);
101611767SAnurag.Maskey@Sun.COM if (nwam_ncu_read(ncph, newname, type, 0, &ncuh) == NWAM_SUCCESS) {
101711767SAnurag.Maskey@Sun.COM nwam_ncu_free(ncuh);
101811767SAnurag.Maskey@Sun.COM nwam_ncp_free(ncph);
101911767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_EXISTS);
102011767SAnurag.Maskey@Sun.COM }
102111767SAnurag.Maskey@Sun.COM nwam_ncp_free(ncph);
102211767SAnurag.Maskey@Sun.COM
102311767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_name_to_typed_name(newname, type, &typednewname))
102411767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
102511767SAnurag.Maskey@Sun.COM return (err);
102611767SAnurag.Maskey@Sun.COM
102711767SAnurag.Maskey@Sun.COM err = nwam_handle_create(NWAM_OBJECT_TYPE_NCU, typednewname, newncuhp);
102811767SAnurag.Maskey@Sun.COM free(typednewname);
102911767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS)
103011767SAnurag.Maskey@Sun.COM return (err);
103111767SAnurag.Maskey@Sun.COM if ((err = nwam_dup_object_list(oldncuh->nwh_data,
103211767SAnurag.Maskey@Sun.COM &((*newncuhp)->nwh_data))) != NWAM_SUCCESS) {
103311767SAnurag.Maskey@Sun.COM free(*newncuhp);
103411767SAnurag.Maskey@Sun.COM *newncuhp = NULL;
103511767SAnurag.Maskey@Sun.COM return (err);
103611767SAnurag.Maskey@Sun.COM }
103711767SAnurag.Maskey@Sun.COM
103811767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
103911767SAnurag.Maskey@Sun.COM }
104011767SAnurag.Maskey@Sun.COM
104111767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_delete_prop(nwam_ncu_handle_t ncuh,const char * propname)104211767SAnurag.Maskey@Sun.COM nwam_ncu_delete_prop(nwam_ncu_handle_t ncuh, const char *propname)
104311767SAnurag.Maskey@Sun.COM {
104411767SAnurag.Maskey@Sun.COM boolean_t ro_ncu, ro_prop;
104511767SAnurag.Maskey@Sun.COM nwam_error_t err;
104611767SAnurag.Maskey@Sun.COM void *olddata;
104711767SAnurag.Maskey@Sun.COM
104811767SAnurag.Maskey@Sun.COM assert(ncuh != NULL && propname != NULL);
104911767SAnurag.Maskey@Sun.COM
105011767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_read_only(ncuh, &ro_ncu)) != NWAM_SUCCESS ||
105111767SAnurag.Maskey@Sun.COM (err = nwam_ncu_prop_read_only(propname, &ro_prop)) != NWAM_SUCCESS)
105211767SAnurag.Maskey@Sun.COM return (err);
105311767SAnurag.Maskey@Sun.COM if (ro_ncu || ro_prop)
105411767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_READ_ONLY);
105511767SAnurag.Maskey@Sun.COM
105611767SAnurag.Maskey@Sun.COM /*
105711767SAnurag.Maskey@Sun.COM * Duplicate data, remove property and validate. If validation
105811767SAnurag.Maskey@Sun.COM * fails, revert to data duplicated prior to remove.
105911767SAnurag.Maskey@Sun.COM */
106011767SAnurag.Maskey@Sun.COM if ((err = nwam_dup_object_list(ncuh->nwh_data, &olddata))
106111767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
106211767SAnurag.Maskey@Sun.COM return (err);
106311767SAnurag.Maskey@Sun.COM if ((err = nwam_delete_prop(ncuh->nwh_data, propname))
106411767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) {
106511767SAnurag.Maskey@Sun.COM nwam_free_object_list(ncuh->nwh_data);
106611767SAnurag.Maskey@Sun.COM ncuh->nwh_data = olddata;
106711767SAnurag.Maskey@Sun.COM return (err);
106811767SAnurag.Maskey@Sun.COM }
106911767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_validate(ncuh, NULL)) != NWAM_SUCCESS) {
107011767SAnurag.Maskey@Sun.COM nwam_free_object_list(ncuh->nwh_data);
107111767SAnurag.Maskey@Sun.COM ncuh->nwh_data = olddata;
107211767SAnurag.Maskey@Sun.COM return (err);
107311767SAnurag.Maskey@Sun.COM }
107411767SAnurag.Maskey@Sun.COM nwam_free_object_list(olddata);
107511767SAnurag.Maskey@Sun.COM
107611767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
107711767SAnurag.Maskey@Sun.COM }
107811767SAnurag.Maskey@Sun.COM
107911767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_set_prop_value(nwam_ncu_handle_t ncuh,const char * propname,nwam_value_t value)108011767SAnurag.Maskey@Sun.COM nwam_ncu_set_prop_value(nwam_ncu_handle_t ncuh, const char *propname,
108111767SAnurag.Maskey@Sun.COM nwam_value_t value)
108211767SAnurag.Maskey@Sun.COM {
108311767SAnurag.Maskey@Sun.COM boolean_t ro_ncu, ro_prop;
108411767SAnurag.Maskey@Sun.COM nwam_error_t err;
108511767SAnurag.Maskey@Sun.COM nwam_ncp_handle_t ncph;
108611767SAnurag.Maskey@Sun.COM
108711767SAnurag.Maskey@Sun.COM assert(ncuh != NULL && propname != NULL && value != NULL);
108811767SAnurag.Maskey@Sun.COM
108911767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_read_only(ncuh, &ro_ncu)) != NWAM_SUCCESS ||
109011767SAnurag.Maskey@Sun.COM (err = nwam_ncu_prop_read_only(propname, &ro_prop)) != NWAM_SUCCESS)
109111767SAnurag.Maskey@Sun.COM return (err);
109211767SAnurag.Maskey@Sun.COM if (ro_ncu || ro_prop)
109311767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_READ_ONLY);
109411767SAnurag.Maskey@Sun.COM
109511767SAnurag.Maskey@Sun.COM err = nwam_ncu_get_ncp(ncuh, &ncph);
109611767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS && err != NWAM_INVALID_ARG) {
109711767SAnurag.Maskey@Sun.COM /*
109811767SAnurag.Maskey@Sun.COM * If "parent" property doesn't exist, NWAM_INVALID_ARG
109911767SAnurag.Maskey@Sun.COM * is returned. Allow the setting to continue.
110011767SAnurag.Maskey@Sun.COM */
110111767SAnurag.Maskey@Sun.COM return (err);
110211767SAnurag.Maskey@Sun.COM }
110311767SAnurag.Maskey@Sun.COM nwam_ncp_free(ncph);
110411767SAnurag.Maskey@Sun.COM
110511767SAnurag.Maskey@Sun.COM /* Need to ensure property, type and value are valid */
110611767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_validate_prop(ncuh, propname, value))
110711767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
110811767SAnurag.Maskey@Sun.COM return (err);
110911767SAnurag.Maskey@Sun.COM
111011767SAnurag.Maskey@Sun.COM return (nwam_set_prop_value(ncuh->nwh_data, propname, value));
111111767SAnurag.Maskey@Sun.COM }
111211767SAnurag.Maskey@Sun.COM
111311767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_get_prop_value(nwam_ncu_handle_t ncuh,const char * propname,nwam_value_t * valuep)111411767SAnurag.Maskey@Sun.COM nwam_ncu_get_prop_value(nwam_ncu_handle_t ncuh, const char *propname,
111511767SAnurag.Maskey@Sun.COM nwam_value_t *valuep)
111611767SAnurag.Maskey@Sun.COM {
111711767SAnurag.Maskey@Sun.COM assert(ncuh != NULL && propname != NULL && valuep != NULL);
111811767SAnurag.Maskey@Sun.COM
111911767SAnurag.Maskey@Sun.COM return (nwam_get_prop_value(ncuh->nwh_data, propname, valuep));
112011767SAnurag.Maskey@Sun.COM }
112111767SAnurag.Maskey@Sun.COM
112211767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_walk_props(nwam_ncu_handle_t ncuh,int (* cb)(const char *,nwam_value_t,void *),void * data,uint64_t flags,int * retp)112311767SAnurag.Maskey@Sun.COM nwam_ncu_walk_props(nwam_ncu_handle_t ncuh,
112411767SAnurag.Maskey@Sun.COM int (*cb)(const char *, nwam_value_t, void *),
112511767SAnurag.Maskey@Sun.COM void *data, uint64_t flags, int *retp)
112611767SAnurag.Maskey@Sun.COM {
112711767SAnurag.Maskey@Sun.COM return (nwam_walk_props(ncuh, cb, data, flags, retp));
112811767SAnurag.Maskey@Sun.COM }
112911767SAnurag.Maskey@Sun.COM
113011767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_get_ncp(nwam_ncu_handle_t ncuh,nwam_ncp_handle_t * ncphp)113111767SAnurag.Maskey@Sun.COM nwam_ncu_get_ncp(nwam_ncu_handle_t ncuh, nwam_ncp_handle_t *ncphp)
113211767SAnurag.Maskey@Sun.COM {
113311767SAnurag.Maskey@Sun.COM nwam_error_t err;
113411767SAnurag.Maskey@Sun.COM char *parentname = NULL;
113511767SAnurag.Maskey@Sun.COM
113611767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_parent_ncp_name(ncuh, &parentname))
113711767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS ||
113811767SAnurag.Maskey@Sun.COM (err = nwam_handle_create(NWAM_OBJECT_TYPE_NCP, parentname, ncphp))
113911767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) {
114011767SAnurag.Maskey@Sun.COM if (parentname != NULL)
114111767SAnurag.Maskey@Sun.COM free(parentname);
114211767SAnurag.Maskey@Sun.COM return (err);
114311767SAnurag.Maskey@Sun.COM }
114411767SAnurag.Maskey@Sun.COM free(parentname);
114511767SAnurag.Maskey@Sun.COM
114611767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
114711767SAnurag.Maskey@Sun.COM }
114811767SAnurag.Maskey@Sun.COM
114911767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_commit(nwam_ncu_handle_t ncuh,uint64_t flags)115011767SAnurag.Maskey@Sun.COM nwam_ncu_commit(nwam_ncu_handle_t ncuh, uint64_t flags)
115111767SAnurag.Maskey@Sun.COM {
115211767SAnurag.Maskey@Sun.COM nwam_error_t err;
115311767SAnurag.Maskey@Sun.COM boolean_t read_only;
115411767SAnurag.Maskey@Sun.COM char *ncpfile, *ncpname;
115511767SAnurag.Maskey@Sun.COM
115611767SAnurag.Maskey@Sun.COM assert(ncuh != NULL && ncuh->nwh_data != NULL);
115711767SAnurag.Maskey@Sun.COM
115811767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_read_only(ncuh, &read_only)) != NWAM_SUCCESS)
115911767SAnurag.Maskey@Sun.COM return (err);
116011767SAnurag.Maskey@Sun.COM if (read_only)
116111767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_READ_ONLY);
116211767SAnurag.Maskey@Sun.COM
116311767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_validate(ncuh, NULL)) != NWAM_SUCCESS ||
116411767SAnurag.Maskey@Sun.COM (err = nwam_ncu_get_parent_ncp_name(ncuh, &ncpname))
116511767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
116611767SAnurag.Maskey@Sun.COM return (err);
116711767SAnurag.Maskey@Sun.COM
116811767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_name_to_file(ncpname, &ncpfile)) != NWAM_SUCCESS) {
116911767SAnurag.Maskey@Sun.COM free(ncpname);
117011767SAnurag.Maskey@Sun.COM return (err);
117111767SAnurag.Maskey@Sun.COM }
117211767SAnurag.Maskey@Sun.COM
117311767SAnurag.Maskey@Sun.COM err = nwam_commit(ncpfile, ncuh, flags);
117411767SAnurag.Maskey@Sun.COM
117511767SAnurag.Maskey@Sun.COM free(ncpname);
117611767SAnurag.Maskey@Sun.COM free(ncpfile);
117711767SAnurag.Maskey@Sun.COM
117811767SAnurag.Maskey@Sun.COM return (err);
117911767SAnurag.Maskey@Sun.COM }
118011767SAnurag.Maskey@Sun.COM /* Get the NCU type */
118111767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_get_ncu_type(nwam_ncu_handle_t ncuh,nwam_ncu_type_t * typep)118211767SAnurag.Maskey@Sun.COM nwam_ncu_get_ncu_type(nwam_ncu_handle_t ncuh, nwam_ncu_type_t *typep)
118311767SAnurag.Maskey@Sun.COM {
118411767SAnurag.Maskey@Sun.COM nwam_error_t err;
118511767SAnurag.Maskey@Sun.COM nwam_value_t typeval;
118611767SAnurag.Maskey@Sun.COM uint64_t type;
118711767SAnurag.Maskey@Sun.COM
118811767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_prop_value(ncuh, NWAM_NCU_PROP_TYPE, &typeval))
118911767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
119011767SAnurag.Maskey@Sun.COM return (err);
119111767SAnurag.Maskey@Sun.COM err = nwam_value_get_uint64(typeval, &type);
119211767SAnurag.Maskey@Sun.COM nwam_value_free(typeval);
119311767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS)
119411767SAnurag.Maskey@Sun.COM return (err);
119511767SAnurag.Maskey@Sun.COM
119611767SAnurag.Maskey@Sun.COM *typep = type;
119711767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
119811767SAnurag.Maskey@Sun.COM }
119911767SAnurag.Maskey@Sun.COM
120011767SAnurag.Maskey@Sun.COM /* Get the NCU class */
120111767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_get_ncu_class(nwam_ncu_handle_t ncuh,nwam_ncu_class_t * classp)120211767SAnurag.Maskey@Sun.COM nwam_ncu_get_ncu_class(nwam_ncu_handle_t ncuh, nwam_ncu_class_t *classp)
120311767SAnurag.Maskey@Sun.COM {
120411767SAnurag.Maskey@Sun.COM nwam_error_t err;
120511767SAnurag.Maskey@Sun.COM nwam_value_t classval;
120611767SAnurag.Maskey@Sun.COM uint64_t class;
120711767SAnurag.Maskey@Sun.COM
120811767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_prop_value(ncuh, NWAM_NCU_PROP_CLASS,
120911767SAnurag.Maskey@Sun.COM &classval)) != NWAM_SUCCESS)
121011767SAnurag.Maskey@Sun.COM return (err);
121111767SAnurag.Maskey@Sun.COM err = nwam_value_get_uint64(classval, &class);
121211767SAnurag.Maskey@Sun.COM nwam_value_free(classval);
121311767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS)
121411767SAnurag.Maskey@Sun.COM return (err);
121511767SAnurag.Maskey@Sun.COM
121611767SAnurag.Maskey@Sun.COM *classp = class;
121711767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
121811767SAnurag.Maskey@Sun.COM }
121911767SAnurag.Maskey@Sun.COM
122011767SAnurag.Maskey@Sun.COM /*
122111767SAnurag.Maskey@Sun.COM * Determine if the NCU has manual activation-mode or not.
122211767SAnurag.Maskey@Sun.COM */
122311767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_is_manual(nwam_ncu_handle_t ncuh,boolean_t * manualp)122411767SAnurag.Maskey@Sun.COM nwam_ncu_is_manual(nwam_ncu_handle_t ncuh, boolean_t *manualp)
122511767SAnurag.Maskey@Sun.COM {
122611767SAnurag.Maskey@Sun.COM nwam_error_t err;
122711767SAnurag.Maskey@Sun.COM nwam_value_t actval;
122811767SAnurag.Maskey@Sun.COM uint64_t activation;
122911767SAnurag.Maskey@Sun.COM
123011767SAnurag.Maskey@Sun.COM assert(ncuh != NULL);
123111767SAnurag.Maskey@Sun.COM
123211767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_prop_value(ncuh, NWAM_NCU_PROP_ACTIVATION_MODE,
123311767SAnurag.Maskey@Sun.COM &actval)) != NWAM_SUCCESS)
123411767SAnurag.Maskey@Sun.COM return (err);
123511767SAnurag.Maskey@Sun.COM err = nwam_value_get_uint64(actval, &activation);
123611767SAnurag.Maskey@Sun.COM nwam_value_free(actval);
123711767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS)
123811767SAnurag.Maskey@Sun.COM return (err);
123911767SAnurag.Maskey@Sun.COM
124011767SAnurag.Maskey@Sun.COM if (activation == NWAM_ACTIVATION_MODE_MANUAL)
124111767SAnurag.Maskey@Sun.COM *manualp = B_TRUE;
124211767SAnurag.Maskey@Sun.COM else
124311767SAnurag.Maskey@Sun.COM *manualp = B_FALSE;
124411767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
124511767SAnurag.Maskey@Sun.COM }
124611767SAnurag.Maskey@Sun.COM
124711767SAnurag.Maskey@Sun.COM /* Determine if NCU is enabled or not */
124811767SAnurag.Maskey@Sun.COM static nwam_error_t
nwam_ncu_is_enabled(nwam_ncu_handle_t ncuh,boolean_t * enabledp)124911767SAnurag.Maskey@Sun.COM nwam_ncu_is_enabled(nwam_ncu_handle_t ncuh, boolean_t *enabledp)
125011767SAnurag.Maskey@Sun.COM {
125111767SAnurag.Maskey@Sun.COM nwam_error_t err;
125211767SAnurag.Maskey@Sun.COM nwam_value_t enabledval;
125311767SAnurag.Maskey@Sun.COM
125411767SAnurag.Maskey@Sun.COM assert(ncuh != NULL);
125511767SAnurag.Maskey@Sun.COM
125611767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_prop_value(ncuh, NWAM_NCU_PROP_ENABLED,
125711767SAnurag.Maskey@Sun.COM &enabledval)) != NWAM_SUCCESS)
125811767SAnurag.Maskey@Sun.COM return (err);
125911767SAnurag.Maskey@Sun.COM err = nwam_value_get_boolean(enabledval, enabledp);
126011767SAnurag.Maskey@Sun.COM nwam_value_free(enabledval);
126111767SAnurag.Maskey@Sun.COM return (err);
126211767SAnurag.Maskey@Sun.COM }
126311767SAnurag.Maskey@Sun.COM
126411767SAnurag.Maskey@Sun.COM /* Update the enabled property */
126511767SAnurag.Maskey@Sun.COM static nwam_error_t
nwam_ncu_update_enabled(nwam_ncu_handle_t ncuh,boolean_t enabled)126611767SAnurag.Maskey@Sun.COM nwam_ncu_update_enabled(nwam_ncu_handle_t ncuh, boolean_t enabled)
126711767SAnurag.Maskey@Sun.COM {
126811767SAnurag.Maskey@Sun.COM nwam_error_t err;
126911767SAnurag.Maskey@Sun.COM nwam_value_t enabledval;
127011767SAnurag.Maskey@Sun.COM
127111767SAnurag.Maskey@Sun.COM if ((err = nwam_value_create_boolean(enabled, &enabledval))
127211767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
127311767SAnurag.Maskey@Sun.COM return (err);
127411767SAnurag.Maskey@Sun.COM err = nwam_set_prop_value(ncuh->nwh_data, NWAM_NCU_PROP_ENABLED,
127511767SAnurag.Maskey@Sun.COM enabledval);
127611767SAnurag.Maskey@Sun.COM nwam_value_free(enabledval);
127711767SAnurag.Maskey@Sun.COM if (err != NWAM_SUCCESS)
127811767SAnurag.Maskey@Sun.COM return (err);
127911767SAnurag.Maskey@Sun.COM return (nwam_ncu_commit(ncuh, NWAM_FLAG_ENTITY_ENABLE));
128011767SAnurag.Maskey@Sun.COM }
128111767SAnurag.Maskey@Sun.COM
128211767SAnurag.Maskey@Sun.COM /*
128311767SAnurag.Maskey@Sun.COM * Make ncu active; fails if the NCU's parent NCP is not active.
128411767SAnurag.Maskey@Sun.COM */
128511767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_enable(nwam_ncu_handle_t ncuh)128611767SAnurag.Maskey@Sun.COM nwam_ncu_enable(nwam_ncu_handle_t ncuh)
128711767SAnurag.Maskey@Sun.COM {
128811767SAnurag.Maskey@Sun.COM char *ncpname = NULL;
128911767SAnurag.Maskey@Sun.COM nwam_error_t err;
129011767SAnurag.Maskey@Sun.COM nwam_ncu_type_t type;
129111767SAnurag.Maskey@Sun.COM boolean_t read_only, enabled, manual;
129211767SAnurag.Maskey@Sun.COM
129311767SAnurag.Maskey@Sun.COM assert(ncuh != NULL);
129411767SAnurag.Maskey@Sun.COM
129511767SAnurag.Maskey@Sun.COM /* Don't allow NCUs of Automatic NCP to be enabled */
129611767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_read_only(ncuh, &read_only)) != NWAM_SUCCESS)
129711767SAnurag.Maskey@Sun.COM return (err);
129811767SAnurag.Maskey@Sun.COM if (read_only)
129911767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_MANUAL);
130011767SAnurag.Maskey@Sun.COM
130111767SAnurag.Maskey@Sun.COM /* Link NCUs with manual activation-mode or IP NCUs can be enabled */
130211767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_ncu_type(ncuh, &type)) != NWAM_SUCCESS)
130311767SAnurag.Maskey@Sun.COM return (err);
130411767SAnurag.Maskey@Sun.COM
130511767SAnurag.Maskey@Sun.COM if (type == NWAM_NCU_TYPE_LINK) {
130611767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_is_manual(ncuh, &manual)) != NWAM_SUCCESS)
130711767SAnurag.Maskey@Sun.COM return (err);
130811767SAnurag.Maskey@Sun.COM if (!manual)
130911767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_MANUAL);
131011767SAnurag.Maskey@Sun.COM }
131111767SAnurag.Maskey@Sun.COM
131211767SAnurag.Maskey@Sun.COM /* Make sure NCU is not enabled */
131311767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_is_enabled(ncuh, &enabled)) != NWAM_SUCCESS ||
131411767SAnurag.Maskey@Sun.COM (err = nwam_ncu_get_parent_ncp_name(ncuh, &ncpname))
131511767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
131611767SAnurag.Maskey@Sun.COM return (err);
131711767SAnurag.Maskey@Sun.COM
131811767SAnurag.Maskey@Sun.COM if (enabled) {
131911767SAnurag.Maskey@Sun.COM free(ncpname);
132011767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
132111767SAnurag.Maskey@Sun.COM }
132211767SAnurag.Maskey@Sun.COM
132311767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_update_enabled(ncuh, B_TRUE)) != NWAM_SUCCESS) {
132411767SAnurag.Maskey@Sun.COM free(ncpname);
132511767SAnurag.Maskey@Sun.COM return (err);
132611767SAnurag.Maskey@Sun.COM }
132711767SAnurag.Maskey@Sun.COM
132811767SAnurag.Maskey@Sun.COM err = nwam_enable(ncpname, ncuh);
132911767SAnurag.Maskey@Sun.COM free(ncpname);
133011767SAnurag.Maskey@Sun.COM
133111767SAnurag.Maskey@Sun.COM /* nwamd may not be running, that's okay. */
133211767SAnurag.Maskey@Sun.COM if (err == NWAM_ERROR_BIND)
133311767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
133411767SAnurag.Maskey@Sun.COM else
133511767SAnurag.Maskey@Sun.COM return (err);
133611767SAnurag.Maskey@Sun.COM }
133711767SAnurag.Maskey@Sun.COM
133811767SAnurag.Maskey@Sun.COM /*
133911767SAnurag.Maskey@Sun.COM * Disable ncu; fails if the NCU's parent NCP is not active, or if the
134011767SAnurag.Maskey@Sun.COM * NCU is not currently active.
134111767SAnurag.Maskey@Sun.COM */
134211767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_disable(nwam_ncu_handle_t ncuh)134311767SAnurag.Maskey@Sun.COM nwam_ncu_disable(nwam_ncu_handle_t ncuh)
134411767SAnurag.Maskey@Sun.COM {
134511767SAnurag.Maskey@Sun.COM char *ncpname = NULL;
134611767SAnurag.Maskey@Sun.COM nwam_error_t err;
134711767SAnurag.Maskey@Sun.COM nwam_ncu_type_t type;
134811767SAnurag.Maskey@Sun.COM boolean_t read_only, enabled, manual;
134911767SAnurag.Maskey@Sun.COM
135011767SAnurag.Maskey@Sun.COM assert(ncuh != NULL);
135111767SAnurag.Maskey@Sun.COM
135211767SAnurag.Maskey@Sun.COM /* Don't allow NCUs of Automatic NCP to be disabled */
135311767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_read_only(ncuh, &read_only)) != NWAM_SUCCESS)
135411767SAnurag.Maskey@Sun.COM return (err);
135511767SAnurag.Maskey@Sun.COM if (read_only)
135611767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_MANUAL);
135711767SAnurag.Maskey@Sun.COM
135811767SAnurag.Maskey@Sun.COM /* Link NCUs with manual activation-mode or IP NCUs can be disabled */
135911767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_ncu_type(ncuh, &type)) != NWAM_SUCCESS)
136011767SAnurag.Maskey@Sun.COM return (err);
136111767SAnurag.Maskey@Sun.COM
136211767SAnurag.Maskey@Sun.COM if (type == NWAM_NCU_TYPE_LINK) {
136311767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_is_manual(ncuh, &manual)) != NWAM_SUCCESS)
136411767SAnurag.Maskey@Sun.COM return (err);
136511767SAnurag.Maskey@Sun.COM if (!manual)
136611767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_MANUAL);
136711767SAnurag.Maskey@Sun.COM }
136811767SAnurag.Maskey@Sun.COM
136911767SAnurag.Maskey@Sun.COM /* Make sure NCU is enabled */
137011767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_is_enabled(ncuh, &enabled)) != NWAM_SUCCESS ||
137111767SAnurag.Maskey@Sun.COM (err = nwam_ncu_get_parent_ncp_name(ncuh, &ncpname))
137211767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
137311767SAnurag.Maskey@Sun.COM return (err);
137411767SAnurag.Maskey@Sun.COM
137511767SAnurag.Maskey@Sun.COM if (!enabled) {
137611767SAnurag.Maskey@Sun.COM free(ncpname);
137711767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
137811767SAnurag.Maskey@Sun.COM }
137911767SAnurag.Maskey@Sun.COM
138011767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_update_enabled(ncuh, B_FALSE)) != NWAM_SUCCESS) {
138111767SAnurag.Maskey@Sun.COM free(ncpname);
138211767SAnurag.Maskey@Sun.COM return (err);
138311767SAnurag.Maskey@Sun.COM }
138411767SAnurag.Maskey@Sun.COM
138511767SAnurag.Maskey@Sun.COM err = nwam_disable(ncpname, ncuh);
138611767SAnurag.Maskey@Sun.COM free(ncpname);
138711767SAnurag.Maskey@Sun.COM
138811767SAnurag.Maskey@Sun.COM /* nwamd may not be running, that's okay. */
138911767SAnurag.Maskey@Sun.COM if (err == NWAM_ERROR_BIND)
139011767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
139111767SAnurag.Maskey@Sun.COM else
139211767SAnurag.Maskey@Sun.COM return (err);
139311767SAnurag.Maskey@Sun.COM }
139411767SAnurag.Maskey@Sun.COM
139511767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_destroy(nwam_ncu_handle_t ncuh,uint64_t flags)139611767SAnurag.Maskey@Sun.COM nwam_ncu_destroy(nwam_ncu_handle_t ncuh, uint64_t flags)
139711767SAnurag.Maskey@Sun.COM {
139811767SAnurag.Maskey@Sun.COM char *ncpname, *ncpfile;
139911767SAnurag.Maskey@Sun.COM boolean_t read_only;
140011767SAnurag.Maskey@Sun.COM nwam_error_t err;
140111767SAnurag.Maskey@Sun.COM
140211767SAnurag.Maskey@Sun.COM assert(ncuh != NULL);
140311767SAnurag.Maskey@Sun.COM
140411767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_read_only(ncuh, &read_only)) != NWAM_SUCCESS)
140511767SAnurag.Maskey@Sun.COM return (err);
140611767SAnurag.Maskey@Sun.COM if (read_only)
140711767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_NOT_DESTROYABLE);
140811767SAnurag.Maskey@Sun.COM
140911767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_parent_ncp_name(ncuh, &ncpname))
141011767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
141111767SAnurag.Maskey@Sun.COM return (err);
141211767SAnurag.Maskey@Sun.COM if ((err = nwam_ncp_name_to_file(ncpname, &ncpfile))
141311767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS) {
141411767SAnurag.Maskey@Sun.COM free(ncpname);
141511767SAnurag.Maskey@Sun.COM return (err);
141611767SAnurag.Maskey@Sun.COM }
141711767SAnurag.Maskey@Sun.COM
141811767SAnurag.Maskey@Sun.COM err = nwam_destroy(ncpfile, ncuh, flags);
141911767SAnurag.Maskey@Sun.COM
142011767SAnurag.Maskey@Sun.COM free(ncpname);
142111767SAnurag.Maskey@Sun.COM free(ncpfile);
142211767SAnurag.Maskey@Sun.COM
142311767SAnurag.Maskey@Sun.COM return (err);
142411767SAnurag.Maskey@Sun.COM }
142511767SAnurag.Maskey@Sun.COM
142611767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_get_prop_description(const char * propname,const char ** descriptionp)142711767SAnurag.Maskey@Sun.COM nwam_ncu_get_prop_description(const char *propname, const char **descriptionp)
142811767SAnurag.Maskey@Sun.COM {
142911767SAnurag.Maskey@Sun.COM return (nwam_get_prop_description(ncu_prop_table, propname,
143011767SAnurag.Maskey@Sun.COM descriptionp));
143111767SAnurag.Maskey@Sun.COM }
143211767SAnurag.Maskey@Sun.COM
143311767SAnurag.Maskey@Sun.COM /* Get expected property data type */
143411767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_get_prop_type(const char * propname,nwam_value_type_t * typep)143511767SAnurag.Maskey@Sun.COM nwam_ncu_get_prop_type(const char *propname, nwam_value_type_t *typep)
143611767SAnurag.Maskey@Sun.COM {
143711767SAnurag.Maskey@Sun.COM return (nwam_get_prop_type(ncu_prop_table, propname, typep));
143811767SAnurag.Maskey@Sun.COM }
143911767SAnurag.Maskey@Sun.COM
144011767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_prop_read_only(const char * propname,boolean_t * readp)144111767SAnurag.Maskey@Sun.COM nwam_ncu_prop_read_only(const char *propname, boolean_t *readp)
144211767SAnurag.Maskey@Sun.COM {
144311767SAnurag.Maskey@Sun.COM if ((*readp = NWAM_NCU_PROP_SETONCE(propname)) == B_TRUE)
144411767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
144511767SAnurag.Maskey@Sun.COM
144611767SAnurag.Maskey@Sun.COM return (nwam_prop_read_only(ncu_prop_table, propname, readp));
144711767SAnurag.Maskey@Sun.COM }
144811767SAnurag.Maskey@Sun.COM
144911767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_prop_multivalued(const char * propname,boolean_t * multip)145011767SAnurag.Maskey@Sun.COM nwam_ncu_prop_multivalued(const char *propname, boolean_t *multip)
145111767SAnurag.Maskey@Sun.COM {
145211767SAnurag.Maskey@Sun.COM return (nwam_prop_multivalued(ncu_prop_table, propname, multip));
145311767SAnurag.Maskey@Sun.COM }
145411767SAnurag.Maskey@Sun.COM
145511767SAnurag.Maskey@Sun.COM /*
145611767SAnurag.Maskey@Sun.COM * Ensure that the properties in the ncu, determined by that ncu's
145711767SAnurag.Maskey@Sun.COM * type and class, belong there.
145811767SAnurag.Maskey@Sun.COM */
145911767SAnurag.Maskey@Sun.COM static nwam_error_t
nwam_ncu_validate_prop_membership(nwam_ncu_handle_t ncuh,const char * propname)146011767SAnurag.Maskey@Sun.COM nwam_ncu_validate_prop_membership(nwam_ncu_handle_t ncuh, const char *propname)
146111767SAnurag.Maskey@Sun.COM {
146211767SAnurag.Maskey@Sun.COM struct nwam_prop_table_entry *pte;
146311767SAnurag.Maskey@Sun.COM nwam_value_t typeval, classval;
146411767SAnurag.Maskey@Sun.COM uint64_t type, class;
146511767SAnurag.Maskey@Sun.COM uint64_t typeflags = 0, classflags = 0;
146611767SAnurag.Maskey@Sun.COM
146711767SAnurag.Maskey@Sun.COM /* Get type/class from ncu */
146811767SAnurag.Maskey@Sun.COM if (nwam_ncu_get_prop_value(ncuh, NWAM_NCU_PROP_TYPE, &typeval)
146911767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
147011767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID);
147111767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(typeval, &type) != NWAM_SUCCESS) {
147211767SAnurag.Maskey@Sun.COM nwam_value_free(typeval);
147311767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID);
147411767SAnurag.Maskey@Sun.COM }
147511767SAnurag.Maskey@Sun.COM typeflags = nwam_ncu_type_to_flag((nwam_ncu_type_t)type);
147611767SAnurag.Maskey@Sun.COM nwam_value_free(typeval);
147711767SAnurag.Maskey@Sun.COM
147811767SAnurag.Maskey@Sun.COM if (nwam_ncu_get_prop_value(ncuh, NWAM_NCU_PROP_CLASS, &classval)
147911767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
148011767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID);
148111767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(classval, &class) != NWAM_SUCCESS) {
148211767SAnurag.Maskey@Sun.COM nwam_value_free(classval);
148311767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID);
148411767SAnurag.Maskey@Sun.COM }
148511767SAnurag.Maskey@Sun.COM classflags = nwam_ncu_class_to_flag((nwam_ncu_class_t)class);
148611767SAnurag.Maskey@Sun.COM nwam_value_free(classval);
148711767SAnurag.Maskey@Sun.COM
148811767SAnurag.Maskey@Sun.COM if ((pte = nwam_get_prop_table_entry(ncu_prop_table, propname)) == NULL)
148911767SAnurag.Maskey@Sun.COM return (NWAM_INVALID_ARG);
149011767SAnurag.Maskey@Sun.COM
149111767SAnurag.Maskey@Sun.COM if (typeflags & pte->prop_type_membership &&
149211767SAnurag.Maskey@Sun.COM classflags & pte->prop_class_membership) {
149311767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
149411767SAnurag.Maskey@Sun.COM } else {
149511767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_MEMBER);
149611767SAnurag.Maskey@Sun.COM }
149711767SAnurag.Maskey@Sun.COM }
149811767SAnurag.Maskey@Sun.COM
149911767SAnurag.Maskey@Sun.COM /* Validate property's ncu membership and type, number and range of values */
150011767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_validate_prop(nwam_ncu_handle_t ncuh,const char * propname,nwam_value_t value)150111767SAnurag.Maskey@Sun.COM nwam_ncu_validate_prop(nwam_ncu_handle_t ncuh, const char *propname,
150211767SAnurag.Maskey@Sun.COM nwam_value_t value)
150311767SAnurag.Maskey@Sun.COM {
150411767SAnurag.Maskey@Sun.COM nwam_error_t err;
150511767SAnurag.Maskey@Sun.COM
150611767SAnurag.Maskey@Sun.COM assert(ncuh != NULL && propname != NULL);
150711767SAnurag.Maskey@Sun.COM
150811767SAnurag.Maskey@Sun.COM /* First, determine if this property is valid for this ncu */
150911767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_validate_prop_membership(ncuh, propname))
151011767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
151111767SAnurag.Maskey@Sun.COM return (err);
151211767SAnurag.Maskey@Sun.COM
151311767SAnurag.Maskey@Sun.COM return (nwam_validate_prop(ncu_prop_table, ncuh, propname, value));
151411767SAnurag.Maskey@Sun.COM }
151511767SAnurag.Maskey@Sun.COM
151611767SAnurag.Maskey@Sun.COM /* Property-specific value validation functions follow */
151711767SAnurag.Maskey@Sun.COM
151811767SAnurag.Maskey@Sun.COM static nwam_error_t
valid_type(nwam_value_t value)151911767SAnurag.Maskey@Sun.COM valid_type(nwam_value_t value)
152011767SAnurag.Maskey@Sun.COM {
152111767SAnurag.Maskey@Sun.COM uint64_t type;
152211767SAnurag.Maskey@Sun.COM
152311767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(value, &type) != NWAM_SUCCESS ||
152411767SAnurag.Maskey@Sun.COM type > NWAM_NCU_TYPE_INTERFACE)
152511767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
152611767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
152711767SAnurag.Maskey@Sun.COM }
152811767SAnurag.Maskey@Sun.COM
152911767SAnurag.Maskey@Sun.COM static nwam_error_t
valid_class(nwam_value_t value)153011767SAnurag.Maskey@Sun.COM valid_class(nwam_value_t value)
153111767SAnurag.Maskey@Sun.COM {
153211767SAnurag.Maskey@Sun.COM uint64_t class;
153311767SAnurag.Maskey@Sun.COM
153411767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(value, &class) != NWAM_SUCCESS ||
153511767SAnurag.Maskey@Sun.COM class > NWAM_NCU_CLASS_IP)
153611767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
153711767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
153811767SAnurag.Maskey@Sun.COM }
153911767SAnurag.Maskey@Sun.COM
154011767SAnurag.Maskey@Sun.COM static nwam_error_t
valid_ncp(nwam_value_t value)154111767SAnurag.Maskey@Sun.COM valid_ncp(nwam_value_t value)
154211767SAnurag.Maskey@Sun.COM {
154311767SAnurag.Maskey@Sun.COM char *ncp;
154411767SAnurag.Maskey@Sun.COM
154511767SAnurag.Maskey@Sun.COM if (nwam_value_get_string(value, &ncp) != NWAM_SUCCESS)
154611767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
154711767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
154811767SAnurag.Maskey@Sun.COM }
154911767SAnurag.Maskey@Sun.COM
155011767SAnurag.Maskey@Sun.COM static nwam_error_t
valid_priority_mode(nwam_value_t value)155111767SAnurag.Maskey@Sun.COM valid_priority_mode(nwam_value_t value)
155211767SAnurag.Maskey@Sun.COM {
155311767SAnurag.Maskey@Sun.COM uint64_t priority_mode;
155411767SAnurag.Maskey@Sun.COM
155511767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(value, &priority_mode) != NWAM_SUCCESS ||
155611767SAnurag.Maskey@Sun.COM priority_mode > NWAM_PRIORITY_MODE_ALL)
155711767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
155811767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
155911767SAnurag.Maskey@Sun.COM }
156011767SAnurag.Maskey@Sun.COM
156111767SAnurag.Maskey@Sun.COM static nwam_error_t
valid_ncu_activation_mode(nwam_value_t value)156211767SAnurag.Maskey@Sun.COM valid_ncu_activation_mode(nwam_value_t value)
156311767SAnurag.Maskey@Sun.COM {
156411767SAnurag.Maskey@Sun.COM uint64_t activation_mode;
156511767SAnurag.Maskey@Sun.COM
156611767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64(value, &activation_mode) != NWAM_SUCCESS)
156711767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
156811767SAnurag.Maskey@Sun.COM
156911767SAnurag.Maskey@Sun.COM switch (activation_mode) {
157011767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_MANUAL:
157111767SAnurag.Maskey@Sun.COM case NWAM_ACTIVATION_MODE_PRIORITIZED:
157211767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
157311767SAnurag.Maskey@Sun.COM }
157411767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
157511767SAnurag.Maskey@Sun.COM }
157611767SAnurag.Maskey@Sun.COM
157711767SAnurag.Maskey@Sun.COM /* ARGSUSED0 */
157811767SAnurag.Maskey@Sun.COM static nwam_error_t
valid_link_autopush(nwam_value_t value)157911767SAnurag.Maskey@Sun.COM valid_link_autopush(nwam_value_t value)
158011767SAnurag.Maskey@Sun.COM {
158111767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
158211767SAnurag.Maskey@Sun.COM }
158311767SAnurag.Maskey@Sun.COM
158411767SAnurag.Maskey@Sun.COM static nwam_error_t
valid_ip_version(nwam_value_t value)158511767SAnurag.Maskey@Sun.COM valid_ip_version(nwam_value_t value)
158611767SAnurag.Maskey@Sun.COM {
158711767SAnurag.Maskey@Sun.COM uint64_t *versions;
158811767SAnurag.Maskey@Sun.COM uint_t i, numvalues;
158911767SAnurag.Maskey@Sun.COM
159011767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64_array(value, &versions, &numvalues)
159111767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
159211767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
159311767SAnurag.Maskey@Sun.COM
159411767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) {
159511767SAnurag.Maskey@Sun.COM if (versions[i] != IPV4_VERSION &&
159611767SAnurag.Maskey@Sun.COM versions[i] != IPV6_VERSION)
159711767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
159811767SAnurag.Maskey@Sun.COM }
159911767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
160011767SAnurag.Maskey@Sun.COM }
160111767SAnurag.Maskey@Sun.COM
160211767SAnurag.Maskey@Sun.COM static nwam_error_t
valid_addrsrc_v4(nwam_value_t value)160311767SAnurag.Maskey@Sun.COM valid_addrsrc_v4(nwam_value_t value)
160411767SAnurag.Maskey@Sun.COM {
160511767SAnurag.Maskey@Sun.COM uint64_t *addrsrc;
160611767SAnurag.Maskey@Sun.COM uint_t i, numvalues;
160711767SAnurag.Maskey@Sun.COM
160811767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64_array(value, &addrsrc, &numvalues)
160911767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
161011767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
161111767SAnurag.Maskey@Sun.COM
161211767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) {
161311767SAnurag.Maskey@Sun.COM if (addrsrc[i] != NWAM_ADDRSRC_DHCP &&
161411767SAnurag.Maskey@Sun.COM addrsrc[i] != NWAM_ADDRSRC_STATIC)
161511767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
161611767SAnurag.Maskey@Sun.COM }
161711767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
161811767SAnurag.Maskey@Sun.COM }
161911767SAnurag.Maskey@Sun.COM
162011767SAnurag.Maskey@Sun.COM static nwam_error_t
valid_addrsrc_v6(nwam_value_t value)162111767SAnurag.Maskey@Sun.COM valid_addrsrc_v6(nwam_value_t value)
162211767SAnurag.Maskey@Sun.COM {
162311767SAnurag.Maskey@Sun.COM uint64_t *addrsrc;
162411767SAnurag.Maskey@Sun.COM uint_t i, numvalues;
162511767SAnurag.Maskey@Sun.COM boolean_t dhcp_found = B_FALSE, autoconf_found = B_FALSE;
162611767SAnurag.Maskey@Sun.COM
162711767SAnurag.Maskey@Sun.COM if (nwam_value_get_uint64_array(value, &addrsrc, &numvalues)
162811767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
162911767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
163011767SAnurag.Maskey@Sun.COM
163111767SAnurag.Maskey@Sun.COM for (i = 0; i < numvalues; i++) {
163211767SAnurag.Maskey@Sun.COM if (addrsrc[i] != NWAM_ADDRSRC_DHCP &&
163311767SAnurag.Maskey@Sun.COM addrsrc[i] != NWAM_ADDRSRC_STATIC &&
163411767SAnurag.Maskey@Sun.COM addrsrc[i] != NWAM_ADDRSRC_AUTOCONF)
163511767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
163611767SAnurag.Maskey@Sun.COM if (addrsrc[i] == NWAM_ADDRSRC_DHCP)
163711767SAnurag.Maskey@Sun.COM dhcp_found = B_TRUE;
163811767SAnurag.Maskey@Sun.COM if (addrsrc[i] == NWAM_ADDRSRC_AUTOCONF)
163911767SAnurag.Maskey@Sun.COM autoconf_found = B_TRUE;
164011767SAnurag.Maskey@Sun.COM }
164111767SAnurag.Maskey@Sun.COM /*
164211767SAnurag.Maskey@Sun.COM * DHCP and AUTOCONF need to be specified as v6 address sources
164311767SAnurag.Maskey@Sun.COM * since there is no way to switch them off in NWAM at present.
164411767SAnurag.Maskey@Sun.COM */
164511767SAnurag.Maskey@Sun.COM if (dhcp_found && autoconf_found)
164611767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
164711767SAnurag.Maskey@Sun.COM else
164811767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID_VALUE);
164911767SAnurag.Maskey@Sun.COM }
165011767SAnurag.Maskey@Sun.COM
165111767SAnurag.Maskey@Sun.COM /* ARGSUSED0 */
165211767SAnurag.Maskey@Sun.COM static nwam_error_t
valid_link_mtu(nwam_value_t value)165311767SAnurag.Maskey@Sun.COM valid_link_mtu(nwam_value_t value)
165411767SAnurag.Maskey@Sun.COM {
165511767SAnurag.Maskey@Sun.COM return (NWAM_SUCCESS);
165611767SAnurag.Maskey@Sun.COM }
165711767SAnurag.Maskey@Sun.COM
165811767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_validate(nwam_ncu_handle_t ncuh,const char ** errpropp)165911767SAnurag.Maskey@Sun.COM nwam_ncu_validate(nwam_ncu_handle_t ncuh, const char **errpropp)
166011767SAnurag.Maskey@Sun.COM {
166111767SAnurag.Maskey@Sun.COM return (nwam_validate(ncu_prop_table, ncuh, errpropp));
166211767SAnurag.Maskey@Sun.COM }
166311767SAnurag.Maskey@Sun.COM
166411767SAnurag.Maskey@Sun.COM /*
166511767SAnurag.Maskey@Sun.COM * Given the ncu type and ncu class, return the list of properties that needs
166611767SAnurag.Maskey@Sun.COM * to be set. Note this list is a complete property list that includes both
166711767SAnurag.Maskey@Sun.COM * the required ones and the optional ones. Caller needs to free prop_list.
166811767SAnurag.Maskey@Sun.COM */
166911767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_get_default_proplist(nwam_ncu_type_t type,nwam_ncu_class_t class,const char *** prop_list,uint_t * numvalues)167011767SAnurag.Maskey@Sun.COM nwam_ncu_get_default_proplist(nwam_ncu_type_t type, nwam_ncu_class_t class,
167111767SAnurag.Maskey@Sun.COM const char ***prop_list, uint_t *numvalues)
167211767SAnurag.Maskey@Sun.COM {
167311767SAnurag.Maskey@Sun.COM uint64_t typeflags = nwam_ncu_type_to_flag(type);
167411767SAnurag.Maskey@Sun.COM uint64_t classflags = nwam_ncu_class_to_flag(class);
167511767SAnurag.Maskey@Sun.COM
167611767SAnurag.Maskey@Sun.COM return (nwam_get_default_proplist(ncu_prop_table, typeflags,
167711767SAnurag.Maskey@Sun.COM classflags, prop_list, numvalues));
167811767SAnurag.Maskey@Sun.COM }
167911767SAnurag.Maskey@Sun.COM
168011767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncp_get_state(nwam_ncp_handle_t ncph,nwam_state_t * statep,nwam_aux_state_t * auxp)168111767SAnurag.Maskey@Sun.COM nwam_ncp_get_state(nwam_ncp_handle_t ncph, nwam_state_t *statep,
168211767SAnurag.Maskey@Sun.COM nwam_aux_state_t *auxp)
168311767SAnurag.Maskey@Sun.COM {
168411767SAnurag.Maskey@Sun.COM return (nwam_get_state(ncph->nwh_name, ncph, statep, auxp));
168511767SAnurag.Maskey@Sun.COM }
168611767SAnurag.Maskey@Sun.COM
168711767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncu_get_state(nwam_ncu_handle_t ncuh,nwam_state_t * statep,nwam_aux_state_t * auxp)168811767SAnurag.Maskey@Sun.COM nwam_ncu_get_state(nwam_ncu_handle_t ncuh, nwam_state_t *statep,
168911767SAnurag.Maskey@Sun.COM nwam_aux_state_t *auxp)
169011767SAnurag.Maskey@Sun.COM {
169111767SAnurag.Maskey@Sun.COM nwam_ncp_handle_t ncph;
169211767SAnurag.Maskey@Sun.COM char *ncpname;
169311767SAnurag.Maskey@Sun.COM nwam_error_t err;
169411767SAnurag.Maskey@Sun.COM
169511767SAnurag.Maskey@Sun.COM assert(ncuh != NULL);
169611767SAnurag.Maskey@Sun.COM
169711767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_ncp(ncuh, &ncph)) != NWAM_SUCCESS)
169811767SAnurag.Maskey@Sun.COM return (err);
169911767SAnurag.Maskey@Sun.COM if (!nwam_ncp_is_active(ncph)) {
170011767SAnurag.Maskey@Sun.COM nwam_ncp_free(ncph);
170111767SAnurag.Maskey@Sun.COM return (NWAM_ENTITY_INVALID);
170211767SAnurag.Maskey@Sun.COM }
170311767SAnurag.Maskey@Sun.COM nwam_ncp_free(ncph);
170411767SAnurag.Maskey@Sun.COM
170511767SAnurag.Maskey@Sun.COM if ((err = nwam_ncu_get_parent_ncp_name(ncuh, &ncpname))
170611767SAnurag.Maskey@Sun.COM != NWAM_SUCCESS)
170711767SAnurag.Maskey@Sun.COM return (err);
170811767SAnurag.Maskey@Sun.COM
170911767SAnurag.Maskey@Sun.COM err = nwam_request_state(NWAM_OBJECT_TYPE_NCU, ncuh->nwh_name, ncpname,
171011767SAnurag.Maskey@Sun.COM statep, auxp);
171111767SAnurag.Maskey@Sun.COM free(ncpname);
171211767SAnurag.Maskey@Sun.COM return (err);
171311767SAnurag.Maskey@Sun.COM }
171411767SAnurag.Maskey@Sun.COM
171511767SAnurag.Maskey@Sun.COM nwam_error_t
nwam_ncp_get_active_priority_group(int64_t * priorityp)171611767SAnurag.Maskey@Sun.COM nwam_ncp_get_active_priority_group(int64_t *priorityp)
171711767SAnurag.Maskey@Sun.COM {
171811767SAnurag.Maskey@Sun.COM return (nwam_request_active_priority_group(priorityp));
171911767SAnurag.Maskey@Sun.COM }
1720