Home | History | Annotate | Download | only in io
      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  * xnb.h - definitions for Xen dom0 network driver
     27  */
     28 
     29 #ifndef _SYS_XNB_H
     30 #define	_SYS_XNB_H
     31 
     32 #include <sys/types.h>
     33 #include <sys/kstat.h>
     34 #include <sys/stream.h>
     35 #include <sys/ethernet.h>
     36 #include <sys/hypervisor.h>
     37 #include <xen/public/io/netif.h>
     38 
     39 #ifdef __cplusplus
     40 extern "C" {
     41 #endif
     42 
     43 #define	NET_TX_RING_SIZE  __RING_SIZE((netif_tx_sring_t *)0, PAGESIZE)
     44 #define	NET_RX_RING_SIZE  __RING_SIZE((netif_rx_sring_t *)0, PAGESIZE)
     45 
     46 #define	XNBMAXPKT	1500		/* MTU size */
     47 
     48 /* DEBUG flags */
     49 #define	XNBDDI		0x01
     50 #define	XNBTRACE	0x02
     51 #define	XNBSEND		0x04
     52 #define	XNBRECV		0x08
     53 #define	XNBINTR		0x10
     54 #define	XNBRING		0x20
     55 #define	XNBCKSUM	0x40
     56 
     57 #define	XNB_STATE_INIT	0x01
     58 #define	XNB_STATE_READY	0x02
     59 
     60 typedef struct xnb xnb_t;
     61 
     62 /*
     63  * The xnb module provides core inter-domain network protocol functionality.
     64  * It is connected to the rest of Solaris in two ways:
     65  * - as a GLDv3 driver (with xnbu),
     66  * - as a GLDv3 consumer (with xnbo).
     67  *
     68  * The different modes of operation are termed "flavours" and each
     69  * instance of an xnb based driver operates in one and only one mode.
     70  * The common xnb driver exports a set of functions to these drivers
     71  * (declarations at the foot of this file) and calls back into the
     72  * drivers via the xnb_flavour_t structure.
     73  */
     74 typedef struct xnb_flavour {
     75 	void		(*xf_from_peer)(xnb_t *, mblk_t *);
     76 	boolean_t	(*xf_peer_connected)(xnb_t *);
     77 	void		(*xf_peer_disconnected)(xnb_t *);
     78 	boolean_t	(*xf_hotplug_connected)(xnb_t *);
     79 	boolean_t	(*xf_start_connect)(xnb_t *);
     80 	mblk_t		*(*xf_cksum_from_peer)(xnb_t *, mblk_t *, uint16_t);
     81 	uint16_t	(*xf_cksum_to_peer)(xnb_t *, mblk_t *);
     82 	boolean_t	(*xf_mcast_add)(xnb_t *, ether_addr_t *);
     83 	boolean_t	(*xf_mcast_del)(xnb_t *, ether_addr_t *);
     84 } xnb_flavour_t;
     85 
     86 typedef struct xnb_txbuf {
     87 	frtn_t			xt_free_rtn;
     88 	xnb_t			*xt_xnbp;
     89 	struct xnb_txbuf	*xt_next;
     90 	RING_IDX		xt_id;
     91 	RING_IDX		xt_idx;
     92 	uint16_t		xt_status;
     93 
     94 	ddi_dma_handle_t	xt_dma_handle;
     95 	ddi_acc_handle_t	xt_acc_handle;
     96 	caddr_t			xt_buf;
     97 	size_t			xt_buflen;
     98 	mfn_t			xt_mfn;
     99 
    100 	mblk_t			*xt_mblk;
    101 
    102 	unsigned int		xt_flags;
    103 
    104 #define	XNB_TXBUF_INUSE	0x01
    105 
    106 } xnb_txbuf_t;
    107 
    108 /* Per network-interface-controller driver private structure */
    109 struct xnb {
    110 	/* most interesting stuff first to assist debugging */
    111 	dev_info_t		*xnb_devinfo;	/* System per-device info. */
    112 
    113 	xnb_flavour_t		*xnb_flavour;
    114 	void			*xnb_flavour_data;
    115 
    116 	boolean_t		xnb_irq;
    117 	unsigned char		xnb_mac_addr[ETHERADDRL];
    118 
    119 	uint64_t		xnb_stat_ipackets;
    120 	uint64_t		xnb_stat_opackets;
    121 	uint64_t		xnb_stat_rbytes;
    122 	uint64_t		xnb_stat_obytes;
    123 
    124 	uint64_t		xnb_stat_intr;
    125 	uint64_t		xnb_stat_rx_defer;
    126 
    127 	uint64_t		xnb_stat_rx_cksum_deferred;
    128 	uint64_t		xnb_stat_tx_cksum_no_need;
    129 
    130 	uint64_t		xnb_stat_rx_rsp_notok;
    131 
    132 	uint64_t		xnb_stat_tx_notify_sent;
    133 	uint64_t		xnb_stat_tx_notify_deferred;
    134 
    135 	uint64_t		xnb_stat_rx_notify_sent;
    136 	uint64_t		xnb_stat_rx_notify_deferred;
    137 
    138 	uint64_t		xnb_stat_tx_too_early;
    139 	uint64_t		xnb_stat_rx_too_early;
    140 	uint64_t		xnb_stat_rx_allocb_failed;
    141 	uint64_t		xnb_stat_tx_allocb_failed;
    142 	uint64_t		xnb_stat_rx_foreign_page;
    143 	uint64_t		xnb_stat_mac_full;
    144 	uint64_t		xnb_stat_spurious_intr;
    145 	uint64_t		xnb_stat_allocation_success;
    146 	uint64_t		xnb_stat_allocation_failure;
    147 	uint64_t		xnb_stat_small_allocation_success;
    148 	uint64_t		xnb_stat_small_allocation_failure;
    149 	uint64_t		xnb_stat_other_allocation_failure;
    150 
    151 	uint64_t		xnb_stat_rx_pagebndry_crossed;
    152 	uint64_t		xnb_stat_rx_cpoparea_grown;
    153 
    154 	uint64_t		xnb_stat_csum_hardware;
    155 	uint64_t		xnb_stat_csum_software;
    156 
    157 	kstat_t			*xnb_kstat_aux;
    158 
    159 	ddi_iblock_cookie_t	xnb_icookie;
    160 
    161 	kmutex_t		xnb_rx_lock;
    162 	kmutex_t		xnb_tx_lock;
    163 	kmutex_t		xnb_state_lock;
    164 
    165 	int			xnb_be_status;
    166 	int			xnb_fe_status;
    167 
    168 	kmem_cache_t		*xnb_tx_buf_cache;
    169 	uint32_t		xnb_tx_buf_count;
    170 	int			xnb_tx_buf_outstanding;
    171 
    172 	netif_rx_back_ring_t	xnb_rx_ring;	/* rx interface struct ptr */
    173 	void			*xnb_rx_ring_addr;
    174 	grant_ref_t		xnb_rx_ring_ref;
    175 	grant_handle_t		xnb_rx_ring_handle;
    176 
    177 	netif_tx_back_ring_t	xnb_tx_ring;	/* tx interface struct ptr */
    178 	void			*xnb_tx_ring_addr;
    179 	grant_ref_t		xnb_tx_ring_ref;
    180 	grant_handle_t		xnb_tx_ring_handle;
    181 
    182 	boolean_t		xnb_connected;
    183 	boolean_t		xnb_hotplugged;
    184 	boolean_t		xnb_detachable;
    185 	int			xnb_evtchn;	/* channel to front end */
    186 	evtchn_port_t		xnb_fe_evtchn;
    187 	domid_t			xnb_peer;
    188 
    189 	xnb_txbuf_t		*xnb_tx_bufp[NET_TX_RING_SIZE];
    190 	gnttab_copy_t		xnb_tx_cop[NET_TX_RING_SIZE];
    191 
    192 	caddr_t			xnb_rx_va;
    193 	gnttab_transfer_t	xnb_rx_top[NET_RX_RING_SIZE];
    194 
    195 	boolean_t		xnb_rx_hv_copy;
    196 	boolean_t		xnb_multicast_control;
    197 	boolean_t		xnb_no_csum_offload;
    198 
    199 	gnttab_copy_t		*xnb_rx_cpop;
    200 #define	CPOP_DEFCNT 	8
    201 	size_t			xnb_rx_cpop_count; 	/* in elements */
    202 };
    203 
    204 extern int xnb_attach(dev_info_t *, xnb_flavour_t *, void *);
    205 extern void xnb_detach(dev_info_t *);
    206 extern mblk_t *xnb_copy_to_peer(xnb_t *, mblk_t *);
    207 extern mblk_t *xnb_process_cksum_flags(xnb_t *, mblk_t *, uint32_t);
    208 
    209 #ifdef __cplusplus
    210 }
    211 #endif
    212 
    213 #endif	/* _SYS_XNB_H */
    214