xref: /illumos-gate/usr/src/lib/libnwam/common/libnwam_values.c (revision 33f5ff17089e3a43e6e730bf80384c233123dbd9)
16ba597c5SAnurag S. Maskey /*
26ba597c5SAnurag S. Maskey  * CDDL HEADER START
36ba597c5SAnurag S. Maskey  *
46ba597c5SAnurag S. Maskey  * The contents of this file are subject to the terms of the
56ba597c5SAnurag S. Maskey  * Common Development and Distribution License (the "License").
66ba597c5SAnurag S. Maskey  * You may not use this file except in compliance with the License.
76ba597c5SAnurag S. Maskey  *
86ba597c5SAnurag S. Maskey  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96ba597c5SAnurag S. Maskey  * or http://www.opensolaris.org/os/licensing.
106ba597c5SAnurag S. Maskey  * See the License for the specific language governing permissions
116ba597c5SAnurag S. Maskey  * and limitations under the License.
126ba597c5SAnurag S. Maskey  *
136ba597c5SAnurag S. Maskey  * When distributing Covered Code, include this CDDL HEADER in each
146ba597c5SAnurag S. Maskey  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156ba597c5SAnurag S. Maskey  * If applicable, add the following below this CDDL HEADER, with the
166ba597c5SAnurag S. Maskey  * fields enclosed by brackets "[]" replaced with your own identifying
176ba597c5SAnurag S. Maskey  * information: Portions Copyright [yyyy] [name of copyright owner]
186ba597c5SAnurag S. Maskey  *
196ba597c5SAnurag S. Maskey  * CDDL HEADER END
206ba597c5SAnurag S. Maskey  */
216ba597c5SAnurag S. Maskey 
226ba597c5SAnurag S. Maskey /*
2348fff0e3SRenee Danson Sommerfeld  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24*33f5ff17SMilan Jurik  * Copyright 2012 Milan Jurik. All rights reserved.
256ba597c5SAnurag S. Maskey  */
266ba597c5SAnurag S. Maskey 
276ba597c5SAnurag S. Maskey #include <assert.h>
286ba597c5SAnurag S. Maskey #include <stdio.h>
296ba597c5SAnurag S. Maskey #include <stdlib.h>
306ba597c5SAnurag S. Maskey #include <string.h>
316ba597c5SAnurag S. Maskey #include <sys/types.h>
326ba597c5SAnurag S. Maskey #include <libdlwlan.h>
336ba597c5SAnurag S. Maskey #include <libnvpair.h>
346ba597c5SAnurag S. Maskey 
356ba597c5SAnurag S. Maskey #include "libnwam_impl.h"
366ba597c5SAnurag S. Maskey #include <libnwam_priv.h>
376ba597c5SAnurag S. Maskey #include <libnwam.h>
386ba597c5SAnurag S. Maskey 
396ba597c5SAnurag S. Maskey /*
406ba597c5SAnurag S. Maskey  * Internal implementation of libnwam in-memory objects and values.  Objects
416ba597c5SAnurag S. Maskey  * are nvlists.
426ba597c5SAnurag S. Maskey  */
436ba597c5SAnurag S. Maskey 
446ba597c5SAnurag S. Maskey void
456ba597c5SAnurag S. Maskey nwam_value_free(nwam_value_t value)
466ba597c5SAnurag S. Maskey {
476ba597c5SAnurag S. Maskey 	uint_t i;
486ba597c5SAnurag S. Maskey 
496ba597c5SAnurag S. Maskey 	if (value == NULL)
506ba597c5SAnurag S. Maskey 		return;
516ba597c5SAnurag S. Maskey 
526ba597c5SAnurag S. Maskey 	switch (value->nwv_value_type) {
536ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_BOOLEAN:
546ba597c5SAnurag S. Maskey 		free(value->nwv_values.nwv_boolean);
556ba597c5SAnurag S. Maskey 		break;
566ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_INT64:
576ba597c5SAnurag S. Maskey 		free(value->nwv_values.nwv_int64);
586ba597c5SAnurag S. Maskey 		break;
596ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_UINT64:
606ba597c5SAnurag S. Maskey 		free(value->nwv_values.nwv_uint64);
616ba597c5SAnurag S. Maskey 		break;
626ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_STRING:
636ba597c5SAnurag S. Maskey 		for (i = 0; i < value->nwv_value_numvalues; i++)
646ba597c5SAnurag S. Maskey 			free(value->nwv_values.nwv_string[i]);
656ba597c5SAnurag S. Maskey 		free(value->nwv_values.nwv_string);
666ba597c5SAnurag S. Maskey 		break;
676ba597c5SAnurag S. Maskey 	}
686ba597c5SAnurag S. Maskey 	free(value);
696ba597c5SAnurag S. Maskey }
706ba597c5SAnurag S. Maskey 
716ba597c5SAnurag S. Maskey nwam_error_t
726ba597c5SAnurag S. Maskey nwam_value_create(nwam_value_type_t value_type, void *values, uint_t numvalues,
736ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
746ba597c5SAnurag S. Maskey {
756ba597c5SAnurag S. Maskey 	nwam_value_t newvalue;
766ba597c5SAnurag S. Maskey 	boolean_t *values_boolean;
776ba597c5SAnurag S. Maskey 	int64_t *values_int64;
786ba597c5SAnurag S. Maskey 	uint64_t *values_uint64;
796ba597c5SAnurag S. Maskey 	char **values_string;
806ba597c5SAnurag S. Maskey 	int i, j;
816ba597c5SAnurag S. Maskey 	nwam_error_t err = NWAM_SUCCESS;
826ba597c5SAnurag S. Maskey 
836ba597c5SAnurag S. Maskey 	*valuep = NULL;
846ba597c5SAnurag S. Maskey 
856ba597c5SAnurag S. Maskey 	if ((newvalue = calloc(1, sizeof (struct nwam_value))) == NULL)
866ba597c5SAnurag S. Maskey 		return (NWAM_NO_MEMORY);
876ba597c5SAnurag S. Maskey 
886ba597c5SAnurag S. Maskey 	newvalue->nwv_value_type = value_type;
896ba597c5SAnurag S. Maskey 	newvalue->nwv_value_numvalues = numvalues;
906ba597c5SAnurag S. Maskey 
916ba597c5SAnurag S. Maskey 	switch (value_type) {
926ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_BOOLEAN:
936ba597c5SAnurag S. Maskey 		values_boolean = values;
946ba597c5SAnurag S. Maskey 		if ((newvalue->nwv_values.nwv_boolean =
956ba597c5SAnurag S. Maskey 		    calloc(numvalues, sizeof (boolean_t))) == NULL) {
966ba597c5SAnurag S. Maskey 			free(newvalue);
976ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
986ba597c5SAnurag S. Maskey 		}
996ba597c5SAnurag S. Maskey 		for (i = 0; i < numvalues; i++)
1006ba597c5SAnurag S. Maskey 			newvalue->nwv_values.nwv_boolean[i] = values_boolean[i];
1016ba597c5SAnurag S. Maskey 		break;
1026ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_INT64:
1036ba597c5SAnurag S. Maskey 		values_int64 = values;
1046ba597c5SAnurag S. Maskey 		if ((newvalue->nwv_values.nwv_int64 =
1056ba597c5SAnurag S. Maskey 		    calloc(numvalues, sizeof (int64_t))) == NULL) {
1066ba597c5SAnurag S. Maskey 			free(newvalue);
1076ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
1086ba597c5SAnurag S. Maskey 		}
1096ba597c5SAnurag S. Maskey 		for (i = 0; i < numvalues; i++)
1106ba597c5SAnurag S. Maskey 			newvalue->nwv_values.nwv_int64[i] = values_int64[i];
1116ba597c5SAnurag S. Maskey 		break;
1126ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_UINT64:
1136ba597c5SAnurag S. Maskey 		values_uint64 = values;
1146ba597c5SAnurag S. Maskey 		if ((newvalue->nwv_values.nwv_uint64 =
1156ba597c5SAnurag S. Maskey 		    calloc(numvalues, sizeof (uint64_t))) == NULL) {
1166ba597c5SAnurag S. Maskey 			free(newvalue);
1176ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
1186ba597c5SAnurag S. Maskey 		}
1196ba597c5SAnurag S. Maskey 		for (i = 0; i < numvalues; i++)
1206ba597c5SAnurag S. Maskey 			newvalue->nwv_values.nwv_uint64[i] = values_uint64[i];
1216ba597c5SAnurag S. Maskey 		break;
1226ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_STRING:
1236ba597c5SAnurag S. Maskey 		values_string = values;
1246ba597c5SAnurag S. Maskey 		if ((newvalue->nwv_values.nwv_string =
1256ba597c5SAnurag S. Maskey 		    calloc(numvalues, sizeof (char *))) == NULL) {
1266ba597c5SAnurag S. Maskey 			free(newvalue);
1276ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
1286ba597c5SAnurag S. Maskey 		}
1296ba597c5SAnurag S. Maskey 		for (i = 0; i < numvalues; i++) {
1306ba597c5SAnurag S. Maskey 			if (strnlen(values_string[i], NWAM_MAX_VALUE_LEN) ==
1316ba597c5SAnurag S. Maskey 			    NWAM_MAX_VALUE_LEN) {
1326ba597c5SAnurag S. Maskey 				err = NWAM_ENTITY_INVALID_VALUE;
1336ba597c5SAnurag S. Maskey 			} else if ((newvalue->nwv_values.nwv_string[i] =
1346ba597c5SAnurag S. Maskey 			    strdup(values_string[i])) == NULL) {
1356ba597c5SAnurag S. Maskey 				err = NWAM_NO_MEMORY;
1366ba597c5SAnurag S. Maskey 			}
1376ba597c5SAnurag S. Maskey 			if (err != NWAM_SUCCESS) {
1386ba597c5SAnurag S. Maskey 				for (j = 0; j < i; j++)
1396ba597c5SAnurag S. Maskey 					free(
1406ba597c5SAnurag S. Maskey 					    newvalue->nwv_values.nwv_string[i]);
1416ba597c5SAnurag S. Maskey 				free(newvalue->nwv_values.nwv_string);
1426ba597c5SAnurag S. Maskey 				free(newvalue);
1436ba597c5SAnurag S. Maskey 				return (err);
1446ba597c5SAnurag S. Maskey 			}
1456ba597c5SAnurag S. Maskey 		}
1466ba597c5SAnurag S. Maskey 		break;
1476ba597c5SAnurag S. Maskey 	default:
1486ba597c5SAnurag S. Maskey 		break;
1496ba597c5SAnurag S. Maskey 	}
1506ba597c5SAnurag S. Maskey 
1516ba597c5SAnurag S. Maskey 	*valuep = newvalue;
1526ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
1536ba597c5SAnurag S. Maskey }
1546ba597c5SAnurag S. Maskey 
1556ba597c5SAnurag S. Maskey nwam_error_t
1566ba597c5SAnurag S. Maskey nwam_value_copy(nwam_value_t old, nwam_value_t *newp)
1576ba597c5SAnurag S. Maskey {
1586ba597c5SAnurag S. Maskey 	void *values;
1596ba597c5SAnurag S. Maskey 
1606ba597c5SAnurag S. Maskey 	assert(old != NULL && newp != NULL);
1616ba597c5SAnurag S. Maskey 
1626ba597c5SAnurag S. Maskey 	switch (old->nwv_value_type) {
1636ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_BOOLEAN:
1646ba597c5SAnurag S. Maskey 		values = old->nwv_values.nwv_boolean;
1656ba597c5SAnurag S. Maskey 		break;
1666ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_INT64:
1676ba597c5SAnurag S. Maskey 		values = old->nwv_values.nwv_int64;
1686ba597c5SAnurag S. Maskey 		break;
1696ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_UINT64:
1706ba597c5SAnurag S. Maskey 		values = old->nwv_values.nwv_uint64;
1716ba597c5SAnurag S. Maskey 		break;
1726ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_STRING:
1736ba597c5SAnurag S. Maskey 		values = old->nwv_values.nwv_string;
1746ba597c5SAnurag S. Maskey 		break;
1756ba597c5SAnurag S. Maskey 	default:
1766ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
1776ba597c5SAnurag S. Maskey 	}
1786ba597c5SAnurag S. Maskey 	return (nwam_value_create(old->nwv_value_type, values,
1796ba597c5SAnurag S. Maskey 	    old->nwv_value_numvalues, newp));
1806ba597c5SAnurag S. Maskey }
1816ba597c5SAnurag S. Maskey nwam_error_t
1826ba597c5SAnurag S. Maskey nwam_value_create_boolean_array(boolean_t *values, uint_t numvalues,
1836ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
1846ba597c5SAnurag S. Maskey {
1856ba597c5SAnurag S. Maskey 	return (nwam_value_create(NWAM_VALUE_TYPE_BOOLEAN, values, numvalues,
1866ba597c5SAnurag S. Maskey 	    valuep));
1876ba597c5SAnurag S. Maskey }
1886ba597c5SAnurag S. Maskey 
1896ba597c5SAnurag S. Maskey nwam_error_t
1906ba597c5SAnurag S. Maskey nwam_value_create_boolean(boolean_t value, nwam_value_t *valuep)
1916ba597c5SAnurag S. Maskey {
1926ba597c5SAnurag S. Maskey 	return (nwam_value_create_boolean_array(&value, 1, valuep));
1936ba597c5SAnurag S. Maskey }
1946ba597c5SAnurag S. Maskey 
1956ba597c5SAnurag S. Maskey nwam_error_t
1966ba597c5SAnurag S. Maskey nwam_value_create_int64_array(int64_t *values, uint_t numvalues,
1976ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
1986ba597c5SAnurag S. Maskey {
1996ba597c5SAnurag S. Maskey 	return (nwam_value_create(NWAM_VALUE_TYPE_INT64, values, numvalues,
2006ba597c5SAnurag S. Maskey 	    valuep));
2016ba597c5SAnurag S. Maskey }
2026ba597c5SAnurag S. Maskey 
2036ba597c5SAnurag S. Maskey nwam_error_t
2046ba597c5SAnurag S. Maskey nwam_value_create_int64(int64_t value, nwam_value_t *valuep)
2056ba597c5SAnurag S. Maskey {
2066ba597c5SAnurag S. Maskey 	return (nwam_value_create_int64_array(&value, 1, valuep));
2076ba597c5SAnurag S. Maskey }
2086ba597c5SAnurag S. Maskey 
2096ba597c5SAnurag S. Maskey nwam_error_t
2106ba597c5SAnurag S. Maskey nwam_value_create_uint64_array(uint64_t *values, uint_t numvalues,
2116ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
2126ba597c5SAnurag S. Maskey {
2136ba597c5SAnurag S. Maskey 	return (nwam_value_create(NWAM_VALUE_TYPE_UINT64, values, numvalues,
2146ba597c5SAnurag S. Maskey 	    valuep));
2156ba597c5SAnurag S. Maskey }
2166ba597c5SAnurag S. Maskey 
2176ba597c5SAnurag S. Maskey nwam_error_t
2186ba597c5SAnurag S. Maskey nwam_value_create_uint64(uint64_t value, nwam_value_t *valuep)
2196ba597c5SAnurag S. Maskey {
2206ba597c5SAnurag S. Maskey 	return (nwam_value_create_uint64_array(&value, 1, valuep));
2216ba597c5SAnurag S. Maskey }
2226ba597c5SAnurag S. Maskey 
2236ba597c5SAnurag S. Maskey nwam_error_t
2246ba597c5SAnurag S. Maskey nwam_value_create_string_array(char **values, uint_t numvalues,
2256ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
2266ba597c5SAnurag S. Maskey {
2276ba597c5SAnurag S. Maskey 	return (nwam_value_create(NWAM_VALUE_TYPE_STRING, values, numvalues,
2286ba597c5SAnurag S. Maskey 	    valuep));
2296ba597c5SAnurag S. Maskey }
2306ba597c5SAnurag S. Maskey 
2316ba597c5SAnurag S. Maskey nwam_error_t
2326ba597c5SAnurag S. Maskey nwam_value_create_string(char *value, nwam_value_t *valuep)
2336ba597c5SAnurag S. Maskey {
2346ba597c5SAnurag S. Maskey 	return (nwam_value_create_string_array(&value, 1, valuep));
2356ba597c5SAnurag S. Maskey }
2366ba597c5SAnurag S. Maskey 
2376ba597c5SAnurag S. Maskey nwam_error_t
2386ba597c5SAnurag S. Maskey nwam_value_get_boolean_array(nwam_value_t value, boolean_t **valuesp,
2396ba597c5SAnurag S. Maskey     uint_t *numvaluesp)
2406ba597c5SAnurag S. Maskey {
2416ba597c5SAnurag S. Maskey 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
2426ba597c5SAnurag S. Maskey 
2436ba597c5SAnurag S. Maskey 	*numvaluesp = value->nwv_value_numvalues;
2446ba597c5SAnurag S. Maskey 	*valuesp = value->nwv_values.nwv_boolean;
2456ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
2466ba597c5SAnurag S. Maskey }
2476ba597c5SAnurag S. Maskey 
2486ba597c5SAnurag S. Maskey nwam_error_t
2496ba597c5SAnurag S. Maskey nwam_value_get_boolean(nwam_value_t value, boolean_t *valuep)
2506ba597c5SAnurag S. Maskey {
2516ba597c5SAnurag S. Maskey 	uint_t numvalues;
2526ba597c5SAnurag S. Maskey 	boolean_t *myvaluesp;
2536ba597c5SAnurag S. Maskey 	nwam_error_t err;
2546ba597c5SAnurag S. Maskey 
2556ba597c5SAnurag S. Maskey 	err = nwam_value_get_boolean_array(value, &myvaluesp, &numvalues);
2566ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
2576ba597c5SAnurag S. Maskey 		return (err);
2586ba597c5SAnurag S. Maskey 	if (numvalues != 1)
2596ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MULTIPLE_VALUES);
2606ba597c5SAnurag S. Maskey 
2616ba597c5SAnurag S. Maskey 	*valuep = myvaluesp[0];
2626ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
2636ba597c5SAnurag S. Maskey }
2646ba597c5SAnurag S. Maskey 
2656ba597c5SAnurag S. Maskey nwam_error_t
2666ba597c5SAnurag S. Maskey nwam_value_get_int64_array(nwam_value_t value, int64_t **valuesp,
2676ba597c5SAnurag S. Maskey     uint_t *numvaluesp)
2686ba597c5SAnurag S. Maskey {
2696ba597c5SAnurag S. Maskey 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
2706ba597c5SAnurag S. Maskey 
2716ba597c5SAnurag S. Maskey 	*numvaluesp = value->nwv_value_numvalues;
2726ba597c5SAnurag S. Maskey 	*valuesp = value->nwv_values.nwv_int64;
2736ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
2746ba597c5SAnurag S. Maskey }
2756ba597c5SAnurag S. Maskey 
2766ba597c5SAnurag S. Maskey nwam_error_t
2776ba597c5SAnurag S. Maskey nwam_value_get_int64(nwam_value_t value, int64_t *valuep)
2786ba597c5SAnurag S. Maskey {
2796ba597c5SAnurag S. Maskey 	uint_t numvalues;
2806ba597c5SAnurag S. Maskey 	int64_t *myvaluesp;
2816ba597c5SAnurag S. Maskey 	nwam_error_t err;
2826ba597c5SAnurag S. Maskey 
2836ba597c5SAnurag S. Maskey 	err = nwam_value_get_int64_array(value, &myvaluesp, &numvalues);
2846ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
2856ba597c5SAnurag S. Maskey 		return (err);
2866ba597c5SAnurag S. Maskey 	if (numvalues != 1)
2876ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MULTIPLE_VALUES);
2886ba597c5SAnurag S. Maskey 
2896ba597c5SAnurag S. Maskey 	*valuep = myvaluesp[0];
2906ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
2916ba597c5SAnurag S. Maskey }
2926ba597c5SAnurag S. Maskey 
2936ba597c5SAnurag S. Maskey nwam_error_t
2946ba597c5SAnurag S. Maskey nwam_value_get_uint64_array(nwam_value_t value, uint64_t **valuesp,
2956ba597c5SAnurag S. Maskey     uint_t *numvaluesp)
2966ba597c5SAnurag S. Maskey {
2976ba597c5SAnurag S. Maskey 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
2986ba597c5SAnurag S. Maskey 
2996ba597c5SAnurag S. Maskey 	*numvaluesp = value->nwv_value_numvalues;
3006ba597c5SAnurag S. Maskey 	*valuesp = value->nwv_values.nwv_uint64;
3016ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
3026ba597c5SAnurag S. Maskey }
3036ba597c5SAnurag S. Maskey 
3046ba597c5SAnurag S. Maskey nwam_error_t
3056ba597c5SAnurag S. Maskey nwam_value_get_uint64(nwam_value_t value, uint64_t *valuep)
3066ba597c5SAnurag S. Maskey {
3076ba597c5SAnurag S. Maskey 	uint_t numvalues;
3086ba597c5SAnurag S. Maskey 	uint64_t *myvaluesp;
3096ba597c5SAnurag S. Maskey 	nwam_error_t err;
3106ba597c5SAnurag S. Maskey 
3116ba597c5SAnurag S. Maskey 	err = nwam_value_get_uint64_array(value, &myvaluesp, &numvalues);
3126ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
3136ba597c5SAnurag S. Maskey 		return (err);
3146ba597c5SAnurag S. Maskey 	if (numvalues != 1)
3156ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MULTIPLE_VALUES);
3166ba597c5SAnurag S. Maskey 
3176ba597c5SAnurag S. Maskey 	*valuep = myvaluesp[0];
3186ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
3196ba597c5SAnurag S. Maskey }
3206ba597c5SAnurag S. Maskey 
3216ba597c5SAnurag S. Maskey nwam_error_t
3226ba597c5SAnurag S. Maskey nwam_value_get_string_array(nwam_value_t value, char ***valuesp,
3236ba597c5SAnurag S. Maskey     uint_t *numvaluesp)
3246ba597c5SAnurag S. Maskey {
3256ba597c5SAnurag S. Maskey 	assert(value != NULL && numvaluesp != NULL && valuesp != NULL);
3266ba597c5SAnurag S. Maskey 
3276ba597c5SAnurag S. Maskey 	*numvaluesp = value->nwv_value_numvalues;
3286ba597c5SAnurag S. Maskey 	*valuesp = value->nwv_values.nwv_string;
3296ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
3306ba597c5SAnurag S. Maskey }
3316ba597c5SAnurag S. Maskey 
3326ba597c5SAnurag S. Maskey nwam_error_t
3336ba597c5SAnurag S. Maskey nwam_value_get_string(nwam_value_t value, char **valuep)
3346ba597c5SAnurag S. Maskey {
3356ba597c5SAnurag S. Maskey 	uint_t numvalues;
3366ba597c5SAnurag S. Maskey 	char **myvaluesp;
3376ba597c5SAnurag S. Maskey 	nwam_error_t err;
3386ba597c5SAnurag S. Maskey 
3396ba597c5SAnurag S. Maskey 	err = nwam_value_get_string_array(value, &myvaluesp, &numvalues);
3406ba597c5SAnurag S. Maskey 	if (err != NWAM_SUCCESS)
3416ba597c5SAnurag S. Maskey 		return (err);
3426ba597c5SAnurag S. Maskey 	if (numvalues != 1)
3436ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_MULTIPLE_VALUES);
3446ba597c5SAnurag S. Maskey 
3456ba597c5SAnurag S. Maskey 	*valuep = myvaluesp[0];
3466ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
3476ba597c5SAnurag S. Maskey }
3486ba597c5SAnurag S. Maskey 
3496ba597c5SAnurag S. Maskey nwam_error_t
3506ba597c5SAnurag S. Maskey nwam_value_get_type(nwam_value_t value, nwam_value_type_t *typep)
3516ba597c5SAnurag S. Maskey {
3526ba597c5SAnurag S. Maskey 	*typep = value->nwv_value_type;
3536ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
3546ba597c5SAnurag S. Maskey }
3556ba597c5SAnurag S. Maskey 
3566ba597c5SAnurag S. Maskey nwam_error_t
3576ba597c5SAnurag S. Maskey nwam_value_get_numvalues(nwam_value_t value, uint_t *numvaluesp)
3586ba597c5SAnurag S. Maskey {
3596ba597c5SAnurag S. Maskey 	*numvaluesp = value->nwv_value_numvalues;
3606ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
3616ba597c5SAnurag S. Maskey }
3626ba597c5SAnurag S. Maskey 
3636ba597c5SAnurag S. Maskey /*
3646ba597c5SAnurag S. Maskey  * Generic object data functions. We hide nvlist implementation
3656ba597c5SAnurag S. Maskey  * from NCP, ENM and location implementations.
3666ba597c5SAnurag S. Maskey  */
3676ba597c5SAnurag S. Maskey nwam_error_t
3686ba597c5SAnurag S. Maskey nwam_alloc_object_list(void *list)
3696ba597c5SAnurag S. Maskey {
3706ba597c5SAnurag S. Maskey 	int nverr;
3716ba597c5SAnurag S. Maskey 
3726ba597c5SAnurag S. Maskey 	assert(list != NULL);
3736ba597c5SAnurag S. Maskey 
3746ba597c5SAnurag S. Maskey 	if ((nverr = nvlist_alloc((nvlist_t **)list, NV_UNIQUE_NAME, 0)) != 0)
3756ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
3766ba597c5SAnurag S. Maskey 
3776ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
3786ba597c5SAnurag S. Maskey }
3796ba597c5SAnurag S. Maskey 
3806ba597c5SAnurag S. Maskey void
3816ba597c5SAnurag S. Maskey nwam_free_object_list(void *list)
3826ba597c5SAnurag S. Maskey {
3836ba597c5SAnurag S. Maskey 	if (list != NULL)
3846ba597c5SAnurag S. Maskey 		nvlist_free(list);
3856ba597c5SAnurag S. Maskey }
3866ba597c5SAnurag S. Maskey 
3876ba597c5SAnurag S. Maskey nwam_error_t
3886ba597c5SAnurag S. Maskey nwam_dup_object_list(void *oldlist, void *newlist)
3896ba597c5SAnurag S. Maskey {
3906ba597c5SAnurag S. Maskey 	int nverr;
3916ba597c5SAnurag S. Maskey 
3926ba597c5SAnurag S. Maskey 	assert(oldlist != NULL && newlist != NULL);
3936ba597c5SAnurag S. Maskey 
3946ba597c5SAnurag S. Maskey 	if ((nverr = nvlist_dup(oldlist, newlist, 0)) != 0)
3956ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
3966ba597c5SAnurag S. Maskey 
3976ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
3986ba597c5SAnurag S. Maskey }
3996ba597c5SAnurag S. Maskey 
4006ba597c5SAnurag S. Maskey /* Add child object list to parent object list using property name childname */
4016ba597c5SAnurag S. Maskey nwam_error_t
4026ba597c5SAnurag S. Maskey nwam_object_list_add_object_list(void *parentlist, char *childname,
4036ba597c5SAnurag S. Maskey     void *childlist)
4046ba597c5SAnurag S. Maskey {
4056ba597c5SAnurag S. Maskey 	return (nwam_errno_to_nwam_error(nvlist_add_nvlist(parentlist,
4066ba597c5SAnurag S. Maskey 	    childname, childlist)));
4076ba597c5SAnurag S. Maskey }
4086ba597c5SAnurag S. Maskey 
4096ba597c5SAnurag S. Maskey /* Remove object list from parent object list */
4106ba597c5SAnurag S. Maskey nwam_error_t
4116ba597c5SAnurag S. Maskey nwam_object_list_remove_object_list(void *parentlist, char *childname)
4126ba597c5SAnurag S. Maskey {
4136ba597c5SAnurag S. Maskey 	return (nwam_errno_to_nwam_error(nvlist_remove_all(parentlist,
4146ba597c5SAnurag S. Maskey 	    childname)));
4156ba597c5SAnurag S. Maskey }
4166ba597c5SAnurag S. Maskey 
4176ba597c5SAnurag S. Maskey /*
4186ba597c5SAnurag S. Maskey  * Get next object list (nvlist) after lastname.  Used to walk NCUs, ENMs and
4196ba597c5SAnurag S. Maskey  * locations, each of which is internally represented as an nvlist.
4206ba597c5SAnurag S. Maskey  */
4216ba597c5SAnurag S. Maskey nwam_error_t
4226ba597c5SAnurag S. Maskey nwam_next_object_list(void *parentlist, char *lastname, char **childnamep,
4236ba597c5SAnurag S. Maskey     void *childlistp)
4246ba597c5SAnurag S. Maskey {
4256ba597c5SAnurag S. Maskey 	nvpair_t *last = NULL, *next;
4266ba597c5SAnurag S. Maskey 	int nverr;
4276ba597c5SAnurag S. Maskey 
4286ba597c5SAnurag S. Maskey 	if (lastname != NULL) {
4296ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_lookup_nvpair(parentlist, lastname, &last))
4306ba597c5SAnurag S. Maskey 		    != 0)
4316ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
4326ba597c5SAnurag S. Maskey 	}
4336ba597c5SAnurag S. Maskey 	if ((next = nvlist_next_nvpair(parentlist, last)) == NULL)
4346ba597c5SAnurag S. Maskey 		return (NWAM_LIST_END);
4356ba597c5SAnurag S. Maskey 
4366ba597c5SAnurag S. Maskey 	*childnamep = nvpair_name(next);
4376ba597c5SAnurag S. Maskey 
4386ba597c5SAnurag S. Maskey 	if (nvpair_type(next) != DATA_TYPE_NVLIST)
4396ba597c5SAnurag S. Maskey 		return (NWAM_ERROR_INTERNAL);
4406ba597c5SAnurag S. Maskey 
4416ba597c5SAnurag S. Maskey 	if ((nverr = nvpair_value_nvlist(next, childlistp)) != NWAM_SUCCESS)
4426ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
4436ba597c5SAnurag S. Maskey 
4446ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
4456ba597c5SAnurag S. Maskey }
4466ba597c5SAnurag S. Maskey 
4476ba597c5SAnurag S. Maskey /*
4486ba597c5SAnurag S. Maskey  * Pack nvlist into contiguous memory. If packed_listp is NULL, we just
4496ba597c5SAnurag S. Maskey  * return the size of the memory needed to do so.
4506ba597c5SAnurag S. Maskey  */
4516ba597c5SAnurag S. Maskey nwam_error_t
4526ba597c5SAnurag S. Maskey nwam_pack_object_list(void *list, char **packed_listp, size_t *packed_sizep)
4536ba597c5SAnurag S. Maskey {
4546ba597c5SAnurag S. Maskey 	int nverr;
4556ba597c5SAnurag S. Maskey 
4566ba597c5SAnurag S. Maskey 	assert(list != NULL && packed_sizep != NULL);
4576ba597c5SAnurag S. Maskey 
4586ba597c5SAnurag S. Maskey 	if (packed_listp == NULL) {
4596ba597c5SAnurag S. Maskey 		nverr = nvlist_size(list, packed_sizep, NV_ENCODE_XDR);
4606ba597c5SAnurag S. Maskey 	} else {
4616ba597c5SAnurag S. Maskey 		nverr = nvlist_pack(list, packed_listp, packed_sizep,
4626ba597c5SAnurag S. Maskey 		    NV_ENCODE_XDR, 0);
4636ba597c5SAnurag S. Maskey 	}
4646ba597c5SAnurag S. Maskey 
4656ba597c5SAnurag S. Maskey 	if (nverr != 0)
4666ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
4676ba597c5SAnurag S. Maskey 
4686ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
4696ba597c5SAnurag S. Maskey }
4706ba597c5SAnurag S. Maskey 
4716ba597c5SAnurag S. Maskey nwam_error_t
4726ba597c5SAnurag S. Maskey nwam_unpack_object_list(char *packed_list, size_t packed_size,
4736ba597c5SAnurag S. Maskey     void *list)
4746ba597c5SAnurag S. Maskey {
4756ba597c5SAnurag S. Maskey 	int nverr;
4766ba597c5SAnurag S. Maskey 
4776ba597c5SAnurag S. Maskey 	assert(packed_list != NULL && list != NULL);
4786ba597c5SAnurag S. Maskey 
4796ba597c5SAnurag S. Maskey 	*((nvlist_t **)list) = NULL;
4806ba597c5SAnurag S. Maskey 
4816ba597c5SAnurag S. Maskey 	nverr = nvlist_unpack(packed_list, packed_size, (nvlist_t **)list, 0);
4826ba597c5SAnurag S. Maskey 
4836ba597c5SAnurag S. Maskey 	if (nverr != 0)
4846ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
4856ba597c5SAnurag S. Maskey 
4866ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
4876ba597c5SAnurag S. Maskey }
4886ba597c5SAnurag S. Maskey 
4896ba597c5SAnurag S. Maskey /*
4906ba597c5SAnurag S. Maskey  * Functions to walk, set and get properties in nvlist, translating
4916ba597c5SAnurag S. Maskey  * between nwam_value_t and nvlist/nvpair representations.
4926ba597c5SAnurag S. Maskey  */
4936ba597c5SAnurag S. Maskey nwam_error_t
4946ba597c5SAnurag S. Maskey nwam_next_object_prop(void *list, char *lastname, char **namep,
4956ba597c5SAnurag S. Maskey     nwam_value_t *valuep)
4966ba597c5SAnurag S. Maskey {
4976ba597c5SAnurag S. Maskey 	nvpair_t *last = NULL, *next;
4986ba597c5SAnurag S. Maskey 	int nverr;
4996ba597c5SAnurag S. Maskey 
5006ba597c5SAnurag S. Maskey 	if (lastname != NULL) {
5016ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_lookup_nvpair(list, lastname, &last)) != 0)
5026ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
5036ba597c5SAnurag S. Maskey 	}
5046ba597c5SAnurag S. Maskey 	if ((next = nvlist_next_nvpair(list, last)) == NULL)
5056ba597c5SAnurag S. Maskey 		return (NWAM_LIST_END);
5066ba597c5SAnurag S. Maskey 
5076ba597c5SAnurag S. Maskey 	*namep = nvpair_name(next);
5086ba597c5SAnurag S. Maskey 
5096ba597c5SAnurag S. Maskey 	return (nwam_get_prop_value(list, (const char *)*namep, valuep));
5106ba597c5SAnurag S. Maskey }
5116ba597c5SAnurag S. Maskey 
5126ba597c5SAnurag S. Maskey nwam_error_t
5136ba597c5SAnurag S. Maskey nwam_get_prop_value(void *list, const char *name, nwam_value_t *valuep)
5146ba597c5SAnurag S. Maskey {
5156ba597c5SAnurag S. Maskey 	nvpair_t *prop;
5166ba597c5SAnurag S. Maskey 	nwam_error_t err;
5176ba597c5SAnurag S. Maskey 	int nverr;
5186ba597c5SAnurag S. Maskey 	boolean_t *valbool;
5196ba597c5SAnurag S. Maskey 	int64_t *valint64;
5206ba597c5SAnurag S. Maskey 	uint64_t *valuint64;
5216ba597c5SAnurag S. Maskey 	char **valstr;
5226ba597c5SAnurag S. Maskey 	uint_t numvalues;
5236ba597c5SAnurag S. Maskey 
5246ba597c5SAnurag S. Maskey 	assert(valuep != NULL);
5256ba597c5SAnurag S. Maskey 
5266ba597c5SAnurag S. Maskey 	*valuep = NULL;
5276ba597c5SAnurag S. Maskey 
5286ba597c5SAnurag S. Maskey 	if ((nverr = nvlist_lookup_nvpair(list, name, &prop)) != 0) {
5296ba597c5SAnurag S. Maskey 		/* convert EINVAL to NOT_FOUND */
5306ba597c5SAnurag S. Maskey 		if (nverr == EINVAL)
5316ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_NOT_FOUND);
5326ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
5336ba597c5SAnurag S. Maskey 	}
5346ba597c5SAnurag S. Maskey 
5356ba597c5SAnurag S. Maskey 	switch (nvpair_type(prop)) {
5366ba597c5SAnurag S. Maskey 	case DATA_TYPE_BOOLEAN_ARRAY:
5376ba597c5SAnurag S. Maskey 		if ((nverr = nvpair_value_boolean_array(prop,
5386ba597c5SAnurag S. Maskey 		    &valbool, &numvalues)) != 0)
5396ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
5406ba597c5SAnurag S. Maskey 		if ((err = nwam_value_create_boolean_array(valbool, numvalues,
5416ba597c5SAnurag S. Maskey 		    valuep)) != NWAM_SUCCESS)
5426ba597c5SAnurag S. Maskey 			return (err);
5436ba597c5SAnurag S. Maskey 		break;
5446ba597c5SAnurag S. Maskey 	case DATA_TYPE_INT64_ARRAY:
5456ba597c5SAnurag S. Maskey 		if ((nverr = nvpair_value_int64_array(prop,
5466ba597c5SAnurag S. Maskey 		    &valint64, &numvalues)) != 0)
5476ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
5486ba597c5SAnurag S. Maskey 		if ((err = nwam_value_create_int64_array(valint64, numvalues,
5496ba597c5SAnurag S. Maskey 		    valuep)) != NWAM_SUCCESS)
5506ba597c5SAnurag S. Maskey 			return (err);
5516ba597c5SAnurag S. Maskey 		break;
5526ba597c5SAnurag S. Maskey 	case DATA_TYPE_UINT64_ARRAY:
5536ba597c5SAnurag S. Maskey 		if ((nverr = nvpair_value_uint64_array(prop,
5546ba597c5SAnurag S. Maskey 		    &valuint64, &numvalues)) != 0)
5556ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
5566ba597c5SAnurag S. Maskey 		if ((err = nwam_value_create_uint64_array(valuint64, numvalues,
5576ba597c5SAnurag S. Maskey 		    valuep)) != NWAM_SUCCESS)
5586ba597c5SAnurag S. Maskey 			return (err);
5596ba597c5SAnurag S. Maskey 		break;
5606ba597c5SAnurag S. Maskey 	case DATA_TYPE_STRING_ARRAY:
5616ba597c5SAnurag S. Maskey 		if ((nverr = nvpair_value_string_array(prop,
5626ba597c5SAnurag S. Maskey 		    &valstr, &numvalues)) != 0)
5636ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
5646ba597c5SAnurag S. Maskey 		if ((err = nwam_value_create_string_array(valstr, numvalues,
5656ba597c5SAnurag S. Maskey 		    valuep)) != NWAM_SUCCESS)
5666ba597c5SAnurag S. Maskey 			return (err);
5676ba597c5SAnurag S. Maskey 		break;
5686ba597c5SAnurag S. Maskey 	default:
5696ba597c5SAnurag S. Maskey 		/* Should not happen */
5706ba597c5SAnurag S. Maskey 		return (NWAM_ERROR_INTERNAL);
5716ba597c5SAnurag S. Maskey 	}
5726ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
5736ba597c5SAnurag S. Maskey }
5746ba597c5SAnurag S. Maskey 
5756ba597c5SAnurag S. Maskey nwam_error_t
5766ba597c5SAnurag S. Maskey nwam_delete_prop(void *list, const char *name)
5776ba597c5SAnurag S. Maskey {
5786ba597c5SAnurag S. Maskey 	int nverr;
5796ba597c5SAnurag S. Maskey 
5806ba597c5SAnurag S. Maskey 	if ((nverr = nvlist_remove_all(list, name)) != 0)
5816ba597c5SAnurag S. Maskey 		return (nwam_errno_to_nwam_error(nverr));
5826ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
5836ba597c5SAnurag S. Maskey }
5846ba597c5SAnurag S. Maskey 
5856ba597c5SAnurag S. Maskey nwam_error_t
5866ba597c5SAnurag S. Maskey nwam_set_prop_value(void *list, const char *propname, nwam_value_t value)
5876ba597c5SAnurag S. Maskey {
5886ba597c5SAnurag S. Maskey 	int nverr;
5896ba597c5SAnurag S. Maskey 	nwam_error_t err;
5906ba597c5SAnurag S. Maskey 	nwam_value_type_t type;
5916ba597c5SAnurag S. Maskey 	uint_t numvalues;
5926ba597c5SAnurag S. Maskey 	boolean_t *valbool;
5936ba597c5SAnurag S. Maskey 	int64_t *valint64;
5946ba597c5SAnurag S. Maskey 	uint64_t *valuint64;
5956ba597c5SAnurag S. Maskey 	char **valstr;
5966ba597c5SAnurag S. Maskey 
5976ba597c5SAnurag S. Maskey 	assert(list != NULL && value != NULL);
5986ba597c5SAnurag S. Maskey 
5996ba597c5SAnurag S. Maskey 	if ((err = nwam_value_get_type(value, &type)) != NWAM_SUCCESS)
6006ba597c5SAnurag S. Maskey 		return (err);
6016ba597c5SAnurag S. Maskey 
6026ba597c5SAnurag S. Maskey 	switch (type) {
6036ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_BOOLEAN:
6046ba597c5SAnurag S. Maskey 		if ((err = nwam_value_get_boolean_array(value, &valbool,
6056ba597c5SAnurag S. Maskey 		    &numvalues)) != NWAM_SUCCESS)
6066ba597c5SAnurag S. Maskey 			return (err);
6076ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_add_boolean_array(list, propname,
6086ba597c5SAnurag S. Maskey 		    valbool, numvalues)) != 0)
6096ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
6106ba597c5SAnurag S. Maskey 		break;
6116ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_INT64:
6126ba597c5SAnurag S. Maskey 		if ((err = nwam_value_get_int64_array(value, &valint64,
6136ba597c5SAnurag S. Maskey 		    &numvalues)) != NWAM_SUCCESS)
6146ba597c5SAnurag S. Maskey 			return (err);
6156ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_add_int64_array(list, propname,
6166ba597c5SAnurag S. Maskey 		    valint64, numvalues)) != 0)
6176ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
6186ba597c5SAnurag S. Maskey 		break;
6196ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_UINT64:
6206ba597c5SAnurag S. Maskey 		if ((err = nwam_value_get_uint64_array(value, &valuint64,
6216ba597c5SAnurag S. Maskey 		    &numvalues)) != NWAM_SUCCESS)
6226ba597c5SAnurag S. Maskey 			return (err);
6236ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_add_uint64_array(list, propname,
6246ba597c5SAnurag S. Maskey 		    valuint64, numvalues)) != 0)
6256ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
6266ba597c5SAnurag S. Maskey 		break;
6276ba597c5SAnurag S. Maskey 	case NWAM_VALUE_TYPE_STRING:
6286ba597c5SAnurag S. Maskey 		if ((err = nwam_value_get_string_array(value, &valstr,
6296ba597c5SAnurag S. Maskey 		    &numvalues)) != NWAM_SUCCESS)
6306ba597c5SAnurag S. Maskey 			return (err);
6316ba597c5SAnurag S. Maskey 		if ((nverr = nvlist_add_string_array(list, propname,
6326ba597c5SAnurag S. Maskey 		    valstr, numvalues)) != 0)
6336ba597c5SAnurag S. Maskey 			return (nwam_errno_to_nwam_error(nverr));
6346ba597c5SAnurag S. Maskey 		break;
6356ba597c5SAnurag S. Maskey 	default:
6366ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
6376ba597c5SAnurag S. Maskey 	}
6386ba597c5SAnurag S. Maskey 
6396ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
6406ba597c5SAnurag S. Maskey }
6416ba597c5SAnurag S. Maskey 
6426ba597c5SAnurag S. Maskey /* Map uint64 values to their string counterparts */
6436ba597c5SAnurag S. Maskey 
6446ba597c5SAnurag S. Maskey struct nwam_value_entry {
6456ba597c5SAnurag S. Maskey 	const char	*value_string;
6466ba597c5SAnurag S. Maskey 	uint64_t		value;
6476ba597c5SAnurag S. Maskey };
6486ba597c5SAnurag S. Maskey 
6496ba597c5SAnurag S. Maskey struct nwam_value_entry prop_activation_mode_value_entries[] =
6506ba597c5SAnurag S. Maskey {
6516ba597c5SAnurag S. Maskey 	{ NWAM_ACTIVATION_MODE_MANUAL_STRING, NWAM_ACTIVATION_MODE_MANUAL },
6526ba597c5SAnurag S. Maskey 	{ NWAM_ACTIVATION_MODE_SYSTEM_STRING, NWAM_ACTIVATION_MODE_SYSTEM },
6536ba597c5SAnurag S. Maskey 	{ NWAM_ACTIVATION_MODE_CONDITIONAL_ANY_STRING,
6546ba597c5SAnurag S. Maskey 	NWAM_ACTIVATION_MODE_CONDITIONAL_ANY },
6556ba597c5SAnurag S. Maskey 	{ NWAM_ACTIVATION_MODE_CONDITIONAL_ALL_STRING,
6566ba597c5SAnurag S. Maskey 	NWAM_ACTIVATION_MODE_CONDITIONAL_ALL },
6576ba597c5SAnurag S. Maskey 	{ NWAM_ACTIVATION_MODE_PRIORITIZED_STRING,
6586ba597c5SAnurag S. Maskey 	NWAM_ACTIVATION_MODE_PRIORITIZED },
6596ba597c5SAnurag S. Maskey 	{ NULL, 0 }
6606ba597c5SAnurag S. Maskey };
6616ba597c5SAnurag S. Maskey 
6626ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_type_entries[] =
6636ba597c5SAnurag S. Maskey {
6646ba597c5SAnurag S. Maskey 	{ NWAM_NCU_TYPE_LINK_STRING, NWAM_NCU_TYPE_LINK },
6656ba597c5SAnurag S. Maskey 	{ NWAM_NCU_TYPE_INTERFACE_STRING, NWAM_NCU_TYPE_INTERFACE },
6666ba597c5SAnurag S. Maskey 	{ NULL, 0 }
6676ba597c5SAnurag S. Maskey };
6686ba597c5SAnurag S. Maskey 
6696ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_class_entries[] =
6706ba597c5SAnurag S. Maskey {
6716ba597c5SAnurag S. Maskey 	{ NWAM_NCU_CLASS_PHYS_STRING, NWAM_NCU_CLASS_PHYS },
6726ba597c5SAnurag S. Maskey 	{ NWAM_NCU_CLASS_IP_STRING, NWAM_NCU_CLASS_IP },
6736ba597c5SAnurag S. Maskey 	{ NULL, 0 }
6746ba597c5SAnurag S. Maskey };
6756ba597c5SAnurag S. Maskey 
6766ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ip_version_entries[] =
6776ba597c5SAnurag S. Maskey {
6786ba597c5SAnurag S. Maskey 	{ NWAM_IP_VERSION_IPV4_STRING, IPV4_VERSION },
6796ba597c5SAnurag S. Maskey 	{ NWAM_IP_VERSION_IPV6_STRING, IPV6_VERSION },
6806ba597c5SAnurag S. Maskey 	{ NULL, 0 }
6816ba597c5SAnurag S. Maskey };
6826ba597c5SAnurag S. Maskey 
6836ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ipv4_addrsrc_entries[] =
6846ba597c5SAnurag S. Maskey {
6856ba597c5SAnurag S. Maskey 	{ NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP },
6866ba597c5SAnurag S. Maskey 	{ NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC },
6876ba597c5SAnurag S. Maskey 	{ NULL, 0 }
6886ba597c5SAnurag S. Maskey };
6896ba597c5SAnurag S. Maskey 
6906ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_ipv6_addrsrc_entries[] =
6916ba597c5SAnurag S. Maskey {
6926ba597c5SAnurag S. Maskey 	{ NWAM_ADDRSRC_DHCP_STRING, NWAM_ADDRSRC_DHCP },
6936ba597c5SAnurag S. Maskey 	{ NWAM_ADDRSRC_STATIC_STRING, NWAM_ADDRSRC_STATIC },
6946ba597c5SAnurag S. Maskey 	{ NWAM_ADDRSRC_AUTOCONF_STRING, NWAM_ADDRSRC_AUTOCONF },
6956ba597c5SAnurag S. Maskey 	{ NULL, 0 }
6966ba597c5SAnurag S. Maskey };
6976ba597c5SAnurag S. Maskey 
6986ba597c5SAnurag S. Maskey struct nwam_value_entry ncu_prop_priority_mode_entries[] =
6996ba597c5SAnurag S. Maskey {
7006ba597c5SAnurag S. Maskey 	{ NWAM_PRIORITY_MODE_EXCLUSIVE_STRING, NWAM_PRIORITY_MODE_EXCLUSIVE },
7016ba597c5SAnurag S. Maskey 	{ NWAM_PRIORITY_MODE_SHARED_STRING, NWAM_PRIORITY_MODE_SHARED },
7026ba597c5SAnurag S. Maskey 	{ NWAM_PRIORITY_MODE_ALL_STRING, NWAM_PRIORITY_MODE_ALL },
7036ba597c5SAnurag S. Maskey 	{ NULL, 0 }
7046ba597c5SAnurag S. Maskey };
7056ba597c5SAnurag S. Maskey 
7066ba597c5SAnurag S. Maskey struct nwam_value_entry loc_prop_nameservices_entries[] =
7076ba597c5SAnurag S. Maskey {
7086ba597c5SAnurag S. Maskey 	{ NWAM_NAMESERVICES_DNS_STRING, NWAM_NAMESERVICES_DNS },
7096ba597c5SAnurag S. Maskey 	{ NWAM_NAMESERVICES_FILES_STRING, NWAM_NAMESERVICES_FILES },
7106ba597c5SAnurag S. Maskey 	{ NWAM_NAMESERVICES_NIS_STRING, NWAM_NAMESERVICES_NIS },
7116ba597c5SAnurag S. Maskey 	{ NWAM_NAMESERVICES_LDAP_STRING, NWAM_NAMESERVICES_LDAP },
7126ba597c5SAnurag S. Maskey 	{ NULL, 0 }
7136ba597c5SAnurag S. Maskey };
7146ba597c5SAnurag S. Maskey 
7156ba597c5SAnurag S. Maskey struct nwam_value_entry loc_prop_nameservice_configsrc_entries[] =
7166ba597c5SAnurag S. Maskey {
7176ba597c5SAnurag S. Maskey 	{ NWAM_CONFIGSRC_MANUAL_STRING, NWAM_CONFIGSRC_MANUAL },
7186ba597c5SAnurag S. Maskey 	{ NWAM_CONFIGSRC_DHCP_STRING, NWAM_CONFIGSRC_DHCP },
7196ba597c5SAnurag S. Maskey 	{ NULL, 0 }
7206ba597c5SAnurag S. Maskey };
7216ba597c5SAnurag S. Maskey 
7226ba597c5SAnurag S. Maskey struct nwam_value_entry known_wlan_prop_security_mode_entries[] =
7236ba597c5SAnurag S. Maskey {
7246ba597c5SAnurag S. Maskey 	{ "none", DLADM_WLAN_SECMODE_NONE },
7256ba597c5SAnurag S. Maskey 	{ "wep", DLADM_WLAN_SECMODE_WEP },
7266ba597c5SAnurag S. Maskey 	{ "wpa", DLADM_WLAN_SECMODE_WPA },
7276ba597c5SAnurag S. Maskey 	{ NULL, 0 }
7286ba597c5SAnurag S. Maskey };
7296ba597c5SAnurag S. Maskey 
7306ba597c5SAnurag S. Maskey struct nwam_prop_value_entry {
7316ba597c5SAnurag S. Maskey 	const char		*prop_name;
7326ba597c5SAnurag S. Maskey 	struct nwam_value_entry	*value_entries;
7336ba597c5SAnurag S. Maskey } prop_value_entry_table[] =
7346ba597c5SAnurag S. Maskey {
7356ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries },
7366ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_TYPE, ncu_prop_type_entries },
7376ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_CLASS, ncu_prop_class_entries },
7386ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IP_VERSION, ncu_prop_ip_version_entries },
7396ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IPV4_ADDRSRC, ncu_prop_ipv4_addrsrc_entries },
7406ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_IPV6_ADDRSRC, ncu_prop_ipv6_addrsrc_entries },
7416ba597c5SAnurag S. Maskey 	{ NWAM_NCU_PROP_PRIORITY_MODE, ncu_prop_priority_mode_entries },
7426ba597c5SAnurag S. Maskey 	{ NWAM_ENM_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries },
7436ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_ACTIVATION_MODE, prop_activation_mode_value_entries },
7446ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_NAMESERVICES, loc_prop_nameservices_entries },
7456ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_DNS_NAMESERVICE_CONFIGSRC,
7466ba597c5SAnurag S. Maskey 	    loc_prop_nameservice_configsrc_entries },
7476ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_NIS_NAMESERVICE_CONFIGSRC,
7486ba597c5SAnurag S. Maskey 	    loc_prop_nameservice_configsrc_entries },
7496ba597c5SAnurag S. Maskey 	{ NWAM_LOC_PROP_LDAP_NAMESERVICE_CONFIGSRC,
7506ba597c5SAnurag S. Maskey 	    loc_prop_nameservice_configsrc_entries },
7516ba597c5SAnurag S. Maskey 	{ NWAM_KNOWN_WLAN_PROP_SECURITY_MODE,
7526ba597c5SAnurag S. Maskey 	    known_wlan_prop_security_mode_entries },
7536ba597c5SAnurag S. Maskey 	{ NULL, NULL }
7546ba597c5SAnurag S. Maskey };
7556ba597c5SAnurag S. Maskey 
7566ba597c5SAnurag S. Maskey /*
7576ba597c5SAnurag S. Maskey  * Convert uint64 values for property propname into a string representing
7586ba597c5SAnurag S. Maskey  * that value. Used by enum values.
7596ba597c5SAnurag S. Maskey  */
7606ba597c5SAnurag S. Maskey nwam_error_t
7616ba597c5SAnurag S. Maskey nwam_uint64_get_value_string(const char *propname, uint64_t val,
7626ba597c5SAnurag S. Maskey     const char **valstrp)
7636ba597c5SAnurag S. Maskey {
7646ba597c5SAnurag S. Maskey 	int i, j;
7656ba597c5SAnurag S. Maskey 	int max = 0; /* largest enum value seen so far */
7666ba597c5SAnurag S. Maskey 	struct nwam_value_entry *value_entries;
7676ba597c5SAnurag S. Maskey 
7686ba597c5SAnurag S. Maskey 	assert(propname != NULL && valstrp != NULL);
7696ba597c5SAnurag S. Maskey 
7706ba597c5SAnurag S. Maskey 	for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) {
7716ba597c5SAnurag S. Maskey 		if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0)
7726ba597c5SAnurag S. Maskey 			continue;
7736ba597c5SAnurag S. Maskey 
7746ba597c5SAnurag S. Maskey 		value_entries = prop_value_entry_table[i].value_entries;
7756ba597c5SAnurag S. Maskey 
7766ba597c5SAnurag S. Maskey 		for (j = 0; value_entries[j].value_string != NULL; j++) {
7776ba597c5SAnurag S. Maskey 			if (value_entries[j].value == val) {
7786ba597c5SAnurag S. Maskey 				*valstrp = value_entries[j].value_string;
7796ba597c5SAnurag S. Maskey 				return (NWAM_SUCCESS);
7806ba597c5SAnurag S. Maskey 			}
7816ba597c5SAnurag S. Maskey 			max = value_entries[j].value > max ?
7826ba597c5SAnurag S. Maskey 			    value_entries[j].value : max;
7836ba597c5SAnurag S. Maskey 		}
7846ba597c5SAnurag S. Maskey 		/*
7856ba597c5SAnurag S. Maskey 		 * If trying to get the string for an enum value that doesn't
7866ba597c5SAnurag S. Maskey 		 * exist, return NWAM_LIST_END.  Otherwise, the input enum
7876ba597c5SAnurag S. Maskey 		 * value doesn't exist for the given property.
7886ba597c5SAnurag S. Maskey 		 */
7896ba597c5SAnurag S. Maskey 		if (val > max)
7906ba597c5SAnurag S. Maskey 			return (NWAM_LIST_END);
7916ba597c5SAnurag S. Maskey 		else
7926ba597c5SAnurag S. Maskey 			return (NWAM_ENTITY_INVALID_VALUE);
7936ba597c5SAnurag S. Maskey 	}
7946ba597c5SAnurag S. Maskey 	return (NWAM_INVALID_ARG);
7956ba597c5SAnurag S. Maskey }
7966ba597c5SAnurag S. Maskey 
7976ba597c5SAnurag S. Maskey /*
7986ba597c5SAnurag S. Maskey  * Convert string to appropriate uint64 value.
7996ba597c5SAnurag S. Maskey  */
8006ba597c5SAnurag S. Maskey nwam_error_t
8016ba597c5SAnurag S. Maskey nwam_value_string_get_uint64(const char *propname, const char *valstr,
8026ba597c5SAnurag S. Maskey     uint64_t *valp)
8036ba597c5SAnurag S. Maskey {
8046ba597c5SAnurag S. Maskey 	int i, j;
8056ba597c5SAnurag S. Maskey 	struct nwam_value_entry *value_entries;
8066ba597c5SAnurag S. Maskey 
8076ba597c5SAnurag S. Maskey 	assert(propname != NULL && valstr != NULL && valp != NULL);
8086ba597c5SAnurag S. Maskey 
8096ba597c5SAnurag S. Maskey 	for (i = 0; prop_value_entry_table[i].prop_name != NULL; i++) {
8106ba597c5SAnurag S. Maskey 		if (strcmp(prop_value_entry_table[i].prop_name, propname) != 0)
8116ba597c5SAnurag S. Maskey 			continue;
8126ba597c5SAnurag S. Maskey 
8136ba597c5SAnurag S. Maskey 		value_entries = prop_value_entry_table[i].value_entries;
8146ba597c5SAnurag S. Maskey 
8156ba597c5SAnurag S. Maskey 		for (j = 0; value_entries[j].value_string != NULL; j++) {
8166ba597c5SAnurag S. Maskey 			if (strcasecmp(value_entries[j].value_string, valstr)
8176ba597c5SAnurag S. Maskey 			    == 0) {
8186ba597c5SAnurag S. Maskey 				*valp = value_entries[j].value;
8196ba597c5SAnurag S. Maskey 				return (NWAM_SUCCESS);
8206ba597c5SAnurag S. Maskey 			}
8216ba597c5SAnurag S. Maskey 		}
8226ba597c5SAnurag S. Maskey 		return (NWAM_ENTITY_INVALID_VALUE);
8236ba597c5SAnurag S. Maskey 	}
8246ba597c5SAnurag S. Maskey 	return (NWAM_INVALID_ARG);
8256ba597c5SAnurag S. Maskey }
8266ba597c5SAnurag S. Maskey 
8276ba597c5SAnurag S. Maskey /* Conditional activation functions */
8286ba597c5SAnurag S. Maskey 
8296ba597c5SAnurag S. Maskey nwam_error_t
8306ba597c5SAnurag S. Maskey nwam_condition_to_condition_string(nwam_condition_object_type_t object_type,
8316ba597c5SAnurag S. Maskey     nwam_condition_t condition, const char *object_name, char **stringp)
8326ba597c5SAnurag S. Maskey {
8336ba597c5SAnurag S. Maskey 	char *object_type_string, *condition_string;
8346ba597c5SAnurag S. Maskey 	char *string;
8356ba597c5SAnurag S. Maskey 
8366ba597c5SAnurag S. Maskey 	assert(stringp != NULL);
8376ba597c5SAnurag S. Maskey 
8386ba597c5SAnurag S. Maskey 	*stringp = NULL;
8396ba597c5SAnurag S. Maskey 
8406ba597c5SAnurag S. Maskey 	switch (object_type) {
8416ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCP:
8426ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCP_STRING;
8436ba597c5SAnurag S. Maskey 		break;
8446ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCU:
8456ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_NCU_STRING;
8466ba597c5SAnurag S. Maskey 		break;
8476ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ENM:
8486ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_ENM_STRING;
8496ba597c5SAnurag S. Maskey 		break;
8506ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_LOC:
8516ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_LOC_STRING;
8526ba597c5SAnurag S. Maskey 		break;
8536ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS:
8546ba597c5SAnurag S. Maskey 		object_type_string =
8556ba597c5SAnurag S. Maskey 		    NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS_STRING;
8566ba597c5SAnurag S. Maskey 		break;
8576ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN:
8586ba597c5SAnurag S. Maskey 		object_type_string =
8596ba597c5SAnurag S. Maskey 		    NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN_STRING;
8606ba597c5SAnurag S. Maskey 		break;
8616ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN:
8626ba597c5SAnurag S. Maskey 		object_type_string =
8636ba597c5SAnurag S. Maskey 		    NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN_STRING;
8646ba597c5SAnurag S. Maskey 		break;
8656ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ESSID:
8666ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_ESSID_STRING;
8676ba597c5SAnurag S. Maskey 		break;
8686ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_BSSID:
8696ba597c5SAnurag S. Maskey 		object_type_string = NWAM_CONDITION_OBJECT_TYPE_BSSID_STRING;
8706ba597c5SAnurag S. Maskey 		break;
8716ba597c5SAnurag S. Maskey 	default:
8726ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
8736ba597c5SAnurag S. Maskey 
8746ba597c5SAnurag S. Maskey 	}
8756ba597c5SAnurag S. Maskey 	switch (condition) {
8766ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS:
8776ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_IS_STRING;
8786ba597c5SAnurag S. Maskey 		break;
8796ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_NOT:
8806ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_IS_NOT_STRING;
8816ba597c5SAnurag S. Maskey 		break;
8826ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_CONTAINS:
8836ba597c5SAnurag S. Maskey 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN &&
8846ba597c5SAnurag S. Maskey 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN &&
8856ba597c5SAnurag S. Maskey 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID)
8866ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
8876ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_CONTAINS_STRING;
8886ba597c5SAnurag S. Maskey 		break;
8896ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_DOES_NOT_CONTAIN:
8906ba597c5SAnurag S. Maskey 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN &&
8916ba597c5SAnurag S. Maskey 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN &&
8926ba597c5SAnurag S. Maskey 		    object_type != NWAM_CONDITION_OBJECT_TYPE_ESSID)
8936ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
8946ba597c5SAnurag S. Maskey 
8956ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_DOES_NOT_CONTAIN_STRING;
8966ba597c5SAnurag S. Maskey 		break;
8976ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_IN_RANGE:
8986ba597c5SAnurag S. Maskey 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS)
8996ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
9006ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_IS_IN_RANGE_STRING;
9016ba597c5SAnurag S. Maskey 		break;
9026ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_NOT_IN_RANGE:
9036ba597c5SAnurag S. Maskey 		if (object_type != NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS)
9046ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
9056ba597c5SAnurag S. Maskey 		condition_string = NWAM_CONDITION_IS_NOT_IN_RANGE_STRING;
9066ba597c5SAnurag S. Maskey 		break;
9076ba597c5SAnurag S. Maskey 	default:
9086ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
9096ba597c5SAnurag S. Maskey 	}
9106ba597c5SAnurag S. Maskey 	if ((string = malloc(NWAM_MAX_VALUE_LEN)) == NULL)
9116ba597c5SAnurag S. Maskey 		return (NWAM_NO_MEMORY);
9126ba597c5SAnurag S. Maskey 	switch (object_type) {
9136ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCP:
9146ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCU:
9156ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ENM:
9166ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_LOC:
9176ba597c5SAnurag S. Maskey 		(void) snprintf(string, NWAM_MAX_VALUE_LEN,
9186ba597c5SAnurag S. Maskey 		    "%s %s %s active", object_type_string,
9196ba597c5SAnurag S. Maskey 		    object_name, condition_string);
9206ba597c5SAnurag S. Maskey 		*stringp = string;
9216ba597c5SAnurag S. Maskey 		break;
9226ba597c5SAnurag S. Maskey 
9236ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS:
9246ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN:
9256ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN:
9266ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ESSID:
9276ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_BSSID:
9286ba597c5SAnurag S. Maskey 		(void) snprintf(string, NWAM_MAX_VALUE_LEN,
9296ba597c5SAnurag S. Maskey 		    "%s %s %s", object_type_string,
9306ba597c5SAnurag S. Maskey 		    condition_string, object_name);
9316ba597c5SAnurag S. Maskey 		*stringp = string;
9326ba597c5SAnurag S. Maskey 		break;
9336ba597c5SAnurag S. Maskey 
9346ba597c5SAnurag S. Maskey 	default:
9356ba597c5SAnurag S. Maskey 		free(string);
9366ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
9376ba597c5SAnurag S. Maskey 
9386ba597c5SAnurag S. Maskey 	}
9396ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
9406ba597c5SAnurag S. Maskey }
9416ba597c5SAnurag S. Maskey 
9426ba597c5SAnurag S. Maskey nwam_error_t
9436ba597c5SAnurag S. Maskey nwam_condition_string_to_condition(const char *string,
9446ba597c5SAnurag S. Maskey     nwam_condition_object_type_t *object_typep,
9456ba597c5SAnurag S. Maskey     nwam_condition_t *conditionp, char **object_namep)
9466ba597c5SAnurag S. Maskey {
9476ba597c5SAnurag S. Maskey 	char *copy, *lasts;
9486ba597c5SAnurag S. Maskey 	char *object_type_string, *object_name;
9496ba597c5SAnurag S. Maskey 	char *condition_string, *active_string;
9506ba597c5SAnurag S. Maskey 
9516ba597c5SAnurag S. Maskey 	assert(string != NULL && object_typep != NULL && conditionp != NULL &&
9526ba597c5SAnurag S. Maskey 	    object_namep != NULL);
9536ba597c5SAnurag S. Maskey 
9546ba597c5SAnurag S. Maskey 	if ((copy = strdup(string)) == NULL)
9556ba597c5SAnurag S. Maskey 		return (NWAM_NO_MEMORY);
9566ba597c5SAnurag S. Maskey 
9576ba597c5SAnurag S. Maskey 	if ((object_type_string = strtok_r(copy, " \t", &lasts)) == NULL) {
9586ba597c5SAnurag S. Maskey 		free(copy);
9596ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
9606ba597c5SAnurag S. Maskey 	}
9616ba597c5SAnurag S. Maskey 
9626ba597c5SAnurag S. Maskey 	if (strcmp(object_type_string, NWAM_CONDITION_OBJECT_TYPE_NCP_STRING)
9636ba597c5SAnurag S. Maskey 	    == 0)
9646ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_NCP;
9656ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
9666ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_NCU_STRING) == 0)
9676ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_NCU;
9686ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
9696ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_ENM_STRING) == 0)
9706ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_ENM;
9716ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
9726ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_LOC_STRING) == 0)
9736ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_LOC;
9746ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
9756ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS_STRING) == 0)
9766ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS;
9776ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
9786ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN_STRING) == 0)
9796ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN;
9806ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
9816ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN_STRING) == 0)
9826ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN;
9836ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
9846ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_ESSID_STRING) == 0)
9856ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_ESSID;
9866ba597c5SAnurag S. Maskey 	else if (strcmp(object_type_string,
9876ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_OBJECT_TYPE_BSSID_STRING) == 0)
9886ba597c5SAnurag S. Maskey 		*object_typep = NWAM_CONDITION_OBJECT_TYPE_BSSID;
9896ba597c5SAnurag S. Maskey 	else {
9906ba597c5SAnurag S. Maskey 		free(copy);
9916ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
9926ba597c5SAnurag S. Maskey 	}
9936ba597c5SAnurag S. Maskey 
9946ba597c5SAnurag S. Maskey 	if (*object_typep == NWAM_CONDITION_OBJECT_TYPE_NCP ||
9956ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_NCU ||
9966ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_ENM ||
9976ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_LOC) {
9986ba597c5SAnurag S. Maskey 		if ((object_name = strtok_r(NULL, " \t", &lasts)) == NULL) {
9996ba597c5SAnurag S. Maskey 			free(copy);
10006ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
10016ba597c5SAnurag S. Maskey 		}
10026ba597c5SAnurag S. Maskey 		if ((*object_namep = strdup(object_name)) == NULL) {
10036ba597c5SAnurag S. Maskey 			free(copy);
10046ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
10056ba597c5SAnurag S. Maskey 		}
10066ba597c5SAnurag S. Maskey 
10076ba597c5SAnurag S. Maskey 	}
10086ba597c5SAnurag S. Maskey 
10096ba597c5SAnurag S. Maskey 	if ((condition_string = strtok_r(NULL, " \t", &lasts)) == NULL) {
10106ba597c5SAnurag S. Maskey 		free(copy);
10116ba597c5SAnurag S. Maskey 		if (*object_namep != NULL)
10126ba597c5SAnurag S. Maskey 			free(*object_namep);
10136ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
10146ba597c5SAnurag S. Maskey 	}
10156ba597c5SAnurag S. Maskey 	if (strcmp(condition_string, NWAM_CONDITION_IS_STRING) == 0)
10166ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_IS;
10176ba597c5SAnurag S. Maskey 	else if (strcmp(condition_string, NWAM_CONDITION_IS_NOT_STRING) == 0)
10186ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_IS_NOT;
10196ba597c5SAnurag S. Maskey 	else if (strcmp(condition_string, NWAM_CONDITION_CONTAINS_STRING) == 0)
10206ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_CONTAINS;
10216ba597c5SAnurag S. Maskey 	else if (strcmp(condition_string,
10226ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_DOES_NOT_CONTAIN_STRING) == 0)
10236ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_DOES_NOT_CONTAIN;
10246ba597c5SAnurag S. Maskey 	else if (strcmp(condition_string,
10256ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_IS_IN_RANGE_STRING) == 0)
10266ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_IS_IN_RANGE;
10276ba597c5SAnurag S. Maskey 	else if (strcmp(condition_string,
10286ba597c5SAnurag S. Maskey 	    NWAM_CONDITION_IS_NOT_IN_RANGE_STRING) == 0)
10296ba597c5SAnurag S. Maskey 		*conditionp = NWAM_CONDITION_IS_NOT_IN_RANGE;
10306ba597c5SAnurag S. Maskey 	else {
10316ba597c5SAnurag S. Maskey 		free(copy);
10326ba597c5SAnurag S. Maskey 		if (*object_namep != NULL)
10336ba597c5SAnurag S. Maskey 			free(*object_namep);
10346ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
10356ba597c5SAnurag S. Maskey 	}
10366ba597c5SAnurag S. Maskey 
10376ba597c5SAnurag S. Maskey 	if (*object_typep == NWAM_CONDITION_OBJECT_TYPE_NCP ||
10386ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_NCU ||
10396ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_ENM ||
10406ba597c5SAnurag S. Maskey 	    *object_typep == NWAM_CONDITION_OBJECT_TYPE_LOC) {
10416ba597c5SAnurag S. Maskey 		if ((*conditionp != NWAM_CONDITION_IS &&
10426ba597c5SAnurag S. Maskey 		    *conditionp != NWAM_CONDITION_IS_NOT) ||
10436ba597c5SAnurag S. Maskey 		    (active_string = strtok_r(NULL, " \t", &lasts)) == NULL ||
10446ba597c5SAnurag S. Maskey 		    strcmp(active_string, NWAM_CONDITION_ACTIVE_STRING) != 0) {
10456ba597c5SAnurag S. Maskey 			free(copy);
10466ba597c5SAnurag S. Maskey 			free(*object_namep);
10476ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
10486ba597c5SAnurag S. Maskey 		}
10496ba597c5SAnurag S. Maskey 	} else {
10506ba597c5SAnurag S. Maskey 		switch (*conditionp) {
10516ba597c5SAnurag S. Maskey 		case NWAM_CONDITION_CONTAINS:
10526ba597c5SAnurag S. Maskey 		case NWAM_CONDITION_DOES_NOT_CONTAIN:
10536ba597c5SAnurag S. Maskey 			if (*object_typep !=
10546ba597c5SAnurag S. Maskey 			    NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN &&
10556ba597c5SAnurag S. Maskey 			    *object_typep !=
10566ba597c5SAnurag S. Maskey 			    NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN &&
10576ba597c5SAnurag S. Maskey 			    *object_typep != NWAM_CONDITION_OBJECT_TYPE_ESSID) {
10586ba597c5SAnurag S. Maskey 				free(copy);
10596ba597c5SAnurag S. Maskey 				free(*object_namep);
10606ba597c5SAnurag S. Maskey 				return (NWAM_INVALID_ARG);
10616ba597c5SAnurag S. Maskey 			}
10626ba597c5SAnurag S. Maskey 			break;
10636ba597c5SAnurag S. Maskey 		case NWAM_CONDITION_IS_IN_RANGE:
10646ba597c5SAnurag S. Maskey 		case NWAM_CONDITION_IS_NOT_IN_RANGE:
10656ba597c5SAnurag S. Maskey 			if (*object_typep !=
10666ba597c5SAnurag S. Maskey 			    NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS) {
10676ba597c5SAnurag S. Maskey 				free(copy);
10686ba597c5SAnurag S. Maskey 				free(*object_namep);
10696ba597c5SAnurag S. Maskey 				return (NWAM_INVALID_ARG);
10706ba597c5SAnurag S. Maskey 			}
10716ba597c5SAnurag S. Maskey 			break;
10726ba597c5SAnurag S. Maskey 		}
10736ba597c5SAnurag S. Maskey 
10746ba597c5SAnurag S. Maskey 		if ((object_name = strtok_r(NULL, " \t", &lasts)) == NULL) {
10756ba597c5SAnurag S. Maskey 			free(copy);
10766ba597c5SAnurag S. Maskey 			free(*object_namep);
10776ba597c5SAnurag S. Maskey 			return (NWAM_INVALID_ARG);
10786ba597c5SAnurag S. Maskey 		}
10796ba597c5SAnurag S. Maskey 		if ((*object_namep = strdup(object_name)) == NULL) {
10806ba597c5SAnurag S. Maskey 			free(copy);
10816ba597c5SAnurag S. Maskey 			free(*object_namep);
10826ba597c5SAnurag S. Maskey 			return (NWAM_NO_MEMORY);
10836ba597c5SAnurag S. Maskey 		}
10846ba597c5SAnurag S. Maskey 	}
10856ba597c5SAnurag S. Maskey 
10866ba597c5SAnurag S. Maskey 	free(copy);
10876ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
10886ba597c5SAnurag S. Maskey }
10896ba597c5SAnurag S. Maskey 
10906ba597c5SAnurag S. Maskey nwam_error_t
10916ba597c5SAnurag S. Maskey nwam_condition_rate(nwam_condition_object_type_t object_type,
10926ba597c5SAnurag S. Maskey     nwam_condition_t condition, uint64_t *ratep)
10936ba597c5SAnurag S. Maskey {
10946ba597c5SAnurag S. Maskey 	assert(ratep != NULL);
10956ba597c5SAnurag S. Maskey 
10966ba597c5SAnurag S. Maskey 	*ratep = 0;
10976ba597c5SAnurag S. Maskey 
10986ba597c5SAnurag S. Maskey 	switch (object_type) {
10996ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCP:
11006ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_NCU:
11016ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ENM:
11026ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_LOC:
11036ba597c5SAnurag S. Maskey 		(*ratep)++;
11046ba597c5SAnurag S. Maskey 		/* FALLTHRU */
11056ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_SYS_DOMAIN:
11066ba597c5SAnurag S. Maskey 		(*ratep)++;
11076ba597c5SAnurag S. Maskey 		/* FALLTHRU */
11086ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ADV_DOMAIN:
11096ba597c5SAnurag S. Maskey 		(*ratep)++;
11106ba597c5SAnurag S. Maskey 		/* FALLTHRU */
11116ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_IP_ADDRESS:
11126ba597c5SAnurag S. Maskey 		(*ratep)++;
11136ba597c5SAnurag S. Maskey 		/* FALLTHRU */
11146ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_BSSID:
11156ba597c5SAnurag S. Maskey 		(*ratep)++;
11166ba597c5SAnurag S. Maskey 		/* FALLTHRU */
11176ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_OBJECT_TYPE_ESSID:
11186ba597c5SAnurag S. Maskey 		(*ratep)++;
11196ba597c5SAnurag S. Maskey 		break;
11206ba597c5SAnurag S. Maskey 	default:
11216ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
11226ba597c5SAnurag S. Maskey 	}
11236ba597c5SAnurag S. Maskey 
11246ba597c5SAnurag S. Maskey 	switch (condition) {
11256ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS:
11266ba597c5SAnurag S. Maskey 		(*ratep)++;
11276ba597c5SAnurag S. Maskey 		/* FALLTHRU */
11286ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_CONTAINS:
11296ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_IN_RANGE:
11306ba597c5SAnurag S. Maskey 		(*ratep)++;
11316ba597c5SAnurag S. Maskey 		/* FALLTHRU */
11326ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_DOES_NOT_CONTAIN:
11336ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_NOT_IN_RANGE:
11346ba597c5SAnurag S. Maskey 		(*ratep)++;
11356ba597c5SAnurag S. Maskey 		/* FALLTHRU */
11366ba597c5SAnurag S. Maskey 	case NWAM_CONDITION_IS_NOT:
11376ba597c5SAnurag S. Maskey 		(*ratep)++;
11386ba597c5SAnurag S. Maskey 		break;
11396ba597c5SAnurag S. Maskey 	default:
11406ba597c5SAnurag S. Maskey 		return (NWAM_INVALID_ARG);
11416ba597c5SAnurag S. Maskey 	}
11426ba597c5SAnurag S. Maskey 	return (NWAM_SUCCESS);
11436ba597c5SAnurag S. Maskey }
1144