diff options
Diffstat (limited to 'include/xen/interface/io/netif.h')
-rw-r--r-- | include/xen/interface/io/netif.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/include/xen/interface/io/netif.h b/include/xen/interface/io/netif.h new file mode 100644 index 000000000000..518481c95f18 --- /dev/null +++ b/include/xen/interface/io/netif.h | |||
@@ -0,0 +1,158 @@ | |||
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 "ring.h" | ||
13 | #include "../grant_table.h" | ||
14 | |||
15 | /* | ||
16 | * Notifications after enqueuing any type of message should be conditional on | ||
17 | * the appropriate req_event or rsp_event field in the shared ring. | ||
18 | * If the client sends notification for rx requests then it should specify | ||
19 | * feature 'feature-rx-notify' via xenbus. Otherwise the backend will assume | ||
20 | * that it cannot safely queue packets (as it may not be kicked to send them). | ||
21 | */ | ||
22 | |||
23 | /* | ||
24 | * This is the 'wire' format for packets: | ||
25 | * Request 1: netif_tx_request -- NETTXF_* (any flags) | ||
26 | * [Request 2: netif_tx_extra] (only if request 1 has NETTXF_extra_info) | ||
27 | * [Request 3: netif_tx_extra] (only if request 2 has XEN_NETIF_EXTRA_MORE) | ||
28 | * Request 4: netif_tx_request -- NETTXF_more_data | ||
29 | * Request 5: netif_tx_request -- NETTXF_more_data | ||
30 | * ... | ||
31 | * Request N: netif_tx_request -- 0 | ||
32 | */ | ||
33 | |||
34 | /* Protocol checksum field is blank in the packet (hardware offload)? */ | ||
35 | #define _NETTXF_csum_blank (0) | ||
36 | #define NETTXF_csum_blank (1U<<_NETTXF_csum_blank) | ||
37 | |||
38 | /* Packet data has been validated against protocol checksum. */ | ||
39 | #define _NETTXF_data_validated (1) | ||
40 | #define NETTXF_data_validated (1U<<_NETTXF_data_validated) | ||
41 | |||
42 | /* Packet continues in the next request descriptor. */ | ||
43 | #define _NETTXF_more_data (2) | ||
44 | #define NETTXF_more_data (1U<<_NETTXF_more_data) | ||
45 | |||
46 | /* Packet to be followed by extra descriptor(s). */ | ||
47 | #define _NETTXF_extra_info (3) | ||
48 | #define NETTXF_extra_info (1U<<_NETTXF_extra_info) | ||
49 | |||
50 | struct xen_netif_tx_request { | ||
51 | grant_ref_t gref; /* Reference to buffer page */ | ||
52 | uint16_t offset; /* Offset within buffer page */ | ||
53 | uint16_t flags; /* NETTXF_* */ | ||
54 | uint16_t id; /* Echoed in response message. */ | ||
55 | uint16_t size; /* Packet size in bytes. */ | ||
56 | }; | ||
57 | |||
58 | /* Types of netif_extra_info descriptors. */ | ||
59 | #define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */ | ||
60 | #define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */ | ||
61 | #define XEN_NETIF_EXTRA_TYPE_MAX (2) | ||
62 | |||
63 | /* netif_extra_info flags. */ | ||
64 | #define _XEN_NETIF_EXTRA_FLAG_MORE (0) | ||
65 | #define XEN_NETIF_EXTRA_FLAG_MORE (1U<<_XEN_NETIF_EXTRA_FLAG_MORE) | ||
66 | |||
67 | /* GSO types - only TCPv4 currently supported. */ | ||
68 | #define XEN_NETIF_GSO_TYPE_TCPV4 (1) | ||
69 | |||
70 | /* | ||
71 | * This structure needs to fit within both netif_tx_request and | ||
72 | * netif_rx_response for compatibility. | ||
73 | */ | ||
74 | struct xen_netif_extra_info { | ||
75 | uint8_t type; /* XEN_NETIF_EXTRA_TYPE_* */ | ||
76 | uint8_t flags; /* XEN_NETIF_EXTRA_FLAG_* */ | ||
77 | |||
78 | union { | ||
79 | struct { | ||
80 | /* | ||
81 | * Maximum payload size of each segment. For | ||
82 | * example, for TCP this is just the path MSS. | ||
83 | */ | ||
84 | uint16_t size; | ||
85 | |||
86 | /* | ||
87 | * GSO type. This determines the protocol of | ||
88 | * the packet and any extra features required | ||
89 | * to segment the packet properly. | ||
90 | */ | ||
91 | uint8_t type; /* XEN_NETIF_GSO_TYPE_* */ | ||
92 | |||
93 | /* Future expansion. */ | ||
94 | uint8_t pad; | ||
95 | |||
96 | /* | ||
97 | * GSO features. This specifies any extra GSO | ||
98 | * features required to process this packet, | ||
99 | * such as ECN support for TCPv4. | ||
100 | */ | ||
101 | uint16_t features; /* XEN_NETIF_GSO_FEAT_* */ | ||
102 | } gso; | ||
103 | |||
104 | uint16_t pad[3]; | ||
105 | } u; | ||
106 | }; | ||
107 | |||
108 | struct xen_netif_tx_response { | ||
109 | uint16_t id; | ||
110 | int16_t status; /* NETIF_RSP_* */ | ||
111 | }; | ||
112 | |||
113 | struct xen_netif_rx_request { | ||
114 | uint16_t id; /* Echoed in response message. */ | ||
115 | grant_ref_t gref; /* Reference to incoming granted frame */ | ||
116 | }; | ||
117 | |||
118 | /* Packet data has been validated against protocol checksum. */ | ||
119 | #define _NETRXF_data_validated (0) | ||
120 | #define NETRXF_data_validated (1U<<_NETRXF_data_validated) | ||
121 | |||
122 | /* Protocol checksum field is blank in the packet (hardware offload)? */ | ||
123 | #define _NETRXF_csum_blank (1) | ||
124 | #define NETRXF_csum_blank (1U<<_NETRXF_csum_blank) | ||
125 | |||
126 | /* Packet continues in the next request descriptor. */ | ||
127 | #define _NETRXF_more_data (2) | ||
128 | #define NETRXF_more_data (1U<<_NETRXF_more_data) | ||
129 | |||
130 | /* Packet to be followed by extra descriptor(s). */ | ||
131 | #define _NETRXF_extra_info (3) | ||
132 | #define NETRXF_extra_info (1U<<_NETRXF_extra_info) | ||
133 | |||
134 | struct xen_netif_rx_response { | ||
135 | uint16_t id; | ||
136 | uint16_t offset; /* Offset in page of start of received packet */ | ||
137 | uint16_t flags; /* NETRXF_* */ | ||
138 | int16_t status; /* -ve: BLKIF_RSP_* ; +ve: Rx'ed pkt size. */ | ||
139 | }; | ||
140 | |||
141 | /* | ||
142 | * Generate netif ring structures and types. | ||
143 | */ | ||
144 | |||
145 | DEFINE_RING_TYPES(xen_netif_tx, | ||
146 | struct xen_netif_tx_request, | ||
147 | struct xen_netif_tx_response); | ||
148 | DEFINE_RING_TYPES(xen_netif_rx, | ||
149 | struct xen_netif_rx_request, | ||
150 | struct xen_netif_rx_response); | ||
151 | |||
152 | #define NETIF_RSP_DROPPED -2 | ||
153 | #define NETIF_RSP_ERROR -1 | ||
154 | #define NETIF_RSP_OKAY 0 | ||
155 | /* No response: used for auxiliary requests (e.g., netif_tx_extra). */ | ||
156 | #define NETIF_RSP_NULL 1 | ||
157 | |||
158 | #endif | ||