#include <linux/inet.h>
#include <linux/kthread.h>
#include <linux/list.h>
#include <linux/radix-tree.h>
#include <linux/module.h>
#include <linux/semaphore.h>
#include <linux/wait.h>
#include <net/sock.h>
#include <net/inet_common.h>
#include <net/inet_connection_sock.h>
#include <net/request_sock.h>
#include <trace/events/sock.h>
#include <xen/events.h>
#include <xen/grant_table.h>
#include <xen/xen.h>
#include <xen/xenbus.h>
#include <xen/interface/io/pvcalls.h>
#define PVCALLS_VERSIONS …
#define MAX_RING_ORDER …
static struct pvcalls_back_global { … } pvcalls_back_global;
struct pvcalls_fedata { … };
struct pvcalls_ioworker { … };
struct sock_mapping { … };
struct sockpass_mapping { … };
static irqreturn_t pvcalls_back_conn_event(int irq, void *sock_map);
static int pvcalls_back_release_active(struct xenbus_device *dev,
struct pvcalls_fedata *fedata,
struct sock_mapping *map);
static bool pvcalls_conn_back_read(void *opaque)
{ … }
static bool pvcalls_conn_back_write(struct sock_mapping *map)
{ … }
static void pvcalls_back_ioworker(struct work_struct *work)
{ … }
static int pvcalls_back_socket(struct xenbus_device *dev,
struct xen_pvcalls_request *req)
{ … }
static void pvcalls_sk_state_change(struct sock *sock)
{ … }
static void pvcalls_sk_data_ready(struct sock *sock)
{ … }
static struct sock_mapping *pvcalls_new_active_socket(
struct pvcalls_fedata *fedata,
uint64_t id,
grant_ref_t ref,
evtchn_port_t evtchn,
struct socket *sock)
{ … }
static int pvcalls_back_connect(struct xenbus_device *dev,
struct xen_pvcalls_request *req)
{ … }
static int pvcalls_back_release_active(struct xenbus_device *dev,
struct pvcalls_fedata *fedata,
struct sock_mapping *map)
{ … }
static int pvcalls_back_release_passive(struct xenbus_device *dev,
struct pvcalls_fedata *fedata,
struct sockpass_mapping *mappass)
{ … }
static int pvcalls_back_release(struct xenbus_device *dev,
struct xen_pvcalls_request *req)
{ … }
static void __pvcalls_back_accept(struct work_struct *work)
{ … }
static void pvcalls_pass_sk_data_ready(struct sock *sock)
{ … }
static int pvcalls_back_bind(struct xenbus_device *dev,
struct xen_pvcalls_request *req)
{ … }
static int pvcalls_back_listen(struct xenbus_device *dev,
struct xen_pvcalls_request *req)
{ … }
static int pvcalls_back_accept(struct xenbus_device *dev,
struct xen_pvcalls_request *req)
{ … }
static int pvcalls_back_poll(struct xenbus_device *dev,
struct xen_pvcalls_request *req)
{ … }
static int pvcalls_back_handle_cmd(struct xenbus_device *dev,
struct xen_pvcalls_request *req)
{ … }
static void pvcalls_back_work(struct pvcalls_fedata *fedata)
{ … }
static irqreturn_t pvcalls_back_event(int irq, void *dev_id)
{ … }
static irqreturn_t pvcalls_back_conn_event(int irq, void *sock_map)
{ … }
static int backend_connect(struct xenbus_device *dev)
{ … }
static int backend_disconnect(struct xenbus_device *dev)
{ … }
static int pvcalls_back_probe(struct xenbus_device *dev,
const struct xenbus_device_id *id)
{ … }
static void set_backend_state(struct xenbus_device *dev,
enum xenbus_state state)
{ … }
static void pvcalls_back_changed(struct xenbus_device *dev,
enum xenbus_state frontend_state)
{ … }
static void pvcalls_back_remove(struct xenbus_device *dev)
{ … }
static int pvcalls_back_uevent(const struct xenbus_device *xdev,
struct kobj_uevent_env *env)
{ … }
static const struct xenbus_device_id pvcalls_back_ids[] = …;
static struct xenbus_driver pvcalls_back_driver = …;
static int __init pvcalls_back_init(void)
{ … }
module_init(…) …;
static void __exit pvcalls_back_fin(void)
{ … }
module_exit(pvcalls_back_fin);
MODULE_DESCRIPTION(…) …;
MODULE_AUTHOR(…) …;
MODULE_LICENSE(…) …;