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