1*fcf3ce44SJohn Forte /*
2*fcf3ce44SJohn Forte  * CDDL HEADER START
3*fcf3ce44SJohn Forte  *
4*fcf3ce44SJohn Forte  * The contents of this file are subject to the terms of the
5*fcf3ce44SJohn Forte  * Common Development and Distribution License (the "License").
6*fcf3ce44SJohn Forte  * You may not use this file except in compliance with the License.
7*fcf3ce44SJohn Forte  *
8*fcf3ce44SJohn Forte  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*fcf3ce44SJohn Forte  * or http://www.opensolaris.org/os/licensing.
10*fcf3ce44SJohn Forte  * See the License for the specific language governing permissions
11*fcf3ce44SJohn Forte  * and limitations under the License.
12*fcf3ce44SJohn Forte  *
13*fcf3ce44SJohn Forte  * When distributing Covered Code, include this CDDL HEADER in each
14*fcf3ce44SJohn Forte  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*fcf3ce44SJohn Forte  * If applicable, add the following below this CDDL HEADER, with the
16*fcf3ce44SJohn Forte  * fields enclosed by brackets "[]" replaced with your own identifying
17*fcf3ce44SJohn Forte  * information: Portions Copyright [yyyy] [name of copyright owner]
18*fcf3ce44SJohn Forte  *
19*fcf3ce44SJohn Forte  * CDDL HEADER END
20*fcf3ce44SJohn Forte  */
21*fcf3ce44SJohn Forte /*
22*fcf3ce44SJohn Forte  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23*fcf3ce44SJohn Forte  * Use is subject to license terms.
24*fcf3ce44SJohn Forte  */
25*fcf3ce44SJohn Forte 
26*fcf3ce44SJohn Forte #ifndef	_SYS_FIBRE_CHANNEL_ULP_FCIP_H
27*fcf3ce44SJohn Forte #define	_SYS_FIBRE_CHANNEL_ULP_FCIP_H
28*fcf3ce44SJohn Forte 
29*fcf3ce44SJohn Forte 
30*fcf3ce44SJohn Forte 
31*fcf3ce44SJohn Forte /*
32*fcf3ce44SJohn Forte  * Header file for FCIP: IP/ARP ULP over FibreChannel
33*fcf3ce44SJohn Forte  */
34*fcf3ce44SJohn Forte 
35*fcf3ce44SJohn Forte #include <sys/kstat.h>
36*fcf3ce44SJohn Forte #include <sys/socket.h>
37*fcf3ce44SJohn Forte #include <netinet/arp.h>
38*fcf3ce44SJohn Forte 
39*fcf3ce44SJohn Forte #ifdef	__cplusplus
40*fcf3ce44SJohn Forte extern "C" {
41*fcf3ce44SJohn Forte #endif
42*fcf3ce44SJohn Forte 
43*fcf3ce44SJohn Forte /*
44*fcf3ce44SJohn Forte  * Definitions for module_info.
45*fcf3ce44SJohn Forte  */
46*fcf3ce44SJohn Forte #define		FCIPIDNUM	(77)		/* module ID number */
47*fcf3ce44SJohn Forte #define		FCIPNAME	"fcip"		/* module name */
48*fcf3ce44SJohn Forte #define		FCIPMINPSZ	(0)		/* min packet size */
49*fcf3ce44SJohn Forte #define		FCIPMAXPSZ	1514		/* max packet size */
50*fcf3ce44SJohn Forte #define		FCIPHIWAT	(32 * 1024)	/* hi-water mark */
51*fcf3ce44SJohn Forte #define		FCIPLOWAT	(1)		/* lo-water mark */
52*fcf3ce44SJohn Forte #define		FCIPMTU		65280		/* Max permissible MTU */
53*fcf3ce44SJohn Forte #define		FCIPMIN		(ETHERMIN + sizeof (llc_snap_hdr_t) + \
54*fcf3ce44SJohn Forte 				sizeof (fcph_network_hdr_t))
55*fcf3ce44SJohn Forte 
56*fcf3ce44SJohn Forte /*
57*fcf3ce44SJohn Forte  * Per-Stream instance state information.
58*fcf3ce44SJohn Forte  *
59*fcf3ce44SJohn Forte  * Each instance is dynamically allocated at open() and free'd
60*fcf3ce44SJohn Forte  * at close().  Each per-Stream instance points to at most one
61*fcf3ce44SJohn Forte  * per-device structure using the sl_fcip field.  All instances
62*fcf3ce44SJohn Forte  * are threaded together into one list of active instances
63*fcf3ce44SJohn Forte  * ordered on minor device number.
64*fcf3ce44SJohn Forte  */
65*fcf3ce44SJohn Forte 
66*fcf3ce44SJohn Forte #define	NMCHASH			64	/* no. of multicast hash buckets */
67*fcf3ce44SJohn Forte #define	INIT_BUCKET_SIZE	16	/* Initial hash bucket size */
68*fcf3ce44SJohn Forte 
69*fcf3ce44SJohn Forte struct	fcipstr {
70*fcf3ce44SJohn Forte 	struct fcipstr	*sl_nextp;	/* next in list */
71*fcf3ce44SJohn Forte 	queue_t		*sl_rq;		/* pointer to our rq */
72*fcf3ce44SJohn Forte 	struct fcip 	*sl_fcip;	/* attached device */
73*fcf3ce44SJohn Forte 	t_uscalar_t	sl_state;	/* current DL state */
74*fcf3ce44SJohn Forte 	t_uscalar_t	sl_sap;		/* bound sap */
75*fcf3ce44SJohn Forte 	uint32_t	sl_flags;	/* misc. flags */
76*fcf3ce44SJohn Forte 	uint32_t	sl_minor;	/* minor device number */
77*fcf3ce44SJohn Forte 	la_wwn_t	*sl_mctab[NMCHASH]; /* multicast addr table */
78*fcf3ce44SJohn Forte 	uint_t		sl_mccount[NMCHASH]; /* # valid addr in mctab[i] */
79*fcf3ce44SJohn Forte 	uint_t		sl_mcsize[NMCHASH]; /* size of mctab[i] */
80*fcf3ce44SJohn Forte 	ushort_t	sl_ladrf[4];	/* Multicast filter bits */
81*fcf3ce44SJohn Forte 	ushort_t	sl_ladrf_refcnt[64]; /* ref. count for filter bits */
82*fcf3ce44SJohn Forte 	kmutex_t	sl_lock;	/* protect this structure */
83*fcf3ce44SJohn Forte };
84*fcf3ce44SJohn Forte 
85*fcf3ce44SJohn Forte /* per-stream flags */
86*fcf3ce44SJohn Forte #define	FCIP_SLFAST	0x01	/* "M_DATA fastpath" mode */
87*fcf3ce44SJohn Forte #define	FCIP_SLRAW	0x02	/* M_DATA plain raw mode */
88*fcf3ce44SJohn Forte #define	FCIP_SLALLPHYS	0x04	/* "promiscuous mode" */
89*fcf3ce44SJohn Forte #define	FCIP_SLALLMULTI	0x08	/* enable all multicast addresses */
90*fcf3ce44SJohn Forte #define	FCIP_SLALLSAP	0x10	/* enable all ether type values */
91*fcf3ce44SJohn Forte 
92*fcf3ce44SJohn Forte /*
93*fcf3ce44SJohn Forte  * Maximum # of multicast addresses per Stream.
94*fcf3ce44SJohn Forte  */
95*fcf3ce44SJohn Forte #define	FCIPMAXMC	64
96*fcf3ce44SJohn Forte #define	FCIPMCALLOC	(FCIPMAXMC * sizeof (la_wwn_t))
97*fcf3ce44SJohn Forte 
98*fcf3ce44SJohn Forte /*
99*fcf3ce44SJohn Forte  * Full DLSAP address length (in struct dladdr format).
100*fcf3ce44SJohn Forte  */
101*fcf3ce44SJohn Forte #define	FCIPADDRL	(sizeof (ushort_t) + sizeof (struct ether_addr))
102*fcf3ce44SJohn Forte 
103*fcf3ce44SJohn Forte 
104*fcf3ce44SJohn Forte typedef struct fcip_port_info {
105*fcf3ce44SJohn Forte 	struct fcip_port_info	*fcipp_next;	/* next port in list */
106*fcf3ce44SJohn Forte 	opaque_t		*fcipp_handle;
107*fcf3ce44SJohn Forte 	struct modlinkage	fcipp_linkage;
108*fcf3ce44SJohn Forte 	dev_info_t		*fcipp_dip;
109*fcf3ce44SJohn Forte 	uint32_t		fcipp_topology;
110*fcf3ce44SJohn Forte 	uint32_t		fcipp_pstate;
111*fcf3ce44SJohn Forte 	la_wwn_t		fcipp_pwwn;
112*fcf3ce44SJohn Forte 	la_wwn_t		fcipp_nwwn;
113*fcf3ce44SJohn Forte 	uchar_t			fcipp_naa;	/* This port's NAA */
114*fcf3ce44SJohn Forte 	int			fcipp_fca_pkt_size;
115*fcf3ce44SJohn Forte 	ddi_dma_attr_t		fcipp_cmd_dma_attr;
116*fcf3ce44SJohn Forte 	ddi_dma_attr_t		fcipp_resp_dma_attr;
117*fcf3ce44SJohn Forte 	ddi_device_acc_attr_t	fcipp_fca_acc_attr;
118*fcf3ce44SJohn Forte 	fc_portid_t		fcipp_sid;	/* this port's S_ID */
119*fcf3ce44SJohn Forte 	struct fcip		*fcipp_fcip;	/* this port's fcip struct */
120*fcf3ce44SJohn Forte } fcip_port_info_t;
121*fcf3ce44SJohn Forte 
122*fcf3ce44SJohn Forte #define	FCIP_SUCCESS		(0)
123*fcf3ce44SJohn Forte #define	FCIP_FAILURE		(1)
124*fcf3ce44SJohn Forte #define	FCIP_FARP_TIMEOUT	10	/* seconds */
125*fcf3ce44SJohn Forte #define	FCIP_WAIT_CMDS		5	/* 5 retries at 1 sec between retries */
126*fcf3ce44SJohn Forte 
127*fcf3ce44SJohn Forte /*
128*fcf3ce44SJohn Forte  * Num ports supported for soft_state_init
129*fcf3ce44SJohn Forte  */
130*fcf3ce44SJohn Forte #define	FCIP_NUM_INSTANCES	5
131*fcf3ce44SJohn Forte 
132*fcf3ce44SJohn Forte #define	FCIP_UB_NBUFS		60
133*fcf3ce44SJohn Forte #define	FCIP_UB_SIZE		65535
134*fcf3ce44SJohn Forte #define	FCIP_UB_DECREMENT	4
135*fcf3ce44SJohn Forte #define	FCIP_UB_MINBUFS		8
136*fcf3ce44SJohn Forte #define	FCIP_INIT_DELAY		10000000	/* 10 seconds */
137*fcf3ce44SJohn Forte #define	FCIP_PKT_TTL		120		/* 120 secs */
138*fcf3ce44SJohn Forte #define	FCIP_TIMEOUT_INTERVAL	10		/* 10 seconds */
139*fcf3ce44SJohn Forte #define	FCIP_OFFLINE_TIMEOUT	60		/* 60 seconds */
140*fcf3ce44SJohn Forte #define	FCIP_MAX_PORTS		127		/* for private loop/pt_pt */
141*fcf3ce44SJohn Forte #define	FCIP_RTE_TIMEOUT	60		/* 60 seconds */
142*fcf3ce44SJohn Forte 
143*fcf3ce44SJohn Forte #define	ETHERSTRL		((2 * ETHERADDRL) + 1)
144*fcf3ce44SJohn Forte /*
145*fcf3ce44SJohn Forte  * Hash lists
146*fcf3ce44SJohn Forte  */
147*fcf3ce44SJohn Forte #define	FCIP_RT_HASH_ELEMS	32
148*fcf3ce44SJohn Forte #define	FCIP_DEST_HASH_ELEMS	16
149*fcf3ce44SJohn Forte 
150*fcf3ce44SJohn Forte 
151*fcf3ce44SJohn Forte #define	FCIP_RT_HASH(x)		((x[2] + x[3] + x[4] + x[5] + x[6] + x[7]) \
152*fcf3ce44SJohn Forte 				& (FCIP_RT_HASH_ELEMS - 1))
153*fcf3ce44SJohn Forte 
154*fcf3ce44SJohn Forte #define	FCIP_DEST_HASH(x)	((x[2] + x[3] + x[4] + x[5] + x[6] + x[7]) \
155*fcf3ce44SJohn Forte 				& (FCIP_DEST_HASH_ELEMS - 1))
156*fcf3ce44SJohn Forte 
157*fcf3ce44SJohn Forte #define	FCIP_HDR_SIZE		8
158*fcf3ce44SJohn Forte #define	FCIP_RT_INVALID		(-1)
159*fcf3ce44SJohn Forte #define	FCIP_RT_RETIRED		(-2)
160*fcf3ce44SJohn Forte #define	FCIP_RT_SUSPENDED	(-3)
161*fcf3ce44SJohn Forte #define	FCIP_RT_LOGIN_PROGRESS	(-4)
162*fcf3ce44SJohn Forte 
163*fcf3ce44SJohn Forte #define	FCIP_RTE_UNAVAIL(state)	(((state) == FCIP_RT_INVALID) || \
164*fcf3ce44SJohn Forte 					((state) == FCIP_RT_RETIRED) || \
165*fcf3ce44SJohn Forte 					((state) == FCIP_RT_SUSPENDED)) ? 1 : 0
166*fcf3ce44SJohn Forte 
167*fcf3ce44SJohn Forte /*
168*fcf3ce44SJohn Forte  * Taskq related
169*fcf3ce44SJohn Forte  */
170*fcf3ce44SJohn Forte #define	FCIP_NUM_THREADS	4
171*fcf3ce44SJohn Forte #define	FCIP_MIN_TASKS		12
172*fcf3ce44SJohn Forte #define	FCIP_MAX_TASKS		32
173*fcf3ce44SJohn Forte 
174*fcf3ce44SJohn Forte 
175*fcf3ce44SJohn Forte /*
176*fcf3ce44SJohn Forte  * Per-Device instance state information.
177*fcf3ce44SJohn Forte  *
178*fcf3ce44SJohn Forte  * Each instance is dynamically allocated on first attach.
179*fcf3ce44SJohn Forte  */
180*fcf3ce44SJohn Forte struct fcip {
181*fcf3ce44SJohn Forte 	dev_info_t		*fcip_dip;	/* parent's dev_info */
182*fcf3ce44SJohn Forte 	int			fcip_instance;	/* parent's instance */
183*fcf3ce44SJohn Forte 	struct fcip		*fcip_sibling;	/* The other FCA port */
184*fcf3ce44SJohn Forte 	uint32_t		fcip_flags;	/* misc. flags */
185*fcf3ce44SJohn Forte 	uint32_t		fcip_port_state; /* Link State */
186*fcf3ce44SJohn Forte 	fcip_port_info_t	*fcip_port_info; /* info about port */
187*fcf3ce44SJohn Forte 	struct fcip		*fcip_next;
188*fcf3ce44SJohn Forte 
189*fcf3ce44SJohn Forte 	kcondvar_t		fcip_farp_cv;	/* For perport serialization */
190*fcf3ce44SJohn Forte 	int			fcip_farp_rsp_flag; /* FARP response flag */
191*fcf3ce44SJohn Forte 	kmutex_t		fcip_mutex;	/* protect this structure */
192*fcf3ce44SJohn Forte 	kmutex_t		fcip_ub_mutex;	/* protect the unsol bufs */
193*fcf3ce44SJohn Forte 
194*fcf3ce44SJohn Forte 	uint32_t		fcip_ub_nbufs;	/* no. of Unsol. Buffers */
195*fcf3ce44SJohn Forte 	uint32_t		fcip_ub_upstream; /* no ubufs in use */
196*fcf3ce44SJohn Forte 	kcondvar_t		fcip_ub_cv;
197*fcf3ce44SJohn Forte 	timeout_id_t		fcip_timeout_id; /* for timeout routine */
198*fcf3ce44SJohn Forte 	uint32_t		fcip_timeout_ticks;
199*fcf3ce44SJohn Forte 	uint32_t		fcip_mark_offline;
200*fcf3ce44SJohn Forte 
201*fcf3ce44SJohn Forte 	uint64_t		*fcip_ub_tokens; /* unsol buf tokens */
202*fcf3ce44SJohn Forte 	kmutex_t		fcip_dest_mutex; /* dest table lock */
203*fcf3ce44SJohn Forte 	struct fcip_dest	*fcip_dest[FCIP_DEST_HASH_ELEMS];
204*fcf3ce44SJohn Forte 					/* hash table of remote dest. ports */
205*fcf3ce44SJohn Forte 	kmutex_t		fcip_rt_mutex;	/* routing table lock */
206*fcf3ce44SJohn Forte 	struct fcip_routing_table *fcip_rtable[FCIP_RT_HASH_ELEMS];
207*fcf3ce44SJohn Forte 					/* hash table of WWN to D_ID maps */
208*fcf3ce44SJohn Forte 
209*fcf3ce44SJohn Forte 	int			fcip_intr_flag;	/* init. flag for fcipintr() */
210*fcf3ce44SJohn Forte 	uint32_t		fcip_addrflags;	/* type of MAC address */
211*fcf3ce44SJohn Forte 	struct ether_addr	fcip_factmacaddr; /* local mac address */
212*fcf3ce44SJohn Forte 	struct ether_addr	fcip_macaddr;	/* MAC addr */
213*fcf3ce44SJohn Forte 	la_wwn_t		fcip_ouraddr;	/* individual address */
214*fcf3ce44SJohn Forte 	uchar_t			fcip_ouripaddr[16]; /* Our IP address */
215*fcf3ce44SJohn Forte 	struct kmem_cache	*fcip_xmit_cache; /* cache of xmit pkts */
216*fcf3ce44SJohn Forte 	uint32_t		fcip_wantw;	/* out of xmit resources */
217*fcf3ce44SJohn Forte 	queue_t			*fcip_ipq;	/* ip read queue */
218*fcf3ce44SJohn Forte 	taskq_t			*fcip_tq;	/* Taskq pointer */
219*fcf3ce44SJohn Forte 	int			fcip_sendup_thr_initted; /* sendup tq thread */
220*fcf3ce44SJohn Forte 	kmutex_t		fcip_sendup_mutex; /* for upstream data */
221*fcf3ce44SJohn Forte 	kcondvar_t		fcip_sendup_cv;	/* for upstream unsol data */
222*fcf3ce44SJohn Forte 	struct fcip_sendup_elem	*fcip_sendup_head; /* head of mblk elems */
223*fcf3ce44SJohn Forte 	struct fcip_sendup_elem	*fcip_sendup_tail; /* tail of elem list */
224*fcf3ce44SJohn Forte 	struct kmem_cache	*fcip_sendup_cache; /* for sendup elems */
225*fcf3ce44SJohn Forte 	uint32_t		fcip_sendup_cnt; /* Num msgs queued */
226*fcf3ce44SJohn Forte 	uint32_t		fcip_broadcast_did; /* broadcast D_ID */
227*fcf3ce44SJohn Forte 
228*fcf3ce44SJohn Forte 	kstat_t			*fcip_intrstats; /* interrupt statistics */
229*fcf3ce44SJohn Forte 	kstat_t			*fcip_kstatp;	/* kstat pointer */
230*fcf3ce44SJohn Forte 
231*fcf3ce44SJohn Forte 	callb_cpr_t		fcip_cpr_info;	/* for the sendup thread */
232*fcf3ce44SJohn Forte 
233*fcf3ce44SJohn Forte 	ulong_t			fcip_ipackets;  /* # packets received */
234*fcf3ce44SJohn Forte 	ulong_t			fcip_ierrors;	/* # total input errors */
235*fcf3ce44SJohn Forte 	ulong_t			fcip_opackets;  /* # packets sent */
236*fcf3ce44SJohn Forte 	ulong_t			fcip_oerrors;	/* # total output errors */
237*fcf3ce44SJohn Forte 	ulong_t			fcip_collisions;  /* # collisions */
238*fcf3ce44SJohn Forte 	ulong_t			fcip_defer;	/* # defers */
239*fcf3ce44SJohn Forte 	ulong_t			fcip_fram;	/* # receive framing errors */
240*fcf3ce44SJohn Forte 	ulong_t			fcip_crc;	/* # receive crc errors */
241*fcf3ce44SJohn Forte 	ulong_t			fcip_oflo;	/* # receiver overflows */
242*fcf3ce44SJohn Forte 	ulong_t			fcip_uflo;	/* # transmit underflows */
243*fcf3ce44SJohn Forte 	ulong_t			fcip_missed;	/* # receive missed */
244*fcf3ce44SJohn Forte 	ulong_t			fcip_tlcol;	/* # xmit late collisions */
245*fcf3ce44SJohn Forte 	ulong_t			fcip_trtry;	/* # transmit retry failures */
246*fcf3ce44SJohn Forte 	ulong_t			fcip_tnocar;	/* # loss of carrier errors */
247*fcf3ce44SJohn Forte 	ulong_t			fcip_inits;	/* # driver inits */
248*fcf3ce44SJohn Forte 	ulong_t			fcip_notbufs;	/* # out of pkts for xmit */
249*fcf3ce44SJohn Forte 	ulong_t			fcip_norbufs;	/* # out of buffers for rcv */
250*fcf3ce44SJohn Forte 	ulong_t			fcip_nocanput;  /* # input canputret.false */
251*fcf3ce44SJohn Forte 	ulong_t			fcip_allocbfail;  /* # allocb failed */
252*fcf3ce44SJohn Forte 	int 			fcip_tx_lbolt;  /* time of last tx interrupt */
253*fcf3ce44SJohn Forte 	int 			fcip_rx_lbolt; 	/* time of last rx interrupt */
254*fcf3ce44SJohn Forte 
255*fcf3ce44SJohn Forte 	/*
256*fcf3ce44SJohn Forte 	 * MIB II variables
257*fcf3ce44SJohn Forte 	 */
258*fcf3ce44SJohn Forte 	ulong_t			fcip_rcvbytes; /* # bytes received */
259*fcf3ce44SJohn Forte 	ulong_t			fcip_xmtbytes; /* # bytes transmitted */
260*fcf3ce44SJohn Forte 	ulong_t			fcip_multircv; /* # multicast pkts received */
261*fcf3ce44SJohn Forte 	ulong_t			fcip_multixmt; /* # multicast pkts for xmit */
262*fcf3ce44SJohn Forte 	ulong_t			fcip_brdcstrcv; /* # broadcast pkts received */
263*fcf3ce44SJohn Forte 	ulong_t			fcip_brdcstxmt; /* # broadcast pkts for xmit */
264*fcf3ce44SJohn Forte 	ulong_t			fcip_norcvbuf; /* # rcv pkts discarded */
265*fcf3ce44SJohn Forte 	ulong_t			fcip_noxmtbuf; /* # xmit pkts discarded */
266*fcf3ce44SJohn Forte 
267*fcf3ce44SJohn Forte 	ulong_t			fcip_num_ipkts_pending;
268*fcf3ce44SJohn Forte 						/* #ipkts pending call back */
269*fcf3ce44SJohn Forte };
270*fcf3ce44SJohn Forte 
271*fcf3ce44SJohn Forte #define	FCIP_FACTADDR_PRESENT		0x01
272*fcf3ce44SJohn Forte #define	FCIP_FACTADDR_USE		0x02
273*fcf3ce44SJohn Forte 
274*fcf3ce44SJohn Forte /* flags */
275*fcf3ce44SJohn Forte #define	FCIP_RUNNING			0x01
276*fcf3ce44SJohn Forte #define	FCIP_INITED			0x02
277*fcf3ce44SJohn Forte #define	FCIP_PROMISC			0x04
278*fcf3ce44SJohn Forte #define	FCIP_SUSPENDED			0x08
279*fcf3ce44SJohn Forte #define	FCIP_NOTIMEOUTS			0x10
280*fcf3ce44SJohn Forte #define	FCIP_DETACHING			0x20
281*fcf3ce44SJohn Forte #define	FCIP_DETACHED			0x40
282*fcf3ce44SJohn Forte #define	FCIP_ATTACHING			0x80
283*fcf3ce44SJohn Forte #define	FCIP_LINK_DOWN			0x100
284*fcf3ce44SJohn Forte #define	FCIP_IN_SC_CB			0x200
285*fcf3ce44SJohn Forte #define	FCIP_IN_DATA_CB			0x400
286*fcf3ce44SJohn Forte #define	FCIP_IN_ELS_CB			0x800
287*fcf3ce44SJohn Forte #define	FCIP_IN_TIMEOUT			0x1000
288*fcf3ce44SJohn Forte #define	FCIP_POWER_DOWN			0x2000
289*fcf3ce44SJohn Forte #define	FCIP_RTE_REMOVING		0x4000
290*fcf3ce44SJohn Forte #define	FCIP_REG_INPROGRESS		0x8000
291*fcf3ce44SJohn Forte /* macro for checking any callback */
292*fcf3ce44SJohn Forte #define	FCIP_IN_CALLBACK		(FCIP_IN_SC_CB | FCIP_IN_DATA_CB | \
293*fcf3ce44SJohn Forte 					FCIP_IN_ELS_CB)
294*fcf3ce44SJohn Forte /* macro for checking if a port is busy */
295*fcf3ce44SJohn Forte #define	FCIP_PORT_BUSY			(FCIP_ATTACHING | \
296*fcf3ce44SJohn Forte 					FCIP_REG_INPROGRESS | FCIP_DETACHING)
297*fcf3ce44SJohn Forte 
298*fcf3ce44SJohn Forte 
299*fcf3ce44SJohn Forte /*
300*fcf3ce44SJohn Forte  * FCIP routing table maintains the FC Layer and the ARP layer
301*fcf3ce44SJohn Forte  * mapping for a destination port.
302*fcf3ce44SJohn Forte  */
303*fcf3ce44SJohn Forte struct fcip_routing_table {
304*fcf3ce44SJohn Forte 	struct fcip_routing_table *fcipr_next;	/* next elem */
305*fcf3ce44SJohn Forte 	la_wwn_t	fcipr_pwwn;	/* Destination Port's Port WWN */
306*fcf3ce44SJohn Forte 	la_wwn_t	fcipr_nwwn;	/* Destination Port's Node WWN */
307*fcf3ce44SJohn Forte 	fc_portid_t	fcipr_d_id;	/* Destination Port's D_ID */
308*fcf3ce44SJohn Forte 	void		*fcipr_pd;	/* pointer to port device struct */
309*fcf3ce44SJohn Forte 	uchar_t		fcipr_ipaddr[16]; /* Port's IP address */
310*fcf3ce44SJohn Forte 	int		fcipr_state;	/* login state etc */
311*fcf3ce44SJohn Forte 	clock_t		fcipr_invalid_timeout;	/* wait after marked inval */
312*fcf3ce44SJohn Forte 	opaque_t	fcipr_fca_dev;	/* FCA device pointer */
313*fcf3ce44SJohn Forte };
314*fcf3ce44SJohn Forte 
315*fcf3ce44SJohn Forte #define	FCIP_COMPARE_NWWN		0x001
316*fcf3ce44SJohn Forte #define	FCIP_COMPARE_PWWN		0x010
317*fcf3ce44SJohn Forte #define	FCIP_COMPARE_BROADCAST		0x100
318*fcf3ce44SJohn Forte 
319*fcf3ce44SJohn Forte #define	IS_BROADCAST_ADDR(wwn)	(((wwn)->raw_wwn[2] == 0xff) && \
320*fcf3ce44SJohn Forte 				((wwn)->raw_wwn[3] == 0xff) && \
321*fcf3ce44SJohn Forte 				((wwn)->w.wwn_lo == 0xffffffff))
322*fcf3ce44SJohn Forte 
323*fcf3ce44SJohn Forte /*
324*fcf3ce44SJohn Forte  * Define a fcip_pkt structure. We can stuff information about
325*fcf3ce44SJohn Forte  * the message block and queue for which the packet was built. We can
326*fcf3ce44SJohn Forte  * then free up the message once the transport layer has confirmed
327*fcf3ce44SJohn Forte  * that the packet has been successfully transported.
328*fcf3ce44SJohn Forte  */
329*fcf3ce44SJohn Forte typedef struct fcip_pkt {
330*fcf3ce44SJohn Forte 	mblk_t			*fcip_pkt_mp;	/* message blk pointer */
331*fcf3ce44SJohn Forte 	queue_t			*fcip_pkt_wq;	/* queue pointer if needed */
332*fcf3ce44SJohn Forte 	uint32_t		fcip_pkt_ttl;	/* time to live */
333*fcf3ce44SJohn Forte 	uint32_t		fcip_pkt_retries; /* retries if needed */
334*fcf3ce44SJohn Forte 	fc_packet_t		*fcip_pkt_fcpktp; /* the actual fc packet */
335*fcf3ce44SJohn Forte 	struct fcip_dest	*fcip_pkt_dest;	/* destination of pkt */
336*fcf3ce44SJohn Forte 	struct fcip		*fcip_pkt_fptr;	/* fcip structure */
337*fcf3ce44SJohn Forte 	struct fcip_pkt		*fcip_pkt_next;	/* next pkt */
338*fcf3ce44SJohn Forte 	struct fcip_pkt		*fcip_pkt_prev;	/* prev pkt */
339*fcf3ce44SJohn Forte 	uint32_t		fcip_pkt_state;	/* pkt state */
340*fcf3ce44SJohn Forte 	uint32_t		fcip_pkt_reason;	/* pkt reason */
341*fcf3ce44SJohn Forte 	uint32_t		fcip_pkt_flags;	/* pkt flags */
342*fcf3ce44SJohn Forte 	uint32_t		fcip_pkt_dma_flags; /* DMA flags */
343*fcf3ce44SJohn Forte 	fc_packet_t		fcip_pkt_fcpkt;	/* the actual fc packet */
344*fcf3ce44SJohn Forte 	struct fcip_routing_table *fcip_pkt_frp;	/* routing table */
345*fcf3ce44SJohn Forte } fcip_pkt_t;
346*fcf3ce44SJohn Forte 
347*fcf3ce44SJohn Forte /* fcipp_dma_flags */
348*fcf3ce44SJohn Forte #define	FCIP_CMD_DMA_MEM	0x01
349*fcf3ce44SJohn Forte #define	FCIP_CMD_DMA_BOUND	0x02
350*fcf3ce44SJohn Forte #define	FCIP_RESP_DMA_MEM	0x04
351*fcf3ce44SJohn Forte #define	FCIP_RESP_DMA_BOUND	0x08
352*fcf3ce44SJohn Forte 
353*fcf3ce44SJohn Forte /* fcipp_flags */
354*fcf3ce44SJohn Forte #define	FCIP_PKT_INTERNAL	0x01
355*fcf3ce44SJohn Forte #define	FCIP_PKT_IN_TIMEOUT	0x02
356*fcf3ce44SJohn Forte #define	FCIP_PKT_RETURNED	0x04
357*fcf3ce44SJohn Forte #define	FCIP_PKT_IN_LIST	0x08
358*fcf3ce44SJohn Forte #define	FCIP_PKT_IN_ABORT	0x10
359*fcf3ce44SJohn Forte 
360*fcf3ce44SJohn Forte #define	FCIP_PKT_TO_FC_PKT(fcip_pkt)	&(fcip_pkt)->fcip_pkt_fcpkt
361*fcf3ce44SJohn Forte /*
362*fcf3ce44SJohn Forte  * For each remote port we have a active session with (logged in and
363*fcf3ce44SJohn Forte  * having active exchanges) setup a Destination Port structure. Maintain
364*fcf3ce44SJohn Forte  * a Hash list of destination structures in the fcip structure. Before
365*fcf3ce44SJohn Forte  * starting a new session with the destination port, lookup the hash
366*fcf3ce44SJohn Forte  * table to see if we are already having active exchanges with a remote
367*fcf3ce44SJohn Forte  * port and if yes bump the reference count and continue use the same
368*fcf3ce44SJohn Forte  * destination port. Hash on Port WWNs.
369*fcf3ce44SJohn Forte  */
370*fcf3ce44SJohn Forte struct fcip_dest {
371*fcf3ce44SJohn Forte 	struct fcip_dest	*fcipd_next;	/* next element of hashtable */
372*fcf3ce44SJohn Forte 	fcip_pkt_t		*fcipd_head;	/* packet head for this port */
373*fcf3ce44SJohn Forte 	kmutex_t		fcipd_mutex;	/* packet list mutex */
374*fcf3ce44SJohn Forte 	uint32_t		fcipd_refcnt;	/* no.of active sessions */
375*fcf3ce44SJohn Forte 	struct fcip_routing_table *fcipd_rtable;
376*fcf3ce44SJohn Forte 
377*fcf3ce44SJohn Forte #define	fcipd_nwwn	fcipd_rtable->fcipr_nwwn
378*fcf3ce44SJohn Forte #define	fcipd_pwwn	fcipd_rtable->fcipr_pwwn
379*fcf3ce44SJohn Forte #define	fcipd_did	fcipd_rtable->fcipr_d_id
380*fcf3ce44SJohn Forte #define	fcipd_pd	fcipd_rtable->fcipr_pd
381*fcf3ce44SJohn Forte #define	fcipd_state	fcipd_rtable->fcipr_state
382*fcf3ce44SJohn Forte #define	fcipd_fca_dev	fcipd_rtable->fcipr_fca_dev;
383*fcf3ce44SJohn Forte 
384*fcf3ce44SJohn Forte 	uint32_t		fcipd_retries;	/* retries if needed ?? */
385*fcf3ce44SJohn Forte 	uint32_t		fcipd_flags;	/* flags ?? */
386*fcf3ce44SJohn Forte 	ulong_t			fcipd_ncmds;	/* no. of transport cmds */
387*fcf3ce44SJohn Forte };
388*fcf3ce44SJohn Forte 
389*fcf3ce44SJohn Forte 
390*fcf3ce44SJohn Forte #define	FCIP_PORT_OFFLINE	0
391*fcf3ce44SJohn Forte #define	FCIP_PORT_ONLINE	1
392*fcf3ce44SJohn Forte #define	FCIP_PORT_NOTLOGGED	2
393*fcf3ce44SJohn Forte 
394*fcf3ce44SJohn Forte #define	FCIP_INVALID_WWN	-1
395*fcf3ce44SJohn Forte 
396*fcf3ce44SJohn Forte #define	SLFAST			0x01	/* MDATA fastpath mode */
397*fcf3ce44SJohn Forte #define	SLRAW			0x02	/* M_DATA plain raw mode */
398*fcf3ce44SJohn Forte #define	SLALLPHYS		0x04	/* promiscuous mode */
399*fcf3ce44SJohn Forte #define	SLALLMULTI		0x05	/* enable all multicast addr */
400*fcf3ce44SJohn Forte #define	SLALLSAP		0x10	/* enable all ethertype values */
401*fcf3ce44SJohn Forte 
402*fcf3ce44SJohn Forte 
403*fcf3ce44SJohn Forte 
404*fcf3ce44SJohn Forte /*
405*fcf3ce44SJohn Forte  * Private DLPI full dlsap address format.
406*fcf3ce44SJohn Forte  */
407*fcf3ce44SJohn Forte struct	fcipdladdr {
408*fcf3ce44SJohn Forte 	struct	ether_addr	dl_phys;
409*fcf3ce44SJohn Forte 	uint16_t		dl_sap;
410*fcf3ce44SJohn Forte };
411*fcf3ce44SJohn Forte 
412*fcf3ce44SJohn Forte 
413*fcf3ce44SJohn Forte typedef struct llc_snap_hdr {
414*fcf3ce44SJohn Forte 	uchar_t		dsap;
415*fcf3ce44SJohn Forte 	uchar_t		ssap;
416*fcf3ce44SJohn Forte 	uchar_t		ctrl;
417*fcf3ce44SJohn Forte 	uchar_t		oui[3];
418*fcf3ce44SJohn Forte 	ushort_t	pid;
419*fcf3ce44SJohn Forte } llc_snap_hdr_t;
420*fcf3ce44SJohn Forte 
421*fcf3ce44SJohn Forte /*
422*fcf3ce44SJohn Forte  * "Export" a few of the error counters via the kstats mechanism.
423*fcf3ce44SJohn Forte  */
424*fcf3ce44SJohn Forte struct	fcipstat {
425*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_ipackets;
426*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_ierrors;
427*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_opackets;
428*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_oerrors;
429*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_collisions;
430*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_defer;
431*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_fram;
432*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_crc;
433*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_oflo;
434*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_uflo;
435*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_missed;
436*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_tlcol;
437*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_trtry;
438*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_tnocar;
439*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_inits;
440*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_notmds;
441*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_notbufs;
442*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_norbufs;
443*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_nocanput;
444*fcf3ce44SJohn Forte 	struct	kstat_named	fcips_allocbfail;
445*fcf3ce44SJohn Forte 
446*fcf3ce44SJohn Forte 	/*
447*fcf3ce44SJohn Forte 	 * required by kstat for MIB II objects(RFC 1213)
448*fcf3ce44SJohn Forte 	 */
449*fcf3ce44SJohn Forte 	struct  kstat_named	fcips_rcvbytes;	/* # octets received */
450*fcf3ce44SJohn Forte 						/* MIB - ifInOctets */
451*fcf3ce44SJohn Forte 	struct  kstat_named	fcips_xmtbytes; /* # octets xmitted */
452*fcf3ce44SJohn Forte 						/* MIB - ifOutOctets */
453*fcf3ce44SJohn Forte 	struct  kstat_named	fcips_multircv;	/* # multicast packets */
454*fcf3ce44SJohn Forte 						/* delivered to upper layer */
455*fcf3ce44SJohn Forte 						/* MIB - ifInNUcastPkts */
456*fcf3ce44SJohn Forte 	struct  kstat_named	fcips_multixmt;	/* # multicast packets */
457*fcf3ce44SJohn Forte 						/* requested to be sent */
458*fcf3ce44SJohn Forte 						/* MIB - ifOutNUcastPkts */
459*fcf3ce44SJohn Forte 	struct  kstat_named	fcips_brdcstrcv; /* # broadcast packets */
460*fcf3ce44SJohn Forte 						/* delivered to upper layer */
461*fcf3ce44SJohn Forte 						/* MIB - ifInNUcastPkts */
462*fcf3ce44SJohn Forte 	struct  kstat_named	fcips_brdcstxmt; /* # broadcast packets */
463*fcf3ce44SJohn Forte 						/* requested to be sent */
464*fcf3ce44SJohn Forte 						/* MIB - ifOutNUcastPkts */
465*fcf3ce44SJohn Forte 	struct  kstat_named	fcips_norcvbuf;	/* # rcv packets discarded */
466*fcf3ce44SJohn Forte 						/* MIB - ifInDiscards */
467*fcf3ce44SJohn Forte 	struct  kstat_named	fcips_noxmtbuf;	/* # xmt packets discarded */
468*fcf3ce44SJohn Forte 						/* MIB - ifOutDiscards */
469*fcf3ce44SJohn Forte };
470*fcf3ce44SJohn Forte 
471*fcf3ce44SJohn Forte 
472*fcf3ce44SJohn Forte #define	FC_OFF		0x00
473*fcf3ce44SJohn Forte #define	DA_OFF		0x01
474*fcf3ce44SJohn Forte #define	SA_OFF		0x07
475*fcf3ce44SJohn Forte #define	DLSAP_OFF	0x0D
476*fcf3ce44SJohn Forte #define	SLSAP_OFF	0x0E
477*fcf3ce44SJohn Forte #define	ORG_OFF		0x0F
478*fcf3ce44SJohn Forte #define	TYPE_OFF	0x13
479*fcf3ce44SJohn Forte 
480*fcf3ce44SJohn Forte #define	FCIP_IPV4_LEN	0x04;
481*fcf3ce44SJohn Forte 
482*fcf3ce44SJohn Forte #define	FCIP_CP_IN(s, d, handle, len)	(ddi_rep_get8((handle), \
483*fcf3ce44SJohn Forte 					(uint8_t *)(d), (uint8_t *)(s), \
484*fcf3ce44SJohn Forte 					(len), DDI_DEV_AUTOINCR))
485*fcf3ce44SJohn Forte 
486*fcf3ce44SJohn Forte #define	FCIP_CP_OUT(s, d, handle, len)	(ddi_rep_put8((handle), \
487*fcf3ce44SJohn Forte 					(uint8_t *)(s), (uint8_t *)(d), \
488*fcf3ce44SJohn Forte 					(len), DDI_DEV_AUTOINCR))
489*fcf3ce44SJohn Forte 
490*fcf3ce44SJohn Forte #define	LA_ELS_FARP_REQ			0x54
491*fcf3ce44SJohn Forte #define	LA_ELS_FARP_REPLY		0x55
492*fcf3ce44SJohn Forte 
493*fcf3ce44SJohn Forte /* Match address code points */
494*fcf3ce44SJohn Forte #define	FARP_MATCH_RSVD			0x00
495*fcf3ce44SJohn Forte #define	FARP_MATCH_WW_PN		0x01
496*fcf3ce44SJohn Forte #define	FARP_MATCH_WW_NN		0x02
497*fcf3ce44SJohn Forte #define	FARP_MATCH_WW_PN_NN		0x03
498*fcf3ce44SJohn Forte #define	FARP_MATCH_IPv4			0x04
499*fcf3ce44SJohn Forte #define	FARP_MATCH_WW_PN_IPv4		0x05
500*fcf3ce44SJohn Forte #define	FARP_MATCH_WW_NN_IPv4		0x06
501*fcf3ce44SJohn Forte #define	FARP_MATCH_WW_PN_NN_IPv4	0x07
502*fcf3ce44SJohn Forte 
503*fcf3ce44SJohn Forte /* Responder flags */
504*fcf3ce44SJohn Forte #define	FARP_INIT_P_LOGI		0x0
505*fcf3ce44SJohn Forte #define	FARP_INIT_REPLY			0x1
506*fcf3ce44SJohn Forte 
507*fcf3ce44SJohn Forte 
508*fcf3ce44SJohn Forte /*
509*fcf3ce44SJohn Forte  * Structure for FARP ELS request and Response
510*fcf3ce44SJohn Forte  */
511*fcf3ce44SJohn Forte typedef struct la_els_farp {
512*fcf3ce44SJohn Forte 	ls_code_t	ls_code;  /* FARP ELS code - 0x54/0x55 */
513*fcf3ce44SJohn Forte 	uchar_t		match_addr; /* match addr. code points */
514*fcf3ce44SJohn Forte 	fc_portid_t	req_id; /* Requester Port_ID */
515*fcf3ce44SJohn Forte 	uchar_t		resp_flags; /* Responder flags */
516*fcf3ce44SJohn Forte 	fc_portid_t	dest_id; /* Responder Port_ID */
517*fcf3ce44SJohn Forte 	la_wwn_t	req_pwwn; /* Port WWN of Requester */
518*fcf3ce44SJohn Forte 	la_wwn_t	req_nwwn; /* Node WWN of Requester */
519*fcf3ce44SJohn Forte 	la_wwn_t	resp_pwwn; /* Port WWN of Responder */
520*fcf3ce44SJohn Forte 	la_wwn_t	resp_nwwn; /* Node WWN of Responder */
521*fcf3ce44SJohn Forte 	uchar_t		req_ip[16]; /* IP address or Requester */
522*fcf3ce44SJohn Forte 	uchar_t		resp_ip[16]; /* IP address or Responder */
523*fcf3ce44SJohn Forte } la_els_farp_t;
524*fcf3ce44SJohn Forte 
525*fcf3ce44SJohn Forte /*
526*fcf3ce44SJohn Forte  * Linked list of farp responses
527*fcf3ce44SJohn Forte  */
528*fcf3ce44SJohn Forte struct farp_resp_list {
529*fcf3ce44SJohn Forte 	struct farp_resp_list *farpl_next;
530*fcf3ce44SJohn Forte 	struct farp_resp_list *farpl_prev;
531*fcf3ce44SJohn Forte 	la_els_farp_t *farpl_resp;
532*fcf3ce44SJohn Forte };
533*fcf3ce44SJohn Forte 
534*fcf3ce44SJohn Forte /*
535*fcf3ce44SJohn Forte  * FCPH Optional network Header
536*fcf3ce44SJohn Forte  */
537*fcf3ce44SJohn Forte typedef struct network_header {
538*fcf3ce44SJohn Forte 	la_wwn_t	net_dest_addr;
539*fcf3ce44SJohn Forte 	la_wwn_t	net_src_addr;
540*fcf3ce44SJohn Forte } fcph_network_hdr_t;
541*fcf3ce44SJohn Forte 
542*fcf3ce44SJohn Forte /*
543*fcf3ce44SJohn Forte  * InArp request structure
544*fcf3ce44SJohn Forte  */
545*fcf3ce44SJohn Forte typedef struct fcip_inarp {
546*fcf3ce44SJohn Forte 	fcph_network_hdr_t	fcip_inarp_nh;
547*fcf3ce44SJohn Forte 	llc_snap_hdr_t		fcip_inarp_snap;
548*fcf3ce44SJohn Forte 	struct ether_arp	fcip_inarp_data;
549*fcf3ce44SJohn Forte } fcip_inarp_t;
550*fcf3ce44SJohn Forte 
551*fcf3ce44SJohn Forte /*
552*fcf3ce44SJohn Forte  * InArp Response list
553*fcf3ce44SJohn Forte  */
554*fcf3ce44SJohn Forte struct inarp_resp_list {
555*fcf3ce44SJohn Forte 	struct inarp_resp_list *inarpl_next;
556*fcf3ce44SJohn Forte 	struct inarp_resp_list *inarpl_prev;
557*fcf3ce44SJohn Forte 	fcip_inarp_t *inarpl_resp;
558*fcf3ce44SJohn Forte };
559*fcf3ce44SJohn Forte 
560*fcf3ce44SJohn Forte /*
561*fcf3ce44SJohn Forte  * Structure to define args for esballoc frtn function
562*fcf3ce44SJohn Forte  */
563*fcf3ce44SJohn Forte struct fcip_esballoc_arg {
564*fcf3ce44SJohn Forte 	fc_unsol_buf_t	*buf;
565*fcf3ce44SJohn Forte 	opaque_t	phandle;
566*fcf3ce44SJohn Forte 	frtn_t		*frtnp;
567*fcf3ce44SJohn Forte };
568*fcf3ce44SJohn Forte 
569*fcf3ce44SJohn Forte struct fcip_sendup_elem {
570*fcf3ce44SJohn Forte 	struct fcip_sendup_elem *fcipsu_next;
571*fcf3ce44SJohn Forte 	mblk_t			*fcipsu_mp;
572*fcf3ce44SJohn Forte 	struct fcipstr		*(*fcipsu_func)();
573*fcf3ce44SJohn Forte };
574*fcf3ce44SJohn Forte 
575*fcf3ce44SJohn Forte /*
576*fcf3ce44SJohn Forte  * FC4 type setttings for Name Server registration.
577*fcf3ce44SJohn Forte  */
578*fcf3ce44SJohn Forte #define	FC4_TYPE_WORD_POS(x)	((uchar_t)(x) >> 5)
579*fcf3ce44SJohn Forte #define	FC4_TYPE_BIT_POS(x)	((uchar_t)(x) & 0x1F)
580*fcf3ce44SJohn Forte 
581*fcf3ce44SJohn Forte #ifdef	__cplusplus
582*fcf3ce44SJohn Forte }
583*fcf3ce44SJohn Forte #endif
584*fcf3ce44SJohn Forte 
585*fcf3ce44SJohn Forte #endif /* !_SYS_FIBRE_CHANNEL_ULP_FCIP_H */
586