cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

net_tx_pkt.h (4743B)


      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/**
    191 * Fix IPv6 'plen' field.
    192 * If ipv6 payload length field is 0 - then there should be Hop-by-Hop
    193 * option for packets greater than 65,535.
    194 * For packets with a payload less than 65,535: fix 'plen' field.
    195 * For backends with vheader, we need just one packet with proper
    196 * payload size. For now, qemu drops every packet with size greater 64K
    197 * (see net_tx_pkt_send()) so, there is no reason to add jumbo option to ip6
    198 * hop-by-hop extension if it's missed
    199 *
    200 * @pkt            packet
    201 */
    202void net_tx_pkt_fix_ip6_payload_len(struct NetTxPkt *pkt);
    203
    204#endif