aboutsummaryrefslogtreecommitdiffstats
path: root/xen-2.4.16/include/hypervisor-ifs/network.h
blob: a0cfc9fa2ca3f8ba03fcca36090fcbdf757ab4cd (plain)
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/******************************************************************************
 * network.h
 *
 * ring data structures for buffering messages between hypervisor and
 * guestos's.  As it stands this is only used for network buffer exchange.
 *
 * This file also contains structures and interfaces for the per-domain
 * routing/filtering tables in the hypervisor.
 *
 */

#ifndef __RING_H__
#define __RING_H__

#include <linux/types.h>

typedef struct tx_entry_st {
	unsigned long addr; /* virtual address */
	unsigned long size; /* in bytes */
} tx_entry_t;

typedef struct rx_entry_st {
	unsigned long addr; /* virtual address */
	unsigned long size; /* in bytes */
} rx_entry_t;

#define TX_RING_SIZE 1024
#define RX_RING_SIZE 1024
typedef struct net_ring_st {
    /*
     * Guest OS places packets into ring at tx_prod.
     * Hypervisor removes at tx_cons.
     * Ring is empty when tx_prod == tx_cons.
     * Guest OS receives a DOMAIN_EVENT_NET_TX when tx_cons passes tx_event.
     * Hypervisor may be prodded whenever tx_prod is updated, but this is
     * only necessary when tx_cons == old_tx_prod (ie. transmitter stalled).
     */
    tx_entry_t	*tx_ring;
    unsigned int tx_prod, tx_cons, tx_event;
    unsigned int tx_ring_size;
    /*
     * Guest OS places empty buffers into ring at rx_prod.
     * Hypervisor fills buffers as rx_cons.
     * Ring is empty when rx_prod == rx_cons.
     * Guest OS receives a DOMAIN_EVENT_NET_RX when rx_cons passes rx_event.
     * Hypervisor may be prodded whenever rx_prod is updated, but this is
     * only necessary when rx_cons == old_rx_prod (ie. receiver stalled).
     */
    rx_entry_t	*rx_ring;
    unsigned int rx_prod, rx_cons, rx_event;
    unsigned int rx_ring_size;
} net_ring_t;

/* Specify base of per-domain array. Get returned free slot in the array. */
//net_ring_t *create_net_vif(int domain);

/* Packet routing/filtering code follows:
 */

#define NETWORK_ACTION_ACCEPT   0
#define NETWORK_ACTION_COUNT    1

#define NETWORK_PROTO_ANY       0
#define NETWORK_PROTO_IP        1
#define NETWORK_PROTO_TCP       2
#define NETWORK_PROTO_UDP       3
#define NETWORK_PROTO_ARP       4

typedef struct net_rule_st 
{
    u32  src_addr;
    u32  dst_addr;
    u16  src_port;
    u16  dst_port;
    u32  src_addr_mask;
    u32  dst_addr_mask;
    u16  src_port_mask;
    u16  dst_port_mask;
    u16  proto;
    
    int  src_interface;
    int  dst_interface;
    u16  action;
} net_rule_t;

/* Network trap operations and associated structure. 
 * This presently just handles rule insertion and deletion, but will
 * evenually have code to add and remove interfaces.
 */

#define NETWORK_OP_ADDRULE      0
#define NETWORK_OP_DELETERULE   1
#define NETWORK_OP_GETRULELIST  2

typedef struct network_op_st 
{
    unsigned long cmd;
    union
    {
        net_rule_t net_rule;
    }
    u;
} network_op_t;

typedef struct net_rule_ent_st
{
    net_rule_t r;
    struct net_rule_ent_st *next;
} net_rule_ent_t;

/* Drop a new rule down to the network tables. */
int add_net_rule(net_rule_t *rule);

#endif