fcoe.h revision 7ff836697c120cb94bd30d5c2204eb9b74718e4c
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* The following notice accompanied the original version of this file:
*
* BSD LICENSE
*
* Copyright(c) 2007 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _FCOE_H_
#define _FCOE_H_
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
extern int fcoe_use_ext_log;
extern struct fcoe_soft_state *fcoe_global_ss;
/*
* Caution: 1) LOG will be available in debug/non-debug mode
* 2) Anything which can potentially flood the log should be under
* extended logging, and use FCOE_EXT_LOG.
* 3) Don't use FCOE_EXT_LOG in performance-critical code path, such
* as normal SCSI I/O code path. It could hurt system performance.
* 4) Use kmdb to change foce_use_ext_log in the fly to adjust
* tracing
*/
#define FCOE_EXT_LOG(log_ident, ...) \
do { \
if (fcoe_use_ext_log) { \
fcoe_trace(log_ident, __VA_ARGS__); \
} \
} while (0)
#define FCOE_LOG(log_ident, ...) \
fcoe_trace(log_ident, __VA_ARGS__)
/*
* There will be only one fcoe instance
*/
typedef struct fcoe_soft_state {
dev_info_t *ss_dip;
uint32_t ss_flags;
list_t ss_mac_list;
uint32_t ss_ioctl_flags;
kmutex_t ss_ioctl_mutex;
/*
* watchdog stuff
*/
ddi_taskq_t *ss_watchdog_taskq;
kcondvar_t ss_watch_cv;
kmutex_t ss_watch_mutex;
list_t ss_pfrm_list; /* Pending frame */
} fcoe_soft_state_t;
#define SS_FLAG_TERMINATE_WATCHDOG 0x0020
#define SS_FLAG_WATCHDOG_RUNNING 0x0040
#define SS_FLAG_DOG_WAITING 0x0080
/*
* Driver name
*/
#define FCOEI_DRIVER_NAME "fcoei"
#define FCOET_DRIVER_NAME "fcoet"
/*
* One for each ethernet port
*/
typedef struct fcoe_mac
{
list_node_t fm_ss_node;
datalink_id_t fm_linkid;
uint32_t fm_flags;
fcoe_soft_state_t *fm_ss;
fcoe_port_t fm_eport;
fcoe_client_t fm_client;
dev_info_t *fm_client_dev;
mac_handle_t fm_handle;
mac_client_handle_t fm_cli_handle;
mac_promisc_handle_t fm_promisc_handle;
mac_notify_handle_t fm_notify_handle;
mac_unicast_handle_t fm_unicst_handle;
uint8_t fm_primary_addr[ETHERADDRL];
uint8_t fm_current_addr[ETHERADDRL];
uint32_t fm_running:1,
fm_force_promisc:1,
fm_rsvd:18,
fm_state:4,
fm_link_state:8;
uint32_t fm_frm_cnt;
kcondvar_t fm_tx_cv;
kmutex_t fm_mutex;
} fcoe_mac_t;
#define FCOE_MAC_STATE_OFFLINE 0x0
#define FCOE_MAC_STATE_ONLINE 0x1
#define FCOE_MAC_LINK_STATE_DOWN 0x00
#define FCOE_MAC_LINK_STATE_UP 0x01
#define FCOE_MAC_FLAG_ENABLED 0x01
#define FCOE_MAC_FLAG_BOUND 0x02
#define FCOE_MAC_FLAG_USER_DEL 0x04
typedef struct fcoe_frame_header {
uint8_t ffh_ver[1]; /* version field - upper 4 bits */
uint8_t ffh_resvd[12];
uint8_t ffh_sof[1]; /* start of frame per RFC 3643 */
} fcoe_frame_header_t;
typedef struct fcoe_frame_tailer {
uint8_t fft_crc[4]; /* FC packet CRC */
uint8_t fft_eof[1];
uint8_t fft_resvd[3];
} fcoe_frame_tailer_t;
/*
* RAW frame structure
* It is used to describe the content of every mblk
*/
typedef struct fcoe_i_frame {
list_node_t fmi_pending_node;
fcoe_frame_t *fmi_frame; /* to common struct */
fcoe_mac_t *fmi_mac; /* to/from where */
/*
* FRAME structure
*/
struct ether_header *fmi_efh; /* 14 bytes eth header */
fcoe_frame_header_t *fmi_ffh; /* 14 bytes FCOE hader */
uint8_t *fmi_fc_frame;
fcoe_frame_tailer_t *fmi_fft; /* 8 bytes FCOE tailer */
} fcoe_i_frame_t;
typedef struct fcoe_worker {
list_t worker_frm_list;
kmutex_t worker_lock;
kcondvar_t worker_cv;
uint32_t worker_flags;
uint32_t worker_ntasks;
} fcoe_worker_t;
#define FCOE_WORKER_TERMINATE 0x01
#define FCOE_WORKER_STARTED 0x02
#define FCOE_WORKER_ACTIVE 0x04
/*
* IOCTL supporting stuff
*/
#define FCOE_IOCTL_FLAG_MASK 0xFF
#define FCOE_IOCTL_FLAG_IDLE 0x00
#define FCOE_IOCTL_FLAG_OPEN 0x01
#define FCOE_IOCTL_FLAG_EXCL 0x02
#define FCOE_IOCTL_FLAG_EXCL_BUSY 0x04
/*
* define common-used macros to simplify coding
*/
#define FCOE_FIP_TYPE 0x8914
#define FCOE_802_1Q_TAG 0x8100
#define PADDING_HEADER_SIZE (sizeof (struct ether_header) + \
sizeof (fcoe_frame_header_t))
#define PADDING_SIZE (PADDING_HEADER_SIZE + sizeof (fcoe_frame_tailer_t))
#define EPORT2MAC(x_eport) ((fcoe_mac_t *)(x_eport)->eport_fcoe_private)
#define FRM2MAC(x_frm) (EPORT2MAC((x_frm)->frm_eport))
#define FRM2FMI(x_frm) ((fcoe_i_frame_t *)(x_frm)->frm_fcoe_private)
#define FRM2MBLK(x_frm) ((mblk_t *)(x_frm)->frm_netb)
#define FCOE_VER 0
#define FCOE_DECAPS_VER(x_ffh) ((x_ffh)->ffh_ver[0] >> 4)
#define FCOE_ENCAPS_VER(x_ffh, x_v) \
{ \
(x_ffh)->ffh_ver[0] = ((x_v) << 4); \
}
/*
* fcoe driver common functions
*/
extern fcoe_mac_t *fcoe_lookup_mac_by_id(datalink_id_t);
extern void fcoe_destroy_mac(fcoe_mac_t *);
extern mblk_t *fcoe_get_mblk(fcoe_mac_t *, uint32_t);
extern void fcoe_post_frame(fcoe_frame_t *);
#endif /* _KERNEL */
#ifdef __cplusplus
}
#endif
#endif /* _FCOE_H_ */