2011-03-15 03:06:18 +03:00
/*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation ; or , when distributed
* separately from the Linux kernel or incorporated into other
* software packages , subject to the following license :
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this source file ( the " Software " ) , to deal in the Software without
* restriction , including without limitation the rights to use , copy , modify ,
* merge , publish , distribute , sublicense , and / or sell copies of the Software ,
* and to permit persons to whom the Software is furnished to do so , subject to
* the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING
* FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE .
*/
# ifndef __XEN_NETBACK__COMMON_H__
# define __XEN_NETBACK__COMMON_H__
# define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
# include <linux/module.h>
# include <linux/interrupt.h>
# include <linux/slab.h>
# include <linux/ip.h>
# include <linux/in.h>
# include <linux/io.h>
# include <linux/netdevice.h>
# include <linux/etherdevice.h>
# include <linux/wait.h>
# include <linux/sched.h>
# include <xen/interface/io/netif.h>
# include <xen/interface/grant_table.h>
# include <xen/grant_table.h>
# include <xen/xenbus.h>
struct xen_netbk ;
struct xenvif {
/* Unique identifier for this interface. */
domid_t domid ;
unsigned int handle ;
/* Reference to netback processing backend. */
struct xen_netbk * netbk ;
u8 fe_dev_addr [ 6 ] ;
/* Physical parameters of the comms window. */
grant_handle_t tx_shmem_handle ;
grant_ref_t tx_shmem_ref ;
grant_handle_t rx_shmem_handle ;
grant_ref_t rx_shmem_ref ;
unsigned int irq ;
/* List of frontends to notify after a batch of frames sent. */
struct list_head notify_list ;
/* The shared rings and indexes. */
struct xen_netif_tx_back_ring tx ;
struct xen_netif_rx_back_ring rx ;
struct vm_struct * tx_comms_area ;
struct vm_struct * rx_comms_area ;
/* Frontend feature information. */
u8 can_sg : 1 ;
u8 gso : 1 ;
u8 gso_prefix : 1 ;
u8 csum : 1 ;
/* Internal feature information. */
u8 can_queue : 1 ; /* can queue packets for receiver? */
/*
* Allow xenvif_start_xmit ( ) to peek ahead in the rx request
* ring . This is a prediction of what rx_req_cons will be
* once all queued skbs are put on the ring .
*/
RING_IDX rx_req_cons_peek ;
/* Transmit shaping: allow 'credit_bytes' every 'credit_usec'. */
unsigned long credit_bytes ;
unsigned long credit_usec ;
unsigned long remaining_credit ;
struct timer_list credit_timeout ;
/* Statistics */
unsigned long rx_gso_checksum_fixup ;
/* Miscellaneous private stuff. */
struct list_head schedule_list ;
atomic_t refcnt ;
struct net_device * dev ;
wait_queue_head_t waiting_to_free ;
} ;
2011-05-17 03:59:48 +04:00
# define XEN_NETIF_TX_RING_SIZE __CONST_RING_SIZE(xen_netif_tx, PAGE_SIZE)
# define XEN_NETIF_RX_RING_SIZE __CONST_RING_SIZE(xen_netif_rx, PAGE_SIZE)
2011-03-15 03:06:18 +03:00
struct xenvif * xenvif_alloc ( struct device * parent ,
domid_t domid ,
unsigned int handle ) ;
int xenvif_connect ( struct xenvif * vif , unsigned long tx_ring_ref ,
unsigned long rx_ring_ref , unsigned int evtchn ) ;
void xenvif_disconnect ( struct xenvif * vif ) ;
void xenvif_get ( struct xenvif * vif ) ;
void xenvif_put ( struct xenvif * vif ) ;
int xenvif_xenbus_init ( void ) ;
int xenvif_schedulable ( struct xenvif * vif ) ;
int xen_netbk_rx_ring_full ( struct xenvif * vif ) ;
int xen_netbk_must_stop_queue ( struct xenvif * vif ) ;
/* (Un)Map communication rings. */
void xen_netbk_unmap_frontend_rings ( struct xenvif * vif ) ;
int xen_netbk_map_frontend_rings ( struct xenvif * vif ,
grant_ref_t tx_ring_ref ,
grant_ref_t rx_ring_ref ) ;
/* (De)Register a xenvif with the netback backend. */
void xen_netbk_add_xenvif ( struct xenvif * vif ) ;
void xen_netbk_remove_xenvif ( struct xenvif * vif ) ;
/* (De)Schedule backend processing for a xenvif */
void xen_netbk_schedule_xenvif ( struct xenvif * vif ) ;
void xen_netbk_deschedule_xenvif ( struct xenvif * vif ) ;
/* Check for SKBs from frontend and schedule backend processing */
void xen_netbk_check_rx_xenvif ( struct xenvif * vif ) ;
/* Receive an SKB from the frontend */
void xenvif_receive_skb ( struct xenvif * vif , struct sk_buff * skb ) ;
/* Queue an SKB for transmission to the frontend */
void xen_netbk_queue_tx_skb ( struct xenvif * vif , struct sk_buff * skb ) ;
/* Notify xenvif that ring now has space to send an skb to the frontend */
void xenvif_notify_tx_completion ( struct xenvif * vif ) ;
/* Returns number of ring slots required to send an skb to the frontend */
unsigned int xen_netbk_count_skb_slots ( struct xenvif * vif , struct sk_buff * skb ) ;
# endif /* __XEN_NETBACK__COMMON_H__ */