xref: /qemu/hw/net/net_rx_pkt.h (revision 605d52e62fc94ec28408890fc682d4bdd7d8a36c)
1e263cd49SDmitry Fleytman /*
2*605d52e6SDmitry 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 
18*605d52e6SDmitry Fleytman #ifndef NET_RX_PKT_H
19*605d52e6SDmitry Fleytman #define NET_RX_PKT_H
20e263cd49SDmitry Fleytman 
21e263cd49SDmitry Fleytman #include "net/eth.h"
22e263cd49SDmitry Fleytman 
23e263cd49SDmitry Fleytman /* defines to enable packet dump functions */
24*605d52e6SDmitry Fleytman /*#define NET_RX_PKT_DEBUG*/
25e263cd49SDmitry Fleytman 
26*605d52e6SDmitry Fleytman struct NetRxPkt;
27e263cd49SDmitry Fleytman 
28e263cd49SDmitry Fleytman /**
29e263cd49SDmitry Fleytman  * Clean all rx packet resources
30e263cd49SDmitry Fleytman  *
31e263cd49SDmitry Fleytman  * @pkt:            packet
32e263cd49SDmitry Fleytman  *
33e263cd49SDmitry Fleytman  */
34*605d52e6SDmitry 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  * @has_virt_hdr:   device uses virtio header
41e263cd49SDmitry Fleytman  *
42e263cd49SDmitry Fleytman  */
43*605d52e6SDmitry Fleytman void net_rx_pkt_init(struct NetRxPkt **pkt, bool has_virt_hdr);
44e263cd49SDmitry Fleytman 
45e263cd49SDmitry Fleytman /**
46e263cd49SDmitry Fleytman  * returns total length of data attached to rx context
47e263cd49SDmitry Fleytman  *
48e263cd49SDmitry Fleytman  * @pkt:            packet
49e263cd49SDmitry Fleytman  *
50e263cd49SDmitry Fleytman  * Return:  nothing
51e263cd49SDmitry Fleytman  *
52e263cd49SDmitry Fleytman  */
53*605d52e6SDmitry Fleytman size_t net_rx_pkt_get_total_len(struct NetRxPkt *pkt);
54e263cd49SDmitry Fleytman 
55e263cd49SDmitry Fleytman /**
56fcf0cdc3SShmulik Ladkani  * parse and set packet analysis results
57fcf0cdc3SShmulik Ladkani  *
58fcf0cdc3SShmulik Ladkani  * @pkt:            packet
59fcf0cdc3SShmulik Ladkani  * @data:           pointer to the data buffer to be parsed
60fcf0cdc3SShmulik Ladkani  * @len:            data length
61fcf0cdc3SShmulik Ladkani  *
62fcf0cdc3SShmulik Ladkani  */
63*605d52e6SDmitry Fleytman void net_rx_pkt_set_protocols(struct NetRxPkt *pkt, const void *data,
64fcf0cdc3SShmulik Ladkani                               size_t len);
65fcf0cdc3SShmulik Ladkani 
66fcf0cdc3SShmulik Ladkani /**
67e263cd49SDmitry Fleytman  * fetches packet analysis results
68e263cd49SDmitry Fleytman  *
69e263cd49SDmitry Fleytman  * @pkt:            packet
70e263cd49SDmitry Fleytman  * @isip4:          whether the packet given is IPv4
71e263cd49SDmitry Fleytman  * @isip6:          whether the packet given is IPv6
72e263cd49SDmitry Fleytman  * @isudp:          whether the packet given is UDP
73e263cd49SDmitry Fleytman  * @istcp:          whether the packet given is TCP
74e263cd49SDmitry Fleytman  *
75e263cd49SDmitry Fleytman  */
76*605d52e6SDmitry Fleytman void net_rx_pkt_get_protocols(struct NetRxPkt *pkt,
77e263cd49SDmitry Fleytman                                  bool *isip4, bool *isip6,
78e263cd49SDmitry Fleytman                                  bool *isudp, bool *istcp);
79e263cd49SDmitry Fleytman 
80e263cd49SDmitry Fleytman /**
81e263cd49SDmitry Fleytman  * returns virtio header stored in rx context
82e263cd49SDmitry Fleytman  *
83e263cd49SDmitry Fleytman  * @pkt:            packet
84e263cd49SDmitry Fleytman  * @ret:            virtio header
85e263cd49SDmitry Fleytman  *
86e263cd49SDmitry Fleytman  */
87*605d52e6SDmitry Fleytman struct virtio_net_hdr *net_rx_pkt_get_vhdr(struct NetRxPkt *pkt);
88e263cd49SDmitry Fleytman 
89e263cd49SDmitry Fleytman /**
90e263cd49SDmitry Fleytman  * returns packet type
91e263cd49SDmitry Fleytman  *
92e263cd49SDmitry Fleytman  * @pkt:            packet
93e263cd49SDmitry Fleytman  * @ret:            packet type
94e263cd49SDmitry Fleytman  *
95e263cd49SDmitry Fleytman  */
96*605d52e6SDmitry Fleytman eth_pkt_types_e net_rx_pkt_get_packet_type(struct NetRxPkt *pkt);
97e263cd49SDmitry Fleytman 
98e263cd49SDmitry Fleytman /**
99e263cd49SDmitry Fleytman  * returns vlan tag
100e263cd49SDmitry Fleytman  *
101e263cd49SDmitry Fleytman  * @pkt:            packet
102e263cd49SDmitry Fleytman  * @ret:            VLAN tag
103e263cd49SDmitry Fleytman  *
104e263cd49SDmitry Fleytman  */
105*605d52e6SDmitry Fleytman uint16_t net_rx_pkt_get_vlan_tag(struct NetRxPkt *pkt);
106e263cd49SDmitry Fleytman 
107e263cd49SDmitry Fleytman /**
108e263cd49SDmitry Fleytman  * tells whether vlan was stripped from the packet
109e263cd49SDmitry Fleytman  *
110e263cd49SDmitry Fleytman  * @pkt:            packet
111e263cd49SDmitry Fleytman  * @ret:            VLAN stripped sign
112e263cd49SDmitry Fleytman  *
113e263cd49SDmitry Fleytman  */
114*605d52e6SDmitry Fleytman bool net_rx_pkt_is_vlan_stripped(struct NetRxPkt *pkt);
115e263cd49SDmitry Fleytman 
116e263cd49SDmitry Fleytman /**
117e263cd49SDmitry Fleytman  * notifies caller if the packet has virtio header
118e263cd49SDmitry Fleytman  *
119e263cd49SDmitry Fleytman  * @pkt:            packet
120e263cd49SDmitry Fleytman  * @ret:            true if packet has virtio header, false otherwize
121e263cd49SDmitry Fleytman  *
122e263cd49SDmitry Fleytman  */
123*605d52e6SDmitry Fleytman bool net_rx_pkt_has_virt_hdr(struct NetRxPkt *pkt);
124e263cd49SDmitry Fleytman 
125e263cd49SDmitry Fleytman /**
126e263cd49SDmitry Fleytman  * attach data to rx packet
127e263cd49SDmitry Fleytman  *
128e263cd49SDmitry Fleytman  * @pkt:            packet
129e263cd49SDmitry Fleytman  * @data:           pointer to the data buffer
130e263cd49SDmitry Fleytman  * @len:            data length
131e263cd49SDmitry Fleytman  * @strip_vlan:     should the module strip vlan from data
132e263cd49SDmitry Fleytman  *
133e263cd49SDmitry Fleytman  */
134*605d52e6SDmitry Fleytman void net_rx_pkt_attach_data(struct NetRxPkt *pkt, const void *data,
135e263cd49SDmitry Fleytman     size_t len, bool strip_vlan);
136e263cd49SDmitry Fleytman 
137e263cd49SDmitry Fleytman /**
138e263cd49SDmitry Fleytman  * returns io vector that holds the attached data
139e263cd49SDmitry Fleytman  *
140e263cd49SDmitry Fleytman  * @pkt:            packet
141e263cd49SDmitry Fleytman  * @ret:            pointer to IOVec
142e263cd49SDmitry Fleytman  *
143e263cd49SDmitry Fleytman  */
144*605d52e6SDmitry Fleytman struct iovec *net_rx_pkt_get_iovec(struct NetRxPkt *pkt);
145e263cd49SDmitry Fleytman 
146e263cd49SDmitry Fleytman /**
147e263cd49SDmitry Fleytman  * prints rx packet data if debug is enabled
148e263cd49SDmitry Fleytman  *
149e263cd49SDmitry Fleytman  * @pkt:            packet
150e263cd49SDmitry Fleytman  *
151e263cd49SDmitry Fleytman  */
152*605d52e6SDmitry Fleytman void net_rx_pkt_dump(struct NetRxPkt *pkt);
153e263cd49SDmitry Fleytman 
154e263cd49SDmitry Fleytman /**
155e263cd49SDmitry Fleytman  * copy passed vhdr data to packet context
156e263cd49SDmitry Fleytman  *
157e263cd49SDmitry Fleytman  * @pkt:            packet
158e263cd49SDmitry Fleytman  * @vhdr:           VHDR buffer
159e263cd49SDmitry Fleytman  *
160e263cd49SDmitry Fleytman  */
161*605d52e6SDmitry Fleytman void net_rx_pkt_set_vhdr(struct NetRxPkt *pkt,
162e263cd49SDmitry Fleytman     struct virtio_net_hdr *vhdr);
163e263cd49SDmitry Fleytman 
164e263cd49SDmitry Fleytman /**
165e263cd49SDmitry Fleytman  * save packet type in packet context
166e263cd49SDmitry Fleytman  *
167e263cd49SDmitry Fleytman  * @pkt:            packet
168e263cd49SDmitry Fleytman  * @packet_type:    the packet type
169e263cd49SDmitry Fleytman  *
170e263cd49SDmitry Fleytman  */
171*605d52e6SDmitry Fleytman void net_rx_pkt_set_packet_type(struct NetRxPkt *pkt,
172e263cd49SDmitry Fleytman     eth_pkt_types_e packet_type);
173e263cd49SDmitry Fleytman 
174e263cd49SDmitry Fleytman #endif
175