/* * 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 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * This header file contains the data structures which the * virtual switch (vsw) uses to communicate with its clients and * the outside world. */ #ifndef _VSW_H #define _VSW_H #ifdef __cplusplus extern "C" { #endif #include <sys/vio_mailbox.h> #include <sys/vnet_common.h> #include <sys/ethernet.h> #include <sys/mac_client.h> #include <sys/vio_util.h> #include <sys/vgen_stats.h> #include <sys/vsw_ldc.h> #include <sys/vsw_hio.h> #include <sys/callb.h> #define DRV_NAME "vsw" /* * Only support ETHER mtu at moment. */ #define VSW_MTU ETHERMAX /* ID of the source of a frame being switched */ #define VSW_PHYSDEV 1 /* physical device associated */ #define VSW_VNETPORT 2 /* port connected to vnet (over ldc) */ #define VSW_LOCALDEV 4 /* vsw configured as an eth interface */ /* * Number of hash chains in the multicast forwarding database. */ #define VSW_NCHAINS 8 /* Number of descriptors - must be power of 2 */ #define VSW_NUM_DESCRIPTORS 512 /* * State of interface if switch plumbed as network device. */ #define VSW_IF_REG 0x1 /* interface was registered */ #define VSW_IF_UP 0x2 /* Interface UP */ #define VSW_IF_PROMISC 0x4 /* Interface in promiscious mode */ #define VSW_U_P(state) \ (state == (VSW_IF_UP | VSW_IF_PROMISC)) /* * Switching modes. */ #define VSW_LAYER2 0x1 /* Layer 2 - MAC switching */ #define VSW_LAYER2_PROMISC 0x2 /* Layer 2 + promisc mode */ #define VSW_LAYER3 0x4 /* Layer 3 - IP switching */ #define NUM_SMODES 3 /* number of switching modes */ #define VSW_PRI_ETH_DEFINED(vswp) ((vswp)->pri_num_types != 0) typedef enum { VSW_SWTHR_STOP = 0x1 } sw_thr_flags_t; typedef enum { PROG_init = 0x00, PROG_locks = 0x01, PROG_readmd = 0x02, PROG_fdb = 0x04, PROG_mfdb = 0x08, PROG_taskq = 0x10, PROG_rxp_taskq = 0x20, PROG_swmode = 0x40, PROG_macreg = 0x80, PROG_mdreg = 0x100 } vsw_attach_progress_t; /* * vlan-id information. */ typedef struct vsw_vlanid { uint16_t vl_vid; /* vlan-id */ mac_unicast_handle_t vl_muh; /* mac unicast handle */ boolean_t vl_set; /* set? */ } vsw_vlanid_t; /* * vsw instance state information. */ typedef struct vsw { int instance; /* instance # */ dev_info_t *dip; /* associated dev_info */ uint64_t regprop; /* "reg" property */ vsw_attach_progress_t attach_progress; /* attach progress flags */ struct vsw *next; /* next in list */ char physname[LIFNAMSIZ]; /* phys-dev */ uint8_t smode; /* switching mode */ kmutex_t sw_thr_lock; /* setup switching thr lock */ kcondvar_t sw_thr_cv; /* cv for setup switching thr */ kthread_t *sw_thread; /* setup switching thread */ sw_thr_flags_t sw_thr_flags; /* setup switching thr flags */ uint32_t switching_setup_done; /* setup switching done */ int mac_open_retries; /* mac_open() retry count */ vsw_port_list_t plist; /* associated ports */ ddi_taskq_t *taskq_p; /* VIO ctrl msg taskq */ mod_hash_t *fdb_hashp; /* forwarding database */ uint32_t fdb_nchains; /* # of hash chains in fdb */ mod_hash_t *vlan_hashp; /* vlan hash table */ uint32_t vlan_nchains; /* # of vlan hash chains */ uint32_t mtu; /* mtu of the device */ uint32_t max_frame_size; /* max frame size supported */ uint32_t mtu_physdev_orig; /* orig mtu of the physdev */ mod_hash_t *mfdb; /* multicast FDB */ krwlock_t mfdbrw; /* rwlock for mFDB */ ddi_taskq_t *rxp_taskq; /* VIO rx pool taskq */ void (*vsw_switch_frame) (struct vsw *, mblk_t *, int, vsw_port_t *, mac_resource_handle_t); /* mac layer */ kmutex_t mac_lock; /* protect mh */ mac_handle_t mh; krwlock_t maccl_rwlock; /* protect fields below */ mac_client_handle_t mch; /* mac client handle */ mac_unicast_handle_t muh; /* mac unicast handle */ mac_notify_handle_t mnh; /* mac notify handle */ boolean_t recfg_reqd; /* Reconfig of addrs needed */ /* mac layer switching flag */ boolean_t mac_cl_switching; /* Machine Description updates */ mdeg_node_spec_t *inst_spec; mdeg_handle_t mdeg_hdl; mdeg_handle_t mdeg_port_hdl; /* if configured as an ethernet interface */ mac_handle_t if_mh; /* MAC handle */ struct ether_addr if_addr; /* interface address */ krwlock_t if_lockrw; uint8_t if_state; /* interface state */ boolean_t addr_set; /* is addr set to HW */ /* multicast addresses when configured as eth interface */ kmutex_t mca_lock; /* multicast lock */ mcst_addr_t *mcap; /* list of multicast addrs */ uint32_t pri_num_types; /* # of priority eth types */ uint16_t *pri_types; /* priority eth types */ vio_mblk_pool_t *pri_tx_vmp; /* tx priority mblk pool */ uint16_t default_vlan_id; /* default vlan id */ uint16_t pvid; /* port vlan id (untagged) */ vsw_vlanid_t *vids; /* vlan ids (tagged) */ uint16_t nvids; /* # of vids */ uint32_t vids_size; /* size alloc'd for vids list */ /* HybridIO related fields */ boolean_t hio_capable; /* Phys dev HIO capable */ vsw_hio_t vhio; /* HybridIO info */ callb_id_t hio_reboot_cb_id; /* Reboot callb ID */ callb_id_t hio_panic_cb_id; /* Panic callb ID */ /* Link-state related fields */ boolean_t phys_no_link_update; /* no link-update supp */ boolean_t pls_update; /* phys link state update ? */ link_state_t phys_link_state; /* physical link state */ /* bandwidth related fields */ uint64_t bandwidth; /* bandwidth limit */ } vsw_t; /* * The flags that are used by vsw_mac_rx(). */ typedef enum { VSW_MACRX_PROMISC = 0x01, VSW_MACRX_COPYMSG = 0x02, VSW_MACRX_FREEMSG = 0x04 } vsw_macrx_flags_t; #ifdef DEBUG extern int vswdbg; extern void vswdebug(vsw_t *vswp, const char *fmt, ...); #define D1(...) \ if (vswdbg & 0x01) \ vswdebug(__VA_ARGS__) #define D2(...) \ if (vswdbg & 0x02) \ vswdebug(__VA_ARGS__) #define D3(...) \ if (vswdbg & 0x04) \ vswdebug(__VA_ARGS__) #define DWARN(...) \ if (vswdbg & 0x08) \ vswdebug(__VA_ARGS__) #define DERR(...) \ if (vswdbg & 0x10) \ vswdebug(__VA_ARGS__) #else #define DERR(...) if (0) do { } while (0) #define DWARN(...) if (0) do { } while (0) #define D1(...) if (0) do { } while (0) #define D2(...) if (0) do { } while (0) #define D3(...) if (0) do { } while (0) #endif /* DEBUG */ #ifdef __cplusplus } #endif #endif /* _VSW_H */