diff options
Diffstat (limited to 'drivers/net/xen-netback/common.h')
| -rw-r--r-- | drivers/net/xen-netback/common.h | 74 | 
1 files changed, 66 insertions, 8 deletions
diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h index f44b38846420..84d6cbdd11b2 100644 --- a/drivers/net/xen-netback/common.h +++ b/drivers/net/xen-netback/common.h @@ -220,6 +220,35 @@ struct xenvif_mcast_addr {  #define XEN_NETBK_MCAST_MAX 64 +#define XEN_NETBK_MAX_HASH_KEY_SIZE 40 +#define XEN_NETBK_MAX_HASH_MAPPING_SIZE 128 +#define XEN_NETBK_HASH_TAG_SIZE 40 + +struct xenvif_hash_cache_entry { +	struct list_head link; +	struct rcu_head rcu; +	u8 tag[XEN_NETBK_HASH_TAG_SIZE]; +	unsigned int len; +	u32 val; +	int seq; +}; + +struct xenvif_hash_cache { +	spinlock_t lock; +	struct list_head list; +	unsigned int count; +	atomic_t seq; +}; + +struct xenvif_hash { +	unsigned int alg; +	u32 flags; +	u8 key[XEN_NETBK_MAX_HASH_KEY_SIZE]; +	u32 mapping[XEN_NETBK_MAX_HASH_MAPPING_SIZE]; +	unsigned int size; +	struct xenvif_hash_cache cache; +}; +  struct xenvif {  	/* Unique identifier for this interface. */  	domid_t          domid; @@ -251,6 +280,8 @@ struct xenvif {  	unsigned int num_queues; /* active queues, resource allocated */  	unsigned int stalled_queues; +	struct xenvif_hash hash; +  	struct xenbus_watch credit_watch;  	struct xenbus_watch mcast_ctrl_watch; @@ -260,6 +291,11 @@ struct xenvif {  	struct dentry *xenvif_dbg_root;  #endif +	struct xen_netif_ctrl_back_ring ctrl; +	struct task_struct *ctrl_task; +	wait_queue_head_t ctrl_wq; +	unsigned int ctrl_irq; +  	/* Miscellaneous private stuff. */  	struct net_device *dev;  }; @@ -285,10 +321,15 @@ struct xenvif *xenvif_alloc(struct device *parent,  int xenvif_init_queue(struct xenvif_queue *queue);  void xenvif_deinit_queue(struct xenvif_queue *queue); -int xenvif_connect(struct xenvif_queue *queue, unsigned long tx_ring_ref, -		   unsigned long rx_ring_ref, unsigned int tx_evtchn, -		   unsigned int rx_evtchn); -void xenvif_disconnect(struct xenvif *vif); +int xenvif_connect_data(struct xenvif_queue *queue, +			unsigned long tx_ring_ref, +			unsigned long rx_ring_ref, +			unsigned int tx_evtchn, +			unsigned int rx_evtchn); +void xenvif_disconnect_data(struct xenvif *vif); +int xenvif_connect_ctrl(struct xenvif *vif, grant_ref_t ring_ref, +			unsigned int evtchn); +void xenvif_disconnect_ctrl(struct xenvif *vif);  void xenvif_free(struct xenvif *vif);  int xenvif_xenbus_init(void); @@ -300,10 +341,10 @@ int xenvif_queue_stopped(struct xenvif_queue *queue);  void xenvif_wake_queue(struct xenvif_queue *queue);  /* (Un)Map communication rings. */ -void xenvif_unmap_frontend_rings(struct xenvif_queue *queue); -int xenvif_map_frontend_rings(struct xenvif_queue *queue, -			      grant_ref_t tx_ring_ref, -			      grant_ref_t rx_ring_ref); +void xenvif_unmap_frontend_data_rings(struct xenvif_queue *queue); +int xenvif_map_frontend_data_rings(struct xenvif_queue *queue, +				   grant_ref_t tx_ring_ref, +				   grant_ref_t rx_ring_ref);  /* Check for SKBs from frontend and schedule backend processing */  void xenvif_napi_schedule_or_enable_events(struct xenvif_queue *queue); @@ -318,6 +359,8 @@ void xenvif_kick_thread(struct xenvif_queue *queue);  int xenvif_dealloc_kthread(void *data); +int xenvif_ctrl_kthread(void *data); +  void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb);  void xenvif_carrier_on(struct xenvif *vif); @@ -341,6 +384,7 @@ extern bool separate_tx_rx_irq;  extern unsigned int rx_drain_timeout_msecs;  extern unsigned int rx_stall_timeout_msecs;  extern unsigned int xenvif_max_queues; +extern unsigned int xenvif_hash_cache_size;  #ifdef CONFIG_DEBUG_FS  extern struct dentry *xen_netback_dbg_root; @@ -354,4 +398,18 @@ void xenvif_skb_zerocopy_complete(struct xenvif_queue *queue);  bool xenvif_mcast_match(struct xenvif *vif, const u8 *addr);  void xenvif_mcast_addr_list_free(struct xenvif *vif); +/* Hash */ +void xenvif_init_hash(struct xenvif *vif); +void xenvif_deinit_hash(struct xenvif *vif); + +u32 xenvif_set_hash_alg(struct xenvif *vif, u32 alg); +u32 xenvif_get_hash_flags(struct xenvif *vif, u32 *flags); +u32 xenvif_set_hash_flags(struct xenvif *vif, u32 flags); +u32 xenvif_set_hash_key(struct xenvif *vif, u32 gref, u32 len); +u32 xenvif_set_hash_mapping_size(struct xenvif *vif, u32 size); +u32 xenvif_set_hash_mapping(struct xenvif *vif, u32 gref, u32 len, +			    u32 off); + +void xenvif_set_skb_hash(struct xenvif *vif, struct sk_buff *skb); +  #endif /* __XEN_NETBACK__COMMON_H__ */  | 
