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