1 /* 2 * QEMU VMWARE VMXNET* paravirtual NICs - 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 VMXNET_RX_PKT_H 19 #define VMXNET_RX_PKT_H 20 21 #include "stdint.h" 22 #include "stdbool.h" 23 #include "net/eth.h" 24 25 /* defines to enable packet dump functions */ 26 /*#define VMXNET_RX_PKT_DEBUG*/ 27 28 struct VmxnetRxPkt; 29 30 /** 31 * Clean all rx packet resources 32 * 33 * @pkt: packet 34 * 35 */ 36 void vmxnet_rx_pkt_uninit(struct VmxnetRxPkt *pkt); 37 38 /** 39 * Init function for rx packet functionality 40 * 41 * @pkt: packet pointer 42 * @has_virt_hdr: device uses virtio header 43 * 44 */ 45 void vmxnet_rx_pkt_init(struct VmxnetRxPkt **pkt, bool has_virt_hdr); 46 47 /** 48 * returns total length of data attached to rx context 49 * 50 * @pkt: packet 51 * 52 * Return: nothing 53 * 54 */ 55 size_t vmxnet_rx_pkt_get_total_len(struct VmxnetRxPkt *pkt); 56 57 /** 58 * fetches packet analysis results 59 * 60 * @pkt: packet 61 * @isip4: whether the packet given is IPv4 62 * @isip6: whether the packet given is IPv6 63 * @isudp: whether the packet given is UDP 64 * @istcp: whether the packet given is TCP 65 * 66 */ 67 void vmxnet_rx_pkt_get_protocols(struct VmxnetRxPkt *pkt, 68 bool *isip4, bool *isip6, 69 bool *isudp, bool *istcp); 70 71 /** 72 * returns virtio header stored in rx context 73 * 74 * @pkt: packet 75 * @ret: virtio header 76 * 77 */ 78 struct virtio_net_hdr *vmxnet_rx_pkt_get_vhdr(struct VmxnetRxPkt *pkt); 79 80 /** 81 * returns packet type 82 * 83 * @pkt: packet 84 * @ret: packet type 85 * 86 */ 87 eth_pkt_types_e vmxnet_rx_pkt_get_packet_type(struct VmxnetRxPkt *pkt); 88 89 /** 90 * returns vlan tag 91 * 92 * @pkt: packet 93 * @ret: VLAN tag 94 * 95 */ 96 uint16_t vmxnet_rx_pkt_get_vlan_tag(struct VmxnetRxPkt *pkt); 97 98 /** 99 * tells whether vlan was stripped from the packet 100 * 101 * @pkt: packet 102 * @ret: VLAN stripped sign 103 * 104 */ 105 bool vmxnet_rx_pkt_is_vlan_stripped(struct VmxnetRxPkt *pkt); 106 107 /** 108 * notifies caller if the packet has virtio header 109 * 110 * @pkt: packet 111 * @ret: true if packet has virtio header, false otherwize 112 * 113 */ 114 bool vmxnet_rx_pkt_has_virt_hdr(struct VmxnetRxPkt *pkt); 115 116 /** 117 * attach data to rx packet 118 * 119 * @pkt: packet 120 * @data: pointer to the data buffer 121 * @len: data length 122 * @strip_vlan: should the module strip vlan from data 123 * 124 */ 125 void vmxnet_rx_pkt_attach_data(struct VmxnetRxPkt *pkt, const void *data, 126 size_t len, bool strip_vlan); 127 128 /** 129 * returns io vector that holds the attached data 130 * 131 * @pkt: packet 132 * @ret: pointer to IOVec 133 * 134 */ 135 struct iovec *vmxnet_rx_pkt_get_iovec(struct VmxnetRxPkt *pkt); 136 137 /** 138 * prints rx packet data if debug is enabled 139 * 140 * @pkt: packet 141 * 142 */ 143 void vmxnet_rx_pkt_dump(struct VmxnetRxPkt *pkt); 144 145 /** 146 * copy passed vhdr data to packet context 147 * 148 * @pkt: packet 149 * @vhdr: VHDR buffer 150 * 151 */ 152 void vmxnet_rx_pkt_set_vhdr(struct VmxnetRxPkt *pkt, 153 struct virtio_net_hdr *vhdr); 154 155 /** 156 * save packet type in packet context 157 * 158 * @pkt: packet 159 * @packet_type: the packet type 160 * 161 */ 162 void vmxnet_rx_pkt_set_packet_type(struct VmxnetRxPkt *pkt, 163 eth_pkt_types_e packet_type); 164 165 #endif 166