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 /*
2319cbc0aaSAnurag S. Maskey  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
246ba597c5SAnurag S. Maskey  */
256ba597c5SAnurag S. Maskey 
266ba597c5SAnurag S. Maskey /*
276ba597c5SAnurag S. Maskey  * nwamadm is a command interpreter to administer NWAM profiles.  It
286ba597c5SAnurag S. Maskey  * is all in C (i.e., no lex/yacc), and all the argument passing is
296ba597c5SAnurag S. Maskey  * argc/argv based.  main() calls the command's handler function,
306ba597c5SAnurag S. Maskey  * which first calls parse_argv() to parse the input arguments and set
316ba597c5SAnurag S. Maskey  * approriate variables for each command.  The rest of the program is
326ba597c5SAnurag S. Maskey  * helper functions for the handler functions.
336ba597c5SAnurag S. Maskey  */
346ba597c5SAnurag S. Maskey 
356ba597c5SAnurag S. Maskey #include <arpa/inet.h>
366ba597c5SAnurag S. Maskey #include <assert.h>
376ba597c5SAnurag S. Maskey #include <errno.h>
386ba597c5SAnurag S. Maskey #include <libdlwlan.h>
39f6da83d4SAnurag S. Maskey #include <libinetutil.h>
406ba597c5SAnurag S. Maskey #include <libnwam.h>
416ba597c5SAnurag S. Maskey #include <libscf.h>
426ba597c5SAnurag S. Maskey #include <locale.h>
436ba597c5SAnurag S. Maskey #include <netinet/in.h>
446ba597c5SAnurag S. Maskey #include <ofmt.h>
456ba597c5SAnurag S. Maskey #include <stdarg.h>
466ba597c5SAnurag S. Maskey #include <stdio.h>
476ba597c5SAnurag S. Maskey #include <stdlib.h>
486ba597c5SAnurag S. Maskey #include <string.h>
496ba597c5SAnurag S. Maskey #include <strings.h>
506ba597c5SAnurag S. Maskey #include <sys/socket.h>
516ba597c5SAnurag S. Maskey #include <sys/types.h>
526ba597c5SAnurag S. Maskey #include <unistd.h>
536ba597c5SAnurag S. Maskey 
546ba597c5SAnurag S. Maskey #if !defined(TEXT_DOMAIN)		/* should be defined by cc -D */
556ba597c5SAnurag S. Maskey #define	TEXT_DOMAIN	"SYS_TEST"	/* Use this only if it wasn't */
566ba597c5SAnurag S. Maskey #endif
576ba597c5SAnurag S. Maskey 
586ba597c5SAnurag S. Maskey typedef void (cmd_func_t)(int, char **);
596ba597c5SAnurag S. Maskey 
606ba597c5SAnurag S. Maskey struct cmd {
616ba597c5SAnurag S. Maskey 	uint_t		cmd_num;		/* command number */
626ba597c5SAnurag S. Maskey 	const char	*cmd_name;		/* command name */
636ba597c5SAnurag S. Maskey 	cmd_func_t	*cmd_handler;		/* function to call */
646ba597c5SAnurag S. Maskey 	const char	*cmd_usage;		/* short form help */
656ba597c5SAnurag S. Maskey 	const char	*cmd_desc;		/* command description */
666ba597c5SAnurag S. Maskey 	boolean_t	cmd_needs_nwamd;	/* nwam needs to run */
676ba597c5SAnurag S. Maskey };
686ba597c5SAnurag S. Maskey 
696ba597c5SAnurag S. Maskey /* constants for commands */
706ba597c5SAnurag S. Maskey #define	CMD_HELP	0
716ba597c5SAnurag S. Maskey #define	CMD_ENABLE	1
726ba597c5SAnurag S. Maskey #define	CMD_DISABLE	2
736ba597c5SAnurag S. Maskey #define	CMD_LIST	3
746ba597c5SAnurag S. Maskey #define	CMD_SHOW_EVENTS	4
756ba597c5SAnurag S. Maskey #define	CMD_SCAN_WIFI	5
766ba597c5SAnurag S. Maskey #define	CMD_SELECT_WIFI	6
776ba597c5SAnurag S. Maskey 
786ba597c5SAnurag S. Maskey #define	CMD_MIN		CMD_HELP
796ba597c5SAnurag S. Maskey #define	CMD_MAX		CMD_SELECT_WIFI
806ba597c5SAnurag S. Maskey 
816ba597c5SAnurag S. Maskey /* functions to call */
826ba597c5SAnurag S. Maskey static cmd_func_t help_func, enable_func, disable_func, list_func;
836ba597c5SAnurag S. Maskey static cmd_func_t show_events_func, scan_wifi_func, select_wifi_func;
846ba597c5SAnurag S. Maskey static ofmt_cb_t print_list_cb;
856ba597c5SAnurag S. Maskey 
866ba597c5SAnurag S. Maskey /* table of commands and usage */
876ba597c5SAnurag S. Maskey static struct cmd cmdtab[] = {
886ba597c5SAnurag S. Maskey 	{ CMD_HELP,		"help",		help_func,
896ba597c5SAnurag S. Maskey 	    "help",
906ba597c5SAnurag S. Maskey 	    "Print this usage message.",		B_FALSE		},
916ba597c5SAnurag S. Maskey 	{ CMD_ENABLE,		"enable",	enable_func,
926ba597c5SAnurag S. Maskey 	    "enable [-p <profile-type>] [-c <ncu-class>] <object-name>",
936ba597c5SAnurag S. Maskey 	    "Enable the specified profile.",		B_FALSE		},
946ba597c5SAnurag S. Maskey 	{ CMD_DISABLE,		"disable",	disable_func,
956ba597c5SAnurag S. Maskey 	    "disable [-p <profile-type>] [-c <ncu-class>] <object-name>",
966ba597c5SAnurag S. Maskey 	    "Disable the specified profile.",		B_FALSE		},
976ba597c5SAnurag S. Maskey 	{ CMD_LIST,		"list",		list_func,
986ba597c5SAnurag S. Maskey 	    "list [-x] [-p <profile-type>] [-c <ncu-class>] [<object-name>]",
996ba597c5SAnurag S. Maskey 	    "List profiles and their current states.",	B_TRUE		},
1006ba597c5SAnurag S. Maskey 	{ CMD_SHOW_EVENTS,	"show-events",	show_events_func,
1016ba597c5SAnurag S. Maskey 	    "show-events",
1026ba597c5SAnurag S. Maskey 	    "Display all events.",			B_TRUE		},
1036ba597c5SAnurag S. Maskey 	{ CMD_SCAN_WIFI,	"scan-wifi",	scan_wifi_func,
1046ba597c5SAnurag S. Maskey 	    "scan-wifi <link-name>",
1056ba597c5SAnurag S. Maskey 	    "Request a WiFi scan for the selected link.", B_TRUE	},
1066ba597c5SAnurag S. Maskey 	{ CMD_SELECT_WIFI,	"select-wifi",	select_wifi_func,
1076ba597c5SAnurag S. Maskey 	    "select-wifi <link-name>",
1086ba597c5SAnurag S. Maskey 	    "Make a WLAN selection from the last WiFi scan.", B_TRUE	}
1096ba597c5SAnurag S. Maskey };
1106ba597c5SAnurag S. Maskey 
1116ba597c5SAnurag S. Maskey /* Structure for "nwamadm list" output */
1126ba597c5SAnurag S. Maskey 
1136ba597c5SAnurag S. Maskey typedef struct profile_entry {
1146ba597c5SAnurag S. Maskey 	nwam_object_type_t	p_type;
1156ba597c5SAnurag S. Maskey 	nwam_ncu_class_t	p_ncu_class;
1166ba597c5SAnurag S. Maskey 	char			p_name[NWAM_MAX_NAME_LEN];
1176ba597c5SAnurag S. Maskey 	nwam_state_t		p_state;
1186ba597c5SAnurag S. Maskey 	nwam_aux_state_t	p_aux_state;
1196ba597c5SAnurag S. Maskey } profile_entry_t;
1206ba597c5SAnurag S. Maskey 
1216ba597c5SAnurag S. Maskey /* widths of colums for printing */
1226ba597c5SAnurag S. Maskey #define	TYPE_WIDTH		12	/* width of TYPE column */
1236ba597c5SAnurag S. Maskey #define	PROFILE_WIDTH		15	/* width of PROFILE column */
1246ba597c5SAnurag S. Maskey #define	STATE_WIDTH		15	/* width of STATE column */
1256ba597c5SAnurag S. Maskey #define	AUXSTATE_WIDTH		36	/* width of AUXILIARY STATE column */
1266ba597c5SAnurag S. Maskey 
127f6da83d4SAnurag S. Maskey #define	EVENT_WIDTH		15	/* width of EVENT column */
128f6da83d4SAnurag S. Maskey #define	DESCRIPTION_WIDTH	64	/* width of DESCRIPTION column */
1296ba597c5SAnurag S. Maskey 
1306ba597c5SAnurag S. Maskey /* id for columns of "nwamadm list" */
1316ba597c5SAnurag S. Maskey typedef enum {
1326ba597c5SAnurag S. Maskey 	LIST_TYPE,
1336ba597c5SAnurag S. Maskey 	LIST_PROFILE,
1346ba597c5SAnurag S. Maskey 	LIST_STATE,
1356ba597c5SAnurag S. Maskey 	LIST_AUXSTATE
1366ba597c5SAnurag S. Maskey } list_field_id_t;
1376ba597c5SAnurag S. Maskey 
1386ba597c5SAnurag S. Maskey static const ofmt_field_t list_fields[] = {
1396ba597c5SAnurag S. Maskey 	/* header,		width,		id,		callback */
1406ba597c5SAnurag S. Maskey 	{ "TYPE",		TYPE_WIDTH,	LIST_TYPE,	print_list_cb },
1416ba597c5SAnurag S. Maskey 	{ "PROFILE",		PROFILE_WIDTH,	LIST_PROFILE,	print_list_cb },
1426ba597c5SAnurag S. Maskey 	{ "STATE",		STATE_WIDTH,	LIST_STATE,	print_list_cb },
1436ba597c5SAnurag S. Maskey 	{ "AUXILIARY STATE",	AUXSTATE_WIDTH,	LIST_AUXSTATE,	print_list_cb },
1446ba597c5SAnurag S. Maskey 	{ NULL,			0,		0,		NULL }
1456ba597c5SAnurag S. Maskey };
1466ba597c5SAnurag S. Maskey 
1476ba597c5SAnurag S. Maskey /* Global variables */
1486ba597c5SAnurag S. Maskey 
1496ba597c5SAnurag S. Maskey /* set early in main(), never modified thereafter, used all over the place */
1506ba597c5SAnurag S. Maskey static char *execname;
1516ba597c5SAnurag S. Maskey 
1526ba597c5SAnurag S. Maskey /* whether the auxilary states are to be printed or not */
1536ba597c5SAnurag S. Maskey static boolean_t extended_list = B_FALSE;
1546ba597c5SAnurag S. Maskey 
1556ba597c5SAnurag S. Maskey /* Functions */
1566ba597c5SAnurag S. Maskey 
1576ba597c5SAnurag S. Maskey static const char *
cmd_to_str(int cmd_num)1586ba597c5SAnurag S. Maskey cmd_to_str(int cmd_num)
1596ba597c5SAnurag S. Maskey {
1606ba597c5SAnurag S. Maskey 	assert(cmd_num >= CMD_MIN && cmd_num <= CMD_MAX);
1616ba597c5SAnurag S. Maskey 	return (cmdtab[cmd_num].cmd_name);
1626ba597c5SAnurag S. Maskey }
1636ba597c5SAnurag S. Maskey 
1646ba597c5SAnurag S. Maskey /* returns description of given command */
1656ba597c5SAnurag S. Maskey static const char *
long_help(int cmd_num)1666ba597c5SAnurag S. Maskey long_help(int cmd_num)
1676ba597c5SAnurag S. Maskey {
1686ba597c5SAnurag S. Maskey 	assert(cmd_num >= CMD_MIN && cmd_num <= CMD_MAX);
1696ba597c5SAnurag S. Maskey 	return (gettext(cmdtab[cmd_num].cmd_desc));
1706ba597c5SAnurag S. Maskey }
1716ba597c5SAnurag S. Maskey 
1726ba597c5SAnurag S. Maskey /*
1736ba597c5SAnurag S. Maskey  * Called with explicit B_TRUE when help is explicitly required,
1746ba597c5SAnurag S. Maskey  * B_FALSE for errors
1756ba597c5SAnurag S. Maskey  */
1766ba597c5SAnurag S. Maskey static void
usage(boolean_t explicit)1776ba597c5SAnurag S. Maskey usage(boolean_t explicit)
1786ba597c5SAnurag S. Maskey {
1796ba597c5SAnurag S. Maskey 	int	i;
1806ba597c5SAnurag S. Maskey 	FILE	*fd = explicit ? stdout : stderr;
1816ba597c5SAnurag S. Maskey 
1826ba597c5SAnurag S. Maskey 	(void) fprintf(fd, gettext("usage: <subcommand> <args> ...\n"));
1836ba597c5SAnurag S. Maskey 	for (i = CMD_MIN; i <= CMD_MAX; i++) {
1846ba597c5SAnurag S. Maskey 		(void) fprintf(fd, "\t%s\n", cmdtab[i].cmd_usage);
1856ba597c5SAnurag S. Maskey 		if (explicit)
1866ba597c5SAnurag S. Maskey 			(void) fprintf(fd, "\t\t%s\n\n", long_help(i));
1876ba597c5SAnurag S. Maskey 	}
1886ba597c5SAnurag S. Maskey }
1896ba597c5SAnurag S. Maskey 
1906ba597c5SAnurag S. Maskey /* PRINTFLIKE1 */
1916ba597c5SAnurag S. Maskey static void
die(const char * format,...)1926ba597c5SAnurag S. Maskey die(const char *format, ...)
1936ba597c5SAnurag S. Maskey {
1946ba597c5SAnurag S. Maskey 	va_list alist;
1956ba597c5SAnurag S. Maskey 
1966ba597c5SAnurag S. Maskey 	format = gettext(format);
1976ba597c5SAnurag S. Maskey 	(void) fprintf(stderr, "%s: ", execname);
1986ba597c5SAnurag S. Maskey 
1996ba597c5SAnurag S. Maskey 	va_start(alist, format);
2006ba597c5SAnurag S. Maskey 	(void) vfprintf(stderr, format, alist);
2016ba597c5SAnurag S. Maskey 	va_end(alist);
2026ba597c5SAnurag S. Maskey 	(void) fprintf(stderr, "\n");
2036ba597c5SAnurag S. Maskey 
2046ba597c5SAnurag S. Maskey 	exit(EXIT_FAILURE);
2056ba597c5SAnurag S. Maskey }
2066ba597c5SAnurag S. Maskey 
2076ba597c5SAnurag S. Maskey /* PRINTFLIKE2 */
2086ba597c5SAnurag S. Maskey static void
die_nwamerr(nwam_error_t err,const char * format,...)2096ba597c5SAnurag S. Maskey die_nwamerr(nwam_error_t err, const char *format, ...)
2106ba597c5SAnurag S. Maskey {
2116ba597c5SAnurag S. Maskey 	va_list alist;
2126ba597c5SAnurag S. Maskey 
2136ba597c5SAnurag S. Maskey 	format = gettext(format);
2146ba597c5SAnurag S. Maskey 	(void) fprintf(stderr, "%s: ", execname);
2156ba597c5SAnurag S. Maskey 
2166ba597c5SAnurag S. Maskey 	va_start(alist, format);
2176ba597c5SAnurag S. Maskey 	(void) vfprintf(stderr, format, alist);
2186ba597c5SAnurag S. Maskey 	va_end(alist);
2196ba597c5SAnurag S. Maskey 	(void) fprintf(stderr, ": %s\n", nwam_strerror(err));
2206ba597c5SAnurag S. Maskey 
2216ba597c5SAnurag S. Maskey 	exit(EXIT_FAILURE);
2226ba597c5SAnurag S. Maskey }
2236ba597c5SAnurag S. Maskey 
2246ba597c5SAnurag S. Maskey /* prints the usage for cmd_num and exits */
2256ba597c5SAnurag S. Maskey static void
die_usage(int cmd_num)2266ba597c5SAnurag S. Maskey die_usage(int cmd_num)
2276ba597c5SAnurag S. Maskey {
2286ba597c5SAnurag S. Maskey 	assert(cmd_num >= CMD_MIN && cmd_num <= CMD_MAX);
2296ba597c5SAnurag S. Maskey 
2306ba597c5SAnurag S. Maskey 	(void) fprintf(stderr, "%s: %s\n", gettext("usage"),
2316ba597c5SAnurag S. Maskey 	    cmdtab[cmd_num].cmd_usage);
2326ba597c5SAnurag S. Maskey 	(void) fprintf(stderr, "\t%s\n", long_help(cmd_num));
2336ba597c5SAnurag S. Maskey 
2346ba597c5SAnurag S. Maskey 	exit(EXIT_FAILURE);
2356ba597c5SAnurag S. Maskey }
2366ba597c5SAnurag S. Maskey 
2376ba597c5SAnurag S. Maskey /*
2386ba597c5SAnurag S. Maskey  * Prints the usage and description of all commands
2396ba597c5SAnurag S. Maskey  */
2406ba597c5SAnurag S. Maskey /* ARGSUSED */
2416ba597c5SAnurag S. Maskey static void
help_func(int argc,char * argv[])2426ba597c5SAnurag S. Maskey help_func(int argc, char *argv[])
2436ba597c5SAnurag S. Maskey {
2446ba597c5SAnurag S. Maskey 	usage(B_TRUE);
2456ba597c5SAnurag S. Maskey }
2466ba597c5SAnurag S. Maskey 
2476ba597c5SAnurag S. Maskey /* determines if the NCP is active or not.  If so, sets arg and halts walk. */
2486ba597c5SAnurag S. Maskey static int
active_ncp_callback(nwam_ncp_handle_t ncph,void * arg)2496ba597c5SAnurag S. Maskey active_ncp_callback(nwam_ncp_handle_t ncph, void *arg)
2506ba597c5SAnurag S. Maskey {
2516ba597c5SAnurag S. Maskey 	char			**namep = arg;
2526ba597c5SAnurag S. Maskey 	nwam_state_t		state = NWAM_STATE_UNINITIALIZED;
2536ba597c5SAnurag S. Maskey 	nwam_aux_state_t	aux;
2546ba597c5SAnurag S. Maskey 
2556ba597c5SAnurag S. Maskey 	(void) nwam_ncp_get_state(ncph, &state, &aux);
2566ba597c5SAnurag S. Maskey 	if (state == NWAM_STATE_ONLINE) {
2576ba597c5SAnurag S. Maskey 		if (nwam_ncp_get_name(ncph, namep) != NWAM_SUCCESS)
2586ba597c5SAnurag S. Maskey 			*namep = NULL;
2596ba597c5SAnurag S. Maskey 		return (1);
2606ba597c5SAnurag S. Maskey 	}
2616ba597c5SAnurag S. Maskey 
2626ba597c5SAnurag S. Maskey 	return (0);
2636ba597c5SAnurag S. Maskey }
2646ba597c5SAnurag S. Maskey 
2656ba597c5SAnurag S. Maskey /* find the currently active NCP and returns its handle */
2666ba597c5SAnurag S. Maskey static nwam_ncp_handle_t
determine_active_ncp()2676ba597c5SAnurag S. Maskey determine_active_ncp()
2686ba597c5SAnurag S. Maskey {
2696ba597c5SAnurag S. Maskey 	char *active_ncp;
2706ba597c5SAnurag S. Maskey 	nwam_ncp_handle_t ncph;
2716ba597c5SAnurag S. Maskey 	nwam_error_t ret;
2726ba597c5SAnurag S. Maskey 
2736ba597c5SAnurag S. Maskey 	if (nwam_walk_ncps(active_ncp_callback, &active_ncp, 0, NULL)
2746ba597c5SAnurag S. Maskey 	    == NWAM_WALK_HALTED) {
2756ba597c5SAnurag S. Maskey 		if (active_ncp == NULL)
2766ba597c5SAnurag S. Maskey 			return (NULL);
2776ba597c5SAnurag S. Maskey 
2786ba597c5SAnurag S. Maskey 		/* retrieve the NCP handle */
2796ba597c5SAnurag S. Maskey 		ret = nwam_ncp_read(active_ncp, 0, &ncph);
2806ba597c5SAnurag S. Maskey 		free(active_ncp);
2816ba597c5SAnurag S. Maskey 		if (ret == NWAM_SUCCESS)
2826ba597c5SAnurag S. Maskey 			return (ncph);
2836ba597c5SAnurag S. Maskey 	}
2846ba597c5SAnurag S. Maskey 
2856ba597c5SAnurag S. Maskey 	return (NULL);
2866ba597c5SAnurag S. Maskey }
2876ba597c5SAnurag S. Maskey 
2886ba597c5SAnurag S. Maskey /* check if the given name is a valid loc, test by reading the given loc */
2896ba597c5SAnurag S. Maskey static boolean_t
valid_loc(const char * name)2906ba597c5SAnurag S. Maskey valid_loc(const char *name)
2916ba597c5SAnurag S. Maskey {
2926ba597c5SAnurag S. Maskey 	nwam_loc_handle_t loch;
2936ba597c5SAnurag S. Maskey 
2946ba597c5SAnurag S. Maskey 	if (nwam_loc_read(name, 0, &loch) != NWAM_SUCCESS)
2956ba597c5SAnurag S. Maskey 		return (B_FALSE);
2966ba597c5SAnurag S. Maskey 	nwam_loc_free(loch);
2976ba597c5SAnurag S. Maskey 	return (B_TRUE);
2986ba597c5SAnurag S. Maskey }
2996ba597c5SAnurag S. Maskey 
3006ba597c5SAnurag S. Maskey static boolean_t
valid_enm(const char * name)3016ba597c5SAnurag S. Maskey valid_enm(const char *name)
3026ba597c5SAnurag S. Maskey {
3036ba597c5SAnurag S. Maskey 	nwam_enm_handle_t enmh;
3046ba597c5SAnurag S. Maskey 
3056ba597c5SAnurag S. Maskey 	if (nwam_enm_read(name, 0, &enmh) != NWAM_SUCCESS)
3066ba597c5SAnurag S. Maskey 		return (B_FALSE);
3076ba597c5SAnurag S. Maskey 	nwam_enm_free(enmh);
3086ba597c5SAnurag S. Maskey 	return (B_TRUE);
3096ba597c5SAnurag S. Maskey }
3106ba597c5SAnurag S. Maskey 
3116ba597c5SAnurag S. Maskey static boolean_t
valid_ncp(const char * name)3126ba597c5SAnurag S. Maskey valid_ncp(const char *name)
3136ba597c5SAnurag S. Maskey {
3146ba597c5SAnurag S. Maskey 	nwam_ncp_handle_t ncph;
3156ba597c5SAnurag S. Maskey 
3166ba597c5SAnurag S. Maskey 	if (nwam_ncp_read(name, 0, &ncph) != NWAM_SUCCESS)
3176ba597c5SAnurag S. Maskey 		return (B_FALSE);
3186ba597c5SAnurag S. Maskey 	nwam_ncp_free(ncph);
3196ba597c5SAnurag S. Maskey 	return (B_TRUE);
3206ba597c5SAnurag S. Maskey }
3216ba597c5SAnurag S. Maskey 
3226ba597c5SAnurag S. Maskey static boolean_t
valid_ncu(const char * name)3236ba597c5SAnurag S. Maskey valid_ncu(const char *name)
3246ba597c5SAnurag S. Maskey {
3256ba597c5SAnurag S. Maskey 	nwam_ncp_handle_t ncph;
3266ba597c5SAnurag S. Maskey 	nwam_ncu_handle_t