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 /*
23*13107SRenee.Sommerfeld@Oracle.COM  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
2411767SAnurag.Maskey@Sun.COM  */
2511767SAnurag.Maskey@Sun.COM 
2611767SAnurag.Maskey@Sun.COM #include <assert.h>
2711767SAnurag.Maskey@Sun.COM #include <stdio.h>
2811767SAnurag.Maskey@Sun.COM #include <stdlib.h>
2911767SAnurag.Maskey@Sun.COM #include <string.h>
3011767SAnurag.Maskey@Sun.COM #include <sys/types.h>
3111767SAnurag.Maskey@Sun.COM #include <libdlwlan.h>
3211767SAnurag.Maskey@Sun.COM #include <libnvpair.h>
3311767SAnurag.Maskey@Sun.COM 
3411767SAnurag.Maskey@Sun.COM #include "libnwam_impl.h"
3511767SAnurag.Maskey@Sun.COM #include <libnwam_priv.h>
3611767SAnurag.Maskey@Sun.COM #include <libnwam.h>
3711767SAnurag.Maskey@Sun.COM 
3811767SAnurag.Maskey@Sun.COM /*
3911767SAnurag.Maskey@Sun.COM  * Internal implementation of libnwam in-memory objects and values.  Objects
4011767SAnurag.Maskey@Sun.COM  * are nvlists.
4111767SAnurag.Maskey@Sun.COM  */
4211767SAnurag.Maskey@Sun.COM 
4311767SAnurag.Maskey@Sun.COM void
4411767SAnurag.Maskey@Sun.COM nwam_value_free(nwam_value_t value)
4511767SAnurag.Maskey@Sun.COM {
4611767SAnurag.Maskey@Sun.COM 	uint_t i;
4711767SAnurag.Maskey@Sun.COM 
4811767SAnurag.Maskey@Sun.COM 	if (value == NULL)
4911767SAnurag.Maskey@Sun.COM 		return;
5011767SAnurag.Maskey@Sun.COM 
5111767SAnurag.Maskey@Sun.COM 	switch (value->nwv_value_type) {
5211767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_BOOLEAN:
5311767SAnurag.Maskey@Sun.COM 		free(value->nwv_values.nwv_boolean);
5411767SAnurag.Maskey@Sun.COM 		break;
5511767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_INT64:
5611767SAnurag.Maskey@Sun.COM 		free(value->nwv_values.nwv_int64);
5711767SAnurag.Maskey@Sun.COM 		break;
5811767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_UINT64:
5911767SAnurag.Maskey@Sun.COM 		free(value->nwv_values.nwv_uint64);
6011767SAnurag.Maskey@Sun.COM 		break;
6111767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_STRING:
6211767SAnurag.Maskey@Sun.COM 		for (i = 0; i < value->nwv_value_numvalues; i++)
6311767SAnurag.Maskey@Sun.COM 			free(value->nwv_values.nwv_string[i]);
6411767SAnurag.Maskey@Sun.COM 		free(value->nwv_values.nwv_string);
6511767SAnurag.Maskey@Sun.COM 		break;
6611767SAnurag.Maskey@Sun.COM 	}
6711767SAnurag.Maskey@Sun.COM 	free(value);
6811767SAnurag.Maskey@Sun.COM }
6911767SAnurag.Maskey@Sun.COM 
7011767SAnurag.Maskey@Sun.COM nwam_error_t
7111767SAnurag.Maskey@Sun.COM nwam_value_create(nwam_value_type_t value_type, void *values, uint_t numvalues,
7211767SAnurag.Maskey@Sun.COM     nwam_value_t *valuep)
7311767SAnurag.Maskey@Sun.COM {
7411767SAnurag.Maskey@Sun.COM 	nwam_value_t newvalue;
7511767SAnurag.Maskey@Sun.COM 	boolean_t *values_boolean;
7611767SAnurag.Maskey@Sun.COM 	int64_t *values_int64;
7711767SAnurag.Maskey@Sun.COM 	uint64_t *values_uint64;
7811767SAnurag.Maskey@Sun.COM 	char **values_string;
7911767SAnurag.Maskey@Sun.COM 	int i, j;
8011767SAnurag.Maskey@Sun.COM 	nwam_error_t err = NWAM_SUCCESS;
8111767SAnurag.Maskey@Sun.COM 
8211767SAnurag.Maskey@Sun.COM 	*valuep = NULL;
8311767SAnurag.Maskey@Sun.COM 
8411767SAnurag.Maskey@Sun.COM 	if ((newvalue = calloc(1, sizeof (struct nwam_value))) == NULL)
8511767SAnurag.Maskey@Sun.COM 		return (NWAM_NO_MEMORY);
8611767SAnurag.Maskey@Sun.COM 
8711767SAnurag.Maskey@Sun.COM 	newvalue->nwv_value_type = value_type;
8811767SAnurag.Maskey@Sun.COM 	newvalue->nwv_value_numvalues = numvalues;
8911767SAnurag.Maskey@Sun.COM 
9011767SAnurag.Maskey@Sun.COM 	switch (value_type) {
9111767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_BOOLEAN:
9211767SAnurag.Maskey@Sun.COM 		values_boolean = values;
9311767SAnurag.Maskey@Sun.COM 		if ((newvalue->nwv_values.nwv_boolean =
9411767SAnurag.Maskey@Sun.COM 		    calloc(numvalues, sizeof (boolean_t))) == NULL) {
9511767SAnurag.Maskey@Sun.COM 			free(newvalue);
9611767SAnurag.Maskey@Sun.COM 			return (NWAM_NO_MEMORY);
9711767SAnurag.Maskey@Sun.COM 		}
9811767SAnurag.Maskey@Sun.COM 		for (i = 0; i < numvalues; i++)
9911767SAnurag.Maskey@Sun.COM 			newvalue->nwv_values.nwv_boolean[i] = values_boolean[i];
10011767SAnurag.Maskey@Sun.COM 		break;
10111767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_INT64:
10211767SAnurag.Maskey@Sun.COM 		values_int64 = values;
10311767SAnurag.Maskey@Sun.COM 		if ((newvalue->nwv_values.nwv_int64 =
10411767SAnurag.Maskey@Sun.COM 		    calloc(numvalues, sizeof (int64_t))) == NULL) {
10511767SAnurag.Maskey@Sun.COM 			free(newvalue);
10611767SAnurag.Maskey@Sun.COM 			return (NWAM_NO_MEMORY);
10711767SAnurag.Maskey@Sun.COM 		}
10811767SAnurag.Maskey@Sun.COM 		for (i = 0; i < numvalues; i++)
10911767SAnurag.Maskey@Sun.COM 			newvalue->nwv_values.nwv_int64[i] = values_int64[i];
11011767SAnurag.Maskey@Sun.COM 		break;
11111767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_UINT64:
11211767SAnurag.Maskey@Sun.COM 		values_uint64 = values;
11311767SAnurag.Maskey@Sun.COM 		if ((newvalue->nwv_values.nwv_uint64 =
11411767SAnurag.Maskey@Sun.COM 		    calloc(numvalues, sizeof (uint64_t))) == NULL) {
11511767SAnurag.Maskey@Sun.COM 			free(newvalue);
11611767SAnurag.Maskey@Sun.COM 			return (NWAM_NO_MEMORY);
11711767SAnurag.Maskey@Sun.COM 		}
11811767SAnurag.Maskey@Sun.COM 		for (i = 0; i < numvalues; i++)
11911767SAnurag.Maskey@Sun.COM 			newvalue->nwv_values.nwv_uint64[i] = values_uint64[i];
12011767SAnurag.Maskey@Sun.COM 		break;
12111767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_STRING:
12211767SAnurag.Maskey@Sun.COM 		values_string = values;
12311767SAnurag.Maskey@Sun.COM 		if ((newvalue->nwv_values.nwv_string =
12411767SAnurag.Maskey@Sun.COM 		    calloc(numvalues, sizeof (char *))) == NULL) {
12511767SAnurag.Maskey@Sun.COM 			free(newvalue);
12611767SAnurag.Maskey@Sun.COM 			return (NWAM_NO_MEMORY);
12711767SAnurag.Maskey@Sun.COM 		}
12811767SAnurag.Maskey@Sun.COM 		for (i = 0; i < numvalues; i++) {
12911767SAnurag.Maskey@Sun.COM 			if (strnlen(values_string[i], NWAM_MAX_VALUE_LEN) ==
13011767SAnurag.Maskey@Sun.COM 			    NWAM_MAX_VALUE_LEN) {
13111767SAnurag.Maskey@Sun.COM 				err = NWAM_ENTITY_INVALID_VALUE;
13211767SAnurag.Maskey@Sun.COM 			} else if ((newvalue->nwv_values.nwv_string[i] =
13311767SAnurag.Maskey@Sun.COM 			    strdup(values_string[i])) == NULL) {
13411767SAnurag.Maskey@Sun.COM 				err = NWAM_NO_MEMORY;
13511767SAnurag.Maskey@Sun.COM 			}
13611767SAnurag.Maskey@Sun.COM 			if (err != NWAM_SUCCESS) {
13711767SAnurag.Maskey@Sun.COM 				for (j = 0; j < i; j++)
13811767SAnurag.Maskey@Sun.COM 					free(
13911767SAnurag.Maskey@Sun.COM 					    newvalue->nwv_values.nwv_string[i]);
14011767SAnurag.Maskey@Sun.COM 				free(newvalue->nwv_values.nwv_string);
14111767SAnurag.Maskey@Sun.COM 				free(newvalue);
14211767SAnurag.Maskey@Sun.COM 				return (err);
14311767SAnurag.Maskey@Sun.COM 			}
14411767SAnurag.Maskey@Sun.COM 		}
14511767SAnurag.Maskey@Sun.COM 		break;
14611767SAnurag.Maskey@Sun.COM 	default:
14711767SAnurag.Maskey@Sun.COM 		break;
14811767SAnurag.Maskey@Sun.COM 	}
14911767SAnurag.Maskey@Sun.COM 
15011767SAnurag.Maskey@Sun.COM 	*valuep = newvalue;
15111767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
15211767SAnurag.Maskey@Sun.COM }
15311767SAnurag.Maskey@Sun.COM 
15411767SAnurag.Maskey@Sun.COM nwam_error_t
15511767SAnurag.Maskey@Sun.COM nwam_value_copy(nwam_value_t old, nwam_value_t *newp)
15611767SAnurag.Maskey@Sun.COM {
15711767SAnurag.Maskey@Sun.COM 	void *values;
15811767SAnurag.Maskey@Sun.COM 
15911767SAnurag.Maskey@Sun.COM 	assert(old != NULL && newp != NULL);
16011767SAnurag.Maskey@Sun.COM 
16111767SAnurag.Maskey@Sun.COM 	switch (old->nwv_value_type) {
16211767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_BOOLEAN:
16311767SAnurag.Maskey@Sun.COM 		values = old->nwv_values.nwv_boolean;
16411767SAnurag.Maskey@Sun.COM 		break;
16511767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_INT64:
16611767SAnurag.Maskey@Sun.COM 		values = old->nwv_values.nwv_int64;
16711767SAnurag.Maskey@Sun.COM 		break;
16811767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_UINT64:
16911767SAnurag.Maskey@Sun.COM 		values = old->nwv_values.nwv_uint64;
17011767SAnurag.Maskey@Sun.COM 		break;
17111767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_STRING:
17211767SAnurag.Maskey@Sun.COM 		values = old->nwv_values.nwv_string;
17311767SAnurag.Maskey@Sun.COM 		break;
17411767SAnurag.Maskey@Sun.COM 	default:
17511767SAnurag.Maskey@Sun.COM 		return (NWAM_INVALID_ARG);
17611767SAnurag.Maskey@Sun.COM 	}
17711767SAnurag.Maskey@Sun.COM 	return (nwam_value_create(old->nwv_value_type, values,
17811767SAnurag.Maskey@Sun.COM 	    old->nwv_value_numvalues, newp));
17911767SAnurag.Maskey@Sun.COM }
18011767SAnurag.Maskey@Sun.COM nwam_error_t
18111767SAnurag.Maskey@Sun.COM nwam_value_create_boolean_array(boolean_t *values, uint_t numvalues,
18211767SAnurag.Maskey@Sun.COM     nwam_value_t *valuep)
18311767SAnurag.Maskey@Sun.COM {
18411767SAnurag.Maskey@Sun.COM 	return (nwam_value_create(NWAM_VALUE_TYPE_BOOLEAN, values, numvalues,
18511767SAnurag.Maskey@Sun.COM 	    valuep));
18611767SAnurag.Maskey@Sun.COM }
18711767SAnurag.Maskey@Sun.COM 
18811767SAnurag.Maskey@Sun.COM nwam_error_t
18911767SAnurag.Maskey@Sun.COM nwam_value_create_boolean(boolean_t value, nwam_value_t *valuep)
19011767SAnurag.Maskey@Sun.COM {
19111767SAnurag.Maskey@Sun.COM 	return (nwam_value_create_boolean_array(&value, 1, valuep));
19211767SAnurag.Maskey@Sun.COM }
19311767SAnurag.Maskey@Sun.COM 
19411767SAnurag.Maskey@Sun.COM nwam_error_t
19511767SAnurag.Maskey@Sun.COM nwam_value_create_int64_array(int64_t *values, uint_t numvalues,
19611767SAnurag.Maskey@Sun.COM     nwam_value_t *valuep)
19711767SAnurag.Maskey@Sun.COM {
19811767SAnurag.Maskey@Sun.COM 	return (nwam_value_create(NWAM_VALUE_TYPE_INT64, values, numvalues,
19911767SAnurag.Maskey@Sun.COM 	    valuep));
20011767SAnurag.Maskey@Sun.COM }
20111767SAnurag.Maskey@Sun.COM 
20211767SAnurag.Maskey@Sun.COM nwam_error_t
20311767SAnurag.Maskey@Sun.COM nwam_value_create_int64(int64_t value, nwam_value_t *valuep)
20411767SAnurag.Maskey@Sun.COM {
20511767SAnurag.Maskey@Sun.COM 	return (nwam_value_create_int64_array(&value, 1, valuep));
20611767SAnurag.Maskey@Sun.COM }
20711767SAnurag.Maskey@Sun.COM 
20811767SAnurag.Maskey@Sun.COM nwam_error_t
20911767SAnurag.Maskey@Sun.COM nwam_value_create_uint64_array(uint64_t *values, uint_t numvalues,
21011767SAnurag.Maskey@Sun.COM     nwam_value_t *valuep)
21111767SAnurag.Maskey@Sun.COM {
21211767SAnurag.Maskey@Sun.COM 	return (nwam_value_create(NWAM_VALUE_TYPE_UINT64, values, numvalues,
21311767SAnurag.Maskey@Sun.COM 	    valuep));
21411767SAnurag.Maskey@Sun.COM }
21511767SAnurag.Maskey@Sun.COM 
21611767SAnurag.Maskey@Sun.COM nwam_error_t
21711767SAnurag.Maskey@Sun.COM nwam_value_create_uint64(uint64_t value, nwam_value_t *valuep)
21811767SAnurag.Maskey@Sun.COM {
21911767SAnurag.Maskey@Sun.COM 	return (nwam_value_create_uint64_array(&value, 1, valuep));
22011767SAnurag.Maskey@Sun.COM }
22111767SAnurag.Maskey@Sun.COM 
22211767SAnurag.Maskey@Sun.COM nwam_error_t
22311767SAnurag.Maskey@Sun.COM nwam_value_create_string_array(char **values, uint_t numvalues,
22411767SAnurag.Maskey@Sun.COM     nwam_value_t *valuep)
22511767SAnurag.Maskey@Sun.COM {
22611767SAnurag.Maskey@Sun.COM 	return (nwam_value_create(NWAM_VALUE_TYPE_STRING, values, numvalues,
22711767SAnurag.Maskey@Sun.COM 	    valuep));
22811767SAnurag.Maskey@Sun.COM }
22911767SAnurag.Maskey@Sun.COM 
23011767SAnurag.Maskey@Sun.COM nwam_error_t
23111767SAnurag.Maskey@Sun.COM nwam_value_create_string(char *value, nwam_value_t *valuep)
23211767SAnurag.Maskey@Sun.COM {
23311767SAnurag.Maskey@Sun.COM 	return (nwam_value_create_string_array(&value, 1, valuep));
23411767SAnurag.Maskey@Sun.COM }
23511767SAnurag.Maskey@Sun.COM 
23611767SAnurag.Maskey@Sun.COM nwam_error_t
23711767SAnurag.Maskey@Sun.COM nwam_value_get_boolean_array(nwam_value_t value, boolean_t **valuesp,
23811767SAnurag.Maskey@Sun.COM     uint_t *numvaluesp)
23911767SAnurag.Maskey@Sun.COM {
24011767SAnurag.Maskey@Sun.COM 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
24111767SAnurag.Maskey@Sun.COM 
24211767SAnurag.Maskey@Sun.COM 	*numvaluesp = value->nwv_value_numvalues;
24311767SAnurag.Maskey@Sun.COM 	*valuesp = value->nwv_values.nwv_boolean;
24411767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
24511767SAnurag.Maskey@Sun.COM }
24611767SAnurag.Maskey@Sun.COM 
24711767SAnurag.Maskey@Sun.COM nwam_error_t
24811767SAnurag.Maskey@Sun.COM nwam_value_get_boolean(nwam_value_t value, boolean_t *valuep)
24911767SAnurag.Maskey@Sun.COM {
25011767SAnurag.Maskey@Sun.COM 	uint_t numvalues;
25111767SAnurag.Maskey@Sun.COM 	boolean_t *myvaluesp;
25211767SAnurag.Maskey@Sun.COM 	nwam_error_t err;
25311767SAnurag.Maskey@Sun.COM 
25411767SAnurag.Maskey@Sun.COM 	err = nwam_value_get_boolean_array(value, &myvaluesp, &numvalues);
25511767SAnurag.Maskey@Sun.COM 	if (err != NWAM_SUCCESS)
25611767SAnurag.Maskey@Sun.COM 		return (err);
25711767SAnurag.Maskey@Sun.COM 	if (numvalues != 1)
25811767SAnurag.Maskey@Sun.COM 		return (NWAM_ENTITY_MULTIPLE_VALUES);
25911767SAnurag.Maskey@Sun.COM 
26011767SAnurag.Maskey@Sun.COM 	*valuep = myvaluesp[0];
26111767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
26211767SAnurag.Maskey@Sun.COM }
26311767SAnurag.Maskey@Sun.COM 
26411767SAnurag.Maskey@Sun.COM nwam_error_t
26511767SAnurag.Maskey@Sun.COM nwam_value_get_int64_array(nwam_value_t value, int64_t **valuesp,
26611767SAnurag.Maskey@Sun.COM     uint_t *numvaluesp)
26711767SAnurag.Maskey@Sun.COM {
26811767SAnurag.Maskey@Sun.COM 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
26911767SAnurag.Maskey@Sun.COM 
27011767SAnurag.Maskey@Sun.COM 	*numvaluesp = value->nwv_value_numvalues;
27111767SAnurag.Maskey@Sun.COM 	*valuesp = value->nwv_values.nwv_int64;
27211767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
27311767SAnurag.Maskey@Sun.COM }
27411767SAnurag.Maskey@Sun.COM 
27511767SAnurag.Maskey@Sun.COM nwam_error_t
27611767SAnurag.Maskey@Sun.COM nwam_value_get_int64(nwam_value_t value, int64_t *valuep)
27711767SAnurag.Maskey@Sun.COM {
27811767SAnurag.Maskey@Sun.COM 	uint_t numvalues;
27911767SAnurag.Maskey@Sun.COM 	int64_t *myvaluesp;
28011767SAnurag.Maskey@Sun.COM 	nwam_error_t err;
28111767SAnurag.Maskey@Sun.COM 
28211767SAnurag.Maskey@Sun.COM 	err = nwam_value_get_int64_array(value, &myvaluesp, &numvalues);
28311767SAnurag.Maskey@Sun.COM 	if (err != NWAM_SUCCESS)
28411767SAnurag.Maskey@Sun.COM 		return (err);
28511767SAnurag.Maskey@Sun.COM 	if (numvalues != 1)
28611767SAnurag.Maskey@Sun.COM 		return (NWAM_ENTITY_MULTIPLE_VALUES);
28711767SAnurag.Maskey@Sun.COM 
28811767SAnurag.Maskey@Sun.COM 	*valuep = myvaluesp[0];
28911767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
29011767SAnurag.Maskey@Sun.COM }
29111767SAnurag.Maskey@Sun.COM 
29211767SAnurag.Maskey@Sun.COM nwam_error_t
29311767SAnurag.Maskey@Sun.COM nwam_value_get_uint64_array(nwam_value_t value, uint64_t **valuesp,
29411767SAnurag.Maskey@Sun.COM     uint_t *numvaluesp)
29511767SAnurag.Maskey@Sun.COM {
29611767SAnurag.Maskey@Sun.COM 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
29711767SAnurag.Maskey@Sun.COM 
29811767SAnurag.Maskey@Sun.COM 	*numvaluesp = value->nwv_value_numvalues;
29911767SAnurag.Maskey@Sun.COM 	*valuesp = value->nwv_values.nwv_uint64;
30011767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
30111767SAnurag.Maskey@Sun.COM }
30211767SAnurag.Maskey@Sun.COM 
30311767SAnurag.Maskey@Sun.COM nwam_error_t
30411767SAnurag.Maskey@Sun.COM nwam_value_get_uint64(nwam_value_t value, uint64_t *valuep)
30511767SAnurag.Maskey@Sun.COM {
30611767SAnurag.Maskey@Sun.COM 	uint_t numvalues;
30711767SAnurag.Maskey@Sun.COM 	uint64_t *myvaluesp;
30811767SAnurag.Maskey@Sun.COM 	nwam_error_t err;
30911767SAnurag.Maskey@Sun.COM 
31011767SAnurag.Maskey@Sun.COM 	err = nwam_value_get_uint64_array(value, &myvaluesp, &numvalues);
31111767SAnurag.Maskey@Sun.COM 	if (err != NWAM_SUCCESS)
31211767SAnurag.Maskey@Sun.COM 		return (err);
31311767SAnurag.Maskey@Sun.COM 	if (numvalues != 1)
31411767SAnurag.Maskey@Sun.COM 		return (NWAM_ENTITY_MULTIPLE_VALUES);
31511767SAnurag.Maskey@Sun.COM 
31611767SAnurag.Maskey@Sun.COM 	*valuep = myvaluesp[0];
31711767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
31811767SAnurag.Maskey@Sun.COM }
31911767SAnurag.Maskey@Sun.COM 
32011767SAnurag.Maskey@Sun.COM nwam_error_t
32111767SAnurag.Maskey@Sun.COM nwam_value_get_string_array(nwam_value_t value, char ***valuesp,
32211767SAnurag.Maskey@Sun.COM     uint_t *numvaluesp)
32311767SAnurag.Maskey@Sun.COM {
32411767SAnurag.Maskey@Sun.COM 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
32511767SAnurag.Maskey@Sun.COM 
32611767SAnurag.Maskey@Sun.COM 	*numvaluesp = value->nwv_value_numvalues;
32711767SAnurag.Maskey@Sun.COM 	*valuesp = value->nwv_values.nwv_string;
32811767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
32911767SAnurag.Maskey@Sun.COM }
33011767SAnurag.Maskey@Sun.COM 
33111767SAnurag.Maskey@Sun.COM nwam_error_t
33211767SAnurag.Maskey@Sun.COM nwam_value_get_string(nwam_value_t value, char **valuep)
33311767SAnurag.Maskey@Sun.COM {
33411767SAnurag.Maskey@Sun.COM 	uint_t numvalues;
33511767SAnurag.Maskey@Sun.COM 	char **myvaluesp;
33611767SAnurag.Maskey@Sun.COM 	nwam_error_t err;
33711767SAnurag.Maskey@Sun.COM 
33811767SAnurag.Maskey@Sun.COM 	err = nwam_value_get_string_array(value, &myvaluesp, &numvalues);
33911767SAnurag.Maskey@Sun.COM 	if (err != NWAM_SUCCESS)
34011767SAnurag.Maskey@Sun.COM 		return (err);
34111767SAnurag.Maskey@Sun.COM 	if (numvalues != 1)
34211767SAnurag.Maskey@Sun.COM 		return (NWAM_ENTITY_MULTIPLE_VALUES);
34311767SAnurag.Maskey@Sun.COM 
34411767SAnurag.Maskey@Sun.COM 	*valuep = myvaluesp[0];
34511767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
34611767SAnurag.Maskey@Sun.COM }
34711767SAnurag.Maskey@Sun.COM 
34811767SAnurag.Maskey@Sun.COM nwam_error_t
34911767SAnurag.Maskey@Sun.COM nwam_value_get_type(nwam_value_t value, nwam_value_type_t *typep)
35011767SAnurag.Maskey@Sun.COM {
35111767SAnurag.Maskey@Sun.COM 	*typep = value->nwv_value_type;
35211767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
35311767SAnurag.Maskey@Sun.COM }
35411767SAnurag.Maskey@Sun.COM 
35511767SAnurag.Maskey@Sun.COM nwam_error_t
35611767SAnurag.Maskey@Sun.COM nwam_value_get_numvalues(nwam_value_t value, uint_t *numvaluesp)
35711767SAnurag.Maskey@Sun.COM {
35811767SAnurag.Maskey@Sun.COM 	*numvaluesp = value->nwv_value_numvalues;
35911767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
36011767SAnurag.Maskey@Sun.COM }
36111767SAnurag.Maskey@Sun.COM 
36211767SAnurag.Maskey@Sun.COM /*
36311767SAnurag.Maskey@Sun.COM  * Generic object data functions. We hide nvlist implementation
36411767SAnurag.Maskey@Sun.COM  * from NCP, ENM and location implementations.
36511767SAnurag.Maskey@Sun.COM  */
36611767SAnurag.Maskey@Sun.COM nwam_error_t
36711767SAnurag.Maskey@Sun.COM nwam_alloc_object_list(void *list)
36811767SAnurag.Maskey@Sun.COM {
36911767SAnurag.Maskey@Sun.COM 	int nverr;
37011767SAnurag.Maskey@Sun.COM 
37111767SAnurag.Maskey@Sun.COM 	assert(list != NULL);
37211767SAnurag.Maskey@Sun.COM 
37311767SAnurag.Maskey@Sun.COM 	if ((nverr = nvlist_alloc((nvlist_t **)list, NV_UNIQUE_NAME, 0)) != 0)
37411767SAnurag.Maskey@Sun.COM 		return (nwam_errno_to_nwam_error(nverr));
37511767SAnurag.Maskey@Sun.COM 
37611767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
37711767SAnurag.Maskey@Sun.COM }
37811767SAnurag.Maskey@Sun.COM 
37911767SAnurag.Maskey@Sun.COM void
38011767SAnurag.Maskey@Sun.COM nwam_free_object_list(void *list)
38111767SAnurag.Maskey@Sun.COM {
38211767SAnurag.Maskey@Sun.COM 	if (list != NULL)
38311767SAnurag.Maskey@Sun.COM 		nvlist_free(list);
38411767SAnurag.Maskey@Sun.COM }
38511767SAnurag.Maskey@Sun.COM 
38611767SAnurag.Maskey@Sun.COM nwam_error_t
38711767SAnurag.Maskey@Sun.COM nwam_dup_object_list(void *oldlist, void *newlist)
38811767SAnurag.Maskey@Sun.COM {
38911767SAnurag.Maskey@Sun.COM 	int nverr;
39011767SAnurag.Maskey@Sun.COM 
39111767SAnurag.Maskey@Sun.COM 	assert(oldlist != NULL && newlist != NULL);
39211767SAnurag.Maskey@Sun.COM 
39311767SAnurag.Maskey@Sun.COM 	if ((nverr = nvlist_dup(oldlist, newlist, 0)) != 0)
39411767SAnurag.Maskey@Sun.COM 		return (nwam_errno_to_nwam_error(nverr));
39511767SAnurag.Maskey@Sun.COM 
39611767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
39711767SAnurag.Maskey@Sun.COM }
39811767SAnurag.Maskey@Sun.COM 
39911767SAnurag.Maskey@Sun.COM /* Add child object list to parent object list using property name childname */
40011767SAnurag.Maskey@Sun.COM nwam_error_t
40111767SAnurag.Maskey@Sun.COM nwam_object_list_add_object_list(void *parentlist, char *childname,
40211767SAnurag.Maskey@Sun.COM     void *childlist)
40311767SAnurag.Maskey@Sun.COM {
40411767SAnurag.Maskey@Sun.COM 	return (nwam_errno_to_nwam_error(nvlist_add_nvlist(parentlist,
40511767SAnurag.Maskey@Sun.COM 	    childname, childlist)));
40611767SAnurag.Maskey@Sun.COM }
40711767SAnurag.Maskey@Sun.COM 
40811767SAnurag.Maskey@Sun.COM /* Remove object list from parent object list */
40911767SAnurag.Maskey@Sun.COM nwam_error_t
41011767SAnurag.Maskey@Sun.COM nwam_object_list_remove_object_list(void *parentlist, char *childname)
41111767SAnurag.Maskey@Sun.COM {
41211767SAnurag.Maskey@Sun.COM 	return (nwam_errno_to_nwam_error(nvlist_remove_all(parentlist,
41311767SAnurag.Maskey@Sun.COM 	    childname)));
41411767SAnurag.Maskey@Sun.COM }
41511767SAnurag.Maskey@Sun.COM 
41611767SAnurag.Maskey@Sun.COM /*
41711767SAnurag.Maskey@Sun.COM  * Get next object list (nvlist) after lastname.  Used to walk NCUs, ENMs and
41811767SAnurag.Maskey@Sun.COM  * locations, each of which is internally represented as an nvlist.
41911767SAnurag.Maskey@Sun.COM  */
42011767SAnurag.Maskey@Sun.COM nwam_error_t
42111767SAnurag.Maskey@Sun.COM nwam_next_object_list(void *parentlist, char *lastname, char **childnamep,
42211767SAnurag.Maskey@Sun.COM     void *childlistp)
42311767SAnurag.Maskey@Sun.COM {
42411767SAnurag.Maskey@Sun.COM 	nvpair_t *last = NULL, *next;
42511767SAnurag.Maskey@Sun.COM 	int nverr;
42611767SAnurag.Maskey@Sun.COM 
42711767SAnurag.Maskey@Sun.COM 	if (lastname != NULL) {
42811767SAnurag.Maskey@Sun.COM 		if ((nverr = nvlist_lookup_nvpair(parentlist, lastname, &last))
42911767SAnurag.Maskey@Sun.COM 		    != 0)
43011767SAnurag.Maskey@Sun.COM 			return (nwam_errno_to_nwam_error(nverr));
43111767SAnurag.Maskey@Sun.COM 	}
43211767SAnurag.Maskey@Sun.COM 	if ((next = nvlist_next_nvpair(parentlist, last)) == NULL)
43311767SAnurag.Maskey@Sun.COM 		return (NWAM_LIST_END);
43411767SAnurag.Maskey@Sun.COM 
43511767SAnurag.Maskey@Sun.COM 	*childnamep = nvpair_name(next);
43611767SAnurag.Maskey@Sun.COM 
43711767SAnurag.Maskey@Sun.COM 	if (nvpair_type(next) != DATA_TYPE_NVLIST)
43811767SAnurag.Maskey@Sun.COM 		return (NWAM_ERROR_INTERNAL);
43911767SAnurag.Maskey@Sun.COM 
44011767SAnurag.Maskey@Sun.COM 	if ((nverr = nvpair_value_nvlist(next, childlistp)) != NWAM_SUCCESS)
44111767SAnurag.Maskey@Sun.COM 		return (nwam_errno_to_nwam_error(nverr));
44211767SAnurag.Maskey@Sun.COM 
44311767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
44411767SAnurag.Maskey@Sun.COM }
44511767SAnurag.Maskey@Sun.COM 
44611767SAnurag.Maskey@Sun.COM /*
44711767SAnurag.Maskey@Sun.COM  * Pack nvlist into contiguous memory. If packed_listp is NULL, we just
44811767SAnurag.Maskey@Sun.COM  * return the size of the memory needed to do so.
44911767SAnurag.Maskey@Sun.COM  */
45011767SAnurag.Maskey@Sun.COM nwam_error_t
45111767SAnurag.Maskey@Sun.COM nwam_pack_object_list(void *list, char **packed_listp, size_t *packed_sizep)
45211767SAnurag.Maskey@Sun.COM {
45311767SAnurag.Maskey@Sun.COM 	int nverr;
45411767SAnurag.Maskey@Sun.COM 
45511767SAnurag.Maskey@Sun.COM 	assert(list != NULL && packed_sizep != NULL);
45611767SAnurag.Maskey@Sun.COM 
45711767SAnurag.Maskey@Sun.COM 	if (packed_listp == NULL) {
45811767SAnurag.Maskey@Sun.COM 		nverr = nvlist_size(list, packed_sizep, NV_ENCODE_XDR);
45911767SAnurag.Maskey@Sun.COM 	} else {
46011767SAnurag.Maskey@Sun.COM 		nverr = nvlist_pack(list, packed_listp, packed_sizep,
46111767SAnurag.Maskey@Sun.COM 		    NV_ENCODE_XDR, 0);
46211767SAnurag.Maskey@Sun.COM 	}
46311767SAnurag.Maskey@Sun.COM 
46411767SAnurag.Maskey@Sun.COM 	if (nverr != 0)
46511767SAnurag.Maskey@Sun.COM 		return (nwam_errno_to_nwam_error(nverr));
46611767SAnurag.Maskey@Sun.COM 
46711767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
46811767SAnurag.Maskey@Sun.COM }
46911767SAnurag.Maskey@Sun.COM 
47011767SAnurag.Maskey@Sun.COM nwam_error_t
47111767SAnurag.Maskey@Sun.COM nwam_unpack_object_list(char *packed_list, size_t packed_size,
47211767SAnurag.Maskey@Sun.COM     void *list)
47311767SAnurag.Maskey@Sun.COM {
47411767SAnurag.Maskey@Sun.COM 	int nverr;
47511767SAnurag.Maskey@Sun.COM 
47611767SAnurag.Maskey@Sun.COM 	assert(packed_list != NULL && list != NULL);
47711767SAnurag.Maskey@Sun.COM 
47811767SAnurag.Maskey@Sun.COM 	*((nvlist_t **)list) = NULL;
47911767SAnurag.Maskey@Sun.COM 
48011767SAnurag.Maskey@Sun.COM 	nverr = nvlist_unpack(packed_list, packed_size, (nvlist_t **)list, 0);
48111767SAnurag.Maskey@Sun.COM 
48211767SAnurag.Maskey@Sun.COM 	if (nverr != 0)
48311767SAnurag.Maskey@Sun.COM 		return (nwam_errno_to_nwam_error(nverr));
48411767SAnurag.Maskey@Sun.COM 
48511767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
48611767SAnurag.Maskey@Sun.COM }
48711767SAnurag.Maskey@Sun.COM 
48811767SAnurag.Maskey@Sun.COM /*
48911767SAnurag.Maskey@Sun.COM  * Functions to walk, set and get properties in nvlist, translating
49011767SAnurag.Maskey@Sun.COM  * between nwam_value_t and nvlist/nvpair representations.
49111767SAnurag.Maskey@Sun.COM  */
49211767SAnurag.Maskey@Sun.COM nwam_error_t
49311767SAnurag.Maskey@Sun.COM nwam_next_object_prop(void *list, char *lastname, char **namep,
49411767SAnurag.Maskey@Sun.COM     nwam_value_t *valuep)
49511767SAnurag.Maskey@Sun.COM {
49611767SAnurag.Maskey@Sun.COM 	nvpair_t *last = NULL, *next;
49711767SAnurag.Maskey@Sun.COM 	int nverr;
49811767SAnurag.Maskey@Sun.COM 
49911767SAnurag.Maskey@Sun.COM 	if (lastname != NULL) {
50011767SAnurag.Maskey@Sun.COM 		if ((nverr = nvlist_lookup_nvpair(list, lastname, &last)) != 0)
50111767SAnurag.Maskey@Sun.COM 			return (nwam_errno_to_nwam_error(nverr));
50211767SAnurag.Maskey@Sun.COM 	}
50311767SAnurag.Maskey@Sun.COM 	if ((next = nvlist_next_nvpair(list, last)) == NULL)
50411767SAnurag.Maskey@Sun.COM 		return (NWAM_LIST_END);
50511767SAnurag.Maskey@Sun.COM 
50611767SAnurag.Maskey@Sun.COM 	*namep = nvpair_name(next);
50711767SAnurag.Maskey@Sun.COM 
50811767SAnurag.Maskey@Sun.COM 	return (nwam_get_prop_value(list, (const char *)*namep, valuep));
50911767SAnurag.Maskey@Sun.COM }
51011767SAnurag.Maskey@Sun.COM 
51111767SAnurag.Maskey@Sun.COM nwam_error_t
51211767SAnurag.Maskey@Sun.COM nwam_get_prop_value(void *list, const char *name, nwam_value_t *valuep)
51311767SAnurag.Maskey@Sun.COM {
51411767SAnurag.Maskey@Sun.COM 	nvpair_t *prop;
51511767SAnurag.Maskey@Sun.COM 	nwam_error_t err;
51611767SAnurag.Maskey@Sun.COM 	int nverr;
51711767SAnurag.Maskey@Sun.COM 	boolean_t *valbool;
51811767SAnurag.Maskey@Sun.COM 	int64_t *valint64;
51911767SAnurag.Maskey@Sun.COM 	uint64_t *valuint64;
52011767SAnurag.Maskey@Sun.COM 	char **valstr;
52111767SAnurag.Maskey@Sun.COM 	uint_t numvalues;
52211767SAnurag.Maskey@Sun.COM 
52311767SAnurag.Maskey@Sun.COM 	assert(valuep != NULL);
52411767SAnurag.Maskey@Sun.COM 
52511767SAnurag.Maskey@Sun.COM 	*valuep = NULL;
52611767SAnurag.Maskey@Sun.COM 
52711767SAnurag.Maskey@Sun.COM 	if ((nverr = nvlist_lookup_nvpair(list, name, &prop)) != 0) {
52811767SAnurag.Maskey@Sun.COM 		/* convert EINVAL to NOT_FOUND */
52911767SAnurag.Maskey@Sun.COM 		if (nverr == EINVAL)
53011767SAnurag.Maskey@Sun.COM 			return (NWAM_ENTITY_NOT_FOUND);
53111767SAnurag.Maskey@Sun.COM 		return (nwam_errno_to_nwam_error(nverr));
53211767SAnurag.Maskey@Sun.COM 	}
53311767SAnurag.Maskey@Sun.COM 
53411767SAnurag.Maskey@Sun.COM 	switch (nvpair_type(prop)) {
53511767SAnurag.Maskey@Sun.COM 	case DATA_TYPE_BOOLEAN_ARRAY:
53611767SAnurag.Maskey@Sun.COM 		if ((nverr = nvpair_value_boolean_array(prop,
53711767SAnurag.Maskey@Sun.COM 		    &valbool, &numvalues)) != 0)
53811767SAnurag.Maskey@Sun.COM 			return (nwam_errno_to_nwam_error(nverr));
53911767SAnurag.Maskey@Sun.COM 		if ((err = nwam_value_create_boolean_array(valbool, numvalues,
54011767SAnurag.Maskey@Sun.COM 		    valuep)) != NWAM_SUCCESS)
54111767SAnurag.Maskey@Sun.COM 			return (err);
54211767SAnurag.Maskey@Sun.COM 		break;
54311767SAnurag.Maskey@Sun.COM 	case DATA_TYPE_INT64_ARRAY:
54411767SAnurag.Maskey@Sun.COM 		if ((nverr = nvpair_value_int64_array(prop,
54511767SAnurag.Maskey@Sun.COM 		    &valint64, &numvalues)) != 0)
54611767SAnurag.Maskey@Sun.COM 			return (nwam_errno_to_nwam_error(nverr));
54711767SAnurag.Maskey@Sun.COM 		if ((err = nwam_value_create_int64_array(valint64, numvalues,
54811767SAnurag.Maskey@Sun.COM 		    valuep)) != NWAM_SUCCESS)
54911767SAnurag.Maskey@Sun.COM 			return (err);
55011767SAnurag.Maskey@Sun.COM 		break;
55111767SAnurag.Maskey@Sun.COM 	case DATA_TYPE_UINT64_ARRAY:
55211767SAnurag.Maskey@Sun.COM 		if ((nverr = nvpair_value_uint64_array(prop,
55311767SAnurag.Maskey@Sun.COM 		    &valuint64, &numvalues)) != 0)
55411767SAnurag.Maskey@Sun.COM 			return (nwam_errno_to_nwam_error(nverr));
55511767SAnurag.Maskey@Sun.COM 		if ((err = nwam_value_create_uint64_array(valuint64, numvalues,
55611767SAnurag.Maskey@Sun.COM 		    valuep)) != NWAM_SUCCESS)
55711767SAnurag.Maskey@Sun.COM 			return (err);
55811767SAnurag.Maskey@Sun.COM 		break;
55911767SAnurag.Maskey@Sun.COM 	case DATA_TYPE_STRING_ARRAY:
56011767SAnurag.Maskey@Sun.COM 		if ((nverr = nvpair_value_string_array(prop,
56111767SAnurag.Maskey@Sun.COM 		    &valstr, &numvalues)) != 0)
56211767SAnurag.Maskey@Sun.COM 			return (nwam_errno_to_nwam_error(nverr));
56311767SAnurag.Maskey@Sun.COM 		if ((err = nwam_value_create_string_array(valstr, numvalues,
56411767SAnurag.Maskey@Sun.COM 		    valuep)) != NWAM_SUCCESS)
56511767SAnurag.Maskey@Sun.COM 			return (err);
56611767SAnurag.Maskey@Sun.COM 		break;
56711767SAnurag.Maskey@Sun.COM 	default:
56811767SAnurag.Maskey@Sun.COM 		/* Should not happen */
56911767SAnurag.Maskey@Sun.COM 		return (NWAM_ERROR_INTERNAL);
57011767SAnurag.Maskey@Sun.COM 	}
57111767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
57211767SAnurag.Maskey@Sun.COM }
57311767SAnurag.Maskey@Sun.COM 
57411767SAnurag.Maskey@Sun.COM nwam_error_t
57511767SAnurag.Maskey@Sun.COM nwam_delete_prop(void *list, const char *name)
57611767SAnurag.Maskey@Sun.COM {
57711767SAnurag.Maskey@Sun.COM 	int nverr;
57811767SAnurag.Maskey@Sun.COM 
57911767SAnurag.Maskey@Sun.COM 	if ((nverr = nvlist_remove_all(list, name)) != 0)
58011767SAnurag.Maskey@Sun.COM 		return (nwam_errno_to_nwam_error(nverr));
58111767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
58211767SAnurag.Maskey@Sun.COM }
58311767SAnurag.Maskey@Sun.COM 
58411767SAnurag.Maskey@Sun.COM nwam_error_t
58511767SAnurag.Maskey@Sun.COM nwam_set_prop_value(void *list, const char *propname, nwam_value_t value)
58611767SAnurag.Maskey@Sun.COM {
58711767SAnurag.Maskey@Sun.COM 	int nverr;
58811767SAnurag.Maskey@Sun.COM 	nwam_error_t err;
58911767SAnurag.Maskey@Sun.COM 	nwam_value_type_t type;
59011767SAnurag.Maskey@Sun.COM 	uint_t numvalues;
59111767SAnurag.Maskey@Sun.COM 	boolean_t *valbool;
59211767SAnurag.Maskey@Sun.COM 	int64_t *valint64;
59311767SAnurag.Maskey@Sun.COM 	uint64_t *valuint64;
59411767SAnurag.Maskey@Sun.COM 	char **valstr;
59511767SAnurag.Maskey@Sun.COM 
59611767SAnurag.Maskey@Sun.COM 	assert(list != NULL && value != NULL);
59711767SAnurag.Maskey@Sun.COM 
59811767SAnurag.Maskey@Sun.COM 	if ((err = nwam_value_get_type(value, &type)) != NWAM_SUCCESS)
59911767SAnurag.Maskey@Sun.COM 		return (err);
60011767SAnurag.Maskey@Sun.COM 
60111767SAnurag.Maskey@Sun.COM 	switch (type) {
60211767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_BOOLEAN:
60311767SAnurag.Maskey@Sun.COM 		if ((err = nwam_value_get_boolean_array(value, &valbool,
60411767SAnurag.Maskey@Sun.COM 		    &numvalues)) != NWAM_SUCCESS)
60511767SAnurag.Maskey@Sun.COM 			return (err);
60611767SAnurag.Maskey@Sun.COM 		if ((nverr = nvlist_add_boolean_array(list, propname,
60711767SAnurag.Maskey@Sun.COM 		    valbool, numvalues)) != 0)
60811767SAnurag.Maskey@Sun.COM 			return (nwam_errno_to_nwam_error(nverr));
60911767SAnurag.Maskey@Sun.COM 		break;
61011767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_INT64:
61111767SAnurag.Maskey@Sun.COM 		if ((err = nwam_value_get_int64_array(value, &valint64,
61211767SAnurag.Maskey@Sun.COM 		    &numvalues)) != NWAM_SUCCESS)
61311767SAnurag.Maskey@Sun.COM 			return (err);
61411767SAnurag.Maskey@Sun.COM 		if ((nverr = nvlist_add_int64_array(list, propname,
61511767SAnurag.Maskey@Sun.COM 		    valint64, numvalues)) != 0)
61611767SAnurag.Maskey@Sun.COM 			return (nwam_errno_to_nwam_error(nverr));
61711767SAnurag.Maskey@Sun.COM 		break;
61811767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_UINT64:
61911767SAnurag.Maskey@Sun.COM 		if ((err = nwam_value_get_uint64_array(value, &valuint64,
62011767SAnurag.Maskey@Sun.COM 		    &numvalues)) != NWAM_SUCCESS)
62111767SAnurag.Maskey@Sun.COM 			return (err);
62211767SAnurag.Maskey@Sun.COM 		if ((nverr = nvlist_add_uint64_array(list, propname,
62311767SAnurag.Maskey@Sun.COM 		    valuint64, numvalues)) != 0)
62411767SAnurag.Maskey@Sun.COM 			return (nwam_errno_to_nwam_error(nverr));
62511767SAnurag.Maskey@Sun.COM 		break;
62611767SAnurag.Maskey@Sun.COM 	case NWAM_VALUE_TYPE_STRING:
62711767SAnurag.Maskey@Sun.COM 		if ((err = nwam_value_get_string_array(value, &valstr,
62811767SAnurag.Maskey@Sun.COM 		    &numvalues)) != NWAM_SUCCESS)
62911767SAnurag.Maskey@Sun.COM 			return (err);
63011767SAnurag.Maskey@Sun.COM 		if ((nverr = nvlist_add_string_array(list, propname,
63111767SAnurag.Maskey@Sun.COM 		    valstr, numvalues)) != 0)
63211767SAnurag.Maskey@Sun.COM 			return (nwam_errno_to_nwam_error(nverr));
63311767SAnurag.Maskey@Sun.COM 		break;
63411767SAnurag.Maskey@Sun.COM 	default:
63511767SAnurag.Maskey@Sun.COM 		return (NWAM_INVALID_ARG);
63611767SAnurag.Maskey@Sun.COM 	}
63711767SAnurag.Maskey@Sun.COM 
63811767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
63911767SAnurag.Maskey@Sun.COM }
64011767SAnurag.Maskey@Sun.COM 
64111767SAnurag.Maskey@Sun.COM /* Map uint64 values to their string counterparts */
64211767SAnurag.Maskey@Sun.COM 
64311767SAnurag.Maskey@Sun.COM struct nwam_value_entry {
64411767SAnurag.Maskey@Sun.COM 	const char	*value_string;
64511767SAnurag.Maskey@Sun.COM 	uint64_t		value;
64611767SAnurag.Maskey@Sun.COM };
64711767SAnurag.Maskey@Sun.COM 
64811767SAnurag.Maskey@Sun.COM struct nwam_value_entry prop_activation_mode_value_entries[] =
64911767SAnurag.Maskey@Sun.COM {
65011767SAnurag.Maskey@Sun.COM 	{ NWAM_ACTIVATION_MODE_MANUAL_STRING, NWAM_ACTIVATION_MODE_MANUAL },
65111767SAnurag.Maskey@Sun.COM 	{ NWAM_ACTIVATION_MODE_SYSTEM_STRING, NWAM_ACTIVATION_MODE_SYSTEM },
65211767SAnurag.Maskey@Sun.COM 	{ NWAM_ACTIVATION_MODE_CONDITIONAL_ANY_STRING,
65311767SAnurag.Maskey@Sun.COM 	NWAM_ACTIVATION_MODE_CONDITIONAL_ANY },
65411767SAnurag.Maskey@Sun.COM 	{ NWAM_ACTIVATION_MODE_CONDITIONAL_ALL_STRING,
65511767SAnurag.Maskey@Sun.COM 	NWAM_ACTIVATION_MODE_CONDITIONAL_ALL },
65611767SAnurag.Maskey@Sun.COM 	{ NWAM_ACTIVATION_MODE_PRIORITIZED_STRING,
65711767SAnurag.Maskey@Sun.COM 	NWAM_ACTIVATION_MODE_PRIORITIZED },
65811767SAnurag.Maskey@Sun.COM 	{ NULL, 0 }
65911767SAnurag.Maskey@Sun.COM };
66011767SAnurag.Maskey@Sun.COM 
66111767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_type_entries[] =
66211767SAnurag.Maskey@Sun.COM {
66311767SAnurag.Maskey@Sun.COM 	{ NWAM_NCU_TYPE_LINK_STRING, NWAM_NCU_TYPE_LINK },
66411767SAnurag.Maskey@Sun.COM 	{ NWAM_NCU_TYPE_INTERFACE_STRING, NWAM_NCU_TYPE_INTERFACE },
66511767SAnurag.Maskey@Sun.COM 	{ NULL, 0 }
66611767SAnurag.Maskey@Sun.COM };
66711767SAnurag.Maskey@Sun.COM 
66811767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_class_entries[] =
66911767SAnurag.Maskey@Sun.COM {
67011767SAnurag.Maskey@Sun.COM 	{ NWAM_NCU_CLASS_PHYS_STRING, NWAM_NCU_CLASS_PHYS },
67111767SAnurag.Maskey@Sun.COM 	{ NWAM_NCU_CLASS_IP_STRING, NWAM_NCU_CLASS_IP },
67211767SAnurag.Maskey@Sun.COM 	{ NULL, 0 }
67311767SAnurag.Maskey@Sun.COM };
67411767SAnurag.Maskey@Sun.COM 
67511767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_ip_version_entries[] =
67611767SAnurag.Maskey@Sun.COM {
67711767SAnurag.Maskey@Sun.COM 	{ NWAM_IP_VERSION_IPV4_STRING, IPV4_VERSION },
67811767SAnurag.Maskey@Sun.COM 	{ NWAM_IP_VERSION_IPV6_STRING, IPV6_VERSION },
67911767SAnurag.Maskey@Sun.COM 	{ NULL, 0 }
68011767SAnurag.Maskey@Sun.COM };
68111767SAnurag.Maskey@Sun.COM 
68211767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_ipv4_addrsrc_entries[] =
68311767SAnurag.Maskey@Sun.COM {
68411767SAnurag.Maskey@Sun.COM 	{ NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP },
68511767SAnurag.Maskey@Sun.COM 	{ NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC },
68611767SAnurag.Maskey@Sun.COM 	{ NULL, 0 }
68711767SAnurag.Maskey@Sun.COM };
68811767SAnurag.Maskey@Sun.COM 
68911767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_ipv6_addrsrc_entries[] =
69011767SAnurag.Maskey@Sun.COM {
69111767SAnurag.Maskey@Sun.COM 	{ NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP },
69211767SAnurag.Maskey@Sun.COM 	{ NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC },
69311767SAnurag.Maskey@Sun.COM 	{ NWAM_ADDRSRC_AUTOCONF_STRING, NWAM_ADDRSRC_AUTOCONF },
69411767SAnurag.Maskey@Sun.COM 	{ NULL, 0 }
69511767SAnurag.Maskey@Sun.COM };
69611767SAnurag.Maskey@Sun.COM 
69711767SAnurag.Maskey@Sun.COM struct nwam_value_entry ncu_prop_priority_mode_entries[] =
69811767SAnurag.Maskey@Sun.COM {
69911767SAnurag.Maskey@Sun.COM 	{ NWAM_PRIORITY_MODE_EXCLUSIVE_STRING, NWAM_PRIORITY_MODE_EXCLUSIVE },
70011767SAnurag.Maskey@Sun.COM 	{ NWAM_PRIORITY_MODE_SHARED_STRING, NWAM_PRIORITY_MODE_SHARED },
70111767SAnurag.Maskey@Sun.COM 	{ NWAM_PRIORITY_MODE_ALL_STRING, NWAM_PRIORITY_MODE_ALL },
70211767SAnurag.Maskey@Sun.COM 	{ NULL, 0 }
70311767SAnurag.Maskey@Sun.COM };
70411767SAnurag.Maskey@Sun.COM 
70511767SAnurag.Maskey@Sun.COM struct nwam_value_entry loc_prop_nameservices_entries[] =
70611767SAnurag.Maskey@Sun.COM {
70711767SAnurag.Maskey@Sun.COM 	{ NWAM_NAMESERVICES_DNS_STRING, NWAM_NAMESERVICES_DNS },
70811767SAnurag.Maskey@Sun.COM 	{ NWAM_NAMESERVICES_FILES_STRING, NWAM_NAMESERVICES_FILES },
70911767SAnurag.Maskey@Sun.COM 	{ NWAM_NAMESERVICES_NIS_STRING, NWAM_NAMESERVICES_NIS },
71011767SAnurag.Maskey@Sun.COM 	{ NWAM_NAMESERVICES_LDAP_STRING, NWAM_NAMESERVICES_LDAP },
71111767SAnurag.Maskey@Sun.COM 	{ NULL, 0 }
71211767SAnurag.Maskey@Sun.COM };
71311767SAnurag.Maskey@Sun.COM 
71411767SAnurag.Maskey@Sun.COM struct nwam_value_entry loc_prop_nameservice_configsrc_entries[] =
71511767SAnurag.Maskey@Sun.COM {
71611767SAnurag.Maskey@Sun.COM 	{ NWAM_CONFIGSRC_MANUAL_STRING, NWAM_CONFIGSRC_MANUAL },
71711767SAnurag.Maskey@Sun.COM 	{ NWAM_CONFIGSRC_DHCP_STRING, NWAM_CONFIGSRC_DHCP },
71811767SAnurag.Maskey@Sun.COM 	{ NULL, 0 }
71911767SAnurag.Maskey@Sun.COM };
72011767SAnurag.Maskey@Sun.COM 
72111767SAnurag.Maskey@Sun.COM struct nwam_value_entry known_wlan_prop_security_mode_entries[] =
72211767SAnurag.Maskey@Sun.COM {
72311767SAnurag.Maskey@Sun.COM 	{ "none", DLADM_WLAN_SECMODE_NONE },
72411767SAnurag.Maskey@Sun.COM 	{ "wep", DLADM_WLAN_SECMODE_WEP },
72511767SAnurag.Maskey@Sun.COM 	{ "wpa", DLADM_WLAN_SECMODE_WPA },
72611767SAnurag.Maskey@Sun.COM 	{ NULL, 0 }
72711767SAnurag.Maskey@Sun.COM };
72811767SAnurag.Maskey@Sun.COM 
72911767SAnurag.Maskey@Sun.COM struct nwam_prop_value_entry {
73011767SAnurag.Maskey@Sun.COM 	const char		*prop_name;
73111767SAnurag.Maskey@Sun.COM 	struct nwam_value_entry	*value_entries;
73211767SAnurag.Maskey@Sun.COM } prop_value_entry_table[] =
73311767SAnurag.Maskey@Sun.COM {
73411767SAnurag.Maskey@Sun.COM 	{ NWAM_NCU_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries },
73511767SAnurag.Maskey@Sun.COM 	{ NWAM_NCU_PROP_TYPE, ncu_prop_type_entries },
73611767SAnurag.Maskey@Sun.COM 	{ NWAM_NCU_PROP_CLASS, ncu_prop_class_entries },
73711767SAnurag.Maskey@Sun.COM 	{ NWAM_NCU_PROP_IP_VERSION, ncu_prop_ip_version_entries },
73811767SAnurag.Maskey@Sun.COM 	{ NWAM_NCU_PROP_IPV4_ADDRSRC, ncu_prop_ipv4_addrsrc_entries },
73911767SAnurag.Maskey@Sun.COM 	{ NWAM_NCU_PROP_IPV6_ADDRSRC, ncu_prop_ipv6_addrsrc_entries },
74011767SAnurag.Maskey@Sun.COM 	{ NWAM_NCU_PROP_PRIORITY_MODE, ncu_prop_priority_mode_entries },
74111767SAnurag.Maskey@Sun.COM 	{ NWAM_ENM_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries },
74211767SAnurag.Maskey@Sun.COM 	{ NWAM_LOC_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries },
74311767SAnurag.Maskey@Sun.COM 	{ NWAM_LOC_PROP_NAMESERVICES, loc_prop_nameservices_entries },
74411767SAnurag.Maskey@Sun.COM 	{ NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC,
74511767SAnurag.Maskey@Sun.COM 	    loc_prop_nameservice_configsrc_entries },
74611767SAnurag.Maskey@Sun.COM 	{ NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC,
74711767SAnurag.Maskey@Sun.COM 	    loc_prop_nameservice_configsrc_entries },
74811767SAnurag.Maskey@Sun.COM 	{ NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC,
74911767SAnurag.Maskey@Sun.COM 	    loc_prop_nameservice_configsrc_entries },
75011767SAnurag.Maskey@Sun.COM 	{ NWAM_KNOWN_WLAN_PROP_SECURITY_MODE,
75111767SAnurag.Maskey@Sun.COM 	    known_wlan_prop_security_mode_entries },
75211767SAnurag.Maskey@Sun.COM 	{ NULL, NULL }
75311767SAnurag.Maskey@Sun.COM };
75411767SAnurag.Maskey@Sun.COM 
75511767SAnurag.Maskey@Sun.COM /*
75611767SAnurag.Maskey@Sun.COM  * Convert uint64 values for property propname into a string representing
75711767SAnurag.Maskey@Sun.COM  * that value. Used by enum values.
75811767SAnurag.Maskey@Sun.COM  */
75911767SAnurag.Maskey@Sun.COM nwam_error_t
76011767SAnurag.Maskey@Sun.COM nwam_uint64_get_value_string(const char *propname, uint64_t val,
76111767SAnurag.Maskey@Sun.COM     const char **valstrp)
76211767SAnurag.Maskey@Sun.COM {
76311767SAnurag.Maskey@Sun.COM 	int i, j;
76411767SAnurag.Maskey@Sun.COM 	int max = 0; /* largest enum value seen so far */
76511767SAnurag.Maskey@Sun.COM 	struct nwam_value_entry *value_entries;
76611767SAnurag.Maskey@Sun.COM 
76711767SAnurag.Maskey@Sun.COM 	assert(propname != NULL && valstrp != NULL);
76811767SAnurag.Maskey@Sun.COM 
76911767SAnurag.Maskey@Sun.COM 	for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) {
77011767SAnurag.Maskey@Sun.COM 		if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0)
77111767SAnurag.Maskey@Sun.COM 			continue;
77211767SAnurag.Maskey@Sun.COM 
77311767SAnurag.Maskey@Sun.COM 		value_entries = prop_value_entry_table[i].value_entries;
77411767SAnurag.Maskey@Sun.COM 
77511767SAnurag.Maskey@Sun.COM 		for (j = 0; value_entries[j].value_string != NULL; j++) {
77611767SAnurag.Maskey@Sun.COM 			if (value_entries[j].value == val) {
77711767SAnurag.Maskey@Sun.COM 				*valstrp = value_entries[j].value_string;
77811767SAnurag.Maskey@Sun.COM 				return (NWAM_SUCCESS);
77911767SAnurag.Maskey@Sun.COM 			}
78011767SAnurag.Maskey@Sun.COM 			max = value_entries[j].value > max ?
78111767SAnurag.Maskey@Sun.COM 			    value_entries[j].value : max;
78211767SAnurag.Maskey@Sun.COM 		}
78311767SAnurag.Maskey@Sun.COM 		/*
78411767SAnurag.Maskey@Sun.COM 		 * If trying to get the string for an enum value that doesn't
78511767SAnurag.Maskey@Sun.COM 		 * exist, return NWAM_LIST_END.  Otherwise, the input enum
78611767SAnurag.Maskey@Sun.COM 		 * value doesn't exist for the given property.
78711767SAnurag.Maskey@Sun.COM 		 */
78811767SAnurag.Maskey@Sun.COM 		if (val > max)
78911767SAnurag.Maskey@Sun.COM 			return (NWAM_LIST_END);
79011767SAnurag.Maskey@Sun.COM 		else
79111767SAnurag.Maskey@Sun.COM 			return (NWAM_ENTITY_INVALID_VALUE);
79211767SAnurag.Maskey@Sun.COM 	}
79311767SAnurag.Maskey@Sun.COM 	return (NWAM_INVALID_ARG);
79411767SAnurag.Maskey@Sun.COM }
79511767SAnurag.Maskey@Sun.COM 
79611767SAnurag.Maskey@Sun.COM /*
79711767SAnurag.Maskey@Sun.COM  * Convert string to appropriate uint64 value.
79811767SAnurag.Maskey@Sun.COM  */
79911767SAnurag.Maskey@Sun.COM nwam_error_t
80011767SAnurag.Maskey@Sun.COM nwam_value_string_get_uint64(const char *propname, const char *valstr,
80111767SAnurag.Maskey@Sun.COM     uint64_t *valp)
80211767SAnurag.Maskey@Sun.COM {
80311767SAnurag.Maskey@Sun.COM 	int i, j;
80411767SAnurag.Maskey@Sun.COM 	struct nwam_value_entry *value_entries;
80511767SAnurag.Maskey@Sun.COM 
80611767SAnurag.Maskey@Sun.COM 	assert(propname != NULL && valstr != NULL && valp != NULL);
80711767SAnurag.Maskey@Sun.COM 
80811767SAnurag.Maskey@Sun.COM 	for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) {
80911767SAnurag.Maskey@Sun.COM 		if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0)
81011767SAnurag.Maskey@Sun.COM 			continue;
81111767SAnurag.Maskey@Sun.COM 
81211767SAnurag.Maskey@Sun.COM 		value_entries = prop_value_entry_table[i].value_entries;
81311767SAnurag.Maskey@Sun.COM 
81411767SAnurag.Maskey@Sun.COM 		for (j = 0; value_entries[j].value_string != NULL; j++) {
81511767SAnurag.Maskey@Sun.COM 			if (strcasecmp(value_entries[j].value_string, valstr)
81611767SAnurag.Maskey@Sun.COM 			    == 0) {
81711767SAnurag.Maskey@Sun.COM 				*valp = value_entries[j].value;
81811767SAnurag.Maskey@Sun.COM 				return (NWAM_SUCCESS);
81911767SAnurag.Maskey@Sun.COM 			}
82011767SAnurag.Maskey@Sun.COM 		}
82111767SAnurag.Maskey@Sun.COM 		return (NWAM_ENTITY_INVALID_VALUE);
82211767SAnurag.Maskey@Sun.COM 	}
82311767SAnurag.Maskey@Sun.COM 	return (NWAM_INVALID_ARG);
82411767SAnurag.Maskey@Sun.COM }
82511767SAnurag.Maskey@Sun.COM 
82611767SAnurag.Maskey@Sun.COM /* Conditional activation functions */
82711767SAnurag.Maskey@Sun.COM 
82811767SAnurag.Maskey@Sun.COM nwam_error_t
82911767SAnurag.Maskey@Sun.COM nwam_condition_to_condition_string(nwam_condition_object_type_t object_type,
83011767SAnurag.Maskey@Sun.COM     nwam_condition_t condition, const char *object_name, char **stringp)
83111767SAnurag.Maskey@Sun.COM {
83211767SAnurag.Maskey@Sun.COM 	char *object_type_string, *condition_string;
83311767SAnurag.Maskey@Sun.COM 	char *string;
83411767SAnurag.Maskey@Sun.COM 
83511767SAnurag.Maskey@Sun.COM 	assert(stringp != NULL);
83611767SAnurag.Maskey@Sun.COM 
83711767SAnurag.Maskey@Sun.COM 	*stringp = NULL;
83811767SAnurag.Maskey@Sun.COM 
83911767SAnurag.Maskey@Sun.COM 	switch (object_type) {
84011767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_NCP:
84111767SAnurag.Maskey@Sun.COM 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCP_STRING;
84211767SAnurag.Maskey@Sun.COM 		break;
84311767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_NCU:
84411767SAnurag.Maskey@Sun.COM 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCU_STRING;
84511767SAnurag.Maskey@Sun.COM 		break;
84611767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_ENM:
84711767SAnurag.Maskey@Sun.COM 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_ENM_STRING;
84811767SAnurag.Maskey@Sun.COM 		break;
84911767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_LOC:
85011767SAnurag.Maskey@Sun.COM 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_LOC_STRING;
85111767SAnurag.Maskey@Sun.COM 		break;
85211767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS:
85311767SAnurag.Maskey@Sun.COM 		object_type_string =
85411767SAnurag.Maskey@Sun.COM 		    NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS_STRING;
85511767SAnurag.Maskey@Sun.COM 		break;
85611767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN:
85711767SAnurag.Maskey@Sun.COM 		object_type_string =
85811767SAnurag.Maskey@Sun.COM 		    NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN_STRING;
85911767SAnurag.Maskey@Sun.COM 		break;
86011767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN:
86111767SAnurag.Maskey@Sun.COM 		object_type_string =
86211767SAnurag.Maskey@Sun.COM 		    NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN_STRING;
86311767SAnurag.Maskey@Sun.COM 		break;
86411767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_ESSID:
86511767SAnurag.Maskey@Sun.COM 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_ESSID_STRING;
86611767SAnurag.Maskey@Sun.COM 		break;
86711767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_BSSID:
86811767SAnurag.Maskey@Sun.COM 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_BSSID_STRING;
86911767SAnurag.Maskey@Sun.COM 		break;
87011767SAnurag.Maskey@Sun.COM 	default:
87111767SAnurag.Maskey@Sun.COM 		return (NWAM_INVALID_ARG);
87211767SAnurag.Maskey@Sun.COM 
87311767SAnurag.Maskey@Sun.COM 	}
87411767SAnurag.Maskey@Sun.COM 	switch (condition) {
87511767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_IS:
87611767SAnurag.Maskey@Sun.COM 		condition_string = NWAM_CONDITION_IS_STRING;
87711767SAnurag.Maskey@Sun.COM 		break;
87811767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_IS_NOT:
87911767SAnurag.Maskey@Sun.COM 		condition_string = NWAM_CONDITION_IS_NOT_STRING;
88011767SAnurag.Maskey@Sun.COM 		break;
88111767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_CONTAINS:
88211767SAnurag.Maskey@Sun.COM 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN &&
88311767SAnurag.Maskey@Sun.COM 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN &&
88411767SAnurag.Maskey@Sun.COM 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID)
88511767SAnurag.Maskey@Sun.COM 			return (NWAM_INVALID_ARG);
88611767SAnurag.Maskey@Sun.COM 		condition_string = NWAM_CONDITION_CONTAINS_STRING;
88711767SAnurag.Maskey@Sun.COM 		break;
88811767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_DOES_NOT_CONTAIN:
88911767SAnurag.Maskey@Sun.COM 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN &&
89011767SAnurag.Maskey@Sun.COM 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN &&
89111767SAnurag.Maskey@Sun.COM 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID)
89211767SAnurag.Maskey@Sun.COM 			return (NWAM_INVALID_ARG);
89311767SAnurag.Maskey@Sun.COM 
89411767SAnurag.Maskey@Sun.COM 		condition_string = NWAM_CONDITION_DOES_NOT_CONTAIN_STRING;
89511767SAnurag.Maskey@Sun.COM 		break;
89611767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_IS_IN_RANGE:
89711767SAnurag.Maskey@Sun.COM 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS)
89811767SAnurag.Maskey@Sun.COM 			return (NWAM_INVALID_ARG);
89911767SAnurag.Maskey@Sun.COM 		condition_string = NWAM_CONDITION_IS_IN_RANGE_STRING;
90011767SAnurag.Maskey@Sun.COM 		break;
90111767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_IS_NOT_IN_RANGE:
90211767SAnurag.Maskey@Sun.COM 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS)
90311767SAnurag.Maskey@Sun.COM 			return (NWAM_INVALID_ARG);
90411767SAnurag.Maskey@Sun.COM 		condition_string = NWAM_CONDITION_IS_NOT_IN_RANGE_STRING;
90511767SAnurag.Maskey@Sun.COM 		break;
90611767SAnurag.Maskey@Sun.COM 	default:
90711767SAnurag.Maskey@Sun.COM 		return (NWAM_INVALID_ARG);
90811767SAnurag.Maskey@Sun.COM 		break;
90911767SAnurag.Maskey@Sun.COM 	}
91011767SAnurag.Maskey@Sun.COM 	if ((string = malloc(NWAM_MAX_VALUE_LEN)) == NULL)
91111767SAnurag.Maskey@Sun.COM 		return (NWAM_NO_MEMORY);
91211767SAnurag.Maskey@Sun.COM 	switch (object_type) {
91311767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_NCP:
91411767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_NCU:
91511767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_ENM:
91611767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_LOC:
91711767SAnurag.Maskey@Sun.COM 		(void) snprintf(string, NWAM_MAX_VALUE_LEN,
91811767SAnurag.Maskey@Sun.COM 		    "%s %s %s active", object_type_string,
91911767SAnurag.Maskey@Sun.COM 		    object_name, condition_string);
92011767SAnurag.Maskey@Sun.COM 		*stringp = string;
92111767SAnurag.Maskey@Sun.COM 		break;
92211767SAnurag.Maskey@Sun.COM 
92311767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS:
92411767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN:
92511767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN:
92611767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_ESSID:
92711767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_BSSID:
92811767SAnurag.Maskey@Sun.COM 		(void) snprintf(string, NWAM_MAX_VALUE_LEN,
92911767SAnurag.Maskey@Sun.COM 		    "%s %s %s", object_type_string,
93011767SAnurag.Maskey@Sun.COM 		    condition_string, object_name);
93111767SAnurag.Maskey@Sun.COM 		*stringp = string;
93211767SAnurag.Maskey@Sun.COM 		break;
93311767SAnurag.Maskey@Sun.COM 
93411767SAnurag.Maskey@Sun.COM 	default:
93511767SAnurag.Maskey@Sun.COM 		free(string);
93611767SAnurag.Maskey@Sun.COM 		return (NWAM_INVALID_ARG);
93711767SAnurag.Maskey@Sun.COM 
93811767SAnurag.Maskey@Sun.COM 	}
93911767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
94011767SAnurag.Maskey@Sun.COM }
94111767SAnurag.Maskey@Sun.COM 
94211767SAnurag.Maskey@Sun.COM nwam_error_t
94311767SAnurag.Maskey@Sun.COM nwam_condition_string_to_condition(const char *string,
94411767SAnurag.Maskey@Sun.COM     nwam_condition_object_type_t *object_typep,
94511767SAnurag.Maskey@Sun.COM     nwam_condition_t *conditionp, char **object_namep)
94611767SAnurag.Maskey@Sun.COM {
94711767SAnurag.Maskey@Sun.COM 	char *copy, *lasts;
94811767SAnurag.Maskey@Sun.COM 	char *object_type_string, *object_name;
94911767SAnurag.Maskey@Sun.COM 	char *condition_string, *active_string;
95011767SAnurag.Maskey@Sun.COM 
95111767SAnurag.Maskey@Sun.COM 	assert(string != NULL && object_typep != NULL && conditionp != NULL &&
95211767SAnurag.Maskey@Sun.COM 	    object_namep != NULL);
95311767SAnurag.Maskey@Sun.COM 
95411767SAnurag.Maskey@Sun.COM 	if ((copy = strdup(string)) == NULL)
95511767SAnurag.Maskey@Sun.COM 		return (NWAM_NO_MEMORY);
95611767SAnurag.Maskey@Sun.COM 
95711767SAnurag.Maskey@Sun.COM 	if ((object_type_string = strtok_r(copy, " \t", &lasts)) == NULL) {
95811767SAnurag.Maskey@Sun.COM 		free(copy);
95911767SAnurag.Maskey@Sun.COM 		return (NWAM_INVALID_ARG);
96011767SAnurag.Maskey@Sun.COM 	}
96111767SAnurag.Maskey@Sun.COM 
96211767SAnurag.Maskey@Sun.COM 	if (strcmp(object_type_string, NWAM_CONDITION_OBJECT_TYPE_NCP_STRING)
96311767SAnurag.Maskey@Sun.COM 	    == 0)
96411767SAnurag.Maskey@Sun.COM 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_NCP;
96511767SAnurag.Maskey@Sun.COM 	else if (strcmp(object_type_string,
96611767SAnurag.Maskey@Sun.COM 	    NWAM_CONDITION_OBJECT_TYPE_NCU_STRING) == 0)
96711767SAnurag.Maskey@Sun.COM 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_NCU;
96811767SAnurag.Maskey@Sun.COM 	else if (strcmp(object_type_string,
96911767SAnurag.Maskey@Sun.COM 	    NWAM_CONDITION_OBJECT_TYPE_ENM_STRING) == 0)
97011767SAnurag.Maskey@Sun.COM 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_ENM;
97111767SAnurag.Maskey@Sun.COM 	else if (strcmp(object_type_string,
97211767SAnurag.Maskey@Sun.COM 	    NWAM_CONDITION_OBJECT_TYPE_LOC_STRING) == 0)
97311767SAnurag.Maskey@Sun.COM 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_LOC;
97411767SAnurag.Maskey@Sun.COM 	else if (strcmp(object_type_string,
97511767SAnurag.Maskey@Sun.COM 	    NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS_STRING) == 0)
97611767SAnurag.Maskey@Sun.COM 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS;
97711767SAnurag.Maskey@Sun.COM 	else if (strcmp(object_type_string,
97811767SAnurag.Maskey@Sun.COM 	    NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN_STRING) == 0)
97911767SAnurag.Maskey@Sun.COM 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN;
98011767SAnurag.Maskey@Sun.COM 	else if (strcmp(object_type_string,
98111767SAnurag.Maskey@Sun.COM 	    NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN_STRING) == 0)
98211767SAnurag.Maskey@Sun.COM 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN;
98311767SAnurag.Maskey@Sun.COM 	else if (strcmp(object_type_string,
98411767SAnurag.Maskey@Sun.COM 	    NWAM_CONDITION_OBJECT_TYPE_ESSID_STRING) == 0)
98511767SAnurag.Maskey@Sun.COM 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_ESSID;
98611767SAnurag.Maskey@Sun.COM 	else if (strcmp(object_type_string,
98711767SAnurag.Maskey@Sun.COM 	    NWAM_CONDITION_OBJECT_TYPE_BSSID_STRING) == 0)
98811767SAnurag.Maskey@Sun.COM 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_BSSID;
98911767SAnurag.Maskey@Sun.COM 	else {
99011767SAnurag.Maskey@Sun.COM 		free(copy);
99111767SAnurag.Maskey@Sun.COM 		return (NWAM_INVALID_ARG);
99211767SAnurag.Maskey@Sun.COM 	}
99311767SAnurag.Maskey@Sun.COM 
99411767SAnurag.Maskey@Sun.COM 	if (*object_typep == NWAM_CONDITION_OBJECT_TYPE_NCP ||
99511767SAnurag.Maskey@Sun.COM 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_NCU ||
99611767SAnurag.Maskey@Sun.COM 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_ENM ||
99711767SAnurag.Maskey@Sun.COM 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_LOC) {
99811767SAnurag.Maskey@Sun.COM 		if ((object_name = strtok_r(NULL, " \t", &lasts)) == NULL) {
99911767SAnurag.Maskey@Sun.COM 			free(copy);
100011767SAnurag.Maskey@Sun.COM 			return (NWAM_INVALID_ARG);
100111767SAnurag.Maskey@Sun.COM 		}
100211767SAnurag.Maskey@Sun.COM 		if ((*object_namep = strdup(object_name)) == NULL) {
100311767SAnurag.Maskey@Sun.COM 			free(copy);
100411767SAnurag.Maskey@Sun.COM 			return (NWAM_NO_MEMORY);
100511767SAnurag.Maskey@Sun.COM 		}
100611767SAnurag.Maskey@Sun.COM 
100711767SAnurag.Maskey@Sun.COM 	}
100811767SAnurag.Maskey@Sun.COM 
100911767SAnurag.Maskey@Sun.COM 	if ((condition_string = strtok_r(NULL, " \t", &lasts)) == NULL) {
101011767SAnurag.Maskey@Sun.COM 		free(copy);
101111767SAnurag.Maskey@Sun.COM 		if (*object_namep != NULL)
101211767SAnurag.Maskey@Sun.COM 			free(*object_namep);
101311767SAnurag.Maskey@Sun.COM 		return (NWAM_INVALID_ARG);
101411767SAnurag.Maskey@Sun.COM 	}
101511767SAnurag.Maskey@Sun.COM 	if (strcmp(condition_string, NWAM_CONDITION_IS_STRING) == 0)
101611767SAnurag.Maskey@Sun.COM 		*conditionp = NWAM_CONDITION_IS;
101711767SAnurag.Maskey@Sun.COM 	else if (strcmp(condition_string, NWAM_CONDITION_IS_NOT_STRING) == 0)
101811767SAnurag.Maskey@Sun.COM 		*conditionp = NWAM_CONDITION_IS_NOT;
101911767SAnurag.Maskey@Sun.COM 	else if (strcmp(condition_string, NWAM_CONDITION_CONTAINS_STRING) == 0)
102011767SAnurag.Maskey@Sun.COM 		*conditionp = NWAM_CONDITION_CONTAINS;
102111767SAnurag.Maskey@Sun.COM 	else if (strcmp(condition_string,
102211767SAnurag.Maskey@Sun.COM 	    NWAM_CONDITION_DOES_NOT_CONTAIN_STRING) == 0)
102311767SAnurag.Maskey@Sun.COM 		*conditionp = NWAM_CONDITION_DOES_NOT_CONTAIN;
102411767SAnurag.Maskey@Sun.COM 	else if (strcmp(condition_string,
102511767SAnurag.Maskey@Sun.COM 	    NWAM_CONDITION_IS_IN_RANGE_STRING) == 0)
102611767SAnurag.Maskey@Sun.COM 		*conditionp = NWAM_CONDITION_IS_IN_RANGE;
102711767SAnurag.Maskey@Sun.COM 	else if (strcmp(condition_string,
102811767SAnurag.Maskey@Sun.COM 	    NWAM_CONDITION_IS_NOT_IN_RANGE_STRING) == 0)
102911767SAnurag.Maskey@Sun.COM 		*conditionp = NWAM_CONDITION_IS_NOT_IN_RANGE;
103011767SAnurag.Maskey@Sun.COM 	else {
103111767SAnurag.Maskey@Sun.COM 		free(copy);
103211767SAnurag.Maskey@Sun.COM 		if (*object_namep != NULL)
103311767SAnurag.Maskey@Sun.COM 			free(*object_namep);
103411767SAnurag.Maskey@Sun.COM 		return (NWAM_INVALID_ARG);
103511767SAnurag.Maskey@Sun.COM 	}
103611767SAnurag.Maskey@Sun.COM 
103711767SAnurag.Maskey@Sun.COM 	if (*object_typep == NWAM_CONDITION_OBJECT_TYPE_NCP ||
103811767SAnurag.Maskey@Sun.COM 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_NCU ||
103911767SAnurag.Maskey@Sun.COM 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_ENM ||
104011767SAnurag.Maskey@Sun.COM 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_LOC) {
104111767SAnurag.Maskey@Sun.COM 		if ((*conditionp != NWAM_CONDITION_IS &&
104211767SAnurag.Maskey@Sun.COM 		    *conditionp != NWAM_CONDITION_IS_NOT) ||
104311767SAnurag.Maskey@Sun.COM 		    (active_string = strtok_r(NULL, " \t", &lasts)) == NULL ||
104411767SAnurag.Maskey@Sun.COM 		    strcmp(active_string, NWAM_CONDITION_ACTIVE_STRING) != 0) {
104511767SAnurag.Maskey@Sun.COM 			free(copy);
104611767SAnurag.Maskey@Sun.COM 			free(*object_namep);
104711767SAnurag.Maskey@Sun.COM 			return (NWAM_INVALID_ARG);
104811767SAnurag.Maskey@Sun.COM 		}
104911767SAnurag.Maskey@Sun.COM 	} else {
105011767SAnurag.Maskey@Sun.COM 		switch (*conditionp) {
105111767SAnurag.Maskey@Sun.COM 		case NWAM_CONDITION_CONTAINS:
105211767SAnurag.Maskey@Sun.COM 		case NWAM_CONDITION_DOES_NOT_CONTAIN:
105311767SAnurag.Maskey@Sun.COM 			if (*object_typep !=
105411767SAnurag.Maskey@Sun.COM 			    NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN &&
105511767SAnurag.Maskey@Sun.COM 			    *object_typep !=
105611767SAnurag.Maskey@Sun.COM 			    NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN &&
105711767SAnurag.Maskey@Sun.COM 			    *object_typep != NWAM_CONDITION_OBJECT_TYPE_ESSID) {
105811767SAnurag.Maskey@Sun.COM 				free(copy);
105911767SAnurag.Maskey@Sun.COM 				free(*object_namep);
106011767SAnurag.Maskey@Sun.COM 				return (NWAM_INVALID_ARG);
106111767SAnurag.Maskey@Sun.COM 			}
106211767SAnurag.Maskey@Sun.COM 			break;
106311767SAnurag.Maskey@Sun.COM 		case NWAM_CONDITION_IS_IN_RANGE:
106411767SAnurag.Maskey@Sun.COM 		case NWAM_CONDITION_IS_NOT_IN_RANGE:
106511767SAnurag.Maskey@Sun.COM 			if (*object_typep !=
106611767SAnurag.Maskey@Sun.COM 			    NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS) {
106711767SAnurag.Maskey@Sun.COM 				free(copy);
106811767SAnurag.Maskey@Sun.COM 				free(*object_namep);
106911767SAnurag.Maskey@Sun.COM 				return (NWAM_INVALID_ARG);
107011767SAnurag.Maskey@Sun.COM 			}
107111767SAnurag.Maskey@Sun.COM 			break;
107211767SAnurag.Maskey@Sun.COM 		}
107311767SAnurag.Maskey@Sun.COM 
107411767SAnurag.Maskey@Sun.COM 		if ((object_name = strtok_r(NULL, " \t", &lasts)) == NULL) {
107511767SAnurag.Maskey@Sun.COM 			free(copy);
107611767SAnurag.Maskey@Sun.COM 			free(*object_namep);
107711767SAnurag.Maskey@Sun.COM 			return (NWAM_INVALID_ARG);
107811767SAnurag.Maskey@Sun.COM 		}
107911767SAnurag.Maskey@Sun.COM 		if ((*object_namep = strdup(object_name)) == NULL) {
108011767SAnurag.Maskey@Sun.COM 			free(copy);
108111767SAnurag.Maskey@Sun.COM 			free(*object_namep);
108211767SAnurag.Maskey@Sun.COM 			return (NWAM_NO_MEMORY);
108311767SAnurag.Maskey@Sun.COM 		}
108411767SAnurag.Maskey@Sun.COM 	}
108511767SAnurag.Maskey@Sun.COM 
108611767SAnurag.Maskey@Sun.COM 	free(copy);
108711767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
108811767SAnurag.Maskey@Sun.COM }
108911767SAnurag.Maskey@Sun.COM 
109011767SAnurag.Maskey@Sun.COM nwam_error_t
109111767SAnurag.Maskey@Sun.COM nwam_condition_rate(nwam_condition_object_type_t object_type,
109211767SAnurag.Maskey@Sun.COM     nwam_condition_t condition, uint64_t *ratep)
109311767SAnurag.Maskey@Sun.COM {
109411767SAnurag.Maskey@Sun.COM 	assert(ratep != NULL);
109511767SAnurag.Maskey@Sun.COM 
109611767SAnurag.Maskey@Sun.COM 	*ratep = 0;
109711767SAnurag.Maskey@Sun.COM 
109811767SAnurag.Maskey@Sun.COM 	switch (object_type) {
109911767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_NCP:
110011767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_NCU:
110111767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_ENM:
110211767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_LOC:
110311767SAnurag.Maskey@Sun.COM 		(*ratep)++;
110411767SAnurag.Maskey@Sun.COM 		/* FALLTHRU */
110511767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN:
110611767SAnurag.Maskey@Sun.COM 		(*ratep)++;
110711767SAnurag.Maskey@Sun.COM 		/* FALLTHRU */
110811767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN:
110911767SAnurag.Maskey@Sun.COM 		(*ratep)++;
111011767SAnurag.Maskey@Sun.COM 		/* FALLTHRU */
111111767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS:
111211767SAnurag.Maskey@Sun.COM 		(*ratep)++;
111311767SAnurag.Maskey@Sun.COM 		/* FALLTHRU */
111411767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_BSSID:
111511767SAnurag.Maskey@Sun.COM 		(*ratep)++;
111611767SAnurag.Maskey@Sun.COM 		/* FALLTHRU */
111711767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_OBJECT_TYPE_ESSID:
111811767SAnurag.Maskey@Sun.COM 		(*ratep)++;
111911767SAnurag.Maskey@Sun.COM 		break;
112011767SAnurag.Maskey@Sun.COM 	default:
112111767SAnurag.Maskey@Sun.COM 		return (NWAM_INVALID_ARG);
112211767SAnurag.Maskey@Sun.COM 	}
112311767SAnurag.Maskey@Sun.COM 
112411767SAnurag.Maskey@Sun.COM 	switch (condition) {
112511767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_IS:
112611767SAnurag.Maskey@Sun.COM 		(*ratep)++;
112711767SAnurag.Maskey@Sun.COM 		/* FALLTHRU */
112811767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_CONTAINS:
112911767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_IS_IN_RANGE:
113011767SAnurag.Maskey@Sun.COM 		(*ratep)++;
113111767SAnurag.Maskey@Sun.COM 		/* FALLTHRU */
113211767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_DOES_NOT_CONTAIN:
113311767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_IS_NOT_IN_RANGE:
113411767SAnurag.Maskey@Sun.COM 		(*ratep)++;
113511767SAnurag.Maskey@Sun.COM 		/* FALLTHRU */
113611767SAnurag.Maskey@Sun.COM 	case NWAM_CONDITION_IS_NOT:
113711767SAnurag.Maskey@Sun.COM 		(*ratep)++;
113811767SAnurag.Maskey@Sun.COM 		break;
113911767SAnurag.Maskey@Sun.COM 	default:
114011767SAnurag.Maskey@Sun.COM 		return (NWAM_INVALID_ARG);
114111767SAnurag.Maskey@Sun.COM 	}
114211767SAnurag.Maskey@Sun.COM 	return (NWAM_SUCCESS);
114311767SAnurag.Maskey@Sun.COM }
1144