root / hw / net / vmxnet_tx_pkt.h @ 49ab747f
History | View | Annotate | Download (3.2 kB)
1 |
/*
|
---|---|
2 |
* QEMU VMWARE VMXNET* paravirtual NICs - TX packets abstraction
|
3 |
*
|
4 |
* Copyright (c) 2012 Ravello Systems LTD (http://ravellosystems.com)
|
5 |
*
|
6 |
* Developed by Daynix Computing LTD (http://www.daynix.com)
|
7 |
*
|
8 |
* Authors:
|
9 |
* Dmitry Fleytman <dmitry@daynix.com>
|
10 |
* Tamir Shomer <tamirs@daynix.com>
|
11 |
* Yan Vugenfirer <yan@daynix.com>
|
12 |
*
|
13 |
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
14 |
* See the COPYING file in the top-level directory.
|
15 |
*
|
16 |
*/
|
17 |
|
18 |
#ifndef VMXNET_TX_PKT_H
|
19 |
#define VMXNET_TX_PKT_H
|
20 |
|
21 |
#include "stdint.h" |
22 |
#include "stdbool.h" |
23 |
#include "net/eth.h" |
24 |
#include "exec/hwaddr.h" |
25 |
|
26 |
/* define to enable packet dump functions */
|
27 |
/*#define VMXNET_TX_PKT_DEBUG*/
|
28 |
|
29 |
struct VmxnetTxPkt;
|
30 |
|
31 |
/**
|
32 |
* Init function for tx packet functionality
|
33 |
*
|
34 |
* @pkt: packet pointer
|
35 |
* @max_frags: max tx ip fragments
|
36 |
* @has_virt_hdr: device uses virtio header.
|
37 |
*/
|
38 |
void vmxnet_tx_pkt_init(struct VmxnetTxPkt **pkt, uint32_t max_frags, |
39 |
bool has_virt_hdr);
|
40 |
|
41 |
/**
|
42 |
* Clean all tx packet resources.
|
43 |
*
|
44 |
* @pkt: packet.
|
45 |
*/
|
46 |
void vmxnet_tx_pkt_uninit(struct VmxnetTxPkt *pkt); |
47 |
|
48 |
/**
|
49 |
* get virtio header
|
50 |
*
|
51 |
* @pkt: packet
|
52 |
* @ret: virtio header
|
53 |
*/
|
54 |
struct virtio_net_hdr *vmxnet_tx_pkt_get_vhdr(struct VmxnetTxPkt *pkt); |
55 |
|
56 |
/**
|
57 |
* build virtio header (will be stored in module context)
|
58 |
*
|
59 |
* @pkt: packet
|
60 |
* @tso_enable: TSO enabled
|
61 |
* @csum_enable: CSO enabled
|
62 |
* @gso_size: MSS size for TSO
|
63 |
*
|
64 |
*/
|
65 |
void vmxnet_tx_pkt_build_vheader(struct VmxnetTxPkt *pkt, bool tso_enable, |
66 |
bool csum_enable, uint32_t gso_size);
|
67 |
|
68 |
/**
|
69 |
* updates vlan tag, and adds vlan header in case it is missing
|
70 |
*
|
71 |
* @pkt: packet
|
72 |
* @vlan: VLAN tag
|
73 |
*
|
74 |
*/
|
75 |
void vmxnet_tx_pkt_setup_vlan_header(struct VmxnetTxPkt *pkt, uint16_t vlan); |
76 |
|
77 |
/**
|
78 |
* populate data fragment into pkt context.
|
79 |
*
|
80 |
* @pkt: packet
|
81 |
* @pa: physical address of fragment
|
82 |
* @len: length of fragment
|
83 |
*
|
84 |
*/
|
85 |
bool vmxnet_tx_pkt_add_raw_fragment(struct VmxnetTxPkt *pkt, hwaddr pa, |
86 |
size_t len); |
87 |
|
88 |
/**
|
89 |
* fix ip header fields and calculate checksums needed.
|
90 |
*
|
91 |
* @pkt: packet
|
92 |
*
|
93 |
*/
|
94 |
void vmxnet_tx_pkt_update_ip_checksums(struct VmxnetTxPkt *pkt); |
95 |
|
96 |
/**
|
97 |
* get length of all populated data.
|
98 |
*
|
99 |
* @pkt: packet
|
100 |
* @ret: total data length
|
101 |
*
|
102 |
*/
|
103 |
size_t vmxnet_tx_pkt_get_total_len(struct VmxnetTxPkt *pkt);
|
104 |
|
105 |
/**
|
106 |
* get packet type
|
107 |
*
|
108 |
* @pkt: packet
|
109 |
* @ret: packet type
|
110 |
*
|
111 |
*/
|
112 |
eth_pkt_types_e vmxnet_tx_pkt_get_packet_type(struct VmxnetTxPkt *pkt);
|
113 |
|
114 |
/**
|
115 |
* prints packet data if debug is enabled
|
116 |
*
|
117 |
* @pkt: packet
|
118 |
*
|
119 |
*/
|
120 |
void vmxnet_tx_pkt_dump(struct VmxnetTxPkt *pkt); |
121 |
|
122 |
/**
|
123 |
* reset tx packet private context (needed to be called between packets)
|
124 |
*
|
125 |
* @pkt: packet
|
126 |
*
|
127 |
*/
|
128 |
void vmxnet_tx_pkt_reset(struct VmxnetTxPkt *pkt); |
129 |
|
130 |
/**
|
131 |
* Send packet to qemu. handles sw offloads if vhdr is not supported.
|
132 |
*
|
133 |
* @pkt: packet
|
134 |
* @nc: NetClientState
|
135 |
* @ret: operation result
|
136 |
*
|
137 |
*/
|
138 |
bool vmxnet_tx_pkt_send(struct VmxnetTxPkt *pkt, NetClientState *nc); |
139 |
|
140 |
/**
|
141 |
* parse raw packet data and analyze offload requirements.
|
142 |
*
|
143 |
* @pkt: packet
|
144 |
*
|
145 |
*/
|
146 |
bool vmxnet_tx_pkt_parse(struct VmxnetTxPkt *pkt); |
147 |
|
148 |
#endif
|