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 "net/eth.h" 22 23 /* defines to enable packet dump functions */ 24 /*#define VMXNET_RX_PKT_DEBUG*/ 25 26 struct VmxnetRxPkt; 27 28 /** 29 * Clean all rx packet resources 30 * 31 * @pkt: packet 32 * 33 */ 34 void vmxnet_rx_pkt_uninit(struct VmxnetRxPkt *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 */ 43 void vmxnet_rx_pkt_init(struct VmxnetRxPkt **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 */ 53 size_t vmxnet_rx_pkt_get_total_len(struct VmxnetRxPkt *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 */ 63 void vmxnet_rx_pkt_set_protocols(struct VmxnetRxPkt *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 */ 76 void vmxnet_rx_pkt_get_protocols(struct VmxnetRxPkt *pkt, 77 bool *isip4, bool *isip6, 78 bool *isudp, bool *istcp); 79 80 /** 81 * returns virtio header stored in rx context 82 * 83 * @pkt: packet 84 * @ret: virtio header 85 * 86 */ 87 struct virtio_net_hdr *vmxnet_rx_pkt_get_vhdr(struct VmxnetRxPkt *pkt); 88 89 /** 90 * returns packet type 91 * 92 * @pkt: packet 93 * @ret: packet type 94 * 95 */ 96 eth_pkt_types_e vmxnet_rx_pkt_get_packet_type(struct VmxnetRxPkt *pkt); 97 98 /** 99 * returns vlan tag 100 * 101 * @pkt: packet 102 * @ret: VLAN tag 103 * 104 */ 105 uint16_t vmxnet_rx_pkt_get_vlan_tag(struct VmxnetRxPkt *pkt); 106 107 /** 108 * tells whether vlan was stripped from the packet 109 * 110 * @pkt: packet 111 * @ret: VLAN stripped sign 112 * 113 */ 114 bool vmxnet_rx_pkt_is_vlan_stripped(struct VmxnetRxPkt *pkt); 115 116 /** 117 * notifies caller if the packet has virtio header 118 * 119 * @pkt: packet 120 * @ret: true if packet has virtio header, false otherwize 121 * 122 */ 123 bool vmxnet_rx_pkt_has_virt_hdr(struct VmxnetRxPkt *pkt); 124 125 /** 126 * attach data to rx packet 127 * 128 * @pkt: packet 129 * @data: pointer to the data buffer 130 * @len: data length 131 * @strip_vlan: should the module strip vlan from data 132 * 133 */ 134 void vmxnet_rx_pkt_attach_data(struct VmxnetRxPkt *pkt, const void *data, 135 size_t len, bool strip_vlan); 136 137 /** 138 * returns io vector that holds the attached data 139 * 140 * @pkt: packet 141 * @ret: pointer to IOVec 142 * 143 */ 144 struct iovec *vmxnet_rx_pkt_get_iovec(struct VmxnetRxPkt *pkt); 145 146 /** 147 * prints rx packet data if debug is enabled 148 * 149 * @pkt: packet 150 * 151 */ 152 void vmxnet_rx_pkt_dump(struct VmxnetRxPkt *pkt); 153 154 /** 155 * copy passed vhdr data to packet context 156 * 157 * @pkt: packet 158 * @vhdr: VHDR buffer 159 * 160 */ 161 void vmxnet_rx_pkt_set_vhdr(struct VmxnetRxPkt *pkt, 162 struct virtio_net_hdr *vhdr); 163 164 /** 165 * save packet type in packet context 166 * 167 * @pkt: packet 168 * @packet_type: the packet type 169 * 170 */ 171 void vmxnet_rx_pkt_set_packet_type(struct VmxnetRxPkt *pkt, 172 eth_pkt_types_e packet_type); 173 174 #endif 175