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