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