linux/include/xen/interface/io/netif.h
<<
>>
Prefs
   1/******************************************************************************
   2 * netif.h
   3 *
   4 * Unified network-device I/O interface for Xen guest OSes.
   5 *
   6 * Copyright (c) 2003-2004, Keir Fraser
   7 */
   8
   9#ifndef __XEN_PUBLIC_IO_NETIF_H__
  10#define __XEN_PUBLIC_IO_NETIF_H__
  11
  12#include <xen/interface/io/ring.h>
  13#include <xen/interface/grant_table.h>
  14
  15/*
  16 * Older implementation of Xen network frontend / backend has an
  17 * implicit dependency on the MAX_SKB_FRAGS as the maximum number of
  18 * ring slots a skb can use. Netfront / netback may not work as
  19 * expected when frontend and backend have different MAX_SKB_FRAGS.
  20 *
  21 * A better approach is to add mechanism for netfront / netback to
  22 * negotiate this value. However we cannot fix all possible
  23 * frontends, so we need to define a value which states the minimum
  24 * slots backend must support.
  25 *
  26 * The minimum value derives from older Linux kernel's MAX_SKB_FRAGS
  27 * (18), which is proved to work with most frontends. Any new backend
  28 * which doesn't negotiate with frontend should expect frontend to
  29 * send a valid packet using slots up to this value.
  30 */
  31#define XEN_NETIF_NR_SLOTS_MIN 18
  32
  33/*
  34 * Notifications after enqueuing any type of message should be conditional on
  35 * the appropriate req_event or rsp_event field in the shared ring.
  36 * If the client sends notification for rx requests then it should specify
  37 * feature 'feature-rx-notify' via xenbus. Otherwise the backend will assume
  38 * that it cannot safely queue packets (as it may not be kicked to send them).
  39 */
  40
  41 /*
  42 * "feature-split-event-channels" is introduced to separate guest TX
  43 * and RX notificaion. Backend either doesn't support this feature or
  44 * advertise it via xenstore as 0 (disabled) or 1 (enabled).
  45 *
  46 * To make use of this feature, frontend should allocate two event
  47 * channels for TX and RX, advertise them to backend as
  48 * "event-channel-tx" and "event-channel-rx" respectively. If frontend
  49 * doesn't want to use this feature, it just writes "event-channel"
  50 * node as before.
  51 */
  52
  53/*
  54 * "feature-gso-tcpv4" and "feature-gso-tcpv6" advertise the capability to
  55 * handle large TCP packets (in IPv4 or IPv6 form respectively). Neither
  56 * frontends nor backends are assumed to be capable unless the flags are
  57 * present.
  58 */
  59
  60/*
  61 * This is the 'wire' format for packets:
  62 *  Request 1: xen_netif_tx_request  -- XEN_NETTXF_* (any flags)
  63 * [Request 2: xen_netif_extra_info]    (only if request 1 has XEN_NETTXF_extra_info)
  64 * [Request 3: xen_netif_extra_info]    (only if request 2 has XEN_NETIF_EXTRA_MORE)
  65 *  Request 4: xen_netif_tx_request  -- XEN_NETTXF_more_data
  66 *  Request 5: xen_netif_tx_request  -- XEN_NETTXF_more_data
  67 *  ...
  68 *  Request N: xen_netif_tx_request  -- 0
  69 */
  70
  71/* Protocol checksum field is blank in the packet (hardware offload)? */
  72#define _XEN_NETTXF_csum_blank          (0)
  73#define  XEN_NETTXF_csum_blank          (1U<<_XEN_NETTXF_csum_blank)
  74
  75/* Packet data has been validated against protocol checksum. */
  76#define _XEN_NETTXF_data_validated      (1)
  77#define  XEN_NETTXF_data_validated      (1U<<_XEN_NETTXF_data_validated)
  78
  79/* Packet continues in the next request descriptor. */
  80#define _XEN_NETTXF_more_data           (2)
  81#define  XEN_NETTXF_more_data           (1U<<_XEN_NETTXF_more_data)
  82
  83/* Packet to be followed by extra descriptor(s). */
  84#define _XEN_NETTXF_extra_info          (3)
  85#define  XEN_NETTXF_extra_info          (1U<<_XEN_NETTXF_extra_info)
  86
  87#define XEN_NETIF_MAX_TX_SIZE 0xFFFF
  88struct xen_netif_tx_request {
  89    grant_ref_t gref;      /* Reference to buffer page */
  90    uint16_t offset;       /* Offset within buffer page */
  91    uint16_t flags;        /* XEN_NETTXF_* */
  92    uint16_t id;           /* Echoed in response message. */
  93    uint16_t size;         /* Packet size in bytes.       */
  94};
  95
  96/* Types of xen_netif_extra_info descriptors. */
  97#define XEN_NETIF_EXTRA_TYPE_NONE       (0)  /* Never used - invalid */
  98#define XEN_NETIF_EXTRA_TYPE_GSO        (1)  /* u.gso */
  99#define XEN_NETIF_EXTRA_TYPE_MAX        (2)
 100
 101/* xen_netif_extra_info flags. */
 102#define _XEN_NETIF_EXTRA_FLAG_MORE      (0)
 103#define  XEN_NETIF_EXTRA_FLAG_MORE      (1U<<_XEN_NETIF_EXTRA_FLAG_MORE)
 104
 105/* GSO types */
 106#define XEN_NETIF_GSO_TYPE_TCPV4        (1)
 107#define XEN_NETIF_GSO_TYPE_TCPV6        (2)
 108
 109/*
 110 * This structure needs to fit within both netif_tx_request and
 111 * netif_rx_response for compatibility.
 112 */
 113struct xen_netif_extra_info {
 114        uint8_t type;  /* XEN_NETIF_EXTRA_TYPE_* */
 115        uint8_t flags; /* XEN_NETIF_EXTRA_FLAG_* */
 116
 117        union {
 118                struct {
 119                        /*
 120                         * Maximum payload size of each segment. For
 121                         * example, for TCP this is just the path MSS.
 122                         */
 123                        uint16_t size;
 124
 125                        /*
 126                         * GSO type. This determines the protocol of
 127                         * the packet and any extra features required
 128                         * to segment the packet properly.
 129                         */
 130                        uint8_t type; /* XEN_NETIF_GSO_TYPE_* */
 131
 132                        /* Future expansion. */
 133                        uint8_t pad;
 134
 135                        /*
 136                         * GSO features. This specifies any extra GSO
 137                         * features required to process this packet,
 138                         * such as ECN support for TCPv4.
 139                         */
 140                        uint16_t features; /* XEN_NETIF_GSO_FEAT_* */
 141                } gso;
 142
 143                uint16_t pad[3];
 144        } u;
 145};
 146
 147struct xen_netif_tx_response {
 148        uint16_t id;
 149        int16_t  status;       /* XEN_NETIF_RSP_* */
 150};
 151
 152struct xen_netif_rx_request {
 153        uint16_t    id;        /* Echoed in response message.        */
 154        grant_ref_t gref;      /* Reference to incoming granted frame */
 155};
 156
 157/* Packet data has been validated against protocol checksum. */
 158#define _XEN_NETRXF_data_validated      (0)
 159#define  XEN_NETRXF_data_validated      (1U<<_XEN_NETRXF_data_validated)
 160
 161/* Protocol checksum field is blank in the packet (hardware offload)? */
 162#define _XEN_NETRXF_csum_blank          (1)
 163#define  XEN_NETRXF_csum_blank          (1U<<_XEN_NETRXF_csum_blank)
 164
 165/* Packet continues in the next request descriptor. */
 166#define _XEN_NETRXF_more_data           (2)
 167#define  XEN_NETRXF_more_data           (1U<<_XEN_NETRXF_more_data)
 168
 169/* Packet to be followed by extra descriptor(s). */
 170#define _XEN_NETRXF_extra_info          (3)
 171#define  XEN_NETRXF_extra_info          (1U<<_XEN_NETRXF_extra_info)
 172
 173/* GSO Prefix descriptor. */
 174#define _XEN_NETRXF_gso_prefix          (4)
 175#define  XEN_NETRXF_gso_prefix          (1U<<_XEN_NETRXF_gso_prefix)
 176
 177struct xen_netif_rx_response {
 178    uint16_t id;
 179    uint16_t offset;       /* Offset in page of start of received packet  */
 180    uint16_t flags;        /* XEN_NETRXF_* */
 181    int16_t  status;       /* -ve: BLKIF_RSP_* ; +ve: Rx'ed pkt size. */
 182};
 183
 184/*
 185 * Generate netif ring structures and types.
 186 */
 187
 188DEFINE_RING_TYPES(xen_netif_tx,
 189                  struct xen_netif_tx_request,
 190                  struct xen_netif_tx_response);
 191DEFINE_RING_TYPES(xen_netif_rx,
 192                  struct xen_netif_rx_request,
 193                  struct xen_netif_rx_response);
 194
 195#define XEN_NETIF_RSP_DROPPED   -2
 196#define XEN_NETIF_RSP_ERROR     -1
 197#define XEN_NETIF_RSP_OKAY       0
 198/* No response: used for auxiliary requests (e.g., xen_netif_extra_info). */
 199#define XEN_NETIF_RSP_NULL       1
 200
 201#endif
 202