1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER START
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The contents of this file are subject to the terms of the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Common Development and Distribution License (the "License").
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You may not use this file except in compliance with the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * or http://www.opensolaris.org/os/licensing.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * See the License for the specific language governing permissions
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * and limitations under the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * When distributing Covered Code, include this CDDL HEADER in each
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * If applicable, add the following below this CDDL HEADER, with the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * fields enclosed by brackets "[]" replaced with your own identifying
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * information: Portions Copyright [yyyy] [name of copyright owner]
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER END
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
7bd3a2e26cc8569257b88c1691d559138e1d32d0Sriharsha Basavapatna * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Use is subject to license terms.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
06db247c678f0e3956535e8a6dec31d6c2108827raghuram * This header file contains the data structures which the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * virtual switch (vsw) uses to communicate with its clients and
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * the outside world.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifndef _VSW_H
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define _VSW_H
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifdef __cplusplus
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoextern "C" {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/vio_mailbox.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/vnet_common.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/ethernet.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac_client.h>
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan#include <sys/vio_util.h>
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#include <sys/vgen_stats.h>
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#include <sys/vsw_ldc.h>
678453a8ed49104d8adad58f3ba591bdc39883e8speer#include <sys/vsw_hio.h>
cdfc78ad277d82b1080e7c86213063d1b73e7789raghuram#include <sys/callb.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#define DRV_NAME "vsw"
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Only support ETHER mtu at moment.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VSW_MTU ETHERMAX
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* ID of the source of a frame being switched */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VSW_PHYSDEV 1 /* physical device associated */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VSW_VNETPORT 2 /* port connected to vnet (over ldc) */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VSW_LOCALDEV 4 /* vsw configured as an eth interface */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Number of hash chains in the multicast forwarding database.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VSW_NCHAINS 8
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
7bd3a2e26cc8569257b88c1691d559138e1d32d0Sriharsha Basavapatna/* Number of descriptors - must be power of 2 */
7bd3a2e26cc8569257b88c1691d559138e1d32d0Sriharsha Basavapatna#define VSW_NUM_DESCRIPTORS 512
f0ca1d9a12d54d304791bc74525e2010ca924726sb
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * State of interface if switch plumbed as network device.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb#define VSW_IF_REG 0x1 /* interface was registered */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb#define VSW_IF_UP 0x2 /* Interface UP */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb#define VSW_IF_PROMISC 0x4 /* Interface in promiscious mode */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VSW_U_P(state) \
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (state == (VSW_IF_UP | VSW_IF_PROMISC))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Switching modes.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VSW_LAYER2 0x1 /* Layer 2 - MAC switching */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VSW_LAYER2_PROMISC 0x2 /* Layer 2 + promisc mode */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VSW_LAYER3 0x4 /* Layer 3 - IP switching */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define NUM_SMODES 3 /* number of switching modes */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
f0ca1d9a12d54d304791bc74525e2010ca924726sb#define VSW_PRI_ETH_DEFINED(vswp) ((vswp)->pri_num_types != 0)
f0ca1d9a12d54d304791bc74525e2010ca924726sb
808f26a819b6259a3340d8d53074a2f1635315cbSriharsha Basavapatnatypedef enum {
808f26a819b6259a3340d8d53074a2f1635315cbSriharsha Basavapatna VSW_SWTHR_STOP = 0x1
808f26a819b6259a3340d8d53074a2f1635315cbSriharsha Basavapatna} sw_thr_flags_t;
808f26a819b6259a3340d8d53074a2f1635315cbSriharsha Basavapatna
6f09f0fef8e4582cfa771d87fe2a1f777bfb5cf0WENTAO YANGtypedef enum {
6f09f0fef8e4582cfa771d87fe2a1f777bfb5cf0WENTAO YANG PROG_init = 0x00,
6f09f0fef8e4582cfa771d87fe2a1f777bfb5cf0WENTAO YANG PROG_locks = 0x01,
6f09f0fef8e4582cfa771d87fe2a1f777bfb5cf0WENTAO YANG PROG_readmd = 0x02,
6f09f0fef8e4582cfa771d87fe2a1f777bfb5cf0WENTAO YANG PROG_fdb = 0x04,
6f09f0fef8e4582cfa771d87fe2a1f777bfb5cf0WENTAO YANG PROG_mfdb = 0x08,
6f09f0fef8e4582cfa771d87fe2a1f777bfb5cf0WENTAO YANG PROG_taskq = 0x10,
34b64c01c6a2242177691e1420a386e2789f79dcWENTAO YANG PROG_rxp_taskq = 0x20,
34b64c01c6a2242177691e1420a386e2789f79dcWENTAO YANG PROG_swmode = 0x40,
34b64c01c6a2242177691e1420a386e2789f79dcWENTAO YANG PROG_macreg = 0x80,
34b64c01c6a2242177691e1420a386e2789f79dcWENTAO YANG PROG_mdreg = 0x100
6f09f0fef8e4582cfa771d87fe2a1f777bfb5cf0WENTAO YANG} vsw_attach_progress_t;
6f09f0fef8e4582cfa771d87fe2a1f777bfb5cf0WENTAO YANG
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * vlan-id information.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengtypedef struct vsw_vlanid {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng uint16_t vl_vid; /* vlan-id */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_unicast_handle_t vl_muh; /* mac unicast handle */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng boolean_t vl_set; /* set? */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng} vsw_vlanid_t;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * vsw instance state information.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct vsw {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo int instance; /* instance # */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo dev_info_t *dip; /* associated dev_info */
19b65a69adc64b3289ccb2fc32b805782e3f4540sb uint64_t regprop; /* "reg" property */
6f09f0fef8e4582cfa771d87fe2a1f777bfb5cf0WENTAO YANG vsw_attach_progress_t attach_progress; /* attach progress flags */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo struct vsw *next; /* next in list */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char physname[LIFNAMSIZ]; /* phys-dev */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng uint8_t smode; /* switching mode */
808f26a819b6259a3340d8d53074a2f1635315cbSriharsha Basavapatna kmutex_t sw_thr_lock; /* setup switching thr lock */
808f26a819b6259a3340d8d53074a2f1635315cbSriharsha Basavapatna kcondvar_t sw_thr_cv; /* cv for setup switching thr */
808f26a819b6259a3340d8d53074a2f1635315cbSriharsha Basavapatna kthread_t *sw_thread; /* setup switching thread */
808f26a819b6259a3340d8d53074a2f1635315cbSriharsha Basavapatna sw_thr_flags_t sw_thr_flags; /* setup switching thr flags */
19b65a69adc64b3289ccb2fc32b805782e3f4540sb uint32_t switching_setup_done; /* setup switching done */
19b65a69adc64b3289ccb2fc32b805782e3f4540sb int mac_open_retries; /* mac_open() retry count */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vsw_port_list_t plist; /* associated ports */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ddi_taskq_t *taskq_p; /* VIO ctrl msg taskq */
c1c61f44e88f4c8c155272ee56d868043146096asb mod_hash_t *fdb_hashp; /* forwarding database */
c1c61f44e88f4c8c155272ee56d868043146096asb uint32_t fdb_nchains; /* # of hash chains in fdb */
c1c61f44e88f4c8c155272ee56d868043146096asb mod_hash_t *vlan_hashp; /* vlan hash table */
c1c61f44e88f4c8c155272ee56d868043146096asb uint32_t vlan_nchains; /* # of vlan hash chains */
7b1f684a14f99a2b9b1b2561f484ff648eff6d9bSriharsha Basavapatna uint32_t mtu; /* mtu of the device */
c1c61f44e88f4c8c155272ee56d868043146096asb uint32_t max_frame_size; /* max frame size supported */
7b1f684a14f99a2b9b1b2561f484ff648eff6d9bSriharsha Basavapatna uint32_t mtu_physdev_orig; /* orig mtu of the physdev */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo mod_hash_t *mfdb; /* multicast FDB */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo krwlock_t mfdbrw; /* rwlock for mFDB */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
34b64c01c6a2242177691e1420a386e2789f79dcWENTAO YANG ddi_taskq_t *rxp_taskq; /* VIO rx pool taskq */
34683adecebe88ca2c857e28be4749f3a083f9fcsg void (*vsw_switch_frame)
34683adecebe88ca2c857e28be4749f3a083f9fcsg (struct vsw *, mblk_t *, int,
34683adecebe88ca2c857e28be4749f3a083f9fcsg vsw_port_t *, mac_resource_handle_t);
d10e4ef2fabf16c3237c6d6592496df3eac6a1efnarayan
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* mac layer */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng kmutex_t mac_lock; /* protect mh */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo mac_handle_t mh;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng krwlock_t maccl_rwlock; /* protect fields below */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_client_handle_t mch; /* mac client handle */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_unicast_handle_t muh; /* mac unicast handle */
1107ea9346159bcc8ea154084897667347c4e6d5Sriharsha Basavapatna mac_notify_handle_t mnh; /* mac notify handle */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
e1ebb9ec908bc2d0a8810f137ebd6566cc8a8061lm boolean_t recfg_reqd; /* Reconfig of addrs needed */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* mac layer switching flag */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng boolean_t mac_cl_switching;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* Machine Description updates */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo mdeg_node_spec_t *inst_spec;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo mdeg_handle_t mdeg_hdl;
34683adecebe88ca2c857e28be4749f3a083f9fcsg mdeg_handle_t mdeg_port_hdl;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* if configured as an ethernet interface */
ba2e4443695ee6a6f420a35cd4fc3d3346d22932seb mac_handle_t if_mh; /* MAC handle */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo struct ether_addr if_addr; /* interface address */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo krwlock_t if_lockrw;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint8_t if_state; /* interface state */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng boolean_t addr_set; /* is addr set to HW */
5f94e909a253b6d0625c7c7425f59848f0cfb850sg
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* multicast addresses when configured as eth interface */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo kmutex_t mca_lock; /* multicast lock */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo mcst_addr_t *mcap; /* list of multicast addrs */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
f0ca1d9a12d54d304791bc74525e2010ca924726sb uint32_t pri_num_types; /* # of priority eth types */
f0ca1d9a12d54d304791bc74525e2010ca924726sb uint16_t *pri_types; /* priority eth types */
f0ca1d9a12d54d304791bc74525e2010ca924726sb vio_mblk_pool_t *pri_tx_vmp; /* tx priority mblk pool */
c1c61f44e88f4c8c155272ee56d868043146096asb uint16_t default_vlan_id; /* default vlan id */
c1c61f44e88f4c8c155272ee56d868043146096asb uint16_t pvid; /* port vlan id (untagged) */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vsw_vlanid_t *vids; /* vlan ids (tagged) */
c1c61f44e88f4c8c155272ee56d868043146096asb uint16_t nvids; /* # of vids */
c1c61f44e88f4c8c155272ee56d868043146096asb uint32_t vids_size; /* size alloc'd for vids list */
678453a8ed49104d8adad58f3ba591bdc39883e8speer
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* HybridIO related fields */
678453a8ed49104d8adad58f3ba591bdc39883e8speer boolean_t hio_capable; /* Phys dev HIO capable */
678453a8ed49104d8adad58f3ba591bdc39883e8speer vsw_hio_t vhio; /* HybridIO info */
cdfc78ad277d82b1080e7c86213063d1b73e7789raghuram callb_id_t hio_reboot_cb_id; /* Reboot callb ID */
cdfc78ad277d82b1080e7c86213063d1b73e7789raghuram callb_id_t hio_panic_cb_id; /* Panic callb ID */
1107ea9346159bcc8ea154084897667347c4e6d5Sriharsha Basavapatna
1107ea9346159bcc8ea154084897667347c4e6d5Sriharsha Basavapatna /* Link-state related fields */
1107ea9346159bcc8ea154084897667347c4e6d5Sriharsha Basavapatna boolean_t phys_no_link_update; /* no link-update supp */
1107ea9346159bcc8ea154084897667347c4e6d5Sriharsha Basavapatna boolean_t pls_update; /* phys link state update ? */
1107ea9346159bcc8ea154084897667347c4e6d5Sriharsha Basavapatna link_state_t phys_link_state; /* physical link state */
bce0a86e5d4d65341c5aca6da2595c848297b2aaWENTAO YANG
bce0a86e5d4d65341c5aca6da2595c848297b2aaWENTAO YANG /* bandwidth related fields */
bce0a86e5d4d65341c5aca6da2595c848297b2aaWENTAO YANG uint64_t bandwidth; /* bandwidth limit */
06db247c678f0e3956535e8a6dec31d6c2108827raghuram} vsw_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
06db247c678f0e3956535e8a6dec31d6c2108827raghuram * The flags that are used by vsw_mac_rx().
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
06db247c678f0e3956535e8a6dec31d6c2108827raghuramtypedef enum {
06db247c678f0e3956535e8a6dec31d6c2108827raghuram VSW_MACRX_PROMISC = 0x01,
06db247c678f0e3956535e8a6dec31d6c2108827raghuram VSW_MACRX_COPYMSG = 0x02,
06db247c678f0e3956535e8a6dec31d6c2108827raghuram VSW_MACRX_FREEMSG = 0x04
06db247c678f0e3956535e8a6dec31d6c2108827raghuram} vsw_macrx_flags_t;
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#ifdef DEBUG
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
06db247c678f0e3956535e8a6dec31d6c2108827raghuramextern int vswdbg;
06db247c678f0e3956535e8a6dec31d6c2108827raghuramextern void vswdebug(vsw_t *vswp, const char *fmt, ...);
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#define D1(...) \
06db247c678f0e3956535e8a6dec31d6c2108827raghuramif (vswdbg & 0x01) \
06db247c678f0e3956535e8a6dec31d6c2108827raghuram vswdebug(__VA_ARGS__)
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#define D2(...) \
06db247c678f0e3956535e8a6dec31d6c2108827raghuramif (vswdbg & 0x02) \
06db247c678f0e3956535e8a6dec31d6c2108827raghuram vswdebug(__VA_ARGS__)
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#define D3(...) \
06db247c678f0e3956535e8a6dec31d6c2108827raghuramif (vswdbg & 0x04) \
06db247c678f0e3956535e8a6dec31d6c2108827raghuram vswdebug(__VA_ARGS__)
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#define DWARN(...) \
06db247c678f0e3956535e8a6dec31d6c2108827raghuramif (vswdbg & 0x08) \
06db247c678f0e3956535e8a6dec31d6c2108827raghuram vswdebug(__VA_ARGS__)
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#define DERR(...) \
06db247c678f0e3956535e8a6dec31d6c2108827raghuramif (vswdbg & 0x10) \
06db247c678f0e3956535e8a6dec31d6c2108827raghuram vswdebug(__VA_ARGS__)
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#else
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#define DERR(...) if (0) do { } while (0)
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#define DWARN(...) if (0) do { } while (0)
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#define D1(...) if (0) do { } while (0)
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#define D2(...) if (0) do { } while (0)
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#define D3(...) if (0) do { } while (0)
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
06db247c678f0e3956535e8a6dec31d6c2108827raghuram#endif /* DEBUG */
06db247c678f0e3956535e8a6dec31d6c2108827raghuram
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifdef __cplusplus
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif /* _VSW_H */