xref: /titanic_51/usr/src/uts/sun4v/sys/vsw.h (revision 5a7763bf3e9db4cfe6cb523b096cb74af71e3793)
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 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * This header file contains the data structures which the
29  * virtual switch (vsw) uses to communicate with its clients and
30  * the outside world.
31  */
32 
33 #ifndef	_VSW_H
34 #define	_VSW_H
35 
36 #pragma ident	"%Z%%M%	%I%	%E% SMI"
37 
38 #ifdef	__cplusplus
39 extern "C" {
40 #endif
41 
42 #include <sys/vio_mailbox.h>
43 #include <sys/vnet_common.h>
44 #include <sys/ethernet.h>
45 #include <sys/vio_util.h>
46 #include <sys/vgen_stats.h>
47 #include <sys/vsw_ldc.h>
48 
49 #define	DRV_NAME	"vsw"
50 
51 /*
52  * Only support ETHER mtu at moment.
53  */
54 #define	VSW_MTU		ETHERMAX
55 
56 /* ID of the source of a frame being switched */
57 #define	VSW_PHYSDEV		1	/* physical device associated */
58 #define	VSW_VNETPORT		2	/* port connected to vnet (over ldc) */
59 #define	VSW_LOCALDEV		4	/* vsw configured as an eth interface */
60 
61 /*
62  * Vsw queue -- largely modeled after squeue
63  *
64  * VSW_QUEUE_RUNNING, vqueue thread for queue is running.
65  * VSW_QUEUE_DRAINED, vqueue thread has drained current work and is exiting.
66  * VSW_QUEUE_STOP, request for the vqueue thread to stop.
67  * VSW_QUEUE_STOPPED, vqueue thread is not running.
68  */
69 #define	VSW_QUEUE_RUNNING	0x01
70 #define	VSW_QUEUE_DRAINED	0x02
71 #define	VSW_QUEUE_STOP		0x04
72 #define	VSW_QUEUE_STOPPED	0x08
73 
74 typedef struct vsw_queue_s {
75 	kmutex_t	vq_lock;	/* Lock, before using any member. */
76 	kcondvar_t	vq_cv;		/* Async threads block on. */
77 	uint32_t	vq_state;	/* State flags. */
78 
79 	mblk_t		*vq_first;	/* First mblk chain or NULL. */
80 	mblk_t		*vq_last;	/* Last mblk chain. */
81 
82 	processorid_t	vq_bind;	/* Process to bind to */
83 	kthread_t	*vq_worker;	/* Queue's thread */
84 } vsw_queue_t;
85 
86 /*
87  * VSW MAC Ring Resources.
88  *	MAC Ring resource is composed of this state structure and
89  *	a kernel thread to perform the processing of the ring.
90  */
91 typedef struct vsw_mac_ring_s {
92 	uint32_t	ring_state;
93 
94 	mac_blank_t	ring_blank;
95 	void		*ring_arg;
96 
97 	vsw_queue_t	*ring_vqp;
98 	struct vsw	*ring_vswp;
99 } vsw_mac_ring_t;
100 
101 /*
102  * Maximum Ring Resources.
103  */
104 #define	VSW_MAC_RX_RINGS	0x40
105 
106 /*
107  * States for entry in ring table.
108  */
109 #define	VSW_MAC_RING_FREE	1
110 #define	VSW_MAC_RING_INUSE	2
111 
112 /*
113  * Number of hash chains in the multicast forwarding database.
114  */
115 #define		VSW_NCHAINS	8
116 
117 /* Number of transmit descriptors -  must be power of 2 */
118 #define		VSW_RING_NUM_EL	512
119 
120 /*
121  * State of interface if switch plumbed as network device.
122  */
123 #define		VSW_IF_REG	0x1	/* interface was registered */
124 #define		VSW_IF_UP	0x2	/* Interface UP */
125 #define		VSW_IF_PROMISC	0x4	/* Interface in promiscious mode */
126 
127 #define		VSW_U_P(state)	\
128 			(state == (VSW_IF_UP | VSW_IF_PROMISC))
129 
130 /*
131  * Switching modes.
132  */
133 #define		VSW_LAYER2		0x1	/* Layer 2 - MAC switching */
134 #define		VSW_LAYER2_PROMISC	0x2	/* Layer 2 + promisc mode */
135 #define		VSW_LAYER3		0x4	/* Layer 3 - IP switching */
136 
137 #define		NUM_SMODES	3	/* number of switching modes */
138 
139 #define	VSW_PRI_ETH_DEFINED(vswp)	((vswp)->pri_num_types != 0)
140 
141 /*
142  * vsw instance state information.
143  */
144 typedef struct	vsw {
145 	int			instance;	/* instance # */
146 	dev_info_t		*dip;		/* associated dev_info */
147 	uint64_t		regprop;	/* "reg" property */
148 	struct vsw		*next;		/* next in list */
149 	char			physname[LIFNAMSIZ];	/* phys-dev */
150 	uint8_t			smode[NUM_SMODES];	/* switching mode */
151 	int			smode_idx;	/* curr pos in smode array */
152 	int			smode_num;	/* # of modes specified */
153 	kmutex_t		swtmout_lock;	/* setup switching tmout lock */
154 	boolean_t		swtmout_enabled; /* setup switching tmout on */
155 	timeout_id_t		swtmout_id;	/* setup switching tmout id */
156 	uint32_t		switching_setup_done; /* setup switching done */
157 	int			mac_open_retries; /* mac_open() retry count */
158 	vsw_port_list_t		plist;		/* associated ports */
159 	ddi_taskq_t		*taskq_p;	/* VIO ctrl msg taskq */
160 	mod_hash_t		*fdb_hashp;	/* forwarding database */
161 	uint32_t		fdb_nchains;	/* # of hash chains in fdb */
162 	mod_hash_t		*vlan_hashp;	/* vlan hash table */
163 	uint32_t		vlan_nchains;	/* # of vlan hash chains */
164 	uint32_t		max_frame_size;	/* max frame size supported */
165 
166 	mod_hash_t		*mfdb;		/* multicast FDB */
167 	krwlock_t		mfdbrw;		/* rwlock for mFDB */
168 
169 	vio_mblk_pool_t		*rxh;		/* Receive pool handle */
170 	void			(*vsw_switch_frame)
171 					(struct vsw *, mblk_t *, int,
172 					vsw_port_t *, mac_resource_handle_t);
173 
174 	/* mac layer */
175 	kmutex_t		mac_lock;	/* protect fields below */
176 	mac_handle_t		mh;
177 	mac_rx_handle_t		mrh;
178 	multiaddress_capab_t	maddr;		/* Multiple uni addr capable */
179 	const mac_txinfo_t	*txinfo;	/* MAC tx routine */
180 	boolean_t		mstarted;	/* Mac Started? */
181 	boolean_t		mresources;	/* Mac Resources cb? */
182 
183 	/*
184 	 * MAC Ring Resources.
185 	 */
186 	kmutex_t		mac_ring_lock;	/* Lock for the table. */
187 	uint32_t		mac_ring_tbl_sz;
188 	vsw_mac_ring_t		*mac_ring_tbl;	/* Mac ring table. */
189 
190 	kmutex_t		hw_lock;	/* sync access to HW */
191 	boolean_t		recfg_reqd;	/* Reconfig of addrs needed */
192 	int			promisc_cnt;
193 
194 	/* Machine Description updates  */
195 	mdeg_node_spec_t	*inst_spec;
196 	mdeg_handle_t		mdeg_hdl;
197 	mdeg_handle_t		mdeg_port_hdl;
198 
199 	/* if configured as an ethernet interface */
200 	mac_handle_t		if_mh;		/* MAC handle */
201 	struct ether_addr	if_addr;	/* interface address */
202 	krwlock_t		if_lockrw;
203 	uint8_t			if_state;	/* interface state */
204 
205 	mac_addr_slot_t		addr_slot;	/* Unicast address slot */
206 	int			addr_set;	/* Addr set where */
207 
208 	/* multicast addresses when configured as eth interface */
209 	kmutex_t		mca_lock;	/* multicast lock */
210 	mcst_addr_t		*mcap;		/* list of multicast addrs */
211 
212 	uint32_t		pri_num_types;	/* # of priority eth types */
213 	uint16_t		*pri_types;	/* priority eth types */
214 	vio_mblk_pool_t		*pri_tx_vmp;	/* tx priority mblk pool */
215 	uint16_t		default_vlan_id; /* default vlan id */
216 	uint16_t		pvid;	/* port vlan id (untagged) */
217 	uint16_t		*vids;	/* vlan ids (tagged) */
218 	uint16_t		nvids;	/* # of vids */
219 	uint32_t		vids_size; /* size alloc'd for vids list */
220 } vsw_t;
221 
222 /*
223  * The flags that are used by vsw_mac_rx().
224  */
225 typedef enum {
226 	VSW_MACRX_PROMISC = 0x01,
227 	VSW_MACRX_COPYMSG = 0x02,
228 	VSW_MACRX_FREEMSG = 0x04
229 } vsw_macrx_flags_t;
230 
231 
232 #ifdef DEBUG
233 
234 extern int vswdbg;
235 extern void vswdebug(vsw_t *vswp, const char *fmt, ...);
236 
237 #define	D1(...)		\
238 if (vswdbg & 0x01)	\
239 	vswdebug(__VA_ARGS__)
240 
241 #define	D2(...)		\
242 if (vswdbg & 0x02)	\
243 	vswdebug(__VA_ARGS__)
244 
245 #define	D3(...)		\
246 if (vswdbg & 0x04)	\
247 	vswdebug(__VA_ARGS__)
248 
249 #define	DWARN(...)	\
250 if (vswdbg & 0x08)	\
251 	vswdebug(__VA_ARGS__)
252 
253 #define	DERR(...)	\
254 if (vswdbg & 0x10)	\
255 	vswdebug(__VA_ARGS__)
256 
257 #else
258 
259 #define	DERR(...)	if (0)	do { } while (0)
260 #define	DWARN(...)	if (0)	do { } while (0)
261 #define	D1(...)		if (0)	do { } while (0)
262 #define	D2(...)		if (0)	do { } while (0)
263 #define	D3(...)		if (0)	do { } while (0)
264 
265 #endif	/* DEBUG */
266 
267 
268 #ifdef	__cplusplus
269 }
270 #endif
271 
272 #endif	/* _VSW_H */
273