Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
openvswitch
flow.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2007-2011 Nicira, Inc.
3
*
4
* This program is free software; you can redistribute it and/or
5
* modify it under the terms of version 2 of the GNU General Public
6
* License as published by the Free Software Foundation.
7
*
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
* General Public License for more details.
12
*
13
* You should have received a copy of the GNU General Public License
14
* along with this program; if not, write to the Free Software
15
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16
* 02110-1301, USA
17
*/
18
19
#ifndef FLOW_H
20
#define FLOW_H 1
21
22
#include <linux/kernel.h>
23
#include <linux/netlink.h>
24
#include <
linux/openvswitch.h
>
25
#include <
linux/spinlock.h
>
26
#include <linux/types.h>
27
#include <
linux/rcupdate.h
>
28
#include <linux/if_ether.h>
29
#include <linux/in6.h>
30
#include <
linux/jiffies.h
>
31
#include <linux/time.h>
32
#include <
linux/flex_array.h
>
33
#include <
net/inet_ecn.h
>
34
35
struct
sk_buff
;
36
37
struct
sw_flow_actions
{
38
struct
rcu_head
rcu
;
39
u32
actions_len
;
40
struct
nlattr
actions
[];
41
};
42
43
struct
sw_flow_key
{
44
struct
{
45
u32
priority
;
/* Packet QoS priority. */
46
u16
in_port
;
/* Input switch port (or DP_MAX_PORTS). */
47
}
phy
;
48
struct
{
49
u8
src
[
ETH_ALEN
];
/* Ethernet source address. */
50
u8
dst
[
ETH_ALEN
];
/* Ethernet destination address. */
51
__be16
tci
;
/* 0 if no VLAN, VLAN_TAG_PRESENT set otherwise. */
52
__be16
type
;
/* Ethernet frame type. */
53
}
eth
;
54
struct
{
55
u8
proto
;
/* IP protocol or lower 8 bits of ARP opcode. */
56
u8
tos
;
/* IP ToS. */
57
u8
ttl
;
/* IP TTL/hop limit. */
58
u8
frag
;
/* One of OVS_FRAG_TYPE_*. */
59
}
ip
;
60
union
{
61
struct
{
62
struct
{
63
__be32
src
;
/* IP source address. */
64
__be32
dst
;
/* IP destination address. */
65
}
addr
;
66
union
{
67
struct
{
68
__be16
src
;
/* TCP/UDP source port. */
69
__be16
dst
;
/* TCP/UDP destination port. */
70
}
tp
;
71
struct
{
72
u8
sha
[
ETH_ALEN
];
/* ARP source hardware address. */
73
u8
tha
[
ETH_ALEN
];
/* ARP target hardware address. */
74
}
arp
;
75
};
76
}
ipv4
;
77
struct
{
78
struct
{
79
struct
in6_addr
src
;
/* IPv6 source address. */
80
struct
in6_addr
dst
;
/* IPv6 destination address. */
81
}
addr
;
82
__be32
label
;
/* IPv6 flow label. */
83
struct
{
84
__be16
src
;
/* TCP/UDP source port. */
85
__be16
dst
;
/* TCP/UDP destination port. */
86
}
tp
;
87
struct
{
88
struct
in6_addr
target
;
/* ND target address. */
89
u8
sll
[
ETH_ALEN
];
/* ND source link layer address. */
90
u8
tll
[
ETH_ALEN
];
/* ND target link layer address. */
91
}
nd
;
92
}
ipv6
;
93
};
94
};
95
96
struct
sw_flow
{
97
struct
rcu_head
rcu
;
98
struct
hlist_node
hash_node
[2];
99
u32
hash
;
100
101
struct
sw_flow_key
key
;
102
struct
sw_flow_actions
__rcu
*
sf_acts
;
103
104
spinlock_t
lock
;
/* Lock for values below. */
105
unsigned
long
used
;
/* Last used time (in jiffies). */
106
u64
packet_count
;
/* Number of packets matched. */
107
u64
byte_count
;
/* Number of bytes matched. */
108
u8
tcp_flags
;
/* Union of seen TCP flags. */
109
};
110
111
struct
arp_eth_header
{
112
__be16
ar_hrd
;
/* format of hardware address */
113
__be16
ar_pro
;
/* format of protocol address */
114
unsigned
char
ar_hln
;
/* length of hardware address */
115
unsigned
char
ar_pln
;
/* length of protocol address */
116
__be16
ar_op
;
/* ARP opcode (command) */
117
118
/* Ethernet+IPv4 specific members. */
119
unsigned
char
ar_sha
[
ETH_ALEN
];
/* sender hardware address */
120
unsigned
char
ar_sip
[4];
/* sender IP address */
121
unsigned
char
ar_tha
[
ETH_ALEN
];
/* target hardware address */
122
unsigned
char
ar_tip
[4];
/* target IP address */
123
}
__packed
;
124
125
int
ovs_flow_init
(
void
);
126
void
ovs_flow_exit
(
void
);
127
128
struct
sw_flow
*
ovs_flow_alloc
(
void
);
129
void
ovs_flow_deferred_free
(
struct
sw_flow
*);
130
void
ovs_flow_free
(
struct
sw_flow
*flow);
131
132
struct
sw_flow_actions
*
ovs_flow_actions_alloc
(
const
struct
nlattr
*);
133
void
ovs_flow_deferred_free_acts
(
struct
sw_flow_actions
*);
134
135
int
ovs_flow_extract
(
struct
sk_buff
*,
u16
in_port,
struct
sw_flow_key
*,
136
int
*key_lenp);
137
void
ovs_flow_used
(
struct
sw_flow
*,
struct
sk_buff
*);
138
u64
ovs_flow_used_time
(
unsigned
long
flow_jiffies);
139
140
/* Upper bound on the length of a nlattr-formatted flow key. The longest
141
* nlattr-formatted flow key would be:
142
*
143
* struct pad nl hdr total
144
* ------ --- ------ -----
145
* OVS_KEY_ATTR_PRIORITY 4 -- 4 8
146
* OVS_KEY_ATTR_IN_PORT 4 -- 4 8
147
* OVS_KEY_ATTR_ETHERNET 12 -- 4 16
148
* OVS_KEY_ATTR_ETHERTYPE 2 2 4 8 (outer VLAN ethertype)
149
* OVS_KEY_ATTR_8021Q 4 -- 4 8
150
* OVS_KEY_ATTR_ENCAP 0 -- 4 4 (VLAN encapsulation)
151
* OVS_KEY_ATTR_ETHERTYPE 2 2 4 8 (inner VLAN ethertype)
152
* OVS_KEY_ATTR_IPV6 40 -- 4 44
153
* OVS_KEY_ATTR_ICMPV6 2 2 4 8
154
* OVS_KEY_ATTR_ND 28 -- 4 32
155
* -------------------------------------------------
156
* total 144
157
*/
158
#define FLOW_BUFSIZE 144
159
160
int
ovs_flow_to_nlattrs
(
const
struct
sw_flow_key
*,
struct
sk_buff
*);
161
int
ovs_flow_from_nlattrs
(
struct
sw_flow_key
*swkey,
int
*key_lenp,
162
const
struct
nlattr
*);
163
int
ovs_flow_metadata_from_nlattrs
(
u32
*
priority
,
u16
*in_port,
164
const
struct
nlattr
*);
165
166
#define MAX_ACTIONS_BUFSIZE (16 * 1024)
167
#define TBL_MIN_BUCKETS 1024
168
169
struct
flow_table
{
170
struct
flex_array
*
buckets
;
171
unsigned
int
count
,
n_buckets
;
172
struct
rcu_head
rcu
;
173
int
node_ver
;
174
u32
hash_seed
;
175
bool
keep_flows
;
176
};
177
178
static
inline
int
ovs_flow_tbl_count(
struct
flow_table
*
table
)
179
{
180
return
table->
count
;
181
}
182
183
static
inline
int
ovs_flow_tbl_need_to_expand(
struct
flow_table
*
table
)
184
{
185
return
(table->
count
> table->
n_buckets
);
186
}
187
188
struct
sw_flow
*
ovs_flow_tbl_lookup
(
struct
flow_table
*table,
189
struct
sw_flow_key
*
key
,
int
len);
190
void
ovs_flow_tbl_destroy
(
struct
flow_table
*table);
191
void
ovs_flow_tbl_deferred_destroy
(
struct
flow_table
*table);
192
struct
flow_table
*
ovs_flow_tbl_alloc
(
int
new_size);
193
struct
flow_table
*
ovs_flow_tbl_expand
(
struct
flow_table
*table);
194
struct
flow_table
*
ovs_flow_tbl_rehash
(
struct
flow_table
*table);
195
void
ovs_flow_tbl_insert
(
struct
flow_table
*table,
struct
sw_flow
*flow);
196
void
ovs_flow_tbl_remove
(
struct
flow_table
*table,
struct
sw_flow
*flow);
197
u32
ovs_flow_hash
(
const
struct
sw_flow_key
*
key
,
int
key_len
);
198
199
struct
sw_flow
*
ovs_flow_tbl_next
(
struct
flow_table
*table,
u32
*bucket,
u32
*
idx
);
200
extern
const
int
ovs_key_lens
[
OVS_KEY_ATTR_MAX
+ 1];
201
202
#endif
/* flow.h */
Generated on Thu Jan 10 2013 14:53:04 for Linux Kernel by
1.8.2