xref: /illumos-gate/usr/src/uts/sun4v/sys/vsw.h (revision d67944fbe3fa0b31893a7116a09b0718eecf6078)
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 2009 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 #ifdef	__cplusplus
37 extern "C" {
38 #endif
39 
40 #include <sys/vio_mailbox.h>
41 #include <sys/vnet_common.h>
42 #include <sys/ethernet.h>
43 #include <sys/mac_client.h>
44 #include <sys/vio_util.h>
45 #include <sys/vgen_stats.h>
46 #include <sys/vsw_ldc.h>
47 #include <sys/vsw_hio.h>
48 #include <sys/callb.h>
49 
50 #define	DRV_NAME	"vsw"
51 
52 /*
53  * Only support ETHER mtu at moment.
54  */
55 #define	VSW_MTU		ETHERMAX
56 
57 /* ID of the source of a frame being switched */
58 #define	VSW_PHYSDEV		1	/* physical device associated */
59 #define	VSW_VNETPORT		2	/* port connected to vnet (over ldc) */
60 #define	VSW_LOCALDEV		4	/* vsw configured as an eth interface */
61 
62 /*
63  * Number of hash chains in the multicast forwarding database.
64  */
65 #define		VSW_NCHAINS	8
66 
67 /* Number of transmit descriptors -  must be power of 2 */
68 #define		VSW_RING_NUM_EL	512
69 
70 /*
71  * State of interface if switch plumbed as network device.
72  */
73 #define		VSW_IF_REG	0x1	/* interface was registered */
74 #define		VSW_IF_UP	0x2	/* Interface UP */
75 #define		VSW_IF_PROMISC	0x4	/* Interface in promiscious mode */
76 
77 #define		VSW_U_P(state)	\
78 			(state == (VSW_IF_UP | VSW_IF_PROMISC))
79 
80 /*
81  * Switching modes.
82  */
83 #define		VSW_LAYER2		0x1	/* Layer 2 - MAC switching */
84 #define		VSW_LAYER2_PROMISC	0x2	/* Layer 2 + promisc mode */
85 #define		VSW_LAYER3		0x4	/* Layer 3 - IP switching */
86 
87 #define		NUM_SMODES	3	/* number of switching modes */
88 
89 #define	VSW_PRI_ETH_DEFINED(vswp)	((vswp)->pri_num_types != 0)
90 
91 typedef enum {
92 	VSW_SWTHR_STOP = 0x1
93 } sw_thr_flags_t;
94 
95 typedef enum {
96 	PROG_init = 0x00,
97 	PROG_locks = 0x01,
98 	PROG_readmd = 0x02,
99 	PROG_fdb = 0x04,
100 	PROG_mfdb = 0x08,
101 	PROG_taskq = 0x10,
102 	PROG_swmode = 0x20,
103 	PROG_macreg = 0x40,
104 	PROG_mdreg = 0x80
105 } vsw_attach_progress_t;
106 
107 /*
108  * vlan-id information.
109  */
110 typedef struct vsw_vlanid {
111 	uint16_t		vl_vid;		/* vlan-id */
112 	mac_unicast_handle_t	vl_muh;		/* mac unicast handle */
113 	boolean_t		vl_set;		/* set? */
114 } vsw_vlanid_t;
115 
116 /*
117  * vsw instance state information.
118  */
119 typedef struct	vsw {
120 	int			instance;	/* instance # */
121 	dev_info_t		*dip;		/* associated dev_info */
122 	uint64_t		regprop;	/* "reg" property */
123 	vsw_attach_progress_t	attach_progress; /* attach progress flags */
124 	struct vsw		*next;		/* next in list */
125 	char			physname[LIFNAMSIZ];	/* phys-dev */
126 	uint8_t			smode;		/* switching mode */
127 	kmutex_t		sw_thr_lock;	/* setup switching thr lock */
128 	kcondvar_t		sw_thr_cv;	/* cv for setup switching thr */
129 	kthread_t		*sw_thread;	/* setup switching thread */
130 	sw_thr_flags_t		sw_thr_flags; 	/* setup switching thr flags */
131 	uint32_t		switching_setup_done; /* setup switching done */
132 	int			mac_open_retries; /* mac_open() retry count */
133 	vsw_port_list_t		plist;		/* associated ports */
134 	ddi_taskq_t		*taskq_p;	/* VIO ctrl msg taskq */
135 	mod_hash_t		*fdb_hashp;	/* forwarding database */
136 	uint32_t		fdb_nchains;	/* # of hash chains in fdb */
137 	mod_hash_t		*vlan_hashp;	/* vlan hash table */
138 	uint32_t		vlan_nchains;	/* # of vlan hash chains */
139 	uint32_t		mtu;		/* mtu of the device */
140 	uint32_t		max_frame_size;	/* max frame size supported */
141 	uint32_t		mtu_physdev_orig; /* orig mtu of the physdev */
142 
143 	mod_hash_t		*mfdb;		/* multicast FDB */
144 	krwlock_t		mfdbrw;		/* rwlock for mFDB */
145 
146 	vio_mblk_pool_t		*rxh;		/* Receive pool handle */
147 	void			(*vsw_switch_frame)
148 					(struct vsw *, mblk_t *, int,
149 					vsw_port_t *, mac_resource_handle_t);
150 
151 	/* mac layer */
152 	kmutex_t		mac_lock;	/* protect mh */
153 	mac_handle_t		mh;
154 	krwlock_t		maccl_rwlock;	/* protect fields below */
155 	mac_client_handle_t	mch;		/* mac client handle */
156 	mac_unicast_handle_t	muh;		/* mac unicast handle */
157 	mac_notify_handle_t	mnh;		/* mac notify handle */
158 
159 	boolean_t		recfg_reqd;	/* Reconfig of addrs needed */
160 
161 	/* mac layer switching flag */
162 	boolean_t		mac_cl_switching;
163 
164 	/* Machine Description updates  */
165 	mdeg_node_spec_t	*inst_spec;
166 	mdeg_handle_t		mdeg_hdl;
167 	mdeg_handle_t		mdeg_port_hdl;
168 
169 	/* if configured as an ethernet interface */
170 	mac_handle_t		if_mh;		/* MAC handle */
171 	struct ether_addr	if_addr;	/* interface address */
172 	krwlock_t		if_lockrw;
173 	uint8_t			if_state;	/* interface state */
174 
175 	boolean_t		addr_set;	/* is addr set to HW */
176 
177 	/* multicast addresses when configured as eth interface */
178 	kmutex_t		mca_lock;	/* multicast lock */
179 	mcst_addr_t		*mcap;		/* list of multicast addrs */
180 
181 	uint32_t		pri_num_types;	/* # of priority eth types */
182 	uint16_t		*pri_types;	/* priority eth types */
183 	vio_mblk_pool_t		*pri_tx_vmp;	/* tx priority mblk pool */
184 	uint16_t		default_vlan_id; /* default vlan id */
185 	uint16_t		pvid;	/* port vlan id (untagged) */
186 	vsw_vlanid_t		*vids;	/* vlan ids (tagged) */
187 	uint16_t		nvids;	/* # of vids */
188 	uint32_t		vids_size; /* size alloc'd for vids list */
189 
190 	/* HybridIO related fields */
191 	boolean_t		hio_capable;	/* Phys dev HIO capable */
192 	vsw_hio_t		vhio;		/* HybridIO info */
193 	callb_id_t		hio_reboot_cb_id; /* Reboot callb ID */
194 	callb_id_t		hio_panic_cb_id; /* Panic callb ID */
195 
196 	/* Link-state related fields */
197 	boolean_t		phys_no_link_update; /* no link-update supp */
198 	boolean_t		pls_update;	/* phys link state update ? */
199 	link_state_t		phys_link_state;    /* physical link state */
200 } vsw_t;
201 
202 /*
203  * The flags that are used by vsw_mac_rx().
204  */
205 typedef enum {
206 	VSW_MACRX_PROMISC = 0x01,
207 	VSW_MACRX_COPYMSG = 0x02,
208 	VSW_MACRX_FREEMSG = 0x04
209 } vsw_macrx_flags_t;
210 
211 
212 #ifdef DEBUG
213 
214 extern int vswdbg;
215 extern void vswdebug(vsw_t *vswp, const char *fmt, ...);
216 
217 #define	D1(...)		\
218 if (vswdbg & 0x01)	\
219 	vswdebug(__VA_ARGS__)
220 
221 #define	D2(...)		\
222 if (vswdbg & 0x02)	\
223 	vswdebug(__VA_ARGS__)
224 
225 #define	D3(...)		\
226 if (vswdbg & 0x04)	\
227 	vswdebug(__VA_ARGS__)
228 
229 #define	DWARN(...)	\
230 if (vswdbg & 0x08)	\
231 	vswdebug(__VA_ARGS__)
232 
233 #define	DERR(...)	\
234 if (vswdbg & 0x10)	\
235 	vswdebug(__VA_ARGS__)
236 
237 #else
238 
239 #define	DERR(...)	if (0)	do { } while (0)
240 #define	DWARN(...)	if (0)	do { } while (0)
241 #define	D1(...)		if (0)	do { } while (0)
242 #define	D2(...)		if (0)	do { } while (0)
243 #define	D3(...)		if (0)	do { } while (0)
244 
245 #endif	/* DEBUG */
246 
247 
248 #ifdef	__cplusplus
249 }
250 #endif
251 
252 #endif	/* _VSW_H */
253