]> git.proxmox.com Git - mirror_ovs.git/blame - datapath/vport.h
ovn-northd.8: Correct description of sending out inport.
[mirror_ovs.git] / datapath / vport.h
CommitLineData
f2459fe7 1/*
e0edde6f 2 * Copyright (c) 2007-2012 Nicira, Inc.
f2459fe7 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
f2459fe7
JG
17 */
18
19#ifndef VPORT_H
20#define VPORT_H 1
21
a0049ffc 22#include <linux/if_tunnel.h>
f2459fe7 23#include <linux/list.h>
2a4999f3 24#include <linux/netlink.h>
077257b8 25#include <linux/openvswitch.h>
beb1c69a 26#include <linux/reciprocal_div.h>
f2459fe7
JG
27#include <linux/skbuff.h>
28#include <linux/spinlock.h>
821cb9fa 29#include <linux/u64_stats_sync.h>
f2459fe7 30
f2459fe7 31struct vport;
94903c98 32struct vport_parms;
f2459fe7
JG
33
34/* The following definitions are for users of the vport subsytem: */
85c9de19
PS
35struct vport_net {
36 struct vport __rcu *gre_vport;
85c9de19 37};
f2459fe7 38
850b6b3b
JG
39int ovs_vport_init(void);
40void ovs_vport_exit(void);
f2459fe7 41
850b6b3b
JG
42struct vport *ovs_vport_add(const struct vport_parms *);
43void ovs_vport_del(struct vport *);
f2459fe7 44
f1f60b85 45struct vport *ovs_vport_locate(const struct net *net, const char *name);
f2459fe7 46
850b6b3b 47void ovs_vport_get_stats(struct vport *, struct ovs_vport_stats *);
f2459fe7 48
850b6b3b
JG
49int ovs_vport_set_options(struct vport *, struct nlattr *options);
50int ovs_vport_get_options(const struct vport *, struct sk_buff *);
f2459fe7 51
f1f60b85 52int ovs_vport_set_upcall_portids(struct vport *, const struct nlattr *pids);
beb1c69a
AW
53int ovs_vport_get_upcall_portids(const struct vport *, struct sk_buff *);
54u32 ovs_vport_find_upcall_portid(const struct vport *, struct sk_buff *);
55
850b6b3b 56int ovs_vport_send(struct vport *, struct sk_buff *);
f2459fe7 57
8b7ea2d4
WZ
58int ovs_tunnel_get_egress_info(struct ovs_tunnel_info *egress_tun_info,
59 struct net *net,
60 const struct ovs_tunnel_info *tun_info,
61 u8 ipproto,
62 u32 skb_mark,
63 __be16 tp_src,
64 __be16 tp_dst);
65int ovs_vport_get_egress_tun_info(struct vport *vport, struct sk_buff *skb,
66 struct ovs_tunnel_info *info);
67
f2459fe7 68/* The following definitions are for implementers of vport devices: */
f2459fe7 69struct vport_err_stats {
f3e54aa7
LR
70 atomic_long_t rx_dropped;
71 atomic_long_t rx_errors;
72 atomic_long_t tx_dropped;
73 atomic_long_t tx_errors;
f2459fe7 74};
f3e54aa7 75
beb1c69a
AW
76/**
77 * struct vport_portids - array of netlink portids of a vport.
78 * must be protected by rcu.
79 * @rn_ids: The reciprocal value of @n_ids.
80 * @rcu: RCU callback head for deferred destruction.
81 * @n_ids: Size of @ids array.
82 * @ids: Array storing the Netlink socket pids to be used for packets received
83 * on this port that miss the flow table.
84 */
85struct vport_portids {
86 struct reciprocal_value rn_ids;
87 struct rcu_head rcu;
88 u32 n_ids;
89 u32 ids[];
90};
f2459fe7 91
e779d8d9
BP
92/**
93 * struct vport - one port within a datapath
057dd6d2 94 * @rcu: RCU callback head for deferred destruction.
e779d8d9 95 * @dp: Datapath to which this port belongs.
beb1c69a 96 * @upcall_portids: RCU protected 'struct vport_portids'.
3da83627 97 * @port_no: Index into @dp's @ports array.
e779d8d9 98 * @hash_node: Element in @dev_table hash table in vport.c.
95b1d73a 99 * @dp_hash_node: Element in @datapath->ports hash table in datapath.c.
e779d8d9 100 * @ops: Class structure.
f613a0d7 101 * @percpu_stats: Points to per-CPU statistics used and maintained by vport
f613a0d7 102 * @err_stats: Points to error statistics used and maintained by vport
cabd5516 103 * @detach_list: list used for detaching vport in net-exit call.
e779d8d9 104 */
f2459fe7 105struct vport {
057dd6d2 106 struct rcu_head rcu;
e779d8d9 107 struct datapath *dp;
beb1c69a 108 struct vport_portids __rcu *upcall_portids;
3da83627 109 u16 port_no;
e779d8d9 110
f2459fe7 111 struct hlist_node hash_node;
95b1d73a 112 struct hlist_node dp_hash_node;
f2459fe7 113 const struct vport_ops *ops;
f2459fe7 114
e2f3178f 115 struct pcpu_sw_netstats __percpu *percpu_stats;
7d16c847 116
f2459fe7 117 struct vport_err_stats err_stats;
cabd5516 118 struct list_head detach_list;
f2459fe7
JG
119};
120
94903c98
BP
121/**
122 * struct vport_parms - parameters for creating a new vport
123 *
124 * @name: New vport's name.
125 * @type: New vport's type.
df2c07f4 126 * @options: %OVS_VPORT_ATTR_OPTIONS attribute from Netlink message, %NULL if
c19e6535 127 * none was supplied.
e779d8d9
BP
128 * @dp: New vport's datapath.
129 * @port_no: New vport's port number.
94903c98
BP
130 */
131struct vport_parms {
132 const char *name;
df2c07f4 133 enum ovs_vport_type type;
c19e6535 134 struct nlattr *options;
e779d8d9 135
850b6b3b 136 /* For ovs_vport_alloc(). */
e779d8d9
BP
137 struct datapath *dp;
138 u16 port_no;
beb1c69a 139 struct nlattr *upcall_portids;
94903c98
BP
140};
141
f2459fe7
JG
142/**
143 * struct vport_ops - definition of a type of virtual port
144 *
df2c07f4 145 * @type: %OVS_VPORT_TYPE_* value for this type of virtual port.
94903c98 146 * @create: Create a new vport configured as specified. On success returns
850b6b3b 147 * a new vport allocated with ovs_vport_alloc(), otherwise an ERR_PTR() value.
057dd6d2
BP
148 * @destroy: Destroys a vport. Must call vport_free() on the vport but not
149 * before an RCU grace period has elapsed.
c19e6535
BP
150 * @set_options: Modify the configuration of an existing vport. May be %NULL
151 * if modification is not supported.
152 * @get_options: Appends vport-specific attributes for the configuration of an
153 * existing vport to a &struct sk_buff. May be %NULL for a vport that does not
154 * have any configuration.
f2459fe7 155 * @get_name: Get the device's name.
be7cd27e
PS
156 * @send: Send a packet on the device. Returns the length of the packet sent,
157 * zero for dropped packets or negative for error.
7d16c847
PS
158 * @get_egress_tun_info: Get the egress tunnel 5-tuple and other info for
159 * a packet.
f2459fe7
JG
160 */
161struct vport_ops {
df2c07f4 162 enum ovs_vport_type type;
f2459fe7 163
cd2a59e9 164 /* Called with ovs_mutex. */
94903c98 165 struct vport *(*create)(const struct vport_parms *);
3544358a 166 void (*destroy)(struct vport *);
f2459fe7 167
c19e6535
BP
168 int (*set_options)(struct vport *, struct nlattr *);
169 int (*get_options)(const struct vport *, struct sk_buff *);
170
cd2a59e9 171 /* Called with rcu_read_lock or ovs_mutex. */
f2459fe7 172 const char *(*get_name)(const struct vport *);
d5de5b0d 173
f2459fe7 174 int (*send)(struct vport *, struct sk_buff *);
8b7ea2d4
WZ
175 int (*get_egress_tun_info)(struct vport *, struct sk_buff *,
176 struct ovs_tunnel_info *);
5a38795f
TG
177
178 struct module *owner;
179 struct list_head list;
f2459fe7
JG
180};
181
182enum vport_err_type {
183 VPORT_E_RX_DROPPED,
184 VPORT_E_RX_ERROR,
f2459fe7
JG
185 VPORT_E_TX_DROPPED,
186 VPORT_E_TX_ERROR,
f2459fe7
JG
187};
188
850b6b3b
JG
189struct vport *ovs_vport_alloc(int priv_size, const struct vport_ops *,
190 const struct vport_parms *);
191void ovs_vport_free(struct vport *);
c405d282 192void ovs_vport_deferred_free(struct vport *vport);
f2459fe7
JG
193
194#define VPORT_ALIGN 8
195
196/**
197 * vport_priv - access private data area of vport
198 *
199 * @vport: vport to access
200 *
201 * If a nonzero size was passed in priv_size of vport_alloc() a private data
202 * area was allocated on creation. This allows that area to be accessed and
203 * used for any purpose needed by the vport implementer.
204 */
fceb2a5b 205static inline void *vport_priv(const struct vport *vport)
f2459fe7 206{
61df3421 207 return (u8 *)(uintptr_t)vport + ALIGN(sizeof(struct vport), VPORT_ALIGN);
f2459fe7
JG
208}
209
210/**
211 * vport_from_priv - lookup vport from private data pointer
212 *
213 * @priv: Start of private data area.
214 *
215 * It is sometimes useful to translate from a pointer to the private data
216 * area to the vport, such as in the case where the private data pointer is
217 * the result of a hash table lookup. @priv must point to the start of the
218 * private data area.
219 */
38b5f1e7 220static inline struct vport *vport_from_priv(void *priv)
f2459fe7 221{
38b5f1e7 222 return (struct vport *)((u8 *)priv - ALIGN(sizeof(struct vport), VPORT_ALIGN));
f2459fe7
JG
223}
224
db0c3134 225void ovs_vport_receive(struct vport *, struct sk_buff *,
f1f60b85 226 const struct ovs_tunnel_info *);
f2459fe7 227
3cfede14
PS
228static inline void ovs_skb_postpush_rcsum(struct sk_buff *skb,
229 const void *start, unsigned int len)
230{
231 if (skb->ip_summed == CHECKSUM_COMPLETE)
232 skb->csum = csum_add(skb->csum, csum_partial(start, len, 0));
233}
5a38795f
TG
234
235int ovs_vport_ops_register(struct vport_ops *ops);
236void ovs_vport_ops_unregister(struct vport_ops *ops);
f2459fe7 237#endif /* vport.h */