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