blob: 9660ef593d7cdf783fcc88968f8dceaad829f29c [file] [log] [blame]
#ifndef VPFRING_H
#define VPFRING
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/eventfd.h>
#include <stdio.h>
#include <stdarg.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#include <sys/poll.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/sockios.h>
#include <linux/if_packet.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <sys/un.h>
#include <sys/time.h>
#include <time.h>
#include <pthread.h>
#include <linux/if_ether.h>
#include "iov.h"
#include "pci.h"
#include <linux/pf_ring.h>
#include <pfring.h>
#include "vnplug.h"
#define VNPLUG_CLIENT_ID_VPFRING 85
struct vPFRingInfo{
pfring *ring;
uint32_t dev_id;
DeviceState *qdev;
struct vNPlugDevClientInfo *vnplug_client;
QLIST_ENTRY(vPFRingInfo) list;
};
/* vPFRing control messages (structures defined both here and in vPFRing lib) */
/* vPFRingMsg types */
#define VPFRING_CTRL_MSG_SET_DIRECTION 0 /* payload: vPFRingSetDirectionMsg */
#define VPFRING_CTRL_MSG_SET_CLUSTER 1 /* payload: vPFRingSetClusterMsg */
#define VPFRING_CTRL_MSG_SET_MASTER_ID 2 /* payload: vPFRingSetMasterIdMsg */
#define VPFRING_CTRL_MSG_SET_CHANNEL_ID 3 /* payload: vPFRingSetChannelIdMsg */
#define VPFRING_CTRL_MSG_ADD_HW_RULE 4 /* payload: vPFRingAddHwRuleMsg */
#define VPFRING_CTRL_MSG_REMOVE_HW_RULE 5 /* payload: vPFRingRemoveHwRuleMsg */
#define VPFRING_CTRL_MSG_REMOVE_FROM_CLUSTER 6
#define VPFRING_CTRL_MSG_PURGE_IDLE_HASH_RULES 7 /* payload: vPFRingPurgeIdleHashRulesMsg */
#define VPFRING_CTRL_MSG_SET_APPLICATION_NAME 8 /* payload: vPFRingSetApplicationNameMsg */
#define VPFRING_CTRL_MSG_DEVICE_ADD 9 /* payload: vPFRingAddMsg */
#define VPFRING_CTRL_MSG_BIND 10 /* payload: vPFRingBindMsg */
#define VPFRING_CTRL_MSG_SET_POLL_WATERMARK 11 /* payload: vPFRingPollWatermarkMsg */
#define VPFRING_CTRL_MSG_DEVICE_DEL 12
#define VPFRING_CTRL_MSG_GET_FILTERING_RULE_STATS 13 /* payload: vPFRingGetFilteringRuleStatsMsg */
#define VPFRING_CTRL_MSG_GET_NUM_RX_CHANNELS 14
#define VPFRING_CTRL_MSG_GET_RING_ID 15
#define VPFRING_CTRL_MSG_GET_PACKET_CONSUMER_MODE 16
#define VPFRING_CTRL_MSG_SET_PACKET_CONSUMER_MODE 17 /* payload: vPFRingSetPacketConsumerModeMsg */
#define VPFRING_CTRL_MSG_SET_VIRTUAL_DEVICE 18 /* payload: virtual_filtering_device_info */
#define VPFRING_CTRL_MSG_GET_HASH_FILTERING_RULE_STATS 19 /* payload: vPFRingGetHashFilteringRuleStatsMsg */
#define VPFRING_CTRL_MSG_ADD_FILTERING_RULE 20 /* payload: filtering_rule */
#define VPFRING_CTRL_MSG_HANDLE_HASH_FILTERING_RULE 21 /* payload: vPFRingHandleHashFilteringRule */
#define VPFRING_CTRL_MSG_ENABLE_RING 22
#define VPFRING_CTRL_MSG_DISABLE_RING 23
#define VPFRING_CTRL_MSG_REMOVE_FILTERING_RULE 24 /* payload: vPFRingRemoveFilteringRuleMsg */
#define VPFRING_CTRL_MSG_TOGGLE_FILTERING_POLICY 25 /* payload: vPFRingToggleFilteringPolicyMsg */
#define VPFRING_CTRL_MSG_VERSION 26
#define VPFRING_CTRL_MSG_SET_SAMPLING_RATE 27 /* payload: vPFRingSetSamplingRateMsg */
#define VPFRING_CTRL_MSG_GET_BOUND_DEVICE_ADDRESS 28
#define VPFRING_CTRL_MSG_GET_SLOT_HEADER_LEN 29
#define VPFRING_CTRL_MSG_GET_NUM_QUEUED_PKTS 30
#define VPFRING_CTRL_MSG_ENABLE_RSS_REHASH 31
#define VPFRING_CTRL_MSG_SET_SOCKET_MODE 32 /* payload: vPFRingSetSocketModeMsg */
#define VPFRING_CTRL_MSG_PURGE_IDLE_RULES 33 /* payload: vPFRingPurgeIdleRulesMsg */
#define VPFRING_CTRL_MSG_SET_BPF_FILTER 34 /* payload: vPFRingSetBPFFilter */
#define VPFRING_CTRL_MSG_REMOVE_BPF_FILTER 35
#define VPFRING_CTRL_MSG_SHUTDOWN 36
#define VPFRING_CTRL_MAX_DEV_NAME 64
struct vPFRingMsg {
uint32_t type;
uint32_t device_id;
uint32_t payload_len;
char payload[0];
};
struct vPFRingSetDirectionMsg {
uint32_t direction;
};
struct vPFRingSetClusterMsg {
uint32_t cluster_id;
uint32_t cluster_type;
};
struct vPFRingSetMasterIdMsg {
uint32_t master_id;
};
struct vPFRingSetChannelIdMsg {
int32_t channel_id;
};
struct vPFRingAddHwRuleMsg{
hw_filtering_rule rule;
};
struct vPFRingRemoveHwRuleMsg{
uint16_t rule_id;
uint16_t __padding;
};
struct vPFRingPurgeIdleHashRulesMsg{
uint16_t inactivity_sec;
uint16_t __padding;
};
struct vPFRingSetApplicationNameMsg {
char name[VPFRING_CTRL_MAX_DEV_NAME];
};
struct vPFRingAddMsg /* PLUG + open_consumer */ {
char device_name[VPFRING_CTRL_MAX_DEV_NAME];
uint32_t caplen;
uint32_t flags;
};
struct vPFRingBindMsg {
char device_name[VPFRING_CTRL_MAX_DEV_NAME];
};
struct vPFRingSetPollWatermarkMsg{
uint16_t watermark;
uint16_t __padding;
};
struct vPFRingGetFilteringRuleStatsMsg{
uint16_t rule_id;
uint16_t __padding;
uint32_t stats_len;
};
struct vPFRingSetPacketConsumerModeMsg{
uint8_t plugin_id;
char __padding[3];
uint32_t plugin_data_len;
char plugin_data[0];
};
struct vPFRingGetHashFilteringRuleStatsMsg{
uint32_t stats_len;
hash_filtering_rule rule;
};
struct vPFRingHandleHashFilteringRuleMsg{
uint8_t add_rule;
char __padding[3];
hash_filtering_rule rule_to_add;
};
struct vPFRingRemoveFilteringRuleMsg{
uint16_t rule_id;
uint16_t __padding;
};
struct vPFRingToggleFilteringPolicyMsg{
uint8_t rules_default_accept_policy;
char __padding[3];
};
struct vPFRingSetSamplingRateMsg{
uint32_t rate;
};
struct vPFRingSetSocketModeMsg{
uint32_t mode;
};
struct vPFRingPurgeIdleRulesMsg{
uint16_t inactivity_sec;
uint16_t __padding;
};
struct vPFRingSetBPFFilter{
uint32_t filter_buffer_len;
char filter_buffer[0];
};
/* END vPFRing control messages */
/* private prototypes */
void vpfring_set_init_data (struct vNPlugDevClientInfo *client, uint32_t dev_id, uint32_t backend_eventfds_n, int *backend_eventfds, uint32_t guest_eventfds_n, int *guest_eventfds);
void vpfring_stop (struct vNPlugDevClientInfo *client);
void vpfring_close_and_free (struct vNPlugDevClientInfo *client);
uint32_t vpfring_io_readl (struct vNPlugDevClientInfo *client, target_phys_addr_t addr);
void vpfring_io_writel (struct vNPlugDevClientInfo *client, target_phys_addr_t addr, uint32_t val);
int vpfring_ctrl_message_rcv(void *message, uint32_t size, void *ret_message, uint32_t ret_size);
#endif