softmac_impl.h revision bd670b35a010421b6e1a5536c34453a827007c81
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * CDDL HEADER START
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The contents of this file are subject to the terms of the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Common Development and Distribution License (the "License").
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * You may not use this file except in compliance with the License.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * or http://www.opensolaris.org/os/licensing.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * See the License for the specific language governing permissions
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * and limitations under the License.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * When distributing Covered Code, include this CDDL HEADER in each
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * If applicable, add the following below this CDDL HEADER, with the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * fields enclosed by brackets "[]" replaced with your own identifying
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * information: Portions Copyright [yyyy] [name of copyright owner]
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * CDDL HEADER END
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
6504182088d3042177dc001b147152e7c07756d5Cathy Zhou * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Use is subject to license terms.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#ifndef _SYS_SOFTMAC_IMPL_H
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#define _SYS_SOFTMAC_IMPL_H
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/types.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/ethernet.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/taskq.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/sunddi.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/sunldi.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/strsun.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/stream.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/dlpi.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/mac.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac_provider.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac_client.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac_client_priv.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/mac_ether.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#ifdef __cplusplus
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern "C" {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#endif
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhoutypedef void (*softmac_rx_t)(void *, mac_resource_handle_t, mblk_t *,
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou mac_header_info_t *);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhoutypedef struct softmac_lower_rxinfo_s {
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou softmac_rx_t slr_rx;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou void *slr_arg;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou} softmac_lower_rxinfo_t;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct softmac_lower_s {
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou ldi_handle_t sl_lh;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz struct softmac *sl_softmac;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz queue_t *sl_wq;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou struct softmac_upper_s *sl_sup;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou softmac_lower_rxinfo_t *sl_rxinfo;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * When a control message is processed, either sl_pending_prim or
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * sl_pending_ioctl will be set. They will be cleared when the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * acknowledgement of the specific control message is received
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * from the underlying legacy driver.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz kmutex_t sl_mutex;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz kcondvar_t sl_cv;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz t_uscalar_t sl_pending_prim;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz boolean_t sl_pending_ioctl;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz mblk_t *sl_ack_mp;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz} softmac_lower_t;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
da14cebe459d3275048785f25bd869cb09b5307fEric Chengtypedef enum {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz SOFTMAC_INITIALIZED,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz SOFTMAC_READY
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng} softmac_lower_state_t;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengtypedef enum {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng SOFTMAC_UNINIT,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng SOFTMAC_ATTACH_INPROG,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng SOFTMAC_ATTACH_DONE,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng SOFTMAC_DETACH_INPROG,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng} softmac_state_t;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct softmac_dev_s {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dev_t sd_dev;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz} softmac_dev_t;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * smac_flag values.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#define SOFTMAC_GLDV3 0x01
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#define SOFTMAC_NOSUPP 0x02
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define SOFTMAC_NEED_RECREATE 0x04
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define SOFTMAC_NOTIFY_QUIT 0x08
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define SMAC_NONZERO_NODECNT(softmac) \
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ((softmac->smac_softmac[0] != NULL) + \
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (softmac->smac_softmac[1] != NULL))
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The softmac structure allows all minor nodes (at most two, style-1 and
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * style-2) for the same device to be processed. A softmac_dev_t will be
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * created for each minor node.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * We try to "register" the mac after all the softmac_dev_t's are processed so
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * that even if DLPI operations fail (because of driver bugs) for one minor
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * node, the other minor node can still be used to register the mac.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * (Specifically, an incorrect xxx_getinfo() implementation will cause style-2
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * minor node mac registration to fail.)
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou *
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Locking description:
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * WO: write once, valid the life time.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct softmac {
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou char smac_devname[MAXNAMELEN]; /* WO */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou major_t smac_umajor; /* WO */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou int smac_uppa; /* WO */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou uint32_t smac_cnt; /* WO, # of minor nodes */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou kmutex_t smac_mutex;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou kcondvar_t smac_cv;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou softmac_state_t smac_state; /* smac_mutex */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The smac_hold_cnt field increases when softmac_hold_device() is
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * called to force the dls_vlan_t of the device to be created. The
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * device pre-detach fails if this counter is not 0.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou uint32_t smac_hold_cnt; /* smac_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou uint32_t smac_flags; /* smac_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou int smac_attacherr; /* smac_mutex */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz mac_handle_t smac_mh;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou softmac_dev_t *smac_softmac[2]; /* smac_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Number of minor nodes whose post-attach routine has succeeded.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * This should be the same as the numbers of softmac_dev_t.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Note that it does not imply SOFTMAC_ATTACH_DONE as the taskq might
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * be still ongoing.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou uint32_t smac_attachok_cnt; /* smac_mutex */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Number of softmac_dev_t left when pre-detach fails. This is used
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * to indicate whether postattach is called because of a failed
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * pre-detach.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou uint32_t smac_attached_left; /* smac_mutex */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Thread handles the DL_NOTIFY_IND message from the lower stream.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou kthread_t *smac_notify_thread; /* smac_mutex */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Head and tail of the DL_NOTIFY_IND messsages.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou mblk_t *smac_notify_head; /* smac_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou mblk_t *smac_notify_tail; /* smac_mutex */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The remaining fields are used to register the MAC for a legacy
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * device. They are set in softmac_mac_register() and do not change.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * One can access them when mac_register() is done without locks.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * media type is needed for create <link name, linkid> mapping, so
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * it is set for GLDv3 device as well
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint_t smac_media;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /* DLPI style of the underlying device */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz int smac_style;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dev_t smac_dev;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz size_t smac_saplen;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz size_t smac_addrlen;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uchar_t smac_unicst_addr[MAXMACADDRLEN];
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint_t smac_min_sdu;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint_t smac_max_sdu;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint32_t smac_margin;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /* Notifications the underlying driver can support. */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint32_t smac_notifications;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Capabilities of the underlying driver.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint32_t smac_capab_flags;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint32_t smac_hcksum_txflags;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz boolean_t smac_no_capability_req;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dl_capab_mdt_t smac_mdt_capab;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz boolean_t smac_mdt;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Lower stream structure, accessed by the MAC provider API. The GLDv3
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * framework assures it's validity.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz softmac_lower_t *smac_lower;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou kmutex_t smac_active_mutex;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Set by xxx_active_set() when aggregation is created.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou boolean_t smac_active; /* smac_active_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Numbers of the bounded streams in the fast-path mode.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou uint32_t smac_nactive; /* smac_active_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou kmutex_t smac_fp_mutex;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou kcondvar_t smac_fp_cv;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * numbers of clients that request to disable fastpath.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou uint32_t smac_fp_disable_clients; /* smac_fp_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou boolean_t smac_fastpath_admin_disabled; /* smac_fp_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * stream list over this softmac.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou list_t smac_sup_list; /* smac_fp_mutex */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz} softmac_t;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct smac_ioc_start_s {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz softmac_lower_t *si_slp;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz} smac_ioc_start_t;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#define SMAC_IOC ('S' << 24 | 'M' << 16 | 'C' << 8)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#define SMAC_IOC_START (SMAC_IOC | 0x01)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou/*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * The su_mode of a non-IP/ARP stream is UNKNOWN, and the su_mode of an IP/ARP
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * stream is either SLOWPATH or FASTPATH.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou#define SOFTMAC_UNKNOWN 0x00
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou#define SOFTMAC_SLOWPATH 0x01
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou#define SOFTMAC_FASTPATH 0x02
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhoutypedef struct softmac_switch_req_s {
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou list_node_t ssq_req_list_node;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou uint32_t ssq_expected_mode;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou} softmac_switch_req_t;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou#define DATAPATH_MODE(softmac) \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou ((((softmac)->smac_fp_disable_clients != 0) || \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou (softmac)->smac_fastpath_admin_disabled) ? SOFTMAC_SLOWPATH : \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou SOFTMAC_FASTPATH)
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou/*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Locking description:
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou *
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * WO: Set once and valid for life;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * SL: Serialized by the control path (softmac_wput_nondata_task())
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhoutypedef struct softmac_upper_s {
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou softmac_t *su_softmac; /* WO */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou queue_t *su_rq; /* WO */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou queue_t *su_wq; /* WO */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * List of upper streams that has pending DLPI messages to be processed.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou list_node_t su_taskq_list_node; /* softmac_taskq_lock */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * non-NULL for IP/ARP streams in the fast-path mode
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou softmac_lower_t *su_slp; /* SL & su_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * List of all IP/ARP upperstreams on the same softmac (including
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * the ones in both data-path modes).
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou list_node_t su_list_node; /* smac_fp_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * List of datapath switch requests.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou list_t su_req_list; /* smac_fp_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Place holder of RX callbacks used to handles data messages comes
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * from the dedicated-lower-stream associated with the IP/ARP stream.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Another RX callback is softmac_drop_rxinfo, which is a global
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * variable.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou softmac_lower_rxinfo_t su_rxinfo; /* WO */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou softmac_lower_rxinfo_t su_direct_rxinfo; /* WO */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Used to serialize the DLPI operation and fastpath<->slowpath
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * switching over operation.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou kmutex_t su_disp_mutex;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou kcondvar_t su_disp_cv;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou mblk_t *su_pending_head; /* su_disp_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou mblk_t *su_pending_tail; /* su_disp_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou boolean_t su_dlpi_pending; /* su_disp_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou boolean_t su_closing; /* su_disp_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou uint32_t su_bound : 1, /* SL */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou su_active : 1, /* SL */
bd670b35a010421b6e1a5536c34453a827007c81Erik Nordmark su_direct : 1, /* SL */
bd670b35a010421b6e1a5536c34453a827007c81Erik Nordmark su_is_arp : 1,
bd670b35a010421b6e1a5536c34453a827007c81Erik Nordmark su_pad_to_32:28;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Used for fastpath data path.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou kmutex_t su_mutex;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou kcondvar_t su_cv;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou mblk_t *su_tx_flow_mp; /* su_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou boolean_t su_tx_busy; /* su_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Number of softmac_srv() operation in fastpath processing.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou uint32_t su_tx_inprocess; /* su_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * SOFTMAC_SLOWPATH or SOFTMAC_FASTPATH
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou uint32_t su_mode; /* SL & su_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou /*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Whether this stream is already scheduled in softmac_taskq_list.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou boolean_t su_taskq_scheduled; /* softmac_taskq_lock */
79eeb64527c881659e23b60088c32ae3736a7a2cCathy Zhou
79eeb64527c881659e23b60088c32ae3736a7a2cCathy Zhou /*
79eeb64527c881659e23b60088c32ae3736a7a2cCathy Zhou * The DLD_CAPAB_DIRECT related notify callback.
79eeb64527c881659e23b60088c32ae3736a7a2cCathy Zhou */
79eeb64527c881659e23b60088c32ae3736a7a2cCathy Zhou mac_tx_notify_t su_tx_notify_func; /* su_mutex */
79eeb64527c881659e23b60088c32ae3736a7a2cCathy Zhou void *su_tx_notify_arg; /* su_mutex */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou} softmac_upper_t;
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou#define SOFTMAC_EQ_PENDING(sup, mp) { \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou if ((sup)->su_pending_head == NULL) { \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou (sup)->su_pending_head = (sup)->su_pending_tail = (mp); \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou } else { \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou (sup)->su_pending_tail->b_next = (mp); \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou (sup)->su_pending_tail = (mp); \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou } \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou}
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou#define SOFTMAC_DQ_PENDING(sup, mpp) { \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou if ((sup)->su_pending_head == NULL) { \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou *(mpp) = NULL; \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou } else { \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou *(mpp) = (sup)->su_pending_head; \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou if (((sup)->su_pending_head = (*(mpp))->b_next) == NULL)\
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou (sup)->su_pending_tail = NULL; \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou (*(mpp))->b_next = NULL; \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou } \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou}
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou/*
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * A macro to check whether the write-queue of the lower stream is full
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * and packets need to be enqueued.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou *
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * Because softmac is pushed right above the underlying device and
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * _I_INSERT/_I_REMOVE is not processed in the lower stream, it is
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou * safe to directly access the q_next pointer.
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou */
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou#define SOFTMAC_CANPUTNEXT(q) \
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou (!((q)->q_next->q_nfsrv->q_flag & QFULL) || canput((q)->q_next))
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern dev_info_t *softmac_dip;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#define SOFTMAC_DEV_NAME "softmac"
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern int softmac_send_bind_req(softmac_lower_t *, uint_t);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern int softmac_send_unbind_req(softmac_lower_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern int softmac_send_notify_req(softmac_lower_t *, uint32_t);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern int softmac_send_promisc_req(softmac_lower_t *, t_uscalar_t,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz boolean_t);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern void softmac_init();
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern void softmac_fini();
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern void softmac_fp_init();
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern void softmac_fp_fini();
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern boolean_t softmac_busy();
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern int softmac_fill_capab(ldi_handle_t, softmac_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern int softmac_capab_enable(softmac_lower_t *);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern void softmac_rput_process_notdata(queue_t *, softmac_upper_t *,
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou mblk_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern void softmac_rput_process_data(softmac_lower_t *, mblk_t *);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern int softmac_output(softmac_lower_t *, mblk_t *, t_uscalar_t,
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou t_uscalar_t, mblk_t **);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern int softmac_mexchange_error_ack(mblk_t **, t_uscalar_t,
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou t_uscalar_t, t_uscalar_t);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern int softmac_m_promisc(void *, boolean_t);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern int softmac_m_multicst(void *, boolean_t, const uint8_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern int softmac_m_unicst(void *, const uint8_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern void softmac_m_ioctl(void *, queue_t *, mblk_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern int softmac_m_stat(void *, uint_t, uint64_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern mblk_t *softmac_m_tx(void *, mblk_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern int softmac_proto_tx(softmac_lower_t *, mblk_t *, mblk_t **);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzextern void softmac_ioctl_tx(softmac_lower_t *, mblk_t *, mblk_t **);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengextern void softmac_notify_thread(void *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern int softmac_hold(dev_t, softmac_t **);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern void softmac_rele(softmac_t *);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern int softmac_lower_setup(softmac_t *, softmac_upper_t *,
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou softmac_lower_t **);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern boolean_t softmac_active_set(void *);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern void softmac_active_clear(void *);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern int softmac_fastpath_disable(void *);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern void softmac_fastpath_enable(void *);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern int softmac_datapath_switch(softmac_t *, boolean_t, boolean_t);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern void softmac_wput_data(softmac_upper_t *, mblk_t *);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern void softmac_wput_nondata(softmac_upper_t *, mblk_t *);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhouextern void softmac_upperstream_close(softmac_upper_t *);
5d460eafffba936e81c4dd5ebe0f59b238f09121Cathy Zhou
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#ifdef __cplusplus
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#endif
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#endif /* _SYS_SOFTMAC_IMPL_H */