]> git.proxmox.com Git - ovs.git/blame - datapath/datapath.h
ofproto-dpif: Fix bad pointer dereference when deleting a bridge.
[ovs.git] / datapath / datapath.h
CommitLineData
a14bc59f 1/*
e0edde6f 2 * Copyright (c) 2007-2012 Nicira, Inc.
a14bc59f 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
a14bc59f
BP
17 */
18
064af421
BP
19#ifndef DATAPATH_H
20#define DATAPATH_H 1
21
22#include <asm/page.h>
23#include <linux/kernel.h>
24#include <linux/mutex.h>
064af421 25#include <linux/netdevice.h>
064af421 26#include <linux/skbuff.h>
821cb9fa 27#include <linux/u64_stats_sync.h>
dd8d6b8c
JG
28
29#include "checksum.h"
9cb8d24d 30#include "compat.h"
2a4999f3 31#include "flow.h"
6e0ce48e 32#include "vlan.h"
2a4999f3 33#include "vport.h"
f2459fe7 34
95b1d73a
PS
35#define DP_MAX_PORTS USHRT_MAX
36#define DP_VPORT_HASH_BUCKETS 1024
37
6ff686f2
PS
38#define SAMPLE_ACTION_DEPTH 3
39
67a78abe
BP
40/**
41 * struct dp_stats_percpu - per-cpu packet processing statistics for a given
42 * datapath.
67a78abe
BP
43 * @n_hit: Number of received packets for which a matching flow was found in
44 * the flow table.
45 * @n_miss: Number of received packets that had no matching flow in the flow
46 * table. The sum of @n_hit and @n_miss is the number of packets that have
47 * been received by the datapath.
48 * @n_lost: Number of received packets that had no matching flow in the flow
49 * table that could not be sent to userspace (normally due to an overflow in
50 * one of the datapath's queues).
67a78abe 51 */
064af421 52struct dp_stats_percpu {
064af421
BP
53 u64 n_hit;
54 u64 n_missed;
55 u64 n_lost;
821cb9fa 56 struct u64_stats_sync sync;
064af421
BP
57};
58
72b06300
BP
59/**
60 * struct datapath - datapath for flow-based packet switching
46c6a11d 61 * @rcu: RCU callback head for deferred destruction.
254f2dc8 62 * @list_node: Element in global 'dps' list.
cd2a59e9 63 * @table: Current flow table. Protected by ovs_mutex and RCU.
95b1d73a 64 * @ports: Hash table for ports. %OVSP_LOCAL port always exists. Protected by
cd2a59e9 65 * ovs_mutex and RCU.
72b06300 66 * @stats_percpu: Per-CPU datapath statistics.
2a4999f3 67 * @net: Reference to net namespace.
ed099e92
BP
68 *
69 * Context: See the comment on locking at the top of datapath.c for additional
70 * locking information.
72b06300 71 */
064af421 72struct datapath {
46c6a11d 73 struct rcu_head rcu;
254f2dc8 74 struct list_head list_node;
064af421 75
064af421 76 /* Flow table. */
3544358a 77 struct flow_table __rcu *table;
064af421 78
064af421 79 /* Switch ports. */
95b1d73a 80 struct hlist_head *ports;
064af421
BP
81
82 /* Stats. */
d3097eff 83 struct dp_stats_percpu __percpu *stats_percpu;
2a4999f3
PS
84
85#ifdef CONFIG_NET_NS
86 /* Network namespace ref. */
87 struct net *net;
88#endif
064af421
BP
89};
90
a063b0df
JG
91/**
92 * struct ovs_skb_cb - OVS data in skb CB
3976f6d5 93 * @flow: The flow associated with this packet. May be %NULL if no flow.
d1d71a36 94 * @pkt_key: The flow information extracted from the packet. Must be nonnull.
356af50b
KM
95 * @tun_key: Key for the tunnel that encapsulated this packet. NULL if the
96 * packet is not being tunneled.
a063b0df
JG
97 * @ip_summed: Consistently stores L4 checksumming status across different
98 * kernel versions.
c3729ee4
JG
99 * @csum_start: Stores the offset from which to start checksumming independent
100 * of the transport header on all kernel versions.
b9298d3f 101 * packet was not received on a tunnel.
6e0ce48e
JG
102 * @vlan_tci: Provides a substitute for the skb->vlan_tci field on kernels
103 * before 2.6.27.
a063b0df
JG
104 */
105struct ovs_skb_cb {
3976f6d5 106 struct sw_flow *flow;
d1d71a36 107 struct sw_flow_key *pkt_key;
356af50b 108 struct ovs_key_ipv4_tunnel *tun_key;
dd8d6b8c 109#ifdef NEED_CSUM_NORMALIZE
659586ef 110 enum csum_type ip_summed;
c3729ee4 111 u16 csum_start;
dd8d6b8c 112#endif
6e0ce48e
JG
113#ifdef NEED_VLAN_FIELD
114 u16 vlan_tci;
115#endif
a063b0df
JG
116};
117#define OVS_CB(skb) ((struct ovs_skb_cb *)(skb)->cb)
118
856081f6
BP
119/**
120 * struct dp_upcall - metadata to include with a packet to send to userspace
df2c07f4
JP
121 * @cmd: One of %OVS_PACKET_CMD_*.
122 * @key: Becomes %OVS_PACKET_ATTR_KEY. Must be nonnull.
e995e3df 123 * @userdata: If nonnull, its variable-length value is passed to userspace as
98403001 124 * %OVS_PACKET_ATTR_USERDATA.
28aea917 125 * @portid: Netlink PID to which packet should be sent. If @portid is 0 then no
98403001
BP
126 * packet is sent and the packet is accounted in the datapath's @n_lost
127 * counter.
6ff686f2 128 */
856081f6 129struct dp_upcall_info {
982b8810 130 u8 cmd;
856081f6 131 const struct sw_flow_key *key;
98403001 132 const struct nlattr *userdata;
28aea917 133 u32 portid;
856081f6
BP
134};
135
2a4999f3
PS
136/**
137 * struct ovs_net - Per net-namespace data for ovs.
138 * @dps: List of datapaths to enable dumping them all out.
139 * Protected by genl_mutex.
140 * @vport_net: Per network namespace data for vport.
141 */
142struct ovs_net {
143 struct list_head dps;
85c9de19 144 struct vport_net vport_net;
cd2a59e9 145 struct work_struct dp_notify_work;
2a4999f3
PS
146};
147
148extern int ovs_net_id;
cd2a59e9
PS
149void ovs_lock(void);
150void ovs_unlock(void);
151
152#ifdef CONFIG_LOCKDEP
153int lockdep_ovsl_is_held(void);
154#else
155#define lockdep_ovsl_is_held() 1
156#endif
157
158#define ASSERT_OVSL() WARN_ON(unlikely(!lockdep_ovsl_is_held()))
159#define ovsl_dereference(p) \
160 rcu_dereference_protected(p, lockdep_ovsl_is_held())
2a4999f3
PS
161
162static inline struct net *ovs_dp_get_net(struct datapath *dp)
163{
164 return read_pnet(&dp->net);
165}
166
167static inline void ovs_dp_set_net(struct datapath *dp, struct net *net)
168{
169 write_pnet(&dp->net, net);
170}
171
95b1d73a
PS
172struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no);
173
174static inline struct vport *ovs_vport_rcu(const struct datapath *dp, int port_no)
175{
176 WARN_ON_ONCE(!rcu_read_lock_held());
177 return ovs_lookup_vport(dp, port_no);
178}
179
cd2a59e9 180static inline struct vport *ovs_vport_ovsl_rcu(const struct datapath *dp, int port_no)
95b1d73a 181{
cd2a59e9 182 WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_ovsl_is_held());
95b1d73a
PS
183 return ovs_lookup_vport(dp, port_no);
184}
185
cd2a59e9 186static inline struct vport *ovs_vport_ovsl(const struct datapath *dp, int port_no)
95b1d73a 187{
cd2a59e9 188 ASSERT_OVSL();
95b1d73a
PS
189 return ovs_lookup_vport(dp, port_no);
190}
191
850b6b3b
JG
192extern struct notifier_block ovs_dp_device_notifier;
193extern struct genl_multicast_group ovs_dp_vport_multicast_group;
064af421 194
850b6b3b
JG
195void ovs_dp_process_received_packet(struct vport *, struct sk_buff *);
196void ovs_dp_detach_port(struct vport *);
197int ovs_dp_upcall(struct datapath *, struct sk_buff *,
198 const struct dp_upcall_info *);
064af421 199
850b6b3b 200const char *ovs_dp_name(const struct datapath *dp);
28aea917 201struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 portid, u32 seq,
f14d8083 202 u8 cmd);
064af421 203
850b6b3b 204int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb);
cd2a59e9 205void ovs_dp_notify_wq(struct work_struct *work);
1b936472
AZ
206
207#define OVS_NLERR(fmt, ...) \
db0fe396 208 pr_info_once("netlink: " fmt, ##__VA_ARGS__)
1b936472 209
064af421 210#endif /* datapath.h */