Blame view
net/openvswitch/datapath.h
6.5 KB
ccb1352e7 net: Add Open vSw... |
1 |
/* |
971427f35 openvswitch: Add ... |
2 |
* Copyright (c) 2007-2014 Nicira, Inc. |
ccb1352e7 net: Add Open vSw... |
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 |
* * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA */ #ifndef DATAPATH_H #define DATAPATH_H 1 #include <asm/page.h> #include <linux/kernel.h> #include <linux/mutex.h> #include <linux/netdevice.h> #include <linux/skbuff.h> #include <linux/u64_stats_sync.h> |
1d8fff907 ip_tunnel: Make o... |
28 |
#include <net/ip_tunnels.h> |
ccb1352e7 net: Add Open vSw... |
29 |
|
7f8a436ea openvswitch: Add ... |
30 |
#include "conntrack.h" |
ccb1352e7 net: Add Open vSw... |
31 |
#include "flow.h" |
e64457191 openvswitch: Rest... |
32 |
#include "flow_table.h" |
ccb1352e7 net: Add Open vSw... |
33 |
|
15eac2a74 openvswitch: Incr... |
34 35 |
#define DP_MAX_PORTS USHRT_MAX #define DP_VPORT_HASH_BUCKETS 1024 |
ccb1352e7 net: Add Open vSw... |
36 37 38 39 40 41 42 43 44 45 46 47 48 |
#define SAMPLE_ACTION_DEPTH 3 /** * struct dp_stats_percpu - per-cpu packet processing statistics for a given * datapath. * @n_hit: Number of received packets for which a matching flow was found in * the flow table. * @n_miss: Number of received packets that had no matching flow in the flow * table. The sum of @n_hit and @n_miss is the number of packets that have * been received by the datapath. * @n_lost: Number of received packets that had no matching flow in the flow * table that could not be sent to userspace (normally due to an overflow in * one of the datapath's queues). |
1bd7116f1 openvswitch: coll... |
49 50 51 |
* @n_mask_hit: Number of masks looked up for flow match. * @n_mask_hit / (@n_hit + @n_missed) will be the average masks looked * up per packet. |
ccb1352e7 net: Add Open vSw... |
52 53 54 55 56 |
*/ struct dp_stats_percpu { u64 n_hit; u64 n_missed; u64 n_lost; |
1bd7116f1 openvswitch: coll... |
57 |
u64 n_mask_hit; |
df9d9fdf8 openvswitch: rena... |
58 |
struct u64_stats_sync syncp; |
ccb1352e7 net: Add Open vSw... |
59 60 61 62 63 64 |
}; /** * struct datapath - datapath for flow-based packet switching * @rcu: RCU callback head for deferred destruction. * @list_node: Element in global 'dps' list. |
b637e4988 openvswitch: Move... |
65 |
* @table: flow table. |
15eac2a74 openvswitch: Incr... |
66 |
* @ports: Hash table for ports. %OVSP_LOCAL port always exists. Protected by |
8e4e1713e openvswitch: Simp... |
67 |
* ovs_mutex and RCU. |
ccb1352e7 net: Add Open vSw... |
68 |
* @stats_percpu: Per-CPU datapath statistics. |
46df7b814 openvswitch: Add ... |
69 |
* @net: Reference to net namespace. |
3a927bc7c ovs: propagate pe... |
70 71 |
* @max_headroom: the maximum headroom of all vports in this datapath; it will * be used by all the internal vports in this dp. |
ccb1352e7 net: Add Open vSw... |
72 73 74 75 76 77 78 79 80 |
* * Context: See the comment on locking at the top of datapath.c for additional * locking information. */ struct datapath { struct rcu_head rcu; struct list_head list_node; /* Flow table. */ |
b637e4988 openvswitch: Move... |
81 |
struct flow_table table; |
ccb1352e7 net: Add Open vSw... |
82 83 |
/* Switch ports. */ |
15eac2a74 openvswitch: Incr... |
84 |
struct hlist_head *ports; |
ccb1352e7 net: Add Open vSw... |
85 86 87 |
/* Stats. */ struct dp_stats_percpu __percpu *stats_percpu; |
46df7b814 openvswitch: Add ... |
88 |
|
46df7b814 openvswitch: Add ... |
89 |
/* Network namespace ref. */ |
0c5c9fb55 net: Introduce po... |
90 |
possible_net_t net; |
43d4be9cb openvswitch: Allo... |
91 92 |
u32 user_features; |
3a927bc7c ovs: propagate pe... |
93 94 |
u32 max_headroom; |
ccb1352e7 net: Add Open vSw... |
95 96 97 98 |
}; /** * struct ovs_skb_cb - OVS data in skb CB |
83c8df26a openvswitch: refa... |
99 100 |
* @input_vport: The original vport packet came in on. This value is cached * when a packet is received by OVS. |
7f8a436ea openvswitch: Add ... |
101 |
* @mru: The maximum received fragement size; 0 if the packet is not |
f2a4d086e openvswitch: Add ... |
102 |
* @cutlen: The number of bytes from the packet end to be removed. |
7f8a436ea openvswitch: Add ... |
103 |
* fragmented. |
ccb1352e7 net: Add Open vSw... |
104 105 |
*/ struct ovs_skb_cb { |
83c8df26a openvswitch: refa... |
106 |
struct vport *input_vport; |
7f8a436ea openvswitch: Add ... |
107 |
u16 mru; |
f2a4d086e openvswitch: Add ... |
108 |
u32 cutlen; |
ccb1352e7 net: Add Open vSw... |
109 110 111 112 113 114 |
}; #define OVS_CB(skb) ((struct ovs_skb_cb *)(skb)->cb) /** * struct dp_upcall - metadata to include with a packet to send to userspace * @cmd: One of %OVS_PACKET_CMD_*. |
4490108b4 openvswitch: Allo... |
115 |
* @userdata: If nonnull, its variable-length value is passed to userspace as |
ccb1352e7 net: Add Open vSw... |
116 |
* %OVS_PACKET_ATTR_USERDATA. |
e8eedb85b openvswitch: Remo... |
117 118 |
* @portid: Netlink portid to which packet should be sent. If @portid is 0 * then no packet is sent and the packet is accounted in the datapath's @n_lost |
ccb1352e7 net: Add Open vSw... |
119 |
* counter. |
8f0aad6f3 openvswitch: Exte... |
120 |
* @egress_tun_info: If nonnull, becomes %OVS_PACKET_ATTR_EGRESS_TUN_KEY. |
7f8a436ea openvswitch: Add ... |
121 |
* @mru: If not zero, Maximum received IP fragment size. |
ccb1352e7 net: Add Open vSw... |
122 123 |
*/ struct dp_upcall_info { |
4c2227984 ip-tunnel: Use AP... |
124 |
struct ip_tunnel_info *egress_tun_info; |
ccb1352e7 net: Add Open vSw... |
125 |
const struct nlattr *userdata; |
ccea74457 openvswitch: incl... |
126 127 |
const struct nlattr *actions; int actions_len; |
15e473046 netlink: Rename p... |
128 |
u32 portid; |
e8eedb85b openvswitch: Remo... |
129 |
u8 cmd; |
7f8a436ea openvswitch: Add ... |
130 |
u16 mru; |
ccb1352e7 net: Add Open vSw... |
131 |
}; |
8e4e1713e openvswitch: Simp... |
132 133 134 135 136 137 138 139 |
/** * struct ovs_net - Per net-namespace data for ovs. * @dps: List of datapaths to enable dumping them all out. * Protected by genl_mutex. */ struct ovs_net { struct list_head dps; struct work_struct dp_notify_work; |
c2ac66735 openvswitch: Allo... |
140 141 142 |
/* Module reference for configuring conntrack. */ bool xt_label; |
8e4e1713e openvswitch: Simp... |
143 144 145 146 147 148 149 150 151 152 153 |
}; extern int ovs_net_id; void ovs_lock(void); void ovs_unlock(void); #ifdef CONFIG_LOCKDEP int lockdep_ovsl_is_held(void); #else #define lockdep_ovsl_is_held() 1 #endif |
80019d310 net: Remove unlik... |
154 |
#define ASSERT_OVSL() WARN_ON(!lockdep_ovsl_is_held()) |
8e4e1713e openvswitch: Simp... |
155 156 |
#define ovsl_dereference(p) \ rcu_dereference_protected(p, lockdep_ovsl_is_held()) |
663efa369 openvswitch: Sile... |
157 158 |
#define rcu_dereference_ovsl(p) \ rcu_dereference_check(p, lockdep_ovsl_is_held()) |
8e4e1713e openvswitch: Simp... |
159 |
|
12eb18f71 openvswitch: Cons... |
160 |
static inline struct net *ovs_dp_get_net(const struct datapath *dp) |
46df7b814 openvswitch: Add ... |
161 162 163 164 165 166 167 168 |
{ return read_pnet(&dp->net); } static inline void ovs_dp_set_net(struct datapath *dp, struct net *net) { write_pnet(&dp->net, net); } |
8e4e1713e openvswitch: Simp... |
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no); static inline struct vport *ovs_vport_rcu(const struct datapath *dp, int port_no) { WARN_ON_ONCE(!rcu_read_lock_held()); return ovs_lookup_vport(dp, port_no); } static inline struct vport *ovs_vport_ovsl_rcu(const struct datapath *dp, int port_no) { WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_ovsl_is_held()); return ovs_lookup_vport(dp, port_no); } static inline struct vport *ovs_vport_ovsl(const struct datapath *dp, int port_no) { ASSERT_OVSL(); return ovs_lookup_vport(dp, port_no); } |
ccb1352e7 net: Add Open vSw... |
188 |
extern struct notifier_block ovs_dp_device_notifier; |
68eb55031 genetlink: pass f... |
189 |
extern struct genl_family dp_vport_genl_family; |
ccb1352e7 net: Add Open vSw... |
190 |
|
8c8b1b83f openvswitch: Use ... |
191 |
void ovs_dp_process_packet(struct sk_buff *skb, struct sw_flow_key *key); |
ccb1352e7 net: Add Open vSw... |
192 193 |
void ovs_dp_detach_port(struct vport *); int ovs_dp_upcall(struct datapath *, struct sk_buff *, |
f2a4d086e openvswitch: Add ... |
194 195 |
const struct sw_flow_key *, const struct dp_upcall_info *, uint32_t cutlen); |
ccb1352e7 net: Add Open vSw... |
196 |
|
971427f35 openvswitch: Add ... |
197 |
const char *ovs_dp_name(const struct datapath *dp); |
ccb1352e7 net: Add Open vSw... |
198 199 |
struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 pid, u32 seq, u8 cmd); |
2ff3e4e48 openvswitch: Remo... |
200 |
int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb, |
12eb18f71 openvswitch: Cons... |
201 |
const struct sw_flow_actions *, struct sw_flow_key *); |
971427f35 openvswitch: Add ... |
202 |
|
8e4e1713e openvswitch: Simp... |
203 |
void ovs_dp_notify_wq(struct work_struct *work); |
03f0d916a openvswitch: Mega... |
204 |
|
971427f35 openvswitch: Add ... |
205 206 |
int action_fifos_init(void); void action_fifos_exit(void); |
be26b9a88 openvswitch: Move... |
207 208 209 |
/* 'KEY' must not have any bits set outside of the 'MASK' */ #define OVS_MASKED(OLD, KEY, MASK) ((KEY) | ((OLD) & ~(MASK))) #define OVS_SET_MASKED(OLD, KEY, MASK) ((OLD) = OVS_MASKED(OLD, KEY, MASK)) |
05da5898a openvswitch: Add ... |
210 |
#define OVS_NLERR(logging_allowed, fmt, ...) \ |
1815a8831 openvswitch: Use ... |
211 |
do { \ |
05da5898a openvswitch: Add ... |
212 213 214 |
if (logging_allowed && net_ratelimit()) \ pr_info("netlink: " fmt " ", ##__VA_ARGS__); \ |
1815a8831 openvswitch: Use ... |
215 |
} while (0) |
ccb1352e7 net: Add Open vSw... |
216 |
#endif /* datapath.h */ |