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