Statistics
| Branch: | Revision:

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