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 "net/eth.h" 22#include "exec/hwaddr.h" 23 24/* define to enable packet dump functions */ 25/*#define VMXNET_TX_PKT_DEBUG*/ 26 27struct VmxnetTxPkt; 28 29/** 30 * Init function for tx packet functionality 31 * 32 * @pkt: packet pointer 33 * @max_frags: max tx ip fragments 34 * @has_virt_hdr: device uses virtio header. 35 */ 36void vmxnet_tx_pkt_init(struct VmxnetTxPkt **pkt, uint32_t max_frags, 37 bool has_virt_hdr); 38 39/** 40 * Clean all tx packet resources. 41 * 42 * @pkt: packet. 43 */ 44void vmxnet_tx_pkt_uninit(struct VmxnetTxPkt *pkt); 45 46/** 47 * get virtio header 48 * 49 * @pkt: packet 50 * @ret: virtio header 51 */ 52struct virtio_net_hdr *vmxnet_tx_pkt_get_vhdr(struct VmxnetTxPkt *pkt); 53 54/** 55 * build virtio header (will be stored in module context) 56 * 57 * @pkt: packet 58 * @tso_enable: TSO enabled 59 * @csum_enable: CSO enabled 60 * @gso_size: MSS size for TSO 61 * 62 */ 63void vmxnet_tx_pkt_build_vheader(struct VmxnetTxPkt *pkt, bool tso_enable, 64 bool csum_enable, uint32_t gso_size); 65 66/** 67 * updates vlan tag, and adds vlan header in case it is missing 68 * 69 * @pkt: packet 70 * @vlan: VLAN tag 71 * 72 */ 73void vmxnet_tx_pkt_setup_vlan_header(struct VmxnetTxPkt *pkt, uint16_t vlan); 74 75/** 76 * populate data fragment into pkt context. 77 * 78 * @pkt: packet 79 * @pa: physical address of fragment 80 * @len: length of fragment 81 * 82 */ 83bool vmxnet_tx_pkt_add_raw_fragment(struct VmxnetTxPkt *pkt, hwaddr pa, 84 size_t len); 85 86/** 87 * fix ip header fields and calculate checksums needed. 88 * 89 * @pkt: packet 90 * 91 */ 92void vmxnet_tx_pkt_update_ip_checksums(struct VmxnetTxPkt *pkt); 93 94/** 95 * get length of all populated data. 96 * 97 * @pkt: packet 98 * @ret: total data length 99 * 100 */ 101size_t vmxnet_tx_pkt_get_total_len(struct VmxnetTxPkt *pkt); 102 103/** 104 * get packet type 105 * 106 * @pkt: packet 107 * @ret: packet type 108 * 109 */ 110eth_pkt_types_e vmxnet_tx_pkt_get_packet_type(struct VmxnetTxPkt *pkt); 111 112/** 113 * prints packet data if debug is enabled 114 * 115 * @pkt: packet 116 * 117 */ 118void vmxnet_tx_pkt_dump(struct VmxnetTxPkt *pkt); 119 120/** 121 * reset tx packet private context (needed to be called between packets) 122 * 123 * @pkt: packet 124 * 125 */ 126void vmxnet_tx_pkt_reset(struct VmxnetTxPkt *pkt); 127 128/** 129 * Send packet to qemu. handles sw offloads if vhdr is not supported. 130 * 131 * @pkt: packet 132 * @nc: NetClientState 133 * @ret: operation result 134 * 135 */ 136bool vmxnet_tx_pkt_send(struct VmxnetTxPkt *pkt, NetClientState *nc); 137 138/** 139 * parse raw packet data and analyze offload requirements. 140 * 141 * @pkt: packet 142 * 143 */ 144bool vmxnet_tx_pkt_parse(struct VmxnetTxPkt *pkt); 145 146#endif 147