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