xref: /qemu/hw/net/net_rx_pkt.h (revision aac8f89dba870bb263d05bb84c3d64e0204be092)
1e263cd49SDmitry Fleytman /*
2605d52e6SDmitry Fleytman  * QEMU RX packets abstraction
3e263cd49SDmitry Fleytman  *
4e263cd49SDmitry Fleytman  * Copyright (c) 2012 Ravello Systems LTD (http://ravellosystems.com)
5e263cd49SDmitry Fleytman  *
6e263cd49SDmitry Fleytman  * Developed by Daynix Computing LTD (http://www.daynix.com)
7e263cd49SDmitry Fleytman  *
8e263cd49SDmitry Fleytman  * Authors:
9e263cd49SDmitry Fleytman  * Dmitry Fleytman <dmitry@daynix.com>
10e263cd49SDmitry Fleytman  * Tamir Shomer <tamirs@daynix.com>
11e263cd49SDmitry Fleytman  * Yan Vugenfirer <yan@daynix.com>
12e263cd49SDmitry Fleytman  *
13e263cd49SDmitry Fleytman  * This work is licensed under the terms of the GNU GPL, version 2 or later.
14e263cd49SDmitry Fleytman  * See the COPYING file in the top-level directory.
15e263cd49SDmitry Fleytman  *
16e263cd49SDmitry Fleytman  */
17e263cd49SDmitry Fleytman 
18605d52e6SDmitry Fleytman #ifndef NET_RX_PKT_H
19605d52e6SDmitry Fleytman #define NET_RX_PKT_H
20e263cd49SDmitry Fleytman 
21e263cd49SDmitry Fleytman #include "net/eth.h"
22e263cd49SDmitry Fleytman 
23e263cd49SDmitry Fleytman /* defines to enable packet dump functions */
24605d52e6SDmitry Fleytman /*#define NET_RX_PKT_DEBUG*/
25e263cd49SDmitry Fleytman 
26605d52e6SDmitry Fleytman struct NetRxPkt;
27e263cd49SDmitry Fleytman 
28e263cd49SDmitry Fleytman /**
29e263cd49SDmitry Fleytman  * Clean all rx packet resources
30e263cd49SDmitry Fleytman  *
31e263cd49SDmitry Fleytman  * @pkt:            packet
32e263cd49SDmitry Fleytman  *
33e263cd49SDmitry Fleytman  */
34605d52e6SDmitry Fleytman void net_rx_pkt_uninit(struct NetRxPkt *pkt);
35e263cd49SDmitry Fleytman 
36e263cd49SDmitry Fleytman /**
37e263cd49SDmitry Fleytman  * Init function for rx packet functionality
38e263cd49SDmitry Fleytman  *
39e263cd49SDmitry Fleytman  * @pkt:            packet pointer
40e263cd49SDmitry Fleytman  *
41e263cd49SDmitry Fleytman  */
42*aac8f89dSAkihiko Odaki void net_rx_pkt_init(struct NetRxPkt **pkt);
43e263cd49SDmitry Fleytman 
44e263cd49SDmitry Fleytman /**
45e263cd49SDmitry Fleytman  * returns total length of data attached to rx context
46e263cd49SDmitry Fleytman  *
47e263cd49SDmitry Fleytman  * @pkt:            packet
48e263cd49SDmitry Fleytman  *
49e263cd49SDmitry Fleytman  * Return:  nothing
50e263cd49SDmitry Fleytman  *
51e263cd49SDmitry Fleytman  */
52605d52e6SDmitry Fleytman size_t net_rx_pkt_get_total_len(struct NetRxPkt *pkt);
53e263cd49SDmitry Fleytman 
54e263cd49SDmitry Fleytman /**
55fcf0cdc3SShmulik Ladkani  * parse and set packet analysis results
56fcf0cdc3SShmulik Ladkani  *
57fcf0cdc3SShmulik Ladkani  * @pkt:            packet
58fcf0cdc3SShmulik Ladkani  * @data:           pointer to the data buffer to be parsed
59fcf0cdc3SShmulik Ladkani  * @len:            data length
60fcf0cdc3SShmulik Ladkani  *
61fcf0cdc3SShmulik Ladkani  */
62605d52e6SDmitry Fleytman void net_rx_pkt_set_protocols(struct NetRxPkt *pkt, const void *data,
63fcf0cdc3SShmulik Ladkani                               size_t len);
64fcf0cdc3SShmulik Ladkani 
65fcf0cdc3SShmulik Ladkani /**
66e263cd49SDmitry Fleytman  * fetches packet analysis results
67e263cd49SDmitry Fleytman  *
68e263cd49SDmitry Fleytman  * @pkt:            packet
69e263cd49SDmitry Fleytman  * @isip4:          whether the packet given is IPv4
70e263cd49SDmitry Fleytman  * @isip6:          whether the packet given is IPv6
71e263cd49SDmitry Fleytman  * @isudp:          whether the packet given is UDP
72e263cd49SDmitry Fleytman  * @istcp:          whether the packet given is TCP
73e263cd49SDmitry Fleytman  *
74e263cd49SDmitry Fleytman  */
75605d52e6SDmitry Fleytman void net_rx_pkt_get_protocols(struct NetRxPkt *pkt,
76e263cd49SDmitry Fleytman                                  bool *isip4, bool *isip6,
77e263cd49SDmitry Fleytman                                  bool *isudp, bool *istcp);
78e263cd49SDmitry Fleytman 
79e263cd49SDmitry Fleytman /**
80eb700029SDmitry Fleytman * fetches L3 header offset
81eb700029SDmitry Fleytman *
82eb700029SDmitry Fleytman * @pkt:            packet
83eb700029SDmitry Fleytman *
84eb700029SDmitry Fleytman */
85eb700029SDmitry Fleytman size_t net_rx_pkt_get_l3_hdr_offset(struct NetRxPkt *pkt);
86eb700029SDmitry Fleytman 
87eb700029SDmitry Fleytman /**
88eb700029SDmitry Fleytman * fetches L4 header offset
89eb700029SDmitry Fleytman *
90eb700029SDmitry Fleytman * @pkt:            packet
91eb700029SDmitry Fleytman *
92eb700029SDmitry Fleytman */
93eb700029SDmitry Fleytman size_t net_rx_pkt_get_l4_hdr_offset(struct NetRxPkt *pkt);
94eb700029SDmitry Fleytman 
95eb700029SDmitry Fleytman /**
96eb700029SDmitry Fleytman * fetches L5 header offset
97eb700029SDmitry Fleytman *
98eb700029SDmitry Fleytman * @pkt:            packet
99eb700029SDmitry Fleytman *
100eb700029SDmitry Fleytman */
101eb700029SDmitry Fleytman size_t net_rx_pkt_get_l5_hdr_offset(struct NetRxPkt *pkt);
102eb700029SDmitry Fleytman 
103eb700029SDmitry Fleytman /**
104eb700029SDmitry Fleytman  * fetches IP6 header analysis results
105eb700029SDmitry Fleytman  *
106eb700029SDmitry Fleytman  * Return:  pointer to analysis results structure which is stored in internal
107eb700029SDmitry Fleytman  *          packet area.
108eb700029SDmitry Fleytman  *
109eb700029SDmitry Fleytman  */
110eb700029SDmitry Fleytman eth_ip6_hdr_info *net_rx_pkt_get_ip6_info(struct NetRxPkt *pkt);
111eb700029SDmitry Fleytman 
112eb700029SDmitry Fleytman /**
113eb700029SDmitry Fleytman  * fetches IP4 header analysis results
114eb700029SDmitry Fleytman  *
115eb700029SDmitry Fleytman  * Return:  pointer to analysis results structure which is stored in internal
116eb700029SDmitry Fleytman  *          packet area.
117eb700029SDmitry Fleytman  *
118eb700029SDmitry Fleytman  */
119eb700029SDmitry Fleytman eth_ip4_hdr_info *net_rx_pkt_get_ip4_info(struct NetRxPkt *pkt);
120eb700029SDmitry Fleytman 
121eb700029SDmitry Fleytman /**
122eb700029SDmitry Fleytman  * fetches L4 header analysis results
123eb700029SDmitry Fleytman  *
124eb700029SDmitry Fleytman  * Return:  pointer to analysis results structure which is stored in internal
125eb700029SDmitry Fleytman  *          packet area.
126eb700029SDmitry Fleytman  *
127eb700029SDmitry Fleytman  */
128eb700029SDmitry Fleytman eth_l4_hdr_info *net_rx_pkt_get_l4_info(struct NetRxPkt *pkt);
129eb700029SDmitry Fleytman 
130eb700029SDmitry Fleytman typedef enum {
131eb700029SDmitry Fleytman     NetPktRssIpV4,
132eb700029SDmitry Fleytman     NetPktRssIpV4Tcp,
133eb700029SDmitry Fleytman     NetPktRssIpV6Tcp,
134eb700029SDmitry Fleytman     NetPktRssIpV6,
13533bbc05eSYuri Benditovich     NetPktRssIpV6Ex,
13633bbc05eSYuri Benditovich     NetPktRssIpV6TcpEx,
13733bbc05eSYuri Benditovich     NetPktRssIpV4Udp,
13833bbc05eSYuri Benditovich     NetPktRssIpV6Udp,
13933bbc05eSYuri Benditovich     NetPktRssIpV6UdpEx,
140eb700029SDmitry Fleytman } NetRxPktRssType;
141eb700029SDmitry Fleytman 
142eb700029SDmitry Fleytman /**
143eb700029SDmitry Fleytman * calculates RSS hash for packet
144eb700029SDmitry Fleytman *
145eb700029SDmitry Fleytman * @pkt:            packet
146eb700029SDmitry Fleytman * @type:           RSS hash type
147eb700029SDmitry Fleytman *
148eb700029SDmitry Fleytman * Return:  Toeplitz RSS hash.
149eb700029SDmitry Fleytman *
150eb700029SDmitry Fleytman */
151eb700029SDmitry Fleytman uint32_t
152eb700029SDmitry Fleytman net_rx_pkt_calc_rss_hash(struct NetRxPkt *pkt,
153eb700029SDmitry Fleytman                          NetRxPktRssType type,
154eb700029SDmitry Fleytman                          uint8_t *key);
155eb700029SDmitry Fleytman 
156eb700029SDmitry Fleytman /**
157eb700029SDmitry Fleytman * fetches IP identification for the packet
158eb700029SDmitry Fleytman *
159eb700029SDmitry Fleytman * @pkt:            packet
160eb700029SDmitry Fleytman *
161eb700029SDmitry Fleytman */
162eb700029SDmitry Fleytman uint16_t net_rx_pkt_get_ip_id(struct NetRxPkt *pkt);
163eb700029SDmitry Fleytman 
164eb700029SDmitry Fleytman /**
165eb700029SDmitry Fleytman * check if given packet is a TCP ACK packet
166eb700029SDmitry Fleytman *
167eb700029SDmitry Fleytman * @pkt:            packet
168eb700029SDmitry Fleytman *
169eb700029SDmitry Fleytman */
170eb700029SDmitry Fleytman bool net_rx_pkt_is_tcp_ack(struct NetRxPkt *pkt);
171eb700029SDmitry Fleytman 
172eb700029SDmitry Fleytman /**
173eb700029SDmitry Fleytman * check if given packet contains TCP data
174eb700029SDmitry Fleytman *
175eb700029SDmitry Fleytman * @pkt:            packet
176eb700029SDmitry Fleytman *
177eb700029SDmitry Fleytman */
178eb700029SDmitry Fleytman bool net_rx_pkt_has_tcp_data(struct NetRxPkt *pkt);
179eb700029SDmitry Fleytman 
180eb700029SDmitry Fleytman /**
181e263cd49SDmitry Fleytman  * returns virtio header stored in rx context
182e263cd49SDmitry Fleytman  *
183e263cd49SDmitry Fleytman  * @pkt:            packet
184e263cd49SDmitry Fleytman  * @ret:            virtio header
185e263cd49SDmitry Fleytman  *
186e263cd49SDmitry Fleytman  */
187605d52e6SDmitry Fleytman struct virtio_net_hdr *net_rx_pkt_get_vhdr(struct NetRxPkt *pkt);
188e263cd49SDmitry Fleytman 
189e263cd49SDmitry Fleytman /**
190e263cd49SDmitry Fleytman  * returns packet type
191e263cd49SDmitry Fleytman  *
192e263cd49SDmitry Fleytman  * @pkt:            packet
193e263cd49SDmitry Fleytman  * @ret:            packet type
194e263cd49SDmitry Fleytman  *
195e263cd49SDmitry Fleytman  */
196605d52e6SDmitry Fleytman eth_pkt_types_e net_rx_pkt_get_packet_type(struct NetRxPkt *pkt);
197e263cd49SDmitry Fleytman 
198e263cd49SDmitry Fleytman /**
199e263cd49SDmitry Fleytman  * returns vlan tag
200e263cd49SDmitry Fleytman  *
201e263cd49SDmitry Fleytman  * @pkt:            packet
202e263cd49SDmitry Fleytman  * @ret:            VLAN tag
203e263cd49SDmitry Fleytman  *
204e263cd49SDmitry Fleytman  */
205605d52e6SDmitry Fleytman uint16_t net_rx_pkt_get_vlan_tag(struct NetRxPkt *pkt);
206e263cd49SDmitry Fleytman 
207e263cd49SDmitry Fleytman /**
208e263cd49SDmitry Fleytman  * tells whether vlan was stripped from the packet
209e263cd49SDmitry Fleytman  *
210e263cd49SDmitry Fleytman  * @pkt:            packet
211e263cd49SDmitry Fleytman  * @ret:            VLAN stripped sign
212e263cd49SDmitry Fleytman  *
213e263cd49SDmitry Fleytman  */
214605d52e6SDmitry Fleytman bool net_rx_pkt_is_vlan_stripped(struct NetRxPkt *pkt);
215e263cd49SDmitry Fleytman 
216e263cd49SDmitry Fleytman /**
217eb700029SDmitry Fleytman * attach scatter-gather data to rx packet
218eb700029SDmitry Fleytman *
219eb700029SDmitry Fleytman * @pkt:            packet
220eb700029SDmitry Fleytman * @iov:            received data scatter-gather list
221eb700029SDmitry Fleytman * @iovcnt          number of elements in iov
222eb700029SDmitry Fleytman * @iovoff          data start offset in the iov
223eb700029SDmitry Fleytman * @strip_vlan:     should the module strip vlan from data
224eb700029SDmitry Fleytman *
225eb700029SDmitry Fleytman */
226eb700029SDmitry Fleytman void net_rx_pkt_attach_iovec(struct NetRxPkt *pkt,
227eb700029SDmitry Fleytman                                 const struct iovec *iov,
228eb700029SDmitry Fleytman                                 int iovcnt, size_t iovoff,
229eb700029SDmitry Fleytman                                 bool strip_vlan);
230eb700029SDmitry Fleytman 
231eb700029SDmitry Fleytman /**
232eb700029SDmitry Fleytman * attach scatter-gather data to rx packet
233eb700029SDmitry Fleytman *
234eb700029SDmitry Fleytman * @pkt:            packet
235eb700029SDmitry Fleytman * @iov:            received data scatter-gather list
236eb700029SDmitry Fleytman * @iovcnt          number of elements in iov
237eb700029SDmitry Fleytman * @iovoff          data start offset in the iov
238eb700029SDmitry Fleytman * @strip_vlan:     should the module strip vlan from data
239eb700029SDmitry Fleytman * @vet:            VLAN tag Ethernet type
240eb700029SDmitry Fleytman *
241eb700029SDmitry Fleytman */
242eb700029SDmitry Fleytman void net_rx_pkt_attach_iovec_ex(struct NetRxPkt *pkt,
243eb700029SDmitry Fleytman                                    const struct iovec *iov, int iovcnt,
244eb700029SDmitry Fleytman                                    size_t iovoff, bool strip_vlan,
245eb700029SDmitry Fleytman                                    uint16_t vet);
246eb700029SDmitry Fleytman 
247eb700029SDmitry Fleytman /**
248e263cd49SDmitry Fleytman  * attach data to rx packet
249e263cd49SDmitry Fleytman  *
250e263cd49SDmitry Fleytman  * @pkt:            packet
251e263cd49SDmitry Fleytman  * @data:           pointer to the data buffer
252e263cd49SDmitry Fleytman  * @len:            data length
253e263cd49SDmitry Fleytman  * @strip_vlan:     should the module strip vlan from data
254e263cd49SDmitry Fleytman  *
255e263cd49SDmitry Fleytman  */
256eb700029SDmitry Fleytman static inline void
257eb700029SDmitry Fleytman net_rx_pkt_attach_data(struct NetRxPkt *pkt, const void *data,
258eb700029SDmitry Fleytman                           size_t len, bool strip_vlan)
259eb700029SDmitry Fleytman {
260eb700029SDmitry Fleytman     const struct iovec iov = {
261eb700029SDmitry Fleytman         .iov_base = (void *) data,
262eb700029SDmitry Fleytman         .iov_len = len
263eb700029SDmitry Fleytman     };
264eb700029SDmitry Fleytman 
265eb700029SDmitry Fleytman     net_rx_pkt_attach_iovec(pkt, &iov, 1, 0, strip_vlan);
266eb700029SDmitry Fleytman }
267e263cd49SDmitry Fleytman 
268e263cd49SDmitry Fleytman /**
269e263cd49SDmitry Fleytman  * returns io vector that holds the attached data
270e263cd49SDmitry Fleytman  *
271e263cd49SDmitry Fleytman  * @pkt:            packet
272e263cd49SDmitry Fleytman  * @ret:            pointer to IOVec
273e263cd49SDmitry Fleytman  *
274e263cd49SDmitry Fleytman  */
275605d52e6SDmitry Fleytman struct iovec *net_rx_pkt_get_iovec(struct NetRxPkt *pkt);
276e263cd49SDmitry Fleytman 
277e263cd49SDmitry Fleytman /**
278eb700029SDmitry Fleytman * returns io vector length that holds the attached data
279eb700029SDmitry Fleytman *
280eb700029SDmitry Fleytman * @pkt:            packet
281eb700029SDmitry Fleytman * @ret:            IOVec length
282eb700029SDmitry Fleytman *
283eb700029SDmitry Fleytman */
284eb700029SDmitry Fleytman uint16_t net_rx_pkt_get_iovec_len(struct NetRxPkt *pkt);
285eb700029SDmitry Fleytman 
286eb700029SDmitry Fleytman /**
287e263cd49SDmitry Fleytman  * prints rx packet data if debug is enabled
288e263cd49SDmitry Fleytman  *
289e263cd49SDmitry Fleytman  * @pkt:            packet
290e263cd49SDmitry Fleytman  *
291e263cd49SDmitry Fleytman  */
292605d52e6SDmitry Fleytman void net_rx_pkt_dump(struct NetRxPkt *pkt);
293e263cd49SDmitry Fleytman 
294e263cd49SDmitry Fleytman /**
295e263cd49SDmitry Fleytman  * copy passed vhdr data to packet context
296e263cd49SDmitry Fleytman  *
297e263cd49SDmitry Fleytman  * @pkt:            packet
298e263cd49SDmitry Fleytman  * @vhdr:           VHDR buffer
299e263cd49SDmitry Fleytman  *
300e263cd49SDmitry Fleytman  */
301605d52e6SDmitry Fleytman void net_rx_pkt_set_vhdr(struct NetRxPkt *pkt,
302e263cd49SDmitry Fleytman     struct virtio_net_hdr *vhdr);
303e263cd49SDmitry Fleytman 
304e263cd49SDmitry Fleytman /**
305eb700029SDmitry Fleytman * copy passed vhdr data to packet context
306eb700029SDmitry Fleytman *
307eb700029SDmitry Fleytman * @pkt:            packet
308eb700029SDmitry Fleytman * @iov:            VHDR iov
309eb700029SDmitry Fleytman * @iovcnt:         VHDR iov array size
310eb700029SDmitry Fleytman *
311eb700029SDmitry Fleytman */
312eb700029SDmitry Fleytman void net_rx_pkt_set_vhdr_iovec(struct NetRxPkt *pkt,
313eb700029SDmitry Fleytman     const struct iovec *iov, int iovcnt);
314eb700029SDmitry Fleytman 
315eb700029SDmitry Fleytman /**
316e263cd49SDmitry Fleytman  * save packet type in packet context
317e263cd49SDmitry Fleytman  *
318e263cd49SDmitry Fleytman  * @pkt:            packet
319e263cd49SDmitry Fleytman  * @packet_type:    the packet type
320e263cd49SDmitry Fleytman  *
321e263cd49SDmitry Fleytman  */
322605d52e6SDmitry Fleytman void net_rx_pkt_set_packet_type(struct NetRxPkt *pkt,
323e263cd49SDmitry Fleytman     eth_pkt_types_e packet_type);
324e263cd49SDmitry Fleytman 
325eb700029SDmitry Fleytman /**
326eb700029SDmitry Fleytman * validate TCP/UDP checksum of the packet
327eb700029SDmitry Fleytman *
328eb700029SDmitry Fleytman * @pkt:            packet
329eb700029SDmitry Fleytman * @csum_valid:     checksum validation result
330eb700029SDmitry Fleytman * @ret:            true if validation was performed, false in case packet is
331eb700029SDmitry Fleytman *                  not TCP/UDP or checksum validation is not possible
332eb700029SDmitry Fleytman *
333eb700029SDmitry Fleytman */
334eb700029SDmitry Fleytman bool net_rx_pkt_validate_l4_csum(struct NetRxPkt *pkt, bool *csum_valid);
335eb700029SDmitry Fleytman 
336eb700029SDmitry Fleytman /**
337eb700029SDmitry Fleytman * validate IPv4 checksum of the packet
338eb700029SDmitry Fleytman *
339eb700029SDmitry Fleytman * @pkt:            packet
340eb700029SDmitry Fleytman * @csum_valid:     checksum validation result
341eb700029SDmitry Fleytman * @ret:            true if validation was performed, false in case packet is
342eb700029SDmitry Fleytman *                  not TCP/UDP or checksum validation is not possible
343eb700029SDmitry Fleytman *
344eb700029SDmitry Fleytman */
345eb700029SDmitry Fleytman bool net_rx_pkt_validate_l3_csum(struct NetRxPkt *pkt, bool *csum_valid);
346eb700029SDmitry Fleytman 
347eb700029SDmitry Fleytman /**
348eb700029SDmitry Fleytman * fix IPv4 checksum of the packet
349eb700029SDmitry Fleytman *
350eb700029SDmitry Fleytman * @pkt:            packet
351eb700029SDmitry Fleytman * @ret:            true if checksum was fixed, false in case packet is
352eb700029SDmitry Fleytman *                  not TCP/UDP or checksum correction is not possible
353eb700029SDmitry Fleytman *
354eb700029SDmitry Fleytman */
355eb700029SDmitry Fleytman bool net_rx_pkt_fix_l4_csum(struct NetRxPkt *pkt);
356eb700029SDmitry Fleytman 
357e263cd49SDmitry Fleytman #endif
358