15373Sraghuram /* 25373Sraghuram * CDDL HEADER START 35373Sraghuram * 45373Sraghuram * The contents of this file are subject to the terms of the 55373Sraghuram * Common Development and Distribution License (the "License"). 65373Sraghuram * You may not use this file except in compliance with the License. 75373Sraghuram * 85373Sraghuram * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95373Sraghuram * or http://www.opensolaris.org/os/licensing. 105373Sraghuram * See the License for the specific language governing permissions 115373Sraghuram * and limitations under the License. 125373Sraghuram * 135373Sraghuram * When distributing Covered Code, include this CDDL HEADER in each 145373Sraghuram * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155373Sraghuram * If applicable, add the following below this CDDL HEADER, with the 165373Sraghuram * fields enclosed by brackets "[]" replaced with your own identifying 175373Sraghuram * information: Portions Copyright [yyyy] [name of copyright owner] 185373Sraghuram * 195373Sraghuram * CDDL HEADER END 205373Sraghuram */ 215373Sraghuram 225373Sraghuram /* 2312950SWentao.Yang@Sun.COM * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. 245373Sraghuram */ 255373Sraghuram 265373Sraghuram /* 275373Sraghuram * This header file contains the basic data structures which the 285373Sraghuram * virtual switch (vsw) uses to communicate with vnet clients. 295373Sraghuram * 305373Sraghuram * The virtual switch reads the machine description (MD) to 315373Sraghuram * determine how many port_t structures to create (each port_t 325373Sraghuram * can support communications to a single network device). The 335373Sraghuram * port_t's are maintained in a linked list. 345373Sraghuram * 355373Sraghuram * Each port in turn contains a number of logical domain channels 365373Sraghuram * (ldc's) which are inter domain communications channels which 3712011SSriharsha.Basavapatna@Sun.COM * are used for passing small messages between the domains. There 3812011SSriharsha.Basavapatna@Sun.COM * may be any number of channels associated with each port, though 3912011SSriharsha.Basavapatna@Sun.COM * currently most devices only have a single channel. The current 4012011SSriharsha.Basavapatna@Sun.COM * implementation provides support for only one channel per port. 415373Sraghuram * 425373Sraghuram * The ldc is a bi-directional channel, which is divided up into 435373Sraghuram * two directional 'lanes', one outbound from the switch to the 445373Sraghuram * virtual network device, the other inbound to the switch. 455373Sraghuram * Depending on the type of device each lane may have seperate 465373Sraghuram * communication paramaters (such as mtu etc). 475373Sraghuram * 485373Sraghuram * For those network clients which use descriptor rings the 495373Sraghuram * rings are associated with the appropriate lane. I.e. rings 505373Sraghuram * which the switch exports are associated with the outbound lanes 515373Sraghuram * while those which the network clients are exporting to the switch 525373Sraghuram * are associated with the inbound lane. 535373Sraghuram * 545373Sraghuram * In diagram form the data structures look as follows: 555373Sraghuram * 565373Sraghuram * vsw instance 575373Sraghuram * | 585373Sraghuram * +----->port_t----->port_t----->port_t-----> 595373Sraghuram * | 6012011SSriharsha.Basavapatna@Sun.COM * +--->ldc_t 615373Sraghuram * | 625373Sraghuram * +--->lane_t (inbound) 635373Sraghuram * | | 6412011SSriharsha.Basavapatna@Sun.COM * | +--->dring 655373Sraghuram * | 665373Sraghuram * +--->lane_t (outbound) 675373Sraghuram * | 6812011SSriharsha.Basavapatna@Sun.COM * +--->dring 695373Sraghuram * 705373Sraghuram */ 715373Sraghuram 725373Sraghuram #ifndef _VSW_LDC_H 735373Sraghuram #define _VSW_LDC_H 745373Sraghuram 755373Sraghuram #ifdef __cplusplus 765373Sraghuram extern "C" { 775373Sraghuram #endif 785373Sraghuram 795373Sraghuram /* 8012011SSriharsha.Basavapatna@Sun.COM * LDC pkt tranfer MTU - largest msg size used 8112011SSriharsha.Basavapatna@Sun.COM */ 8212011SSriharsha.Basavapatna@Sun.COM #define VSW_LDC_MTU 64 8312011SSriharsha.Basavapatna@Sun.COM 8412011SSriharsha.Basavapatna@Sun.COM #define VSW_DEF_MSG_WORDS \ 8512011SSriharsha.Basavapatna@Sun.COM (VNET_DRING_REG_EXT_MSG_SIZE_MAX / sizeof (uint64_t)) 8612011SSriharsha.Basavapatna@Sun.COM 8712011SSriharsha.Basavapatna@Sun.COM /* 885373Sraghuram * Default message type. 895373Sraghuram */ 905373Sraghuram typedef struct def_msg { 9112011SSriharsha.Basavapatna@Sun.COM uint64_t data[VSW_DEF_MSG_WORDS]; 925373Sraghuram } def_msg_t; 935373Sraghuram 945373Sraghuram /* 955373Sraghuram * Currently only support one major/minor pair. 965373Sraghuram */ 975373Sraghuram #define VSW_NUM_VER 1 985373Sraghuram 995373Sraghuram typedef struct ver_sup { 1005462Swentaoy uint16_t ver_major; /* major version number */ 1015462Swentaoy uint16_t ver_minor; /* minor version number */ 1025373Sraghuram } ver_sup_t; 1035373Sraghuram 1045373Sraghuram /* 1055373Sraghuram * Lane states. 1065373Sraghuram */ 1075373Sraghuram #define VSW_LANE_INACTIV 0x0 /* No params set for lane */ 1085373Sraghuram 1095373Sraghuram #define VSW_VER_INFO_SENT 0x1 /* Version # sent to peer */ 1105373Sraghuram #define VSW_VER_INFO_RECV 0x2 /* Version # recv from peer */ 1115373Sraghuram #define VSW_VER_ACK_RECV 0x4 1125373Sraghuram #define VSW_VER_ACK_SENT 0x8 1135373Sraghuram #define VSW_VER_NACK_RECV 0x10 1145373Sraghuram #define VSW_VER_NACK_SENT 0x20 1155373Sraghuram 1165373Sraghuram #define VSW_ATTR_INFO_SENT 0x40 /* Attributes sent to peer */ 1175373Sraghuram #define VSW_ATTR_INFO_RECV 0x80 /* Peer attributes received */ 1185373Sraghuram #define VSW_ATTR_ACK_SENT 0x100 1195373Sraghuram #define VSW_ATTR_ACK_RECV 0x200 1205373Sraghuram #define VSW_ATTR_NACK_SENT 0x400 1215373Sraghuram #define VSW_ATTR_NACK_RECV 0x800 1225373Sraghuram 1235373Sraghuram #define VSW_DRING_INFO_SENT 0x1000 /* Dring info sent to peer */ 1245373Sraghuram #define VSW_DRING_INFO_RECV 0x2000 /* Dring info received */ 1255373Sraghuram #define VSW_DRING_ACK_SENT 0x4000 1265373Sraghuram #define VSW_DRING_ACK_RECV 0x8000 1275373Sraghuram #define VSW_DRING_NACK_SENT 0x10000 1285373Sraghuram #define VSW_DRING_NACK_RECV 0x20000 1295373Sraghuram 1305373Sraghuram #define VSW_RDX_INFO_SENT 0x40000 /* RDX sent to peer */ 1315373Sraghuram #define VSW_RDX_INFO_RECV 0x80000 /* RDX received from peer */ 1325373Sraghuram #define VSW_RDX_ACK_SENT 0x100000 1335373Sraghuram #define VSW_RDX_ACK_RECV 0x200000 1345373Sraghuram #define VSW_RDX_NACK_SENT 0x400000 1355373Sraghuram #define VSW_RDX_NACK_RECV 0x800000 1365373Sraghuram 1375373Sraghuram #define VSW_MCST_INFO_SENT 0x1000000 1385373Sraghuram #define VSW_MCST_INFO_RECV 0x2000000 1395373Sraghuram #define VSW_MCST_ACK_SENT 0x4000000 1405373Sraghuram #define VSW_MCST_ACK_RECV 0x8000000 1415373Sraghuram #define VSW_MCST_NACK_SENT 0x10000000 1425373Sraghuram #define VSW_MCST_NACK_RECV 0x20000000 1435373Sraghuram 1445373Sraghuram #define VSW_LANE_ACTIVE 0x40000000 /* Lane open to xmit data */ 1455373Sraghuram 1465373Sraghuram /* Handshake milestones */ 1475373Sraghuram #define VSW_MILESTONE0 0x1 /* ver info exchanged */ 1485373Sraghuram #define VSW_MILESTONE1 0x2 /* attribute exchanged */ 1495373Sraghuram #define VSW_MILESTONE2 0x4 /* dring info exchanged */ 1505373Sraghuram #define VSW_MILESTONE3 0x8 /* rdx exchanged */ 1515373Sraghuram #define VSW_MILESTONE4 0x10 /* handshake complete */ 1525373Sraghuram 1535373Sraghuram /* 1545373Sraghuram * Lane direction (relative to ourselves). 1555373Sraghuram */ 1565373Sraghuram #define INBOUND 0x1 1575373Sraghuram #define OUTBOUND 0x2 1585373Sraghuram 1595373Sraghuram /* Peer session id received */ 1605373Sraghuram #define VSW_PEER_SESSION 0x1 1615373Sraghuram 1625373Sraghuram /* 1635373Sraghuram * Maximum number of consecutive reads of data from channel 1645373Sraghuram */ 1655373Sraghuram #define VSW_MAX_CHAN_READ 50 1665373Sraghuram 1675373Sraghuram /* 1685373Sraghuram * Currently only support one ldc per port. 1695373Sraghuram */ 1705373Sraghuram #define VSW_PORT_MAX_LDCS 1 /* max # of ldcs per port */ 1715373Sraghuram 1725373Sraghuram /* 1735373Sraghuram * Used for port add/deletion. 1745373Sraghuram */ 1755373Sraghuram #define VSW_PORT_UPDATED 0x1 1765373Sraghuram 1775373Sraghuram #define LDC_TX_SUCCESS 0 /* ldc transmit success */ 1785373Sraghuram #define LDC_TX_FAILURE 1 /* ldc transmit failure */ 1795373Sraghuram #define LDC_TX_NORESOURCES 2 /* out of descriptors */ 1805373Sraghuram 1815373Sraghuram /* 1825373Sraghuram * Descriptor ring info 1835373Sraghuram * 1845373Sraghuram * Each descriptor element has a pre-allocated data buffer 1855373Sraghuram * associated with it, into which data being transmitted is 1865373Sraghuram * copied. By pre-allocating we speed up the copying process. 1875373Sraghuram * The buffer is re-used once the peer has indicated that it is 1885373Sraghuram * finished with the descriptor. 1895373Sraghuram */ 1905373Sraghuram #define VSW_RING_EL_DATA_SZ 2048 /* Size of data section (bytes) */ 1915373Sraghuram #define VSW_PRIV_SIZE sizeof (vnet_private_desc_t) 1925373Sraghuram 1935373Sraghuram #define VSW_MAX_COOKIES ((ETHERMTU >> MMU_PAGESHIFT) + 2) 1945373Sraghuram 1955373Sraghuram /* 1965373Sraghuram * Size of the mblk in each mblk pool. 1975373Sraghuram */ 1985373Sraghuram #define VSW_MBLK_SZ_128 128 1995373Sraghuram #define VSW_MBLK_SZ_256 256 2005373Sraghuram #define VSW_MBLK_SZ_2048 2048 2015373Sraghuram 2025373Sraghuram /* 2035373Sraghuram * Number of mblks in each mblk pool. 2045373Sraghuram */ 2055373Sraghuram #define VSW_NUM_MBLKS 1024 2065373Sraghuram 207*13098SWentao.Yang@Sun.COM /* 208*13098SWentao.Yang@Sun.COM * Number of rcv buffers in RxDringData mode 209*13098SWentao.Yang@Sun.COM */ 210*13098SWentao.Yang@Sun.COM #define VSW_RXDRING_NRBUFS (vsw_num_descriptors * vsw_nrbufs_factor) 211*13098SWentao.Yang@Sun.COM 21212011SSriharsha.Basavapatna@Sun.COM /* increment recv index */ 21312011SSriharsha.Basavapatna@Sun.COM #define INCR_DESC_INDEX(dp, i) \ 21412011SSriharsha.Basavapatna@Sun.COM ((i) = (((i) + 1) & ((dp)->num_descriptors - 1))) 21512011SSriharsha.Basavapatna@Sun.COM 21612011SSriharsha.Basavapatna@Sun.COM /* decrement recv index */ 21712011SSriharsha.Basavapatna@Sun.COM #define DECR_DESC_INDEX(dp, i) \ 21812011SSriharsha.Basavapatna@Sun.COM ((i) = (((i) - 1) & ((dp)->num_descriptors - 1))) 21912011SSriharsha.Basavapatna@Sun.COM 22012011SSriharsha.Basavapatna@Sun.COM #define INCR_TXI INCR_DESC_INDEX 22112011SSriharsha.Basavapatna@Sun.COM #define DECR_TXI DECR_DESC_INDEX 22212011SSriharsha.Basavapatna@Sun.COM #define INCR_RXI INCR_DESC_INDEX 22312011SSriharsha.Basavapatna@Sun.COM #define DECR_RXI DECR_DESC_INDEX 22412011SSriharsha.Basavapatna@Sun.COM 22512011SSriharsha.Basavapatna@Sun.COM /* bounds check rx index */ 22612011SSriharsha.Basavapatna@Sun.COM #define CHECK_DESC_INDEX(dp, i) \ 22712011SSriharsha.Basavapatna@Sun.COM (((i) >= 0) && ((i) < (dp)->num_descriptors)) 22812011SSriharsha.Basavapatna@Sun.COM 22912011SSriharsha.Basavapatna@Sun.COM #define CHECK_RXI CHECK_DESC_INDEX 23012011SSriharsha.Basavapatna@Sun.COM #define CHECK_TXI CHECK_DESC_INDEX 23112011SSriharsha.Basavapatna@Sun.COM 2325373Sraghuram /* 2335373Sraghuram * Private descriptor 2345373Sraghuram */ 2355373Sraghuram typedef struct vsw_private_desc { 2365373Sraghuram /* 2375373Sraghuram * Below lock must be held when accessing the state of 2385373Sraghuram * a descriptor on either the private or public sections 2395373Sraghuram * of the ring. 2405373Sraghuram */ 2415373Sraghuram kmutex_t dstate_lock; 2425373Sraghuram uint64_t dstate; 2435373Sraghuram vnet_public_desc_t *descp; 2445373Sraghuram ldc_mem_handle_t memhandle; 2455373Sraghuram void *datap; 2465373Sraghuram uint64_t datalen; 2475373Sraghuram uint64_t ncookies; 2485373Sraghuram ldc_mem_cookie_t memcookie[VSW_MAX_COOKIES]; 2495373Sraghuram int bound; 2505373Sraghuram } vsw_private_desc_t; 2515373Sraghuram 2525373Sraghuram /* 2535373Sraghuram * Descriptor ring structure 2545373Sraghuram */ 2555373Sraghuram typedef struct dring_info { 25612011SSriharsha.Basavapatna@Sun.COM kmutex_t dlock; /* sync access */ 25712011SSriharsha.Basavapatna@Sun.COM uint32_t num_descriptors; /* # of descriptors */ 25812011SSriharsha.Basavapatna@Sun.COM uint32_t descriptor_size; /* size of descriptor */ 25912011SSriharsha.Basavapatna@Sun.COM uint32_t options; /* dring options (mode) */ 26012011SSriharsha.Basavapatna@Sun.COM ldc_dring_handle_t dring_handle; /* dring LDC handle */ 26112011SSriharsha.Basavapatna@Sun.COM uint32_t dring_ncookies; /* # of dring cookies */ 26212011SSriharsha.Basavapatna@Sun.COM ldc_mem_cookie_t dring_cookie[1]; /* LDC cookie of dring */ 26312011SSriharsha.Basavapatna@Sun.COM ldc_mem_handle_t data_handle; /* data area LDC handle */ 26412011SSriharsha.Basavapatna@Sun.COM uint32_t data_ncookies; /* # of data area cookies */ 26512011SSriharsha.Basavapatna@Sun.COM ldc_mem_cookie_t *data_cookie; /* data area LDC cookies */ 26612011SSriharsha.Basavapatna@Sun.COM uint64_t ident; /* identifier sent to peer */ 2675373Sraghuram uint64_t end_idx; /* last idx processed */ 26812011SSriharsha.Basavapatna@Sun.COM int64_t last_ack_recv; /* last ack received */ 26912011SSriharsha.Basavapatna@Sun.COM kmutex_t txlock; /* protect tx desc alloc */ 27012011SSriharsha.Basavapatna@Sun.COM uint32_t next_txi; /* next tx descriptor index */ 27112011SSriharsha.Basavapatna@Sun.COM uint32_t next_rxi; /* next expected recv index */ 27212011SSriharsha.Basavapatna@Sun.COM kmutex_t restart_lock; /* protect restart_reqd */ 2735373Sraghuram boolean_t restart_reqd; /* send restart msg */ 27412950SWentao.Yang@Sun.COM uint32_t restart_peer_txi; /* index to restart peer */ 2755373Sraghuram void *pub_addr; /* base of public section */ 2765373Sraghuram void *priv_addr; /* base of private section */ 2775373Sraghuram void *data_addr; /* base of data section */ 2785373Sraghuram size_t data_sz; /* size of data section */ 2796419Ssb155480 size_t desc_data_sz; /* size of descr data blk */ 2806845Sha137994 uint8_t dring_mtype; /* dring mem map type */ 28112011SSriharsha.Basavapatna@Sun.COM uint32_t num_bufs; /* # of buffers */ 28212011SSriharsha.Basavapatna@Sun.COM vio_mblk_pool_t *rx_vmp; /* rx mblk pool */ 28312011SSriharsha.Basavapatna@Sun.COM vio_mblk_t **rxdp_to_vmp; /* descr to buf map tbl */ 2845373Sraghuram } dring_info_t; 2855373Sraghuram 2865373Sraghuram /* 2875373Sraghuram * Each ldc connection is comprised of two lanes, incoming 2885373Sraghuram * from a peer, and outgoing to that peer. Each lane shares 2895373Sraghuram * common ldc parameters and also has private lane-specific 2905373Sraghuram * parameters. 2915373Sraghuram */ 2925373Sraghuram typedef struct lane { 2935373Sraghuram uint64_t lstate; /* Lane state */ 2945462Swentaoy uint16_t ver_major; /* Version major number */ 2955462Swentaoy uint16_t ver_minor; /* Version minor number */ 2965373Sraghuram uint64_t seq_num; /* Sequence number */ 2975373Sraghuram uint64_t mtu; /* ETHERMTU */ 2985373Sraghuram uint64_t addr; /* Unique physical address */ 2995373Sraghuram uint8_t addr_type; /* Only MAC address at moment */ 3005373Sraghuram uint8_t xfer_mode; /* Dring or Pkt based */ 3015373Sraghuram uint8_t ack_freq; /* Only non zero for Pkt based xfer */ 3029336SSriharsha.Basavapatna@Sun.COM uint32_t physlink_update; /* physlink updates */ 30312011SSriharsha.Basavapatna@Sun.COM uint8_t dring_mode; /* Descriptor ring mode */ 3045373Sraghuram dring_info_t *dringp; /* List of drings for this lane */ 3055373Sraghuram } lane_t; 3065373Sraghuram 3075373Sraghuram /* channel drain states */ 3085373Sraghuram #define VSW_LDC_INIT 0x1 /* Initial non-drain state */ 3095373Sraghuram #define VSW_LDC_DRAINING 0x2 /* Channel draining */ 3105373Sraghuram 3115935Ssb155480 /* 3125935Ssb155480 * vnet-protocol-version dependent function prototypes. 3135935Ssb155480 */ 3145935Ssb155480 typedef int (*vsw_ldctx_t) (void *, mblk_t *, mblk_t *, uint32_t); 3155935Ssb155480 typedef void (*vsw_ldcrx_pktdata_t) (void *, void *, uint32_t); 31612011SSriharsha.Basavapatna@Sun.COM typedef void (*vsw_ldcrx_dringdata_t) (void *, void *); 3175935Ssb155480 3185373Sraghuram /* ldc information associated with a vsw-port */ 3195373Sraghuram typedef struct vsw_ldc { 3205373Sraghuram struct vsw_ldc *ldc_next; /* next ldc in the list */ 3215373Sraghuram struct vsw_port *ldc_port; /* associated port */ 3225373Sraghuram struct vsw *ldc_vswp; /* associated vsw */ 3235373Sraghuram kmutex_t ldc_cblock; /* sync callback processing */ 3245373Sraghuram kmutex_t ldc_txlock; /* sync transmits */ 3255373Sraghuram kmutex_t ldc_rxlock; /* sync rx */ 3265373Sraghuram uint64_t ldc_id; /* channel number */ 3275373Sraghuram ldc_handle_t ldc_handle; /* channel handle */ 3285373Sraghuram kmutex_t drain_cv_lock; 3295373Sraghuram kcondvar_t drain_cv; /* channel draining */ 3305373Sraghuram int drain_state; 3315373Sraghuram uint32_t hphase; /* handshake phase */ 3325373Sraghuram int hcnt; /* # handshake attempts */ 3335373Sraghuram kmutex_t status_lock; 3345373Sraghuram ldc_status_t ldc_status; /* channel status */ 3355373Sraghuram uint8_t reset_active; /* reset flag */ 3365373Sraghuram uint64_t local_session; /* Our session id */ 3375373Sraghuram uint64_t peer_session; /* Our peers session id */ 3385373Sraghuram uint8_t session_status; /* Session recv'd, sent */ 3395373Sraghuram uint32_t hss_id; /* Handshake session id */ 3405373Sraghuram uint64_t next_ident; /* Next dring ident # to use */ 3415373Sraghuram lane_t lane_in; /* Inbound lane */ 3425373Sraghuram lane_t lane_out; /* Outbound lane */ 3435373Sraghuram uint8_t dev_class; /* Peer device class */ 3449336SSriharsha.Basavapatna@Sun.COM boolean_t pls_negotiated; /* phys link state update ? */ 3455373Sraghuram vio_multi_pool_t vmp; /* Receive mblk pools */ 3467529SSriharsha.Basavapatna@Sun.COM uint32_t max_rxpool_size; /* max size of rxpool in use */ 3475935Ssb155480 uint64_t *ldcmsg; /* msg buffer for ldc_read() */ 3485935Ssb155480 uint64_t msglen; /* size of ldcmsg */ 34912011SSriharsha.Basavapatna@Sun.COM uint32_t dringdata_msgid; /* msgid in RxDringData mode */ 3505373Sraghuram 3515373Sraghuram /* tx thread fields */ 3525373Sraghuram kthread_t *tx_thread; /* tx thread */ 3535373Sraghuram uint32_t tx_thr_flags; /* tx thread flags */ 3545373Sraghuram kmutex_t tx_thr_lock; /* lock for tx thread */ 3555373Sraghuram kcondvar_t tx_thr_cv; /* cond.var for tx thread */ 3565373Sraghuram mblk_t *tx_mhead; /* tx mblks head */ 3575373Sraghuram mblk_t *tx_mtail; /* tx mblks tail */ 3585935Ssb155480 uint32_t tx_cnt; /* # of pkts queued for tx */ 3595373Sraghuram 36012011SSriharsha.Basavapatna@Sun.COM /* message thread fields */ 36112011SSriharsha.Basavapatna@Sun.COM kthread_t *msg_thread; /* message thread */ 36212011SSriharsha.Basavapatna@Sun.COM uint32_t msg_thr_flags; /* message thread flags */ 36312011SSriharsha.Basavapatna@Sun.COM kmutex_t msg_thr_lock; /* lock for message thread */ 36412011SSriharsha.Basavapatna@Sun.COM kcondvar_t msg_thr_cv; /* cond.var for msg thread */ 36512011SSriharsha.Basavapatna@Sun.COM 3665373Sraghuram /* receive thread fields */ 36712011SSriharsha.Basavapatna@Sun.COM kthread_t *rcv_thread; /* receive thread */ 36812011SSriharsha.Basavapatna@Sun.COM uint32_t rcv_thr_flags; /* receive thread flags */ 36912011SSriharsha.Basavapatna@Sun.COM kmutex_t rcv_thr_lock; /* lock for receive thread */ 37012011SSriharsha.Basavapatna@Sun.COM kcondvar_t rcv_thr_cv; /* cond.var for recv thread */ 3715373Sraghuram 3725935Ssb155480 vsw_ldctx_t tx; /* transmit function */ 37312011SSriharsha.Basavapatna@Sun.COM vsw_ldcrx_pktdata_t rx_pktdata; /* process raw data msg */ 37412011SSriharsha.Basavapatna@Sun.COM vsw_ldcrx_dringdata_t rx_dringdata; /* process dring data msg */ 3755935Ssb155480 3765373Sraghuram /* channel statistics */ 3775373Sraghuram vgen_stats_t ldc_stats; /* channel statistics */ 3785373Sraghuram kstat_t *ksp; /* channel kstats */ 3795373Sraghuram } vsw_ldc_t; 3805373Sraghuram 3815373Sraghuram /* worker thread flags */ 3829217SWentao.Yang@Sun.COM #define VSW_WTHR_DATARCVD 0x01 /* data received */ 3839217SWentao.Yang@Sun.COM #define VSW_WTHR_STOP 0x02 /* stop worker thread request */ 3845373Sraghuram 3855373Sraghuram /* multicast addresses port is interested in */ 3865373Sraghuram typedef struct mcst_addr { 3875373Sraghuram struct mcst_addr *nextp; 3885373Sraghuram struct ether_addr mca; /* multicast address */ 3895373Sraghuram uint64_t addr; /* mcast addr converted to hash key */ 3905373Sraghuram boolean_t mac_added; /* added into physical device */ 3915373Sraghuram } mcst_addr_t; 3925373Sraghuram 3935373Sraghuram /* Port detach states */ 3945373Sraghuram #define VSW_PORT_INIT 0x1 /* Initial non-detach state */ 3955373Sraghuram #define VSW_PORT_DETACHING 0x2 /* In process of being detached */ 3965373Sraghuram #define VSW_PORT_DETACHABLE 0x4 /* Safe to detach */ 3975373Sraghuram 3985373Sraghuram /* port information associated with a vsw */ 3995373Sraghuram typedef struct vsw_port { 4005373Sraghuram int p_instance; /* port instance */ 4015373Sraghuram struct vsw_port *p_next; /* next port in the list */ 4025373Sraghuram struct vsw *p_vswp; /* associated vsw */ 4036419Ssb155480 int num_ldcs; /* # of ldcs in the port */ 4046419Ssb155480 uint64_t *ldc_ids; /* ldc ids */ 40512011SSriharsha.Basavapatna@Sun.COM vsw_ldc_t *ldcp; /* ldc for this port */ 4065373Sraghuram 4075373Sraghuram kmutex_t tx_lock; /* transmit lock */ 4085373Sraghuram int (*transmit)(vsw_ldc_t *, mblk_t *); 4095373Sraghuram 4105373Sraghuram int state; /* port state */ 4115373Sraghuram kmutex_t state_lock; 4125373Sraghuram kcondvar_t state_cv; 4135373Sraghuram 4148275SEric Cheng krwlock_t maccl_rwlock; /* protect fields below */ 4158275SEric Cheng mac_client_handle_t p_mch; /* mac client handle */ 4168275SEric Cheng mac_unicast_handle_t p_muh; /* mac unicast handle */ 4178275SEric Cheng 4185373Sraghuram kmutex_t mca_lock; /* multicast lock */ 4195373Sraghuram mcst_addr_t *mcap; /* list of multicast addrs */ 4205373Sraghuram 4218275SEric Cheng boolean_t addr_set; /* Addr set where */ 4225373Sraghuram 4235373Sraghuram /* 4245373Sraghuram * mac address of the port & connected device 4255373Sraghuram */ 4265373Sraghuram struct ether_addr p_macaddr; 4276419Ssb155480 uint16_t pvid; /* port vlan id (untagged) */ 4288275SEric Cheng struct vsw_vlanid *vids; /* vlan ids (tagged) */ 4296419Ssb155480 uint16_t nvids; /* # of vids */ 4306419Ssb155480 mod_hash_t *vlan_hashp; /* vlan hash table */ 4316419Ssb155480 uint32_t vlan_nchains; /* # of vlan hash chains */ 4326495Sspeer 4336495Sspeer /* HybridIO related info */ 4346495Sspeer uint32_t p_hio_enabled; /* Hybrid mode enabled? */ 4356495Sspeer uint32_t p_hio_capable; /* Port capable of HIO */ 43610795SWentao.Yang@Sun.COM 43710795SWentao.Yang@Sun.COM /* bandwidth limit */ 43810795SWentao.Yang@Sun.COM uint64_t p_bandwidth; /* bandwidth limit */ 4395373Sraghuram } vsw_port_t; 4405373Sraghuram 4415373Sraghuram /* list of ports per vsw */ 4425373Sraghuram typedef struct vsw_port_list { 4435373Sraghuram vsw_port_t *head; /* head of the list */ 4445373Sraghuram krwlock_t lockrw; /* sync access(rw) to the list */ 4455373Sraghuram int num_ports; /* number of ports in the list */ 4465373Sraghuram } vsw_port_list_t; 4475373Sraghuram 4485373Sraghuram /* 4495373Sraghuram * Taskq control message 4505373Sraghuram */ 4515373Sraghuram typedef struct vsw_ctrl_task { 4525373Sraghuram vsw_ldc_t *ldcp; 4535373Sraghuram def_msg_t pktp; 4545373Sraghuram uint32_t hss_id; 4555373Sraghuram } vsw_ctrl_task_t; 4565373Sraghuram 4575373Sraghuram /* 4585373Sraghuram * State of connection to peer. Some of these states 4595373Sraghuram * can be mapped to LDC events as follows: 4605373Sraghuram * 4615373Sraghuram * VSW_CONN_RESET -> LDC_RESET_EVT 4625373Sraghuram * VSW_CONN_UP -> LDC_UP_EVT 4635373Sraghuram */ 4645373Sraghuram #define VSW_CONN_UP 0x1 /* Connection come up */ 4655373Sraghuram #define VSW_CONN_RESET 0x2 /* Connection reset */ 4665373Sraghuram #define VSW_CONN_RESTART 0x4 /* Restarting handshake on connection */ 4675373Sraghuram 4685373Sraghuram typedef struct vsw_conn_evt { 4695373Sraghuram uint16_t evt; /* Connection event */ 4705373Sraghuram vsw_ldc_t *ldcp; 4715373Sraghuram } vsw_conn_evt_t; 4725373Sraghuram 4735373Sraghuram /* 4745373Sraghuram * Ethernet broadcast address definition. 4755373Sraghuram */ 4765373Sraghuram static struct ether_addr etherbroadcastaddr = { 4775373Sraghuram 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 4785373Sraghuram }; 4795373Sraghuram 4805373Sraghuram #define IS_BROADCAST(ehp) \ 4818275SEric Cheng (bcmp(&ehp->ether_dhost, ðerbroadcastaddr, ETHERADDRL) == 0) 4825373Sraghuram #define IS_MULTICAST(ehp) \ 4835373Sraghuram ((ehp->ether_dhost.ether_addr_octet[0] & 01) == 1) 4845373Sraghuram 4855373Sraghuram #define READ_ENTER(x) rw_enter(x, RW_READER) 4865373Sraghuram #define WRITE_ENTER(x) rw_enter(x, RW_WRITER) 4875373Sraghuram #define RW_EXIT(x) rw_exit(x) 4885373Sraghuram 4895373Sraghuram #define VSW_PORT_REFHOLD(portp) atomic_inc_32(&((portp)->ref_cnt)) 4905373Sraghuram #define VSW_PORT_REFRELE(portp) atomic_dec_32(&((portp)->ref_cnt)) 4915373Sraghuram 4925373Sraghuram #ifdef __cplusplus 4935373Sraghuram } 4945373Sraghuram #endif 4955373Sraghuram 4965373Sraghuram #endif /* _VSW_LDC_H */ 497