qemu/hw/net/net_rx_pkt.h
<<
>>
Prefs
   1/*
   2 * QEMU RX 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_RX_PKT_H
  19#define NET_RX_PKT_H
  20
  21#include "net/eth.h"
  22
  23/* defines to enable packet dump functions */
  24/*#define NET_RX_PKT_DEBUG*/
  25
  26struct NetRxPkt;
  27
  28/**
  29 * Clean all rx packet resources
  30 *
  31 * @pkt:            packet
  32 *
  33 */
  34void net_rx_pkt_uninit(struct NetRxPkt *pkt);
  35
  36/**
  37 * Init function for rx packet functionality
  38 *
  39 * @pkt:            packet pointer
  40 * @has_virt_hdr:   device uses virtio header
  41 *
  42 */
  43void net_rx_pkt_init(struct NetRxPkt **pkt, bool has_virt_hdr);
  44
  45/**
  46 * returns total length of data attached to rx context
  47 *
  48 * @pkt:            packet
  49 *
  50 * Return:  nothing
  51 *
  52 */
  53size_t net_rx_pkt_get_total_len(struct NetRxPkt *pkt);
  54
  55/**
  56 * parse and set packet analysis results
  57 *
  58 * @pkt:            packet
  59 * @data:           pointer to the data buffer to be parsed
  60 * @len:            data length
  61 *
  62 */
  63void net_rx_pkt_set_protocols(struct NetRxPkt *pkt, const void *data,
  64                              size_t len);
  65
  66/**
  67 * fetches packet analysis results
  68 *
  69 * @pkt:            packet
  70 * @isip4:          whether the packet given is IPv4
  71 * @isip6:          whether the packet given is IPv6
  72 * @isudp:          whether the packet given is UDP
  73 * @istcp:          whether the packet given is TCP
  74 *
  75 */
  76void net_rx_pkt_get_protocols(struct NetRxPkt *pkt,
  77                                 bool *isip4, bool *isip6,
  78                                 bool *isudp, bool *istcp);
  79
  80/**
  81* fetches L3 header offset
  82*
  83* @pkt:            packet
  84*
  85*/
  86size_t net_rx_pkt_get_l3_hdr_offset(struct NetRxPkt *pkt);
  87
  88/**
  89* fetches L4 header offset
  90*
  91* @pkt:            packet
  92*
  93*/
  94size_t net_rx_pkt_get_l4_hdr_offset(struct NetRxPkt *pkt);
  95
  96/**
  97* fetches L5 header offset
  98*
  99* @pkt:            packet
 100*
 101*/
 102size_t net_rx_pkt_get_l5_hdr_offset(struct NetRxPkt *pkt);
 103
 104/**
 105 * fetches IP6 header analysis results
 106 *
 107 * Return:  pointer to analysis results structure which is stored in internal
 108 *          packet area.
 109 *
 110 */
 111eth_ip6_hdr_info *net_rx_pkt_get_ip6_info(struct NetRxPkt *pkt);
 112
 113/**
 114 * fetches IP4 header analysis results
 115 *
 116 * Return:  pointer to analysis results structure which is stored in internal
 117 *          packet area.
 118 *
 119 */
 120eth_ip4_hdr_info *net_rx_pkt_get_ip4_info(struct NetRxPkt *pkt);
 121
 122/**
 123 * fetches L4 header analysis results
 124 *
 125 * Return:  pointer to analysis results structure which is stored in internal
 126 *          packet area.
 127 *
 128 */
 129eth_l4_hdr_info *net_rx_pkt_get_l4_info(struct NetRxPkt *pkt);
 130
 131typedef enum {
 132    NetPktRssIpV4,
 133    NetPktRssIpV4Tcp,
 134    NetPktRssIpV6Tcp,
 135    NetPktRssIpV6,
 136    NetPktRssIpV6Ex,
 137    NetPktRssIpV6TcpEx,
 138    NetPktRssIpV4Udp,
 139    NetPktRssIpV6Udp,
 140    NetPktRssIpV6UdpEx,
 141} NetRxPktRssType;
 142
 143/**
 144* calculates RSS hash for packet
 145*
 146* @pkt:            packet
 147* @type:           RSS hash type
 148*
 149* Return:  Toeplitz RSS hash.
 150*
 151*/
 152uint32_t
 153net_rx_pkt_calc_rss_hash(struct NetRxPkt *pkt,
 154                         NetRxPktRssType type,
 155                         uint8_t *key);
 156
 157/**
 158* fetches IP identification for the packet
 159*
 160* @pkt:            packet
 161*
 162*/
 163uint16_t net_rx_pkt_get_ip_id(struct NetRxPkt *pkt);
 164
 165/**
 166* check if given packet is a TCP ACK packet
 167*
 168* @pkt:            packet
 169*
 170*/
 171bool net_rx_pkt_is_tcp_ack(struct NetRxPkt *pkt);
 172
 173/**
 174* check if given packet contains TCP data
 175*
 176* @pkt:            packet
 177*
 178*/
 179bool net_rx_pkt_has_tcp_data(struct NetRxPkt *pkt);
 180
 181/**
 182 * returns virtio header stored in rx context
 183 *
 184 * @pkt:            packet
 185 * @ret:            virtio header
 186 *
 187 */
 188struct virtio_net_hdr *net_rx_pkt_get_vhdr(struct NetRxPkt *pkt);
 189
 190/**
 191 * returns packet type
 192 *
 193 * @pkt:            packet
 194 * @ret:            packet type
 195 *
 196 */
 197eth_pkt_types_e net_rx_pkt_get_packet_type(struct NetRxPkt *pkt);
 198
 199/**
 200 * returns vlan tag
 201 *
 202 * @pkt:            packet
 203 * @ret:            VLAN tag
 204 *
 205 */
 206uint16_t net_rx_pkt_get_vlan_tag(struct NetRxPkt *pkt);
 207
 208/**
 209 * tells whether vlan was stripped from the packet
 210 *
 211 * @pkt:            packet
 212 * @ret:            VLAN stripped sign
 213 *
 214 */
 215bool net_rx_pkt_is_vlan_stripped(struct NetRxPkt *pkt);
 216
 217/**
 218 * notifies caller if the packet has virtio header
 219 *
 220 * @pkt:            packet
 221 * @ret:            true if packet has virtio header, false otherwize
 222 *
 223 */
 224bool net_rx_pkt_has_virt_hdr(struct NetRxPkt *pkt);
 225
 226/**
 227* attach scatter-gather data to rx packet
 228*
 229* @pkt:            packet
 230* @iov:            received data scatter-gather list
 231* @iovcnt          number of elements in iov
 232* @iovoff          data start offset in the iov
 233* @strip_vlan:     should the module strip vlan from data
 234*
 235*/
 236void net_rx_pkt_attach_iovec(struct NetRxPkt *pkt,
 237                                const struct iovec *iov,
 238                                int iovcnt, size_t iovoff,
 239                                bool strip_vlan);
 240
 241/**
 242* attach scatter-gather data to rx packet
 243*
 244* @pkt:            packet
 245* @iov:            received data scatter-gather list
 246* @iovcnt          number of elements in iov
 247* @iovoff          data start offset in the iov
 248* @strip_vlan:     should the module strip vlan from data
 249* @vet:            VLAN tag Ethernet type
 250*
 251*/
 252void net_rx_pkt_attach_iovec_ex(struct NetRxPkt *pkt,
 253                                   const struct iovec *iov, int iovcnt,
 254                                   size_t iovoff, bool strip_vlan,
 255                                   uint16_t vet);
 256
 257/**
 258 * attach data to rx packet
 259 *
 260 * @pkt:            packet
 261 * @data:           pointer to the data buffer
 262 * @len:            data length
 263 * @strip_vlan:     should the module strip vlan from data
 264 *
 265 */
 266static inline void
 267net_rx_pkt_attach_data(struct NetRxPkt *pkt, const void *data,
 268                          size_t len, bool strip_vlan)
 269{
 270    const struct iovec iov = {
 271        .iov_base = (void *) data,
 272        .iov_len = len
 273    };
 274
 275    net_rx_pkt_attach_iovec(pkt, &iov, 1, 0, strip_vlan);
 276}
 277
 278/**
 279 * returns io vector that holds the attached data
 280 *
 281 * @pkt:            packet
 282 * @ret:            pointer to IOVec
 283 *
 284 */
 285struct iovec *net_rx_pkt_get_iovec(struct NetRxPkt *pkt);
 286
 287/**
 288* returns io vector length that holds the attached data
 289*
 290* @pkt:            packet
 291* @ret:            IOVec length
 292*
 293*/
 294uint16_t net_rx_pkt_get_iovec_len(struct NetRxPkt *pkt);
 295
 296/**
 297 * prints rx packet data if debug is enabled
 298 *
 299 * @pkt:            packet
 300 *
 301 */
 302void net_rx_pkt_dump(struct NetRxPkt *pkt);
 303
 304/**
 305 * copy passed vhdr data to packet context
 306 *
 307 * @pkt:            packet
 308 * @vhdr:           VHDR buffer
 309 *
 310 */
 311void net_rx_pkt_set_vhdr(struct NetRxPkt *pkt,
 312    struct virtio_net_hdr *vhdr);
 313
 314/**
 315* copy passed vhdr data to packet context
 316*
 317* @pkt:            packet
 318* @iov:            VHDR iov
 319* @iovcnt:         VHDR iov array size
 320*
 321*/
 322void net_rx_pkt_set_vhdr_iovec(struct NetRxPkt *pkt,
 323    const struct iovec *iov, int iovcnt);
 324
 325/**
 326 * save packet type in packet context
 327 *
 328 * @pkt:            packet
 329 * @packet_type:    the packet type
 330 *
 331 */
 332void net_rx_pkt_set_packet_type(struct NetRxPkt *pkt,
 333    eth_pkt_types_e packet_type);
 334
 335/**
 336* validate TCP/UDP checksum of the packet
 337*
 338* @pkt:            packet
 339* @csum_valid:     checksum validation result
 340* @ret:            true if validation was performed, false in case packet is
 341*                  not TCP/UDP or checksum validation is not possible
 342*
 343*/
 344bool net_rx_pkt_validate_l4_csum(struct NetRxPkt *pkt, bool *csum_valid);
 345
 346/**
 347* validate IPv4 checksum of the packet
 348*
 349* @pkt:            packet
 350* @csum_valid:     checksum validation result
 351* @ret:            true if validation was performed, false in case packet is
 352*                  not TCP/UDP or checksum validation is not possible
 353*
 354*/
 355bool net_rx_pkt_validate_l3_csum(struct NetRxPkt *pkt, bool *csum_valid);
 356
 357/**
 358* fix IPv4 checksum of the packet
 359*
 360* @pkt:            packet
 361* @ret:            true if checksum was fixed, false in case packet is
 362*                  not TCP/UDP or checksum correction is not possible
 363*
 364*/
 365bool net_rx_pkt_fix_l4_csum(struct NetRxPkt *pkt);
 366
 367#endif
 368