]> git.proxmox.com Git - mirror_ovs.git/blame - datapath/tunnel.h
datapath: Reformat copyright messages.
[mirror_ovs.git] / datapath / tunnel.h
CommitLineData
d1eb60cc 1/*
a9a29d22 2 * Copyright (c) 2007-2011 Nicira Networks.
d1eb60cc 3 *
a9a29d22
JG
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
d1eb60cc
JG
17 */
18
19#ifndef TUNNEL_H
20#define TUNNEL_H 1
21
842cf6f4
JG
22#include <linux/version.h>
23
24#include "flow.h"
d1eb60cc 25#include "openvswitch/tunnel.h"
d1eb60cc
JG
26#include "vport.h"
27
5214f5c4
JG
28/*
29 * The absolute minimum fragment size. Note that there are many other
30 * definitions of the minimum MTU.
31 */
d1eb60cc
JG
32#define IP_MIN_MTU 68
33
34/*
842cf6f4 35 * One of these goes in struct tnl_ops and in tnl_find_port().
d1eb60cc 36 * These values are in the same namespace as other TNL_T_* values, so
842cf6f4
JG
37 * only the least significant 10 bits are available to define protocol
38 * identifiers.
d1eb60cc
JG
39 */
40#define TNL_T_PROTO_GRE 0
e90b1cf9 41#define TNL_T_PROTO_CAPWAP 1
d1eb60cc 42
842cf6f4 43/* These flags are only needed when calling tnl_find_port(). */
d1eb60cc
JG
44#define TNL_T_KEY_EXACT (1 << 10)
45#define TNL_T_KEY_MATCH (1 << 11)
d1eb60cc 46
c19e6535 47/* Private flags not exposed to userspace in this form. */
6455100f
PS
48#define TNL_F_IN_KEY_MATCH (1 << 16) /* Store the key in tun_id to
49 * match in flow table. */
50#define TNL_F_OUT_KEY_ACTION (1 << 17) /* Get the key from a SET_TUNNEL
51 * action. */
c19e6535
BP
52
53/* All public tunnel flags. */
54#define TNL_F_PUBLIC (TNL_F_CSUM | TNL_F_TOS_INHERIT | TNL_F_TTL_INHERIT | \
dc432c2e
AE
55 TNL_F_DF_INHERIT | TNL_F_DF_DEFAULT | TNL_F_PMTUD | \
56 TNL_F_HDR_CACHE | TNL_F_IPSEC)
c19e6535 57
f686a33a
PS
58/**
59 * struct port_lookup_key - Tunnel port key, used as hash table key.
60 * @in_key: Key to match on input, 0 for wildcard.
61 * @saddr: IPv4 source address to match, 0 to accept any source address.
62 * @daddr: IPv4 destination of tunnel.
63 * @tunnel_type: Set of TNL_T_* flags that define lookup.
64 */
65struct port_lookup_key {
66 __be64 in_key;
67 __be32 saddr;
68 __be32 daddr;
69 u32 tunnel_type;
70};
71
6455100f 72#define PORT_KEY_LEN (offsetof(struct port_lookup_key, tunnel_type) + \
bd85a68f
PS
73 FIELD_SIZEOF(struct port_lookup_key, tunnel_type))
74
c19e6535
BP
75/**
76 * struct tnl_mutable_config - modifiable configuration for a tunnel.
f686a33a
PS
77 * @key: Used as key for tunnel port. Configured via OVS_TUNNEL_ATTR_*
78 * attributes.
c19e6535
BP
79 * @rcu: RCU callback head for deferred destruction.
80 * @seq: Sequence number for distinguishing configuration versions.
c19e6535
BP
81 * @tunnel_hlen: Tunnel header length.
82 * @eth_addr: Source address for packets generated by tunnel itself
83 * (e.g. ICMP fragmentation needed messages).
c19e6535
BP
84 * @out_key: Key to use on output, 0 if this tunnel has no fixed output key.
85 * @flags: TNL_F_* flags.
c19e6535
BP
86 * @tos: IPv4 TOS value to use for tunnel, 0 if no fixed TOS.
87 * @ttl: IPv4 TTL value to use for tunnel, 0 if no fixed TTL.
88 */
d1eb60cc 89struct tnl_mutable_config {
f686a33a 90 struct port_lookup_key key;
d1eb60cc
JG
91 struct rcu_head rcu;
92
c19e6535 93 unsigned seq;
d1eb60cc 94
c19e6535 95 unsigned tunnel_hlen;
842cf6f4
JG
96
97 unsigned char eth_addr[ETH_ALEN];
d1eb60cc 98
df2c07f4 99 /* Configured via OVS_TUNNEL_ATTR_* attributes. */
c19e6535
BP
100 __be64 out_key;
101 u32 flags;
c19e6535
BP
102 u8 tos;
103 u8 ttl;
b37e6334
BP
104
105 /* Multicast configuration. */
106 int mlink;
d1eb60cc
JG
107};
108
109struct tnl_ops {
842cf6f4
JG
110 u32 tunnel_type; /* Put the TNL_T_PROTO_* type in here. */
111 u8 ipproto; /* The IP protocol for the tunnel. */
d1eb60cc 112
5214f5c4 113 /*
842cf6f4 114 * Returns the length of the tunnel header that will be added in
5214f5c4
JG
115 * build_header() (i.e. excludes the IP header). Returns a negative
116 * error code if the configuration is invalid.
117 */
c19e6535 118 int (*hdr_len)(const struct tnl_mutable_config *);
5214f5c4
JG
119
120 /*
842cf6f4
JG
121 * Builds the static portion of the tunnel header, which is stored in
122 * the header cache. In general the performance of this function is
123 * not too important as we try to only call it when building the cache
124 * so it is preferable to shift as much work as possible here. However,
125 * in some circumstances caching is disabled and this function will be
126 * called for every packet, so try not to make it too slow.
127 */
128 void (*build_header)(const struct vport *,
129 const struct tnl_mutable_config *, void *header);
130
131 /*
132 * Updates the cached header of a packet to match the actual packet
133 * data. Typical things that might need to be updated are length,
134 * checksum, etc. The IP header will have already been updated and this
135 * is the final step before transmission. Returns a linked list of
136 * completed SKBs (multiple packets may be generated in the event
137 * of fragmentation).
138 */
139 struct sk_buff *(*update_header)(const struct vport *,
140 const struct tnl_mutable_config *,
141 struct dst_entry *, struct sk_buff *);
142};
143
144#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
145/*
146 * On these kernels we have a fast mechanism to tell if the ARP cache for a
147 * particular destination has changed.
148 */
149#define HAVE_HH_SEQ
150#endif
151#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
152/*
153 * On these kernels we have a fast mechanism to tell if the routing table
154 * has changed.
155 */
156#define HAVE_RT_GENID
157#endif
158#if !defined(HAVE_HH_SEQ) || !defined(HAVE_RT_GENID)
159/* If we can't detect all system changes directly we need to use a timeout. */
160#define NEED_CACHE_TIMEOUT
161#endif
162struct tnl_cache {
163 struct rcu_head rcu;
164
165 int len; /* Length of data to be memcpy'd from cache. */
c2310ade 166 int hh_len; /* Hardware hdr length, cached from hh_cache. */
842cf6f4 167
6455100f
PS
168 /* Sequence number of mutable->seq from which this cache was
169 * generated. */
842cf6f4
JG
170 unsigned mutable_seq;
171
172#ifdef HAVE_HH_SEQ
173 /*
174 * The sequence number from the seqlock protecting the hardware header
175 * cache (in the ARP cache). Since every write increments the counter
176 * this gives us an easy way to tell if it has changed.
177 */
178 unsigned hh_seq;
179#endif
180
181#ifdef NEED_CACHE_TIMEOUT
182 /*
183 * If we don't have direct mechanisms to detect all important changes in
184 * the system fall back to an expiration time. This expiration time
185 * can be relatively short since at high rates there will be millions of
186 * packets per second, so we'll still get plenty of benefit from the
187 * cache. Note that if something changes we may blackhole packets
188 * until the expiration time (depending on what changed and the kernel
189 * version we may be able to detect the change sooner). Expiration is
190 * expressed as a time in jiffies.
5214f5c4 191 */
842cf6f4
JG
192 unsigned long expiration;
193#endif
194
195 /*
196 * The routing table entry that is the result of looking up the tunnel
197 * endpoints. It also contains a sequence number (called a generation
198 * ID) that can be compared to a global sequence to tell if the routing
199 * table has changed (and therefore there is a potential that this
200 * cached route has been invalidated).
201 */
202 struct rtable *rt;
203
204 /*
205 * If the output device for tunnel traffic is an OVS internal device,
206 * the flow of that datapath. Since all tunnel traffic will have the
207 * same headers this allows us to cache the flow lookup. NULL if the
208 * output device is not OVS or if there is no flow installed.
209 */
210 struct sw_flow *flow;
211
212 /* The cached header follows after padding for alignment. */
d1eb60cc
JG
213};
214
215struct tnl_vport {
216 struct rcu_head rcu;
3544358a 217 struct hlist_node hash_node;
d1eb60cc
JG
218
219 char name[IFNAMSIZ];
220 const struct tnl_ops *tnl_ops;
221
e1040c77 222 struct tnl_mutable_config __rcu *mutable;
5214f5c4 223
842cf6f4
JG
224 /*
225 * ID of last fragment sent (for tunnel protocols with direct support
226 * fragmentation). If the protocol relies on IP fragmentation then
227 * this is not needed.
228 */
5214f5c4 229 atomic_t frag_id;
842cf6f4
JG
230
231 spinlock_t cache_lock;
6455100f 232 struct tnl_cache __rcu *cache; /* Protected by RCU/cache_lock. */
842cf6f4
JG
233
234#ifdef NEED_CACHE_TIMEOUT
235 /*
236 * If we must rely on expiration time to invalidate the cache, this is
237 * the interval. It is randomized within a range (defined by
238 * MAX_CACHE_EXP in tunnel.c) to avoid synchronized expirations caused
239 * by creation of a large number of tunnels at a one time.
240 */
241 unsigned long cache_exp_interval;
242#endif
d1eb60cc
JG
243};
244
94903c98 245struct vport *tnl_create(const struct vport_parms *, const struct vport_ops *,
d1eb60cc 246 const struct tnl_ops *);
3544358a 247void tnl_destroy(struct vport *);
c19e6535
BP
248
249int tnl_set_options(struct vport *, struct nlattr *);
250int tnl_get_options(const struct vport *, struct sk_buff *);
251
d1eb60cc
JG
252int tnl_set_addr(struct vport *vport, const unsigned char *addr);
253const char *tnl_get_name(const struct vport *vport);
254const unsigned char *tnl_get_addr(const struct vport *vport);
d1eb60cc 255int tnl_send(struct vport *vport, struct sk_buff *skb);
aae369c7 256void tnl_rcv(struct vport *vport, struct sk_buff *skb, u8 tos);
d1eb60cc 257
b9298d3f 258struct vport *tnl_find_port(__be32 saddr, __be32 daddr, __be64 key,
d1eb60cc
JG
259 int tunnel_type,
260 const struct tnl_mutable_config **mutable);
261bool tnl_frag_needed(struct vport *vport,
262 const struct tnl_mutable_config *mutable,
b9298d3f 263 struct sk_buff *skb, unsigned int mtu, __be64 flow_key);
842cf6f4 264void tnl_free_linked_skbs(struct sk_buff *skb);
d1eb60cc 265
3544358a
PS
266int tnl_init(void);
267void tnl_exit(void);
d1eb60cc
JG
268static inline struct tnl_vport *tnl_vport_priv(const struct vport *vport)
269{
270 return vport_priv(vport);
271}
272
842cf6f4 273
d1eb60cc 274#endif /* tunnel.h */