datapath: vport: Remove compat support
[sliver-openvswitch.git] / datapath / vport.c
1 /*
2  * Copyright (c) 2007-2012 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 #include <linux/etherdevice.h>
20 #include <linux/if.h>
21 #include <linux/if_vlan.h>
22 #include <linux/jhash.h>
23 #include <linux/kconfig.h>
24 #include <linux/kernel.h>
25 #include <linux/list.h>
26 #include <linux/mutex.h>
27 #include <linux/percpu.h>
28 #include <linux/rcupdate.h>
29 #include <linux/rtnetlink.h>
30 #include <linux/compat.h>
31 #include <linux/version.h>
32 #include <net/net_namespace.h>
33
34 #include "datapath.h"
35 #include "vport.h"
36 #include "vport-internal_dev.h"
37
38 /* List of statically compiled vport implementations.  Don't forget to also
39  * add yours to the list at the bottom of vport.h. */
40 static const struct vport_ops *vport_ops_list[] = {
41         &ovs_netdev_vport_ops,
42         &ovs_internal_vport_ops,
43 #if IS_ENABLED(CONFIG_NET_IPGRE_DEMUX)
44         &ovs_gre_vport_ops,
45         &ovs_gre64_vport_ops,
46 #endif
47         &ovs_vxlan_vport_ops,
48         &ovs_lisp_vport_ops,
49 };
50
51 /* Protected by RCU read lock for reading, ovs_mutex for writing. */
52 static struct hlist_head *dev_table;
53 #define VPORT_HASH_BUCKETS 1024
54
55 /**
56  *      ovs_vport_init - initialize vport subsystem
57  *
58  * Called at module load time to initialize the vport subsystem.
59  */
60 int ovs_vport_init(void)
61 {
62         dev_table = kzalloc(VPORT_HASH_BUCKETS * sizeof(struct hlist_head),
63                             GFP_KERNEL);
64         if (!dev_table)
65                 return -ENOMEM;
66
67         return 0;
68 }
69
70 /**
71  *      ovs_vport_exit - shutdown vport subsystem
72  *
73  * Called at module exit time to shutdown the vport subsystem.
74  */
75 void ovs_vport_exit(void)
76 {
77         kfree(dev_table);
78 }
79
80 static struct hlist_head *hash_bucket(struct net *net, const char *name)
81 {
82         unsigned int hash = jhash(name, strlen(name), (unsigned long) net);
83         return &dev_table[hash & (VPORT_HASH_BUCKETS - 1)];
84 }
85
86 /**
87  *      ovs_vport_locate - find a port that has already been created
88  *
89  * @name: name of port to find
90  *
91  * Must be called with ovs or RCU read lock.
92  */
93 struct vport *ovs_vport_locate(struct net *net, const char *name)
94 {
95         struct hlist_head *bucket = hash_bucket(net, name);
96         struct vport *vport;
97
98         hlist_for_each_entry_rcu(vport, bucket, hash_node)
99                 if (!strcmp(name, vport->ops->get_name(vport)) &&
100                     net_eq(ovs_dp_get_net(vport->dp), net))
101                         return vport;
102
103         return NULL;
104 }
105
106 /**
107  *      ovs_vport_alloc - allocate and initialize new vport
108  *
109  * @priv_size: Size of private data area to allocate.
110  * @ops: vport device ops
111  *
112  * Allocate and initialize a new vport defined by @ops.  The vport will contain
113  * a private data area of size @priv_size that can be accessed using
114  * vport_priv().  vports that are no longer needed should be released with
115  * ovs_vport_free().
116  */
117 struct vport *ovs_vport_alloc(int priv_size, const struct vport_ops *ops,
118                               const struct vport_parms *parms)
119 {
120         struct vport *vport;
121         size_t alloc_size;
122
123         alloc_size = sizeof(struct vport);
124         if (priv_size) {
125                 alloc_size = ALIGN(alloc_size, VPORT_ALIGN);
126                 alloc_size += priv_size;
127         }
128
129         vport = kzalloc(alloc_size, GFP_KERNEL);
130         if (!vport)
131                 return ERR_PTR(-ENOMEM);
132
133         vport->dp = parms->dp;
134         vport->port_no = parms->port_no;
135         vport->upcall_portid = parms->upcall_portid;
136         vport->ops = ops;
137         INIT_HLIST_NODE(&vport->dp_hash_node);
138
139         vport->percpu_stats = alloc_percpu(struct pcpu_tstats);
140         if (!vport->percpu_stats) {
141                 kfree(vport);
142                 return ERR_PTR(-ENOMEM);
143         }
144
145         spin_lock_init(&vport->stats_lock);
146
147         return vport;
148 }
149
150 /**
151  *      ovs_vport_free - uninitialize and free vport
152  *
153  * @vport: vport to free
154  *
155  * Frees a vport allocated with ovs_vport_alloc() when it is no longer needed.
156  *
157  * The caller must ensure that an RCU grace period has passed since the last
158  * time @vport was in a datapath.
159  */
160 void ovs_vport_free(struct vport *vport)
161 {
162         free_percpu(vport->percpu_stats);
163         kfree(vport);
164 }
165
166 /**
167  *      ovs_vport_add - add vport device (for kernel callers)
168  *
169  * @parms: Information about new vport.
170  *
171  * Creates a new vport with the specified configuration (which is dependent on
172  * device type).  ovs_mutex must be held.
173  */
174 struct vport *ovs_vport_add(const struct vport_parms *parms)
175 {
176         struct vport *vport;
177         int err = 0;
178         int i;
179
180         for (i = 0; i < ARRAY_SIZE(vport_ops_list); i++) {
181                 if (vport_ops_list[i]->type == parms->type) {
182                         struct hlist_head *bucket;
183
184                         vport = vport_ops_list[i]->create(parms);
185                         if (IS_ERR(vport)) {
186                                 err = PTR_ERR(vport);
187                                 goto out;
188                         }
189
190                         bucket = hash_bucket(ovs_dp_get_net(vport->dp),
191                                              vport->ops->get_name(vport));
192                         hlist_add_head_rcu(&vport->hash_node, bucket);
193                         return vport;
194                 }
195         }
196
197         err = -EAFNOSUPPORT;
198
199 out:
200         return ERR_PTR(err);
201 }
202
203 /**
204  *      ovs_vport_set_options - modify existing vport device (for kernel callers)
205  *
206  * @vport: vport to modify.
207  * @options: New configuration.
208  *
209  * Modifies an existing device with the specified configuration (which is
210  * dependent on device type).  ovs_mutex must be held.
211  */
212 int ovs_vport_set_options(struct vport *vport, struct nlattr *options)
213 {
214         if (!vport->ops->set_options)
215                 return -EOPNOTSUPP;
216         return vport->ops->set_options(vport, options);
217 }
218
219 /**
220  *      ovs_vport_del - delete existing vport device
221  *
222  * @vport: vport to delete.
223  *
224  * Detaches @vport from its datapath and destroys it.  It is possible to fail
225  * for reasons such as lack of memory.  ovs_mutex must be held.
226  */
227 void ovs_vport_del(struct vport *vport)
228 {
229         ASSERT_OVSL();
230
231         hlist_del_rcu(&vport->hash_node);
232         vport->ops->destroy(vport);
233 }
234
235 /**
236  *      ovs_vport_set_stats - sets offset device stats
237  *
238  * @vport: vport on which to set stats
239  * @stats: stats to set
240  *
241  * Provides a set of transmit, receive, and error stats to be added as an
242  * offset to the collect data when stats are retreived.  Some devices may not
243  * support setting the stats, in which case the result will always be
244  * -EOPNOTSUPP.
245  *
246  * Must be called with ovs_mutex.
247  */
248 void ovs_vport_set_stats(struct vport *vport, struct ovs_vport_stats *stats)
249 {
250         spin_lock_bh(&vport->stats_lock);
251         vport->offset_stats = *stats;
252         spin_unlock_bh(&vport->stats_lock);
253 }
254
255 /**
256  *      ovs_vport_get_stats - retrieve device stats
257  *
258  * @vport: vport from which to retrieve the stats
259  * @stats: location to store stats
260  *
261  * Retrieves transmit, receive, and error stats for the given device.
262  *
263  * Must be called with ovs_mutex or rcu_read_lock.
264  */
265 void ovs_vport_get_stats(struct vport *vport, struct ovs_vport_stats *stats)
266 {
267         int i;
268
269         /* We potentially have 3 sources of stats that need to be
270          * combined: those we have collected (split into err_stats and
271          * percpu_stats), offset_stats from set_stats(), and device
272          * error stats from netdev->get_stats() (for errors that happen
273          * downstream and therefore aren't reported through our
274          * vport_record_error() function).
275          * Stats from first two sources are merged and reported by ovs over
276          * OVS_VPORT_ATTR_STATS.
277          * netdev-stats can be directly read over netlink-ioctl.
278          */
279
280         spin_lock_bh(&vport->stats_lock);
281
282         *stats = vport->offset_stats;
283
284         stats->rx_errors        += vport->err_stats.rx_errors;
285         stats->tx_errors        += vport->err_stats.tx_errors;
286         stats->tx_dropped       += vport->err_stats.tx_dropped;
287         stats->rx_dropped       += vport->err_stats.rx_dropped;
288
289         spin_unlock_bh(&vport->stats_lock);
290
291         for_each_possible_cpu(i) {
292                 const struct pcpu_tstats *percpu_stats;
293                 struct pcpu_tstats local_stats;
294                 unsigned int start;
295
296                 percpu_stats = per_cpu_ptr(vport->percpu_stats, i);
297
298                 do {
299                         start = u64_stats_fetch_begin_bh(&percpu_stats->syncp);
300                         local_stats = *percpu_stats;
301                 } while (u64_stats_fetch_retry_bh(&percpu_stats->syncp, start));
302
303                 stats->rx_bytes         += local_stats.rx_bytes;
304                 stats->rx_packets       += local_stats.rx_packets;
305                 stats->tx_bytes         += local_stats.tx_bytes;
306                 stats->tx_packets       += local_stats.tx_packets;
307         }
308 }
309
310 /**
311  *      ovs_vport_get_options - retrieve device options
312  *
313  * @vport: vport from which to retrieve the options.
314  * @skb: sk_buff where options should be appended.
315  *
316  * Retrieves the configuration of the given device, appending an
317  * %OVS_VPORT_ATTR_OPTIONS attribute that in turn contains nested
318  * vport-specific attributes to @skb.
319  *
320  * Returns 0 if successful, -EMSGSIZE if @skb has insufficient room, or another
321  * negative error code if a real error occurred.  If an error occurs, @skb is
322  * left unmodified.
323  *
324  * Must be called with ovs_mutex or rcu_read_lock.
325  */
326 int ovs_vport_get_options(const struct vport *vport, struct sk_buff *skb)
327 {
328         struct nlattr *nla;
329         int err;
330
331         if (!vport->ops->get_options)
332                 return 0;
333
334         nla = nla_nest_start(skb, OVS_VPORT_ATTR_OPTIONS);
335         if (!nla)
336                 return -EMSGSIZE;
337
338         err = vport->ops->get_options(vport, skb);
339         if (err) {
340                 nla_nest_cancel(skb, nla);
341                 return err;
342         }
343
344         nla_nest_end(skb, nla);
345         return 0;
346 }
347
348 /**
349  *      ovs_vport_receive - pass up received packet to the datapath for processing
350  *
351  * @vport: vport that received the packet
352  * @skb: skb that was received
353  * @tun_key: tunnel (if any) that carried packet
354  *
355  * Must be called with rcu_read_lock.  The packet cannot be shared and
356  * skb->data should point to the Ethernet header.  The caller must have already
357  * called compute_ip_summed() to initialize the checksumming fields.
358  */
359 void ovs_vport_receive(struct vport *vport, struct sk_buff *skb,
360                        struct ovs_key_ipv4_tunnel *tun_key)
361 {
362         struct pcpu_tstats *stats;
363
364         stats = this_cpu_ptr(vport->percpu_stats);
365         u64_stats_update_begin(&stats->syncp);
366         stats->rx_packets++;
367         stats->rx_bytes += skb->len;
368         u64_stats_update_end(&stats->syncp);
369
370         OVS_CB(skb)->tun_key = tun_key;
371         ovs_dp_process_received_packet(vport, skb);
372 }
373
374 /**
375  *      ovs_vport_send - send a packet on a device
376  *
377  * @vport: vport on which to send the packet
378  * @skb: skb to send
379  *
380  * Sends the given packet and returns the length of data sent.  Either ovs
381  * lock or rcu_read_lock must be held.
382  */
383 int ovs_vport_send(struct vport *vport, struct sk_buff *skb)
384 {
385         int sent = vport->ops->send(vport, skb);
386
387         if (likely(sent > 0)) {
388                 struct pcpu_tstats *stats;
389
390                 stats = this_cpu_ptr(vport->percpu_stats);
391
392                 u64_stats_update_begin(&stats->syncp);
393                 stats->tx_packets++;
394                 stats->tx_bytes += sent;
395                 u64_stats_update_end(&stats->syncp);
396         } else if (sent < 0) {
397                 ovs_vport_record_error(vport, VPORT_E_TX_ERROR);
398                 kfree_skb(skb);
399         } else
400                 ovs_vport_record_error(vport, VPORT_E_TX_DROPPED);
401
402         return sent;
403 }
404
405 /**
406  *      ovs_vport_record_error - indicate device error to generic stats layer
407  *
408  * @vport: vport that encountered the error
409  * @err_type: one of enum vport_err_type types to indicate the error type
410  *
411  * If using the vport generic stats layer indicate that an error of the given
412  * type has occurred.
413  */
414 void ovs_vport_record_error(struct vport *vport, enum vport_err_type err_type)
415 {
416         spin_lock(&vport->stats_lock);
417
418         switch (err_type) {
419         case VPORT_E_RX_DROPPED:
420                 vport->err_stats.rx_dropped++;
421                 break;
422
423         case VPORT_E_RX_ERROR:
424                 vport->err_stats.rx_errors++;
425                 break;
426
427         case VPORT_E_TX_DROPPED:
428                 vport->err_stats.tx_dropped++;
429                 break;
430
431         case VPORT_E_TX_ERROR:
432                 vport->err_stats.tx_errors++;
433                 break;
434         }
435
436         spin_unlock(&vport->stats_lock);
437 }
438
439 static void free_vport_rcu(struct rcu_head *rcu)
440 {
441         struct vport *vport = container_of(rcu, struct vport, rcu);
442
443         ovs_vport_free(vport);
444 }
445
446 void ovs_vport_deferred_free(struct vport *vport)
447 {
448         if (!vport)
449                 return;
450
451         call_rcu(&vport->rcu, free_vport_rcu);
452 }