qemu/hw/net/net_tx_pkt.h
<<
>>
Prefs
   1/*
   2 * QEMU 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 NET_TX_PKT_H
  19#define NET_TX_PKT_H
  20
  21#include "net/eth.h"
  22#include "exec/hwaddr.h"
  23
  24/* define to enable packet dump functions */
  25/*#define NET_TX_PKT_DEBUG*/
  26
  27struct NetTxPkt;
  28
  29/**
  30 * Init function for tx packet functionality
  31 *
  32 * @pkt:            packet pointer
  33 * @pci_dev:        PCI device processing this packet
  34 * @max_frags:      max tx ip fragments
  35 * @has_virt_hdr:   device uses virtio header.
  36 */
  37void net_tx_pkt_init(struct NetTxPkt **pkt, PCIDevice *pci_dev,
  38    uint32_t max_frags, bool has_virt_hdr);
  39
  40/**
  41 * Clean all tx packet resources.
  42 *
  43 * @pkt:            packet.
  44 */
  45void net_tx_pkt_uninit(struct NetTxPkt *pkt);
  46
  47/**
  48 * get virtio header
  49 *
  50 * @pkt:            packet
  51 * @ret:            virtio header
  52 */
  53struct virtio_net_hdr *net_tx_pkt_get_vhdr(struct NetTxPkt *pkt);
  54
  55/**
  56 * build virtio header (will be stored in module context)
  57 *
  58 * @pkt:            packet
  59 * @tso_enable:     TSO enabled
  60 * @csum_enable:    CSO enabled
  61 * @gso_size:       MSS size for TSO
  62 *
  63 */
  64void net_tx_pkt_build_vheader(struct NetTxPkt *pkt, bool tso_enable,
  65    bool csum_enable, uint32_t gso_size);
  66
  67/**
  68* updates vlan tag, and adds vlan header with custom ethernet type
  69* in case it is missing.
  70*
  71* @pkt:            packet
  72* @vlan:           VLAN tag
  73* @vlan_ethtype:   VLAN header Ethernet type
  74*
  75*/
  76void net_tx_pkt_setup_vlan_header_ex(struct NetTxPkt *pkt,
  77    uint16_t vlan, uint16_t vlan_ethtype);
  78
  79/**
  80* updates vlan tag, and adds vlan header in case it is missing
  81*
  82* @pkt:            packet
  83* @vlan:           VLAN tag
  84*
  85*/
  86static inline void
  87net_tx_pkt_setup_vlan_header(struct NetTxPkt *pkt, uint16_t vlan)
  88{
  89    net_tx_pkt_setup_vlan_header_ex(pkt, vlan, ETH_P_VLAN);
  90}
  91
  92/**
  93 * populate data fragment into pkt context.
  94 *
  95 * @pkt:            packet
  96 * @pa:             physical address of fragment
  97 * @len:            length of fragment
  98 *
  99 */
 100bool net_tx_pkt_add_raw_fragment(struct NetTxPkt *pkt, hwaddr pa,
 101    size_t len);
 102
 103/**
 104 * Fix ip header fields and calculate IP header and pseudo header checksums.
 105 *
 106 * @pkt:            packet
 107 *
 108 */
 109void net_tx_pkt_update_ip_checksums(struct NetTxPkt *pkt);
 110
 111/**
 112 * Calculate the IP header checksum.
 113 *
 114 * @pkt:            packet
 115 *
 116 */
 117void net_tx_pkt_update_ip_hdr_checksum(struct NetTxPkt *pkt);
 118
 119/**
 120 * get length of all populated data.
 121 *
 122 * @pkt:            packet
 123 * @ret:            total data length
 124 *
 125 */
 126size_t net_tx_pkt_get_total_len(struct NetTxPkt *pkt);
 127
 128/**
 129 * get packet type
 130 *
 131 * @pkt:            packet
 132 * @ret:            packet type
 133 *
 134 */
 135eth_pkt_types_e net_tx_pkt_get_packet_type(struct NetTxPkt *pkt);
 136
 137/**
 138 * prints packet data if debug is enabled
 139 *
 140 * @pkt:            packet
 141 *
 142 */
 143void net_tx_pkt_dump(struct NetTxPkt *pkt);
 144
 145/**
 146 * reset tx packet private context (needed to be called between packets)
 147 *
 148 * @pkt:            packet
 149 *
 150 */
 151void net_tx_pkt_reset(struct NetTxPkt *pkt);
 152
 153/**
 154 * Send packet to qemu. handles sw offloads if vhdr is not supported.
 155 *
 156 * @pkt:            packet
 157 * @nc:             NetClientState
 158 * @ret:            operation result
 159 *
 160 */
 161bool net_tx_pkt_send(struct NetTxPkt *pkt, NetClientState *nc);
 162
 163/**
 164* Redirect packet directly to receive path (emulate loopback phy).
 165* Handles sw offloads if vhdr is not supported.
 166*
 167* @pkt:            packet
 168* @nc:             NetClientState
 169* @ret:            operation result
 170*
 171*/
 172bool net_tx_pkt_send_loopback(struct NetTxPkt *pkt, NetClientState *nc);
 173
 174/**
 175 * parse raw packet data and analyze offload requirements.
 176 *
 177 * @pkt:            packet
 178 *
 179 */
 180bool net_tx_pkt_parse(struct NetTxPkt *pkt);
 181
 182/**
 183* indicates if there are data fragments held by this packet object.
 184*
 185* @pkt:            packet
 186*
 187*/
 188bool net_tx_pkt_has_fragments(struct NetTxPkt *pkt);
 189
 190#endif
 191