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/*
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <ctype.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <errno.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <limits.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <stdio.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <stdlib.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <string.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libdladm.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libdllink.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libdlwlan.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libgen.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <libnwam.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "events.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "known_wlans.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "ncu.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "objects.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "util.h"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * known_wlans.c - contains routines which handle the known WLAN abstraction.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#define KNOWN_WIFI_NETS_FILE "/etc/nwam/known_wifi_nets"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* enum for parsing each line of /etc/nwam/known_wifi_nets */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeytypedef enum {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ESSID = 0,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey BSSID,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey MAX_FIELDS
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey} known_wifi_nets_fields_t;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Structure for one BSSID */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeytypedef struct bssid {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct qelem bssid_links;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *bssid;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey} bssid_t;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Structure for an ESSID and its BSSIDs */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeytypedef struct kw {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct qelem kw_links;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char kw_essid[NWAM_MAX_NAME_LEN];
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint32_t kw_num_bssids;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct qelem kw_bssids;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey} kw_t;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Holds the linked-list of ESSIDs to make Known WLANs out of */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic struct qelem kw_list;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Used in walking secobjs looking for an ESSID prefix match. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystruct nwamd_secobj_arg {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char nsa_essid_prefix[DLADM_WLAN_MAX_KEYNAME_LEN];
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char nsa_keyname[DLADM_WLAN_MAX_KEYNAME_LEN];
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey dladm_wlan_key_t *nsa_key;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t nsa_secmode;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey};
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic void
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeykw_list_init(void)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw_list.q_forw = kw_list.q_back = &kw_list;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic void
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeykw_list_free(void)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw_t *kw;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey bssid_t *b;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey while (kw_list.q_forw != &kw_list) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw = (kw_t *)kw_list.q_forw;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* free kw_bssids */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey while (kw->kw_bssids.q_forw != &kw->kw_bssids) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey b = (bssid_t *)kw->kw_bssids.q_forw;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey remque(&b->bssid_links);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(b->bssid);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(b);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey remque(&kw->kw_links);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(kw);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Returns the entry in kw_list for the given ESSID. NULL if non-existent */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic kw_t *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeykw_lookup(const char *essid)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw_t *kw;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (essid == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (kw = (kw_t *)kw_list.q_forw;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw != (kw_t *)&kw_list;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw = (kw_t *)kw->kw_links.q_forw) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (strcmp(essid, kw->kw_essid) == 0)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (kw);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Adds an ESSID/BSSID combination to kw_list. Returns B_TRUE on success. */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic boolean_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeykw_add(const char *essid, const char *bssid)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw_t *kw;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey bssid_t *b;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((b = calloc(1, sizeof (bssid_t))) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "kw_add: cannot allocate for bssid_t: %m");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_FALSE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((kw = calloc(1, sizeof (kw_t))) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "kw_add: cannot allocate for kw_t: %m");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(b);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_FALSE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw->kw_bssids.q_forw = kw->kw_bssids.q_back = &kw->kw_bssids;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey b->bssid = strdup(bssid);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) strlcpy(kw->kw_essid, essid, sizeof (kw->kw_essid));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw->kw_num_bssids = 1;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey insque(&b->bssid_links, kw->kw_bssids.q_back);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey insque(&kw->kw_links, kw_list.q_back);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "kw_add: added Known WLAN %s, BSSID %s", essid, bssid);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_TRUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Add the BSSID to the given kw. Since /etc/nwam/known_wifi_nets is
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * populated such that the wifi networks visited later are towards the end
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * of the file, remove the give kw from its current position and append it
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * to the end of kw_list. This ensures that kw_list is in the reverse
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * order of visited wifi networks. Returns B_TRUE on success.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic boolean_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeykw_update(kw_t *kw, const char *bssid)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey bssid_t *b;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((b = calloc(1, sizeof (bssid_t))) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "kw_update: cannot allocate for bssid_t: %m");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_FALSE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey b->bssid = strdup(bssid);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey insque(&b->bssid_links, kw->kw_bssids.q_back);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw->kw_num_bssids++;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* remove kw from current position */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey remque(&kw->kw_links);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* and insert at end */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey insque(&kw->kw_links, kw_list.q_back);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "kw_update: appended BSSID %s to Known WLAN %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey bssid, kw->kw_essid);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_TRUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Parses /etc/nwam/known_wifi_nets and populates kw_list, with the oldest
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * wifi networks first in the list. Returns the number of unique entries
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * in kw_list (to use for priority values).
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyparse_known_wifi_nets(void)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey FILE *fp;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char line[LINE_MAX];
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *cp, *tok[MAX_FIELDS];
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int lnum, num_kw = 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw_t *kw;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw_list_init();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * The file format is:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * essid\tbssid (essid followed by tab followed by bssid)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey fp = fopen(KNOWN_WIFI_NETS_FILE, "r");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (fp == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (lnum = 1; fgets(line, sizeof (line), fp) != NULL; lnum++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey cp = line;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey while (isspace(*cp))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey cp++;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (*cp == '#' || *cp == '\0')
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (bufsplit(cp, MAX_FIELDS, tok) != MAX_FIELDS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey syslog(LOG_ERR, "%s:%d: wrong number of tokens; "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "ignoring entry", KNOWN_WIFI_NETS_FILE, lnum);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((kw = kw_lookup(tok[ESSID])) == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!kw_add(tok[ESSID], tok[BSSID])) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "%s:%d: cannot add entry (%s,%s) to list",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey KNOWN_WIFI_NETS_FILE, lnum,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey tok[ESSID], tok[BSSID]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey num_kw++;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey } else {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!kw_update(kw, tok[BSSID])) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "%s:%d:cannot update entry (%s,%s) to list",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey KNOWN_WIFI_NETS_FILE, lnum,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey tok[ESSID], tok[BSSID]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* next line ... */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) fclose(fp);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (num_kw);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Walk security objects looking for one that matches the essid prefix.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Store the key and keyname if a match is found - we use the last match
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * as the key for the known WLAN, since it is the most recently updated.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* ARGSUSED0 */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic boolean_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyfind_secobj_matching_prefix(dladm_handle_t dh, void *arg,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey const char *secobjname)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct nwamd_secobj_arg *nsa = arg;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (strncmp(nsa->nsa_essid_prefix, secobjname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey strlen(nsa->nsa_essid_prefix)) == 0) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "find_secobj_matching_prefix: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "found secobj with prefix %s : %s\n",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nsa->nsa_essid_prefix, secobjname);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Free last key found (if any) */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nsa->nsa_key != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(nsa->nsa_key);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Retrive key so we can get security mode */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nsa->nsa_key = nwamd_wlan_get_key_named(secobjname, 0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) strlcpy(nsa->nsa_keyname, secobjname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (nsa->nsa_keyname));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (nsa->nsa_key->wk_class) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case DLADM_SECOBJ_CLASS_WEP:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nsa->nsa_secmode = DLADM_WLAN_SECMODE_WEP;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "find_secobj_matching_prefix: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "got WEP key %s", nsa->nsa_keyname);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case DLADM_SECOBJ_CLASS_WPA:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nsa->nsa_secmode = DLADM_WLAN_SECMODE_WPA;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "find_secobj_matching_prefix: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "got WPA key %s", nsa->nsa_keyname);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* shouldn't happen */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nsa->nsa_secmode = DLADM_WLAN_SECMODE_NONE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "find_secobj_matching_prefix: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "key class for key %s was invalid",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nsa->nsa_keyname);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (B_TRUE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Upgrade /etc/nwam/known_wifi_nets file to new libnwam-based config model */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyupgrade_known_wifi_nets_config(void)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw_t *kw;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey bssid_t *b;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_handle_t kwh;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char **bssids;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey uint64_t priority;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey int i, num_kw;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct nwamd_secobj_arg nsa;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_INFO, "Upgrading %s to Known WLANs", KNOWN_WIFI_NETS_FILE);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Parse /etc/nwam/known_wifi_nets */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey num_kw = parse_known_wifi_nets();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Create Known WLANs for each unique ESSID */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (kw = (kw_t *)kw_list.q_forw, priority = num_kw-1;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw != (kw_t *)&kw_list;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw = (kw_t *)kw->kw_links.q_forw, priority--) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t priorityval = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t bssidsval = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t secmodeval = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t keynameval = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_DEBUG, "Creating Known WLAN %s", kw->kw_essid);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_known_wlan_create(kw->kw_essid, &kwh))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "upgrade wlan %s: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "could not create known wlan: %s", kw->kw_essid,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* priority of this ESSID */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_uint64(priority, &priorityval))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "upgrade wlan %s: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "could not create priority value: %s", kw->kw_essid,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
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 nlog(LOG_ERR, "upgrade wlan %s: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "could not set priority value: %s", kw->kw_essid,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* loop through kw->kw_bssids and create an array of bssids */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey bssids = calloc(kw->kw_num_bssids, sizeof (char *));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (bssids == NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "upgrade wlan %s: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "could not calloc for bssids: %m", kw->kw_essid);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (b = (bssid_t *)kw->kw_bssids.q_forw, i = 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey b != (bssid_t *)&kw->kw_bssids;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey b = (bssid_t *)b->bssid_links.q_forw, i++) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey bssids[i] = strdup(b->bssid);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* BSSIDs for this ESSID */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_string_array(bssids,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw->kw_num_bssids, &bssidsval)) != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "upgrade wlan %s: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "could not create bssids value: %s", kw->kw_essid,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey for (i = 0; i < kw->kw_num_bssids; i++)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(bssids[i]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(bssids);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
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 for (i = 0; i < kw->kw_num_bssids; i++)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(bssids[i]);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(bssids);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "upgrade wlan %s: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "could not set bssids: %s", kw->kw_essid,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Retrieve last key matching ESSID prefix if any, and set
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * the retrieved key name and security mode.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_set_key_name(kw->kw_essid, NULL, nsa.nsa_essid_prefix,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey sizeof (nsa.nsa_essid_prefix));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nsa.nsa_key = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nsa.nsa_secmode = DLADM_WLAN_SECMODE_NONE;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) dladm_walk_secobj(dld_handle, &nsa,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey find_secobj_matching_prefix, DLADM_OPT_PERSIST);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (nsa.nsa_key != NULL) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_string(nsa.nsa_keyname,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &keynameval)) == NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwam_known_wlan_set_prop_value(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_KNOWN_WLAN_PROP_KEYNAME, keynameval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey free(nsa.nsa_key);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(keynameval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if ((err = nwam_value_create_uint64(nsa.nsa_secmode,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey &secmodeval)) != NWAM_SUCCESS ||
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_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "upgrade wlan %s: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "could not set security mode: %s",
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw->kw_essid, nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(secmodeval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey continue;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* commit, no collision checking by libnwam */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey err = nwam_known_wlan_commit(kwh,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey NWAM_FLAG_KNOWN_WLAN_NO_COLLISION_CHECK);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_free(kwh);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (err != NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_ERR, "upgrade wlan %s: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "could not commit wlan: %s", kw->kw_essid,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_strerror(err));
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* next ... */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey kw_list_free();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwam_error_t
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyknown_wlan_get_keyname(const char *essid, char *name)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_known_wlan_handle_t kwh = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_t keynameval = NULL;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey char *keyname;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_error_t err;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
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_KEYNAME, &keynameval)) == NWAM_SUCCESS &&
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (err = nwam_value_get_string(keynameval, &keyname))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey == NWAM_SUCCESS) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) strlcpy(name, keyname, NWAM_MAX_VALUE_LEN);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (keynameval != NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwam_value_free(keynameval);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (kwh != NULL)
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/* Performs a scan on a wifi link NCU */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* ARGSUSED */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeystatic int
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_ncu_known_wlan_committed(nwamd_object_t object, void *data)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_ncu_t *ncu_data = object->nwamd_object_data;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (ncu_data->ncu_type != NWAM_NCU_TYPE_LINK)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* network selection will be done only if possible */
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey if (ncu_data->ncu_link.nwamd_link_media == DL_WIFI)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwamd_wlan_scan(ncu_data->ncu_name);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* Handle known WLAN initialization/refresh event */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/* ARGSUSED */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_known_wlan_handle_init_event(nwamd_event_t known_wlan_event)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * Since the Known WLAN list has changed, do a rescan so that the
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * best network is selected.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (void) nwamd_walk_objects(NWAM_OBJECT_TYPE_NCU,
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_ncu_known_wlan_committed, NULL);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyvoid
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_known_wlan_handle_action_event(nwamd_event_t known_wlan_event)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey switch (known_wlan_event->event_msg->nwe_data.nwe_object_action.
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwe_action) {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTION_ADD:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTION_REFRESH:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_known_wlan_handle_init_event(known_wlan_event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTION_DESTROY:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* Nothing needs to be done for destroy */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey /* all other events are invalid for known WLANs */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTION_ENABLE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey case NWAM_ACTION_DISABLE:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey default:
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nlog(LOG_INFO, "nwam_known_wlan_handle_action_event: "
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey "unexpected action");
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey break;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyint
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeynwamd_known_wlan_action(const char *known_wlan, nwam_action_t action)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_t known_wlan_event = nwamd_event_init_object_action
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey (NWAM_OBJECT_TYPE_KNOWN_WLAN, known_wlan, NULL, action);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (known_wlan_event == NULL)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (1);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey nwamd_event_enqueue(known_wlan_event);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return (0);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey}