6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * CDDL HEADER START
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * The contents of this file are subject to the terms of the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Common Development and Distribution License (the "License").
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * You may not use this file except in compliance with the License.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * or http://www.opensolaris.org/os/licensing.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * See the License for the specific language governing permissions
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * and limitations under the License.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * When distributing Covered Code, include this CDDL HEADER in each
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If applicable, add the following below this CDDL HEADER, with the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * fields enclosed by brackets "[]" replaced with your own identifying
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * information: Portions Copyright [yyyy] [name of copyright owner]
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * CDDL HEADER END
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Use is subject to license terms.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <assert.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <ctype.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <sys/param.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <sys/types.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <sys/stat.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <stdio.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <stdlib.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <strings.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <unistd.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libdllink.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libdlwlan.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "libnwam_impl.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libnwam_priv.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libnwam.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Functions to support creating, modifying and destroying
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * known WLAN objects. These represent the WiFi connection history,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * and are used by nwamd to identify and connect to known WLANs in
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * scan results.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t valid_keyname(nwam_value_t);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t valid_keyslot(nwam_value_t);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t valid_secmode(nwam_value_t);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystruct nwam_prop_table_entry known_wlan_prop_table_entries[] = {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_KNOWN_WLAN_PROP_PRIORITY, NWAM_VALUE_TYPE_UINT64, B_FALSE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 1, 1, nwam_valid_uint64,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies priority of known WLAN - lower values are prioritized",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_KNOWN_WLAN_PROP_BSSIDS, NWAM_VALUE_TYPE_STRING, B_FALSE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 0, NWAM_MAX_NUM_VALUES, nwam_valid_mac_addr,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies BSSID(s) (of the form aa:bb:cc:dd:ee:ff) associated "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "with known WLAN",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_KNOWN_WLAN_PROP_KEYNAME, NWAM_VALUE_TYPE_STRING, B_FALSE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 0, 1, valid_keyname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies security key name used with known WLAN",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_KNOWN_WLAN_PROP_KEYSLOT, NWAM_VALUE_TYPE_UINT64, B_FALSE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 0, 1, valid_keyslot,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies key slot [1-4] for security key used with known WLAN",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY},
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {NWAM_KNOWN_WLAN_PROP_SECURITY_MODE, NWAM_VALUE_TYPE_UINT64, B_FALSE,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey 0, 1, valid_secmode,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "specifies security mode used for known WLAN",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey};
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#define NWAM_NUM_KNOWN_WLAN_PROPS \
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (sizeof (known_wlan_prop_table_entries) / \
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (*known_wlan_prop_table_entries))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystruct nwam_prop_table known_wlan_prop_table =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey { NWAM_NUM_KNOWN_WLAN_PROPS, known_wlan_prop_table_entries };
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_read(const char *name, uint64_t flags,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_handle_t *kwhp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_read(NWAM_OBJECT_TYPE_KNOWN_WLAN,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_CONF_FILE, name, flags, kwhp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_create(const char *name, nwam_known_wlan_handle_t *kwhp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t priorityval = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(kwhp != NULL && name != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_create(NWAM_OBJECT_TYPE_KNOWN_WLAN,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_CONF_FILE, name, kwhp)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Create new object list for known WLAN. The initial priority is
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * also set.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_alloc_object_list(&((*kwhp)->nwh_data)))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_uint64(0, &priorityval)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto finish;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_set_prop_value((*kwhp)->nwh_data,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_PRIORITY, priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyfinish:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(*kwhp);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *kwhp = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_get_name(nwam_known_wlan_handle_t kwh, char **namep)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_get_name(kwh, namep));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_set_name(nwam_known_wlan_handle_t kwh, const char *name)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_set_name(kwh, name));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyboolean_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_can_set_name(nwam_known_wlan_handle_t kwh)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (!kwh->nwh_committed);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Used to store wlan names/priorities for prioritized walk.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystruct nwam_wlan_info {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *wlan_name;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t wlan_priority;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey boolean_t wlan_walked;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey};
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystruct nwam_wlan_info_list {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct nwam_wlan_info **list;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t num_wlans;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey};
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Used to read in each known WLAN name/priority.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyget_wlans_cb(nwam_known_wlan_handle_t kwh, void *data)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct nwam_wlan_info_list *wil = data;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct nwam_wlan_info **list = wil->list;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct nwam_wlan_info **newlist = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t priorityval = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t num_wlans = wil->num_wlans;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Reallocate WLAN list and allocate new info list element. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((newlist = realloc(list,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (struct nwam_wlan_info *) * ++num_wlans)) == NULL ||
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (newlist[num_wlans - 1] = calloc(1,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (struct nwam_wlan_info))) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (newlist != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(newlist);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_NO_MEMORY);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Update list since realloc() may have relocated it */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey wil->list = newlist;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Retrieve name/priority */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_get_name(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &((newlist[num_wlans - 1])->wlan_name))) != NWAM_SUCCESS ||
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (err = nwam_known_wlan_get_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_PRIORITY, &priorityval)) != NWAM_SUCCESS ||
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (err = nwam_value_get_uint64(priorityval,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &((newlist[num_wlans - 1])->wlan_priority))) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(newlist[num_wlans - 1]->wlan_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(newlist[num_wlans - 1]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (newlist[num_wlans - 1])->wlan_walked = B_FALSE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey wil->num_wlans = num_wlans;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Some recursion is required here, since if _WALK_PRIORITY_ORDER is specified,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * we need to first walk the list of known WLANs to retrieve names
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * and priorities, then utilize that list to carry out an in-order walk.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_walk_known_wlans(int(*cb)(nwam_known_wlan_handle_t, void *), void *data,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t flags, int *retp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_handle_t kwh;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int ret = 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(cb != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_valid_flags(flags,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_FLAG_KNOWN_WLAN_WALK_PRIORITY_ORDER | NWAM_FLAG_BLOCKING))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((flags & NWAM_FLAG_KNOWN_WLAN_WALK_PRIORITY_ORDER) != 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct nwam_wlan_info_list wil = { NULL, 0};
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t iflags = flags &~
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_FLAG_KNOWN_WLAN_WALK_PRIORITY_ORDER;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t minpriority;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int errval, i, j, minindex;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_walk_known_wlans(get_wlans_cb, &wil, iflags, &errval)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = (nwam_error_t)errval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto done;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = NWAM_SUCCESS;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < wil.num_wlans; i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Find lowest priority value not walked so far. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey minpriority = (uint64_t)-1;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (j = 0; j < wil.num_wlans; j++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (wil.list[j]->wlan_priority < minpriority &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey !(wil.list[j]->wlan_walked)) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey minpriority =
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey wil.list[j]->wlan_priority;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey minindex = j;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey wil.list[minindex]->wlan_walked = B_TRUE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_read
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (wil.list[minindex]->wlan_name,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey iflags, &kwh)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto done;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ret = cb(kwh, data);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (ret != 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = NWAM_WALK_HALTED;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto done;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeydone:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (wil.list != NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (j = 0; j < wil.num_wlans; j++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(wil.list[j]->wlan_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(wil.list[j]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(wil.list);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (retp != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey *retp = ret;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_walk(NWAM_OBJECT_TYPE_KNOWN_WLAN,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_CONF_FILE, cb, data, flags, retp, NULL));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_free(nwam_known_wlan_handle_t kwh)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_copy(nwam_known_wlan_handle_t oldkwh, const char *newname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_handle_t *newkwhp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_copy(NWAM_KNOWN_WLAN_CONF_FILE, oldkwh, newname, newkwhp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_delete_prop(nwam_known_wlan_handle_t kwh, const char *propname)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey void *olddata;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(kwh != NULL && propname != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Duplicate data, remove property and validate. If validation
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * fails, revert to data duplicated prior to remove.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_dup_object_list(kwh->nwh_data, &olddata))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_delete_prop(kwh->nwh_data, propname)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_free_object_list(kwh->nwh_data);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kwh->nwh_data = olddata;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_validate(kwh, NULL)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_free_object_list(kwh->nwh_data);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kwh->nwh_data = olddata;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_free_object_list(olddata);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_set_prop_value(nwam_known_wlan_handle_t kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char *propname, nwam_value_t value)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(kwh != NULL && propname != NULL && value != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_validate_prop(kwh, propname, value))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_set_prop_value(kwh->nwh_data, propname, value));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_get_prop_value(nwam_known_wlan_handle_t kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char *propname, nwam_value_t *valuep)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_get_prop_value(kwh->nwh_data, propname, valuep));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_walk_props(nwam_known_wlan_handle_t kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int (*cb)(const char *, nwam_value_t, void *),
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey void *data, uint64_t flags, int *retp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_walk_props(kwh, cb, data, flags, retp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystruct priority_collision_data {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *wlan_name;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t priority;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey};
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyavoid_priority_collisions_cb(nwam_known_wlan_handle_t kwh, void *data)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t priorityval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct priority_collision_data *pcd = data;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *name;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t priority;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_get_name(kwh, &name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (strcmp(name, pcd->wlan_name) == 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* skip to-be-updated wlan */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_get_prop_value(kwh, NWAM_KNOWN_WLAN_PROP_PRIORITY,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_value_get_uint64(priorityval, &priority);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (priority < pcd->priority)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (priority == pcd->priority) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Two priority values collide. Move this one up. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_value_create_uint64(priority + 1, &priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_set_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_PRIORITY, priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * We are doing a walk, and will continue shifting until
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * we find a gap in the priority numbers; thus no need to
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * do collision checking here.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_commit(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_FLAG_KNOWN_WLAN_NO_COLLISION_CHECK);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (pcd->priority)++;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Only possiblity left at this point is that we're looking
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * at a priority greater than the last one we wrote, so we've
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * found a gap. We can halt the walk now.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_WALK_HALTED);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_commit(nwam_known_wlan_handle_t kwh, uint64_t flags)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t priorityval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int ret = 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct priority_collision_data pcd;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey assert(kwh != NULL && kwh->nwh_data != NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_validate(kwh, NULL)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * If the NO_COLLISION_CHECK flag is set, no need to check for
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * collision.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (flags & NWAM_FLAG_KNOWN_WLAN_NO_COLLISION_CHECK)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_commit(NWAM_KNOWN_WLAN_CONF_FILE, kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (flags & NWAM_FLAG_GLOBAL_MASK) |
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_FLAG_ENTITY_KNOWN_WLAN));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * We need to do priority checking. Walk the list, looking
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * for the first entry with priority greater than or equal
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * to the entry we're adding. Commit the new one (without
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * doing additional checking), and then increment other
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * entries as needed.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_get_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_PRIORITY, &priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_value_get_uint64(priorityval, &(pcd.priority));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_get_name(kwh, &(pcd.wlan_name));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_walk_known_wlans(avoid_priority_collisions_cb, &pcd,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_FLAG_KNOWN_WLAN_WALK_PRIORITY_ORDER, &ret);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(pcd.wlan_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * a halted walk is okay, it just means we didn't have
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * to walk the entire list to resolve priorities
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (ret != NWAM_SUCCESS && ret != NWAM_WALK_HALTED)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (ret);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_known_wlan_commit(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey flags | NWAM_FLAG_KNOWN_WLAN_NO_COLLISION_CHECK));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_destroy(nwam_known_wlan_handle_t kwh, uint64_t flags)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_destroy(NWAM_KNOWN_WLAN_CONF_FILE, kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey flags | NWAM_FLAG_ENTITY_KNOWN_WLAN));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_get_prop_description(const char *propname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char **descriptionp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_get_prop_description(known_wlan_prop_table, propname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey descriptionp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Property-specific value validation functions should go here. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvalid_keyname(nwam_value_t value)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *keyname;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_string(value, &keyname) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!dladm_valid_secobj_name(keyname))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvalid_keyslot(nwam_value_t value)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t keyslot;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_uint64(value, &keyslot) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (keyslot < 1 || keyslot > 4)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic nwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvalid_secmode(nwam_value_t value)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t secmode;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nwam_value_get_uint64(value, &secmode) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (secmode != DLADM_WLAN_SECMODE_NONE &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey secmode != DLADM_WLAN_SECMODE_WEP &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey secmode != DLADM_WLAN_SECMODE_WPA)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_ENTITY_INVALID_VALUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_SUCCESS);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_validate(nwam_known_wlan_handle_t kwh, const char **errpropp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_validate(known_wlan_prop_table, kwh, errpropp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_validate_prop(nwam_known_wlan_handle_t kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char *propname, nwam_value_t value)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_validate_prop(known_wlan_prop_table, kwh, propname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey value));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Given a property, return expected property data type
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_get_prop_type(const char *propname, nwam_value_type_t *typep)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_get_prop_type(known_wlan_prop_table, propname, typep));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_prop_multivalued(const char *propname, boolean_t *multip)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_prop_multivalued(known_wlan_prop_table, propname, multip));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_get_default_proplist(const char ***prop_list,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t *numvaluesp)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (nwam_get_default_proplist(known_wlan_prop_table,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_TYPE_ANY, NWAM_CLASS_ANY, prop_list, numvaluesp));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Add the given ESSID, BSSID, secmode, keyslot and key name to known WLANs.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * BSSID and keyname can be NULL.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_add_to_known_wlans(const char *essid, const char *bssid,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint32_t secmode, uint_t keyslot, const char *keyname)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_handle_t kwh;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t keynameval = NULL, keyslotval = NULL, bssidsval = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t secmodeval = NULL, priorityval = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char **old_bssids = NULL, **new_bssids;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t nelem = 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int i, j;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Check if the given ESSID already exists as known WLAN. If so,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * add the BSSID to the bssids property. If not, create one with
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * the given ESSID and add BSSID if given.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_read(essid, 0, &kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (err) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ENTITY_NOT_FOUND:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_create(essid, &kwh)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* New known WLAN - set priority to 0 */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_uint64(0, &priorityval))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_set_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_PRIORITY, priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(priorityval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* If BSSID is NULL, nothing more to do here. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (bssid == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_string((char *)bssid, &bssidsval))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Set the bssids property */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_set_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_BSSIDS, bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_SUCCESS:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* If no bssid is specified, nothing to do */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (bssid == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* known WLAN exists, retrieve the existing bssids property */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_get_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_BSSIDS, &bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS && err != NWAM_ENTITY_NOT_FOUND) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err == NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_get_string_array(bssidsval,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &old_bssids, &nelem)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Create a new array to append given BSSID */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey new_bssids = calloc(nelem + 1, sizeof (char *));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (new_bssids == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_NO_MEMORY);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Copy over existing BSSIDs to the new array. Also, check
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * to make sure that the given BSSID doesn't already exist
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * in the known WLAN. If so, do abort copying and return
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * NWAM_SUCCESS.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < nelem; i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (strcmp(old_bssids[i], bssid) == 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* nothing to do, so free up everything */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (j = 0; j < i; j++)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(new_bssids[j]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(new_bssids);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto set_key_info;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey new_bssids[i] = strdup(old_bssids[i]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey new_bssids[nelem] = strdup(bssid);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_value_create_string_array(new_bssids, nelem + 1,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < nelem + 1; i++)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(new_bssids[i]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(new_bssids);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Set the bssids property */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_set_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_BSSIDS, bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyset_key_info:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Set the security mode property */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_uint64(secmode, &secmodeval))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_set_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_SECURITY_MODE, secmodeval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(secmodeval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (keyname != NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_string((char *)keyname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &keynameval)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_set_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_KEYNAME, keynameval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(keynameval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_uint64(keyslot,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &keyslotval)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_set_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_KEYSLOT, keyslotval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(keyslotval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_commit(kwh, 0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Remove the given BSSID/keyname from the bssids/keyname property for the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * given ESSID.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_known_wlan_remove_from_known_wlans(const char *essid, const char *bssid,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char *keyname)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_handle_t kwh;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t bssidsval;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char **old_bssids, **new_bssids;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint_t nelem;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int i, found = -1;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Retrieve the existing bssids */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_read(essid, 0, &kwh)) != NWAM_SUCCESS)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_get_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_BSSIDS, &bssidsval)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_get_string_array(bssidsval, &old_bssids, &nelem))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Cycle through the BSSIDs array to find the BSSID to remove */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < nelem; i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (strcmp(old_bssids[i], bssid) == 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey found = i;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Given BSSID was not found in the array */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (found == -1) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_INVALID_ARG);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* If removing the only BSSID entry, remove the bssids property */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nelem == 1) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_delete_prop(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_BSSIDS)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_commit(kwh, 0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey new_bssids = calloc(nelem - 1, sizeof (char *));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (new_bssids == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NWAM_NO_MEMORY);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Copy over other BSSIDs */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < found; i++)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey new_bssids[i] = strdup(old_bssids[i]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = found + 1; i < nelem; i++)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey new_bssids[i-1] = strdup(old_bssids[i]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_value_create_string_array(new_bssids, nelem - 1, &bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < nelem - 1; i++)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(new_bssids[i]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(new_bssids);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Set the bssids property */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_set_prop_value(kwh, NWAM_KNOWN_WLAN_PROP_BSSIDS,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(bssidsval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (keyname != NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_delete_prop(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_KEYNAME)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_delete_prop(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_KEYSLOT)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_commit(kwh, 0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (err);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}