1181624Skmacy/****************************************************************************** 2181624Skmacy * netif.h 3181624Skmacy * 4181624Skmacy * Unified network-device I/O interface for Xen guest OSes. 5181624Skmacy * 6181624Skmacy * Permission is hereby granted, free of charge, to any person obtaining a copy 7181624Skmacy * of this software and associated documentation files (the "Software"), to 8181624Skmacy * deal in the Software without restriction, including without limitation the 9181624Skmacy * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10181624Skmacy * sell copies of the Software, and to permit persons to whom the Software is 11181624Skmacy * furnished to do so, subject to the following conditions: 12181624Skmacy * 13181624Skmacy * The above copyright notice and this permission notice shall be included in 14181624Skmacy * all copies or substantial portions of the Software. 15181624Skmacy * 16181624Skmacy * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17181624Skmacy * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18181624Skmacy * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19181624Skmacy * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20181624Skmacy * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21181624Skmacy * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22181624Skmacy * DEALINGS IN THE SOFTWARE. 23181624Skmacy * 24181624Skmacy * Copyright (c) 2003-2004, Keir Fraser 25181624Skmacy */ 26181624Skmacy 27181624Skmacy#ifndef __XEN_PUBLIC_IO_NETIF_H__ 28181624Skmacy#define __XEN_PUBLIC_IO_NETIF_H__ 29181624Skmacy 30181624Skmacy#include "ring.h" 31181624Skmacy#include "../grant_table.h" 32181624Skmacy 33181624Skmacy/* 34181624Skmacy * Notifications after enqueuing any type of message should be conditional on 35181624Skmacy * the appropriate req_event or rsp_event field in the shared ring. 36181624Skmacy * If the client sends notification for rx requests then it should specify 37181624Skmacy * feature 'feature-rx-notify' via xenbus. Otherwise the backend will assume 38181624Skmacy * that it cannot safely queue packets (as it may not be kicked to send them). 39181624Skmacy */ 40181624Skmacy 41181624Skmacy/* 42181624Skmacy * This is the 'wire' format for packets: 43181624Skmacy * Request 1: netif_tx_request -- NETTXF_* (any flags) 44251767Sgibbs * [Request 2: netif_tx_extra] (only if request 1 has NETTXF_extra_info) 45230587Sken * [Request 3: netif_tx_extra] (only if request 2 has XEN_NETIF_EXTRA_FLAG_MORE) 46181624Skmacy * Request 4: netif_tx_request -- NETTXF_more_data 47181624Skmacy * Request 5: netif_tx_request -- NETTXF_more_data 48181624Skmacy * ... 49181624Skmacy * Request N: netif_tx_request -- 0 50181624Skmacy */ 51181624Skmacy 52181624Skmacy/* Protocol checksum field is blank in the packet (hardware offload)? */ 53181624Skmacy#define _NETTXF_csum_blank (0) 54181624Skmacy#define NETTXF_csum_blank (1U<<_NETTXF_csum_blank) 55181624Skmacy 56181624Skmacy/* Packet data has been validated against protocol checksum. */ 57181624Skmacy#define _NETTXF_data_validated (1) 58181624Skmacy#define NETTXF_data_validated (1U<<_NETTXF_data_validated) 59181624Skmacy 60181624Skmacy/* Packet continues in the next request descriptor. */ 61181624Skmacy#define _NETTXF_more_data (2) 62181624Skmacy#define NETTXF_more_data (1U<<_NETTXF_more_data) 63181624Skmacy 64181624Skmacy/* Packet to be followed by extra descriptor(s). */ 65181624Skmacy#define _NETTXF_extra_info (3) 66181624Skmacy#define NETTXF_extra_info (1U<<_NETTXF_extra_info) 67181624Skmacy 68181624Skmacystruct netif_tx_request { 69181624Skmacy grant_ref_t gref; /* Reference to buffer page */ 70181624Skmacy uint16_t offset; /* Offset within buffer page */ 71181624Skmacy uint16_t flags; /* NETTXF_* */ 72181624Skmacy uint16_t id; /* Echoed in response message. */ 73230587Sken uint16_t size; /* For the first request in a packet, the packet 74230587Sken size in bytes. For subsequent requests, the 75230587Sken size of that request's associated data in bytes*/ 76181624Skmacy}; 77181624Skmacytypedef struct netif_tx_request netif_tx_request_t; 78181624Skmacy 79181624Skmacy/* Types of netif_extra_info descriptors. */ 80183375Skmacy#define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */ 81183375Skmacy#define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */ 82183375Skmacy#define XEN_NETIF_EXTRA_TYPE_MCAST_ADD (2) /* u.mcast */ 83183375Skmacy#define XEN_NETIF_EXTRA_TYPE_MCAST_DEL (3) /* u.mcast */ 84183375Skmacy#define XEN_NETIF_EXTRA_TYPE_MAX (4) 85181624Skmacy 86181624Skmacy/* netif_extra_info flags. */ 87181624Skmacy#define _XEN_NETIF_EXTRA_FLAG_MORE (0) 88181624Skmacy#define XEN_NETIF_EXTRA_FLAG_MORE (1U<<_XEN_NETIF_EXTRA_FLAG_MORE) 89181624Skmacy 90181624Skmacy/* GSO types - only TCPv4 currently supported. */ 91181624Skmacy#define XEN_NETIF_GSO_TYPE_TCPV4 (1) 92181624Skmacy 93181624Skmacy/* 94181624Skmacy * This structure needs to fit within both netif_tx_request and 95181624Skmacy * netif_rx_response for compatibility. 96181624Skmacy */ 97181624Skmacystruct netif_extra_info { 98181624Skmacy uint8_t type; /* XEN_NETIF_EXTRA_TYPE_* */ 99181624Skmacy uint8_t flags; /* XEN_NETIF_EXTRA_FLAG_* */ 100181624Skmacy 101181624Skmacy union { 102183375Skmacy /* 103183375Skmacy * XEN_NETIF_EXTRA_TYPE_GSO: 104183375Skmacy */ 105181624Skmacy struct { 106181624Skmacy /* 107181624Skmacy * Maximum payload size of each segment. For example, for TCP this 108181624Skmacy * is just the path MSS. 109181624Skmacy */ 110181624Skmacy uint16_t size; 111181624Skmacy 112181624Skmacy /* 113181624Skmacy * GSO type. This determines the protocol of the packet and any 114181624Skmacy * extra features required to segment the packet properly. 115181624Skmacy */ 116181624Skmacy uint8_t type; /* XEN_NETIF_GSO_TYPE_* */ 117181624Skmacy 118181624Skmacy /* Future expansion. */ 119181624Skmacy uint8_t pad; 120181624Skmacy 121181624Skmacy /* 122181624Skmacy * GSO features. This specifies any extra GSO features required 123181624Skmacy * to process this packet, such as ECN support for TCPv4. 124181624Skmacy */ 125181624Skmacy uint16_t features; /* XEN_NETIF_GSO_FEAT_* */ 126181624Skmacy } gso; 127181624Skmacy 128183375Skmacy /* 129183375Skmacy * XEN_NETIF_EXTRA_TYPE_MCAST_{ADD,DEL}: 130183375Skmacy * Backend advertises availability via 'feature-multicast-control' 131183375Skmacy * xenbus node containing value '1'. 132183375Skmacy * Frontend requests this feature by advertising 133183375Skmacy * 'request-multicast-control' xenbus node containing value '1'. 134183375Skmacy * If multicast control is requested then multicast flooding is 135183375Skmacy * disabled and the frontend must explicitly register its interest 136183375Skmacy * in multicast groups using dummy transmit requests containing 137183375Skmacy * MCAST_{ADD,DEL} extra-info fragments. 138183375Skmacy */ 139183375Skmacy struct { 140183375Skmacy uint8_t addr[6]; /* Address to add/remove. */ 141183375Skmacy } mcast; 142183375Skmacy 143181624Skmacy uint16_t pad[3]; 144181624Skmacy } u; 145181624Skmacy}; 146183375Skmacytypedef struct netif_extra_info netif_extra_info_t; 147181624Skmacy 148181624Skmacystruct netif_tx_response { 149181624Skmacy uint16_t id; 150181624Skmacy int16_t status; /* NETIF_RSP_* */ 151181624Skmacy}; 152181624Skmacytypedef struct netif_tx_response netif_tx_response_t; 153181624Skmacy 154181624Skmacystruct netif_rx_request { 155181624Skmacy uint16_t id; /* Echoed in response message. */ 156181624Skmacy grant_ref_t gref; /* Reference to incoming granted frame */ 157181624Skmacy}; 158181624Skmacytypedef struct netif_rx_request netif_rx_request_t; 159181624Skmacy 160181624Skmacy/* Packet data has been validated against protocol checksum. */ 161181624Skmacy#define _NETRXF_data_validated (0) 162181624Skmacy#define NETRXF_data_validated (1U<<_NETRXF_data_validated) 163181624Skmacy 164181624Skmacy/* Protocol checksum field is blank in the packet (hardware offload)? */ 165181624Skmacy#define _NETRXF_csum_blank (1) 166181624Skmacy#define NETRXF_csum_blank (1U<<_NETRXF_csum_blank) 167181624Skmacy 168181624Skmacy/* Packet continues in the next request descriptor. */ 169181624Skmacy#define _NETRXF_more_data (2) 170181624Skmacy#define NETRXF_more_data (1U<<_NETRXF_more_data) 171181624Skmacy 172181624Skmacy/* Packet to be followed by extra descriptor(s). */ 173181624Skmacy#define _NETRXF_extra_info (3) 174181624Skmacy#define NETRXF_extra_info (1U<<_NETRXF_extra_info) 175181624Skmacy 176230879Sken/* GSO Prefix descriptor. */ 177230879Sken#define _NETRXF_gso_prefix (4) 178230879Sken#define NETRXF_gso_prefix (1U<<_NETRXF_gso_prefix) 179230879Sken 180181624Skmacystruct netif_rx_response { 181181624Skmacy uint16_t id; 182181624Skmacy uint16_t offset; /* Offset in page of start of received packet */ 183181624Skmacy uint16_t flags; /* NETRXF_* */ 184230587Sken int16_t status; /* -ve: NETIF_RSP_* ; +ve: Rx'ed response size. */ 185181624Skmacy}; 186181624Skmacytypedef struct netif_rx_response netif_rx_response_t; 187181624Skmacy 188181624Skmacy/* 189181624Skmacy * Generate netif ring structures and types. 190181624Skmacy */ 191181624Skmacy 192181624SkmacyDEFINE_RING_TYPES(netif_tx, struct netif_tx_request, struct netif_tx_response); 193181624SkmacyDEFINE_RING_TYPES(netif_rx, struct netif_rx_request, struct netif_rx_response); 194181624Skmacy 195181624Skmacy#define NETIF_RSP_DROPPED -2 196181624Skmacy#define NETIF_RSP_ERROR -1 197181624Skmacy#define NETIF_RSP_OKAY 0 198181624Skmacy/* No response: used for auxiliary requests (e.g., netif_tx_extra). */ 199181624Skmacy#define NETIF_RSP_NULL 1 200181624Skmacy 201181624Skmacy#endif 202181624Skmacy 203181624Skmacy/* 204181624Skmacy * Local variables: 205181624Skmacy * mode: C 206181624Skmacy * c-set-style: "BSD" 207181624Skmacy * c-basic-offset: 4 208181624Skmacy * tab-width: 4 209181624Skmacy * indent-tabs-mode: nil 210181624Skmacy * End: 211181624Skmacy */ 212