datapath: Enable offloading on internal devices.
[sliver-openvswitch.git] / datapath / vport-netdev.c
1 /*
2  * Copyright (c) 2010 Nicira Networks.
3  * Distributed under the terms of the GNU GPL version 2.
4  *
5  * Significant portions of this file may be copied from parts of the Linux
6  * kernel, by Linus Torvalds and others.
7  */
8
9 #include <linux/if_arp.h>
10 #include <linux/if_bridge.h>
11 #include <linux/if_vlan.h>
12 #include <linux/kernel.h>
13 #include <linux/llc.h>
14 #include <linux/rtnetlink.h>
15 #include <linux/skbuff.h>
16
17 #include <net/llc.h>
18
19 #include "datapath.h"
20 #include "vport-internal_dev.h"
21 #include "vport-netdev.h"
22
23 #include "compat.h"
24
25 struct vport_ops netdev_vport_ops;
26
27 static void netdev_port_receive(struct net_bridge_port *, struct sk_buff *);
28
29 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
30 static struct llc_sap *netdev_stp_sap;
31
32 static int
33 netdev_stp_rcv(struct sk_buff *skb, struct net_device *dev,
34                       struct packet_type *pt, struct net_device *orig_dev)
35 {
36         /* We don't really care about STP packets, we just listen for them for
37          * mutual exclusion with the bridge module, so this just discards
38          * them. */
39         kfree_skb(skb);
40         return 0;
41 }
42
43 static int
44 netdev_avoid_bridge_init(void)
45 {
46         /* Register to receive STP packets because the bridge module also
47          * attempts to do so.  Since there can only be a single listener for a
48          * given protocol, this provides mutual exclusion against the bridge
49          * module, preventing both of them from being loaded at the same
50          * time. */
51         netdev_stp_sap = llc_sap_open(LLC_SAP_BSPAN, netdev_stp_rcv);
52         if (!netdev_stp_sap) {
53                 printk(KERN_ERR "openvswitch: can't register sap for STP (probably the bridge module is loaded)\n");
54                 return -EADDRINUSE;
55         }
56         return 0;
57 }
58
59 static void
60 netdev_avoid_bridge_exit(void)
61 {
62         llc_sap_put(netdev_stp_sap);
63 }
64 #else  /* Linux 2.6.27 or later. */
65 static int
66 netdev_avoid_bridge_init(void)
67 {
68         /* Linux 2.6.27 introduces a way for multiple clients to register for
69          * STP packets, which interferes with what we try to do above.
70          * Instead, just check whether there's a bridge hook defined.  This is
71          * not as safe--the bridge module is willing to load over the top of
72          * us--but it provides a little bit of protection. */
73         if (br_handle_frame_hook) {
74                 printk(KERN_ERR "openvswitch: bridge module is loaded, cannot load over it\n");
75                 return -EADDRINUSE;
76         }
77         return 0;
78 }
79
80 static void
81 netdev_avoid_bridge_exit(void)
82 {
83         /* Nothing to do. */
84 }
85 #endif  /* Linux 2.6.27 or later */
86
87 /*
88  * Used as br_handle_frame_hook.  (Cannot run bridge at the same time, even on
89  * different set of devices!)
90  */
91 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
92 /* Called with rcu_read_lock and bottom-halves disabled. */
93 static struct sk_buff *
94 netdev_frame_hook(struct net_bridge_port *p, struct sk_buff *skb)
95 {
96         netdev_port_receive(p, skb);
97         return NULL;
98 }
99 #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
100 /* Called with rcu_read_lock and bottom-halves disabled. */
101 static int
102 netdev_frame_hook(struct net_bridge_port *p, struct sk_buff **pskb)
103 {
104         netdev_port_receive(p, *pskb);
105         return 1;
106 }
107 #else
108 #error
109 #endif
110
111 static int
112 netdev_init(void)
113 {
114         int err;
115
116         err = netdev_avoid_bridge_init();
117         if (err)
118                 return err;
119
120         /* Hook into callback used by the bridge to intercept packets.
121          * Parasites we are. */
122         br_handle_frame_hook = netdev_frame_hook;
123
124         return 0;
125 }
126
127 static void
128 netdev_exit(void)
129 {
130         br_handle_frame_hook = NULL;
131         netdev_avoid_bridge_exit();
132 }
133
134 static struct vport *
135 netdev_create(const char *name, const void __user *config)
136 {
137         struct vport *vport;
138         struct netdev_vport *netdev_vport;
139         int err;
140
141         vport = vport_alloc(sizeof(struct netdev_vport), &netdev_vport_ops);
142         if (IS_ERR(vport)) {
143                 err = PTR_ERR(vport);
144                 goto error;
145         }
146
147         netdev_vport = netdev_vport_priv(vport);
148
149         netdev_vport->dev = dev_get_by_name(&init_net, name);
150         if (!netdev_vport->dev) {
151                 err = -ENODEV;
152                 goto error_free_vport;
153         }
154
155         if (netdev_vport->dev->flags & IFF_LOOPBACK ||
156             netdev_vport->dev->type != ARPHRD_ETHER ||
157             is_internal_dev(netdev_vport->dev)) {
158                 err = -EINVAL;
159                 goto error_put;
160         }
161
162         if (netdev_vport->dev->br_port) {
163                 err = -EBUSY;
164                 goto error_put;
165         }
166
167         return vport;
168
169 error_put:
170         dev_put(netdev_vport->dev);
171 error_free_vport:
172         vport_free(vport);
173 error:
174         return ERR_PTR(err);
175 }
176
177 static int
178 netdev_destroy(struct vport *vport)
179 {
180         struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
181
182         dev_put(netdev_vport->dev);
183         vport_free(vport);
184
185         return 0;
186 }
187
188 static int
189 netdev_attach(struct vport *vport)
190 {
191         struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
192
193         dev_set_promiscuity(netdev_vport->dev, 1);
194         dev_disable_lro(netdev_vport->dev);
195         rcu_assign_pointer(netdev_vport->dev->br_port, (struct net_bridge_port *)vport);
196
197         return 0;
198 }
199
200 static int
201 netdev_detach(struct vport *vport)
202 {
203         struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
204
205         rcu_assign_pointer(netdev_vport->dev->br_port, NULL);
206         dev_set_promiscuity(netdev_vport->dev, -1);
207
208         return 0;
209 }
210
211 int
212 netdev_set_mtu(struct vport *vport, int mtu)
213 {
214         struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
215         return dev_set_mtu(netdev_vport->dev, mtu);
216 }
217
218 int
219 netdev_set_addr(struct vport *vport, const unsigned char *addr)
220 {
221         struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
222         struct sockaddr sa;
223
224         sa.sa_family = ARPHRD_ETHER;
225         memcpy(sa.sa_data, addr, ETH_ALEN);
226
227         return dev_set_mac_address(netdev_vport->dev, &sa);
228 }
229
230 const char *
231 netdev_get_name(const struct vport *vport)
232 {
233         const struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
234         return netdev_vport->dev->name;
235 }
236
237 const unsigned char *
238 netdev_get_addr(const struct vport *vport)
239 {
240         const struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
241         return netdev_vport->dev->dev_addr;
242 }
243
244 struct kobject *
245 netdev_get_kobj(const struct vport *vport)
246 {
247         const struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
248         return &netdev_vport->dev->NETDEV_DEV_MEMBER.kobj;
249 }
250
251 int
252 netdev_get_stats(const struct vport *vport, struct odp_vport_stats *stats)
253 {
254         const struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
255         const struct net_device_stats *netdev_stats;
256
257         netdev_stats = dev_get_stats(netdev_vport->dev);
258
259         stats->rx_bytes         = netdev_stats->rx_bytes;
260         stats->rx_packets       = netdev_stats->rx_packets;
261         stats->tx_bytes         = netdev_stats->tx_bytes;
262         stats->tx_packets       = netdev_stats->tx_packets;
263         stats->rx_dropped       = netdev_stats->rx_dropped;
264         stats->rx_errors        = netdev_stats->rx_errors;
265         stats->rx_frame_err     = netdev_stats->rx_frame_errors;
266         stats->rx_over_err      = netdev_stats->rx_over_errors;
267         stats->rx_crc_err       = netdev_stats->rx_crc_errors;
268         stats->tx_dropped       = netdev_stats->tx_dropped;
269         stats->tx_errors        = netdev_stats->tx_errors;
270         stats->collisions       = netdev_stats->collisions;
271
272         return 0;
273 }
274
275 unsigned
276 netdev_get_dev_flags(const struct vport *vport)
277 {
278         const struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
279         return dev_get_flags(netdev_vport->dev);
280 }
281
282 int
283 netdev_is_running(const struct vport *vport)
284 {
285         const struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
286         return netif_running(netdev_vport->dev);
287 }
288
289 unsigned char
290 netdev_get_operstate(const struct vport *vport)
291 {
292         const struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
293         return netdev_vport->dev->operstate;
294 }
295
296 int
297 netdev_get_ifindex(const struct vport *vport)
298 {
299         const struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
300         return netdev_vport->dev->ifindex;
301 }
302
303 int
304 netdev_get_iflink(const struct vport *vport)
305 {
306         const struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
307         return netdev_vport->dev->iflink;
308 }
309
310 int
311 netdev_get_mtu(const struct vport *vport)
312 {
313         const struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
314         return netdev_vport->dev->mtu;
315 }
316
317 /* Must be called with rcu_read_lock. */
318 static void
319 netdev_port_receive(struct net_bridge_port *p, struct sk_buff *skb)
320 {
321         struct vport *vport = (struct vport *)p;
322
323         /* Make our own copy of the packet.  Otherwise we will mangle the
324          * packet for anyone who came before us (e.g. tcpdump via AF_PACKET).
325          * (No one comes after us, since we tell handle_bridge() that we took
326          * the packet.) */
327         skb = skb_share_check(skb, GFP_ATOMIC);
328         if (!skb)
329                 return;
330
331         /* Push the Ethernet header back on. */
332         skb_push(skb, ETH_HLEN);
333         skb_reset_mac_header(skb);
334         compute_ip_summed(skb, false);
335
336         vport_receive(vport, skb);
337 }
338
339 static int
340 netdev_send(struct vport *vport, struct sk_buff *skb)
341 {
342         struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
343         int len = skb->len;
344
345         skb->dev = netdev_vport->dev;
346         forward_ip_summed(skb);
347         dev_queue_xmit(skb);
348
349         return len;
350 }
351
352 /* Returns null if this device is not attached to a datapath. */
353 struct vport *
354 netdev_get_vport(struct net_device *dev)
355 {
356         return (struct vport *)dev->br_port;
357 }
358
359 struct vport_ops netdev_vport_ops = {
360         .type           = "netdev",
361         .flags          = VPORT_F_REQUIRED,
362         .init           = netdev_init,
363         .exit           = netdev_exit,
364         .create         = netdev_create,
365         .destroy        = netdev_destroy,
366         .attach         = netdev_attach,
367         .detach         = netdev_detach,
368         .set_mtu        = netdev_set_mtu,
369         .set_addr       = netdev_set_addr,
370         .get_name       = netdev_get_name,
371         .get_addr       = netdev_get_addr,
372         .get_kobj       = netdev_get_kobj,
373         .get_stats      = netdev_get_stats,
374         .get_dev_flags  = netdev_get_dev_flags,
375         .is_running     = netdev_is_running,
376         .get_operstate  = netdev_get_operstate,
377         .get_ifindex    = netdev_get_ifindex,
378         .get_iflink     = netdev_get_iflink,
379         .get_mtu        = netdev_get_mtu,
380         .send           = netdev_send,
381 };