1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#ifndef __XEN_NETBACK__COMMON_H__
28#define __XEN_NETBACK__COMMON_H__
29
30#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
31
32#include <linux/module.h>
33#include <linux/interrupt.h>
34#include <linux/slab.h>
35#include <linux/ip.h>
36#include <linux/in.h>
37#include <linux/io.h>
38#include <linux/netdevice.h>
39#include <linux/etherdevice.h>
40#include <linux/wait.h>
41#include <linux/sched.h>
42
43#include <xen/interface/io/netif.h>
44#include <xen/interface/grant_table.h>
45#include <xen/grant_table.h>
46#include <xen/xenbus.h>
47
48struct xen_netbk;
49
50struct xenvif {
51
52 domid_t domid;
53 unsigned int handle;
54
55
56 struct xen_netbk *netbk;
57
58 u8 fe_dev_addr[6];
59
60
61 grant_handle_t tx_shmem_handle;
62 grant_ref_t tx_shmem_ref;
63 grant_handle_t rx_shmem_handle;
64 grant_ref_t rx_shmem_ref;
65 unsigned int irq;
66
67
68 struct list_head notify_list;
69
70
71 struct xen_netif_tx_back_ring tx;
72 struct xen_netif_rx_back_ring rx;
73 struct vm_struct *tx_comms_area;
74 struct vm_struct *rx_comms_area;
75
76
77 u8 can_sg:1;
78 u8 gso:1;
79 u8 gso_prefix:1;
80 u8 csum:1;
81
82
83 u8 can_queue:1;
84
85
86
87
88
89
90 RING_IDX rx_req_cons_peek;
91
92
93 unsigned long credit_bytes;
94 unsigned long credit_usec;
95 unsigned long remaining_credit;
96 struct timer_list credit_timeout;
97
98
99 unsigned long rx_gso_checksum_fixup;
100
101
102 struct list_head schedule_list;
103 atomic_t refcnt;
104 struct net_device *dev;
105
106 wait_queue_head_t waiting_to_free;
107};
108
109#define XEN_NETIF_TX_RING_SIZE __CONST_RING_SIZE(xen_netif_tx, PAGE_SIZE)
110#define XEN_NETIF_RX_RING_SIZE __CONST_RING_SIZE(xen_netif_rx, PAGE_SIZE)
111
112struct xenvif *xenvif_alloc(struct device *parent,
113 domid_t domid,
114 unsigned int handle);
115
116int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref,
117 unsigned long rx_ring_ref, unsigned int evtchn);
118void xenvif_disconnect(struct xenvif *vif);
119
120void xenvif_get(struct xenvif *vif);
121void xenvif_put(struct xenvif *vif);
122
123int xenvif_xenbus_init(void);
124
125int xenvif_schedulable(struct xenvif *vif);
126
127int xen_netbk_rx_ring_full(struct xenvif *vif);
128
129int xen_netbk_must_stop_queue(struct xenvif *vif);
130
131
132void xen_netbk_unmap_frontend_rings(struct xenvif *vif);
133int xen_netbk_map_frontend_rings(struct xenvif *vif,
134 grant_ref_t tx_ring_ref,
135 grant_ref_t rx_ring_ref);
136
137
138void xen_netbk_add_xenvif(struct xenvif *vif);
139void xen_netbk_remove_xenvif(struct xenvif *vif);
140
141
142void xen_netbk_schedule_xenvif(struct xenvif *vif);
143void xen_netbk_deschedule_xenvif(struct xenvif *vif);
144
145
146void xen_netbk_check_rx_xenvif(struct xenvif *vif);
147
148void xenvif_receive_skb(struct xenvif *vif, struct sk_buff *skb);
149
150
151void xen_netbk_queue_tx_skb(struct xenvif *vif, struct sk_buff *skb);
152
153void xenvif_notify_tx_completion(struct xenvif *vif);
154
155
156unsigned int xen_netbk_count_skb_slots(struct xenvif *vif, struct sk_buff *skb);
157
158#endif
159