pandora: defconfig: update
[pandora-kernel.git] / net / l2tp / l2tp_eth.c
1 /*
2  * L2TPv3 ethernet pseudowire driver
3  *
4  * Copyright (c) 2008,2009,2010 Katalix Systems Ltd
5  *
6  *      This program is free software; you can redistribute it and/or
7  *      modify it under the terms of the GNU General Public License
8  *      as published by the Free Software Foundation; either version
9  *      2 of the License, or (at your option) any later version.
10  */
11
12 #include <linux/module.h>
13 #include <linux/skbuff.h>
14 #include <linux/socket.h>
15 #include <linux/hash.h>
16 #include <linux/l2tp.h>
17 #include <linux/in.h>
18 #include <linux/etherdevice.h>
19 #include <linux/spinlock.h>
20 #include <net/sock.h>
21 #include <net/ip.h>
22 #include <net/icmp.h>
23 #include <net/udp.h>
24 #include <net/inet_common.h>
25 #include <net/inet_hashtables.h>
26 #include <net/tcp_states.h>
27 #include <net/protocol.h>
28 #include <net/xfrm.h>
29 #include <net/net_namespace.h>
30 #include <net/netns/generic.h>
31
32 #include "l2tp_core.h"
33
34 /* Default device name. May be overridden by name specified by user */
35 #define L2TP_ETH_DEV_NAME       "l2tpeth%d"
36
37 /* via netdev_priv() */
38 struct l2tp_eth {
39         struct net_device       *dev;
40         struct sock             *tunnel_sock;
41         struct l2tp_session     *session;
42 };
43
44 /* via l2tp_session_priv() */
45 struct l2tp_eth_sess {
46         struct net_device __rcu *dev;
47 };
48
49
50 static int l2tp_eth_dev_init(struct net_device *dev)
51 {
52         struct l2tp_eth *priv = netdev_priv(dev);
53
54         priv->dev = dev;
55         random_ether_addr(dev->dev_addr);
56         memset(&dev->broadcast[0], 0xff, 6);
57
58         return 0;
59 }
60
61 static void l2tp_eth_dev_uninit(struct net_device *dev)
62 {
63         struct l2tp_eth *priv = netdev_priv(dev);
64         struct l2tp_eth_sess *spriv;
65
66         spriv = l2tp_session_priv(priv->session);
67         RCU_INIT_POINTER(spriv->dev, NULL);
68         /* No need for synchronize_net() here. We're called by
69          * unregister_netdev*(), which does the synchronisation for us.
70          */
71 }
72
73 static int l2tp_eth_dev_xmit(struct sk_buff *skb, struct net_device *dev)
74 {
75         struct l2tp_eth *priv = netdev_priv(dev);
76         struct l2tp_session *session = priv->session;
77
78         l2tp_xmit_skb(session, skb, session->hdr_len);
79
80         dev->stats.tx_bytes += skb->len;
81         dev->stats.tx_packets++;
82
83         return 0;
84 }
85
86 static struct net_device_ops l2tp_eth_netdev_ops = {
87         .ndo_init               = l2tp_eth_dev_init,
88         .ndo_uninit             = l2tp_eth_dev_uninit,
89         .ndo_start_xmit         = l2tp_eth_dev_xmit,
90 };
91
92 static void l2tp_eth_dev_setup(struct net_device *dev)
93 {
94         ether_setup(dev);
95         dev->priv_flags &= ~IFF_TX_SKB_SHARING;
96         dev->netdev_ops         = &l2tp_eth_netdev_ops;
97         dev->destructor         = free_netdev;
98 }
99
100 static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb, int data_len)
101 {
102         struct l2tp_eth_sess *spriv = l2tp_session_priv(session);
103         struct net_device *dev;
104
105         if (session->debug & L2TP_MSG_DATA) {
106                 unsigned int length;
107                 int offset;
108                 u8 *ptr = skb->data;
109
110                 length = min(32u, skb->len);
111                 if (!pskb_may_pull(skb, length))
112                         goto error;
113
114                 printk(KERN_DEBUG "%s: eth recv: ", session->name);
115
116                 offset = 0;
117                 do {
118                         printk(" %02X", ptr[offset]);
119                 } while (++offset < length);
120
121                 printk("\n");
122         }
123
124         if (!pskb_may_pull(skb, ETH_HLEN))
125                 goto error;
126
127         secpath_reset(skb);
128
129         /* checksums verified by L2TP */
130         skb->ip_summed = CHECKSUM_NONE;
131
132         skb_dst_drop(skb);
133         nf_reset(skb);
134
135         rcu_read_lock();
136         dev = rcu_dereference(spriv->dev);
137         if (!dev)
138                 goto error_rcu;
139
140         if (dev_forward_skb(dev, skb) == NET_RX_SUCCESS) {
141                 dev->stats.rx_packets++;
142                 dev->stats.rx_bytes += data_len;
143         } else
144                 dev->stats.rx_errors++;
145         rcu_read_unlock();
146
147         return;
148
149 error_rcu:
150         rcu_read_unlock();
151 error:
152         dev->stats.rx_errors++;
153         kfree_skb(skb);
154 }
155
156 static void l2tp_eth_delete(struct l2tp_session *session)
157 {
158         struct l2tp_eth_sess *spriv;
159         struct net_device *dev;
160
161         if (session) {
162                 spriv = l2tp_session_priv(session);
163
164                 rtnl_lock();
165                 dev = rtnl_dereference(spriv->dev);
166                 if (dev) {
167                         unregister_netdevice(dev);
168                         rtnl_unlock();
169                         module_put(THIS_MODULE);
170                 } else {
171                         rtnl_unlock();
172                 }
173         }
174 }
175
176 #if defined(CONFIG_L2TP_DEBUGFS) || defined(CONFIG_L2TP_DEBUGFS_MODULE)
177 static void l2tp_eth_show(struct seq_file *m, void *arg)
178 {
179         struct l2tp_session *session = arg;
180         struct l2tp_eth_sess *spriv = l2tp_session_priv(session);
181         struct net_device *dev;
182
183         rcu_read_lock();
184         dev = rcu_dereference(spriv->dev);
185         if (!dev) {
186                 rcu_read_unlock();
187                 return;
188         }
189         dev_hold(dev);
190         rcu_read_unlock();
191
192         seq_printf(m, "   interface %s\n", dev->name);
193
194         dev_put(dev);
195 }
196 #endif
197
198 static int l2tp_eth_create(struct net *net, struct l2tp_tunnel *tunnel,
199                            u32 session_id, u32 peer_session_id,
200                            struct l2tp_session_cfg *cfg)
201 {
202         struct net_device *dev;
203         char name[IFNAMSIZ];
204         struct l2tp_session *session;
205         struct l2tp_eth *priv;
206         struct l2tp_eth_sess *spriv;
207         int rc;
208
209         if (cfg->ifname) {
210                 dev = dev_get_by_name(net, cfg->ifname);
211                 if (dev) {
212                         dev_put(dev);
213                         rc = -EEXIST;
214                         goto err;
215                 }
216                 strlcpy(name, cfg->ifname, IFNAMSIZ);
217         } else
218                 strcpy(name, L2TP_ETH_DEV_NAME);
219
220         session = l2tp_session_create(sizeof(*spriv), tunnel, session_id,
221                                       peer_session_id, cfg);
222         if (IS_ERR(session)) {
223                 rc = PTR_ERR(session);
224                 goto err;
225         }
226
227         dev = alloc_netdev(sizeof(*priv), name, l2tp_eth_dev_setup);
228         if (!dev) {
229                 rc = -ENOMEM;
230                 goto err_sess;
231         }
232
233         dev_net_set(dev, net);
234         if (session->mtu == 0)
235                 session->mtu = dev->mtu - session->hdr_len;
236         dev->mtu = session->mtu;
237         dev->needed_headroom += session->hdr_len;
238
239         priv = netdev_priv(dev);
240         priv->dev = dev;
241         priv->session = session;
242
243         priv->tunnel_sock = tunnel->sock;
244         session->recv_skb = l2tp_eth_dev_recv;
245         session->session_close = l2tp_eth_delete;
246 #if defined(CONFIG_L2TP_DEBUGFS) || defined(CONFIG_L2TP_DEBUGFS_MODULE)
247         session->show = l2tp_eth_show;
248 #endif
249
250         spriv = l2tp_session_priv(session);
251
252         l2tp_session_inc_refcount(session);
253
254         rtnl_lock();
255
256         /* Register both device and session while holding the rtnl lock. This
257          * ensures that l2tp_eth_delete() will see that there's a device to
258          * unregister, even if it happened to run before we assign spriv->dev.
259          */
260         rc = l2tp_session_register(session, tunnel);
261         if (rc < 0) {
262                 rtnl_unlock();
263                 goto err_sess_dev;
264         }
265
266         rc = register_netdevice(dev);
267         if (rc < 0) {
268                 rtnl_unlock();
269                 l2tp_session_delete(session);
270                 l2tp_session_dec_refcount(session);
271                 free_netdev(dev);
272
273                 return rc;
274         }
275
276         strlcpy(session->ifname, dev->name, IFNAMSIZ);
277         rcu_assign_pointer(spriv->dev, dev);
278
279         rtnl_unlock();
280
281         l2tp_session_dec_refcount(session);
282
283         __module_get(THIS_MODULE);
284
285         return 0;
286
287 err_sess_dev:
288         l2tp_session_dec_refcount(session);
289         free_netdev(dev);
290 err_sess:
291         kfree(session);
292 err:
293         return rc;
294 }
295
296
297 static const struct l2tp_nl_cmd_ops l2tp_eth_nl_cmd_ops = {
298         .session_create = l2tp_eth_create,
299         .session_delete = l2tp_session_delete,
300 };
301
302
303 static int __init l2tp_eth_init(void)
304 {
305         int err = 0;
306
307         err = l2tp_nl_register_ops(L2TP_PWTYPE_ETH, &l2tp_eth_nl_cmd_ops);
308         if (err)
309                 goto err;
310
311         printk(KERN_INFO "L2TP ethernet pseudowire support (L2TPv3)\n");
312
313         return 0;
314
315 err:
316         return err;
317 }
318
319 static void __exit l2tp_eth_exit(void)
320 {
321         l2tp_nl_unregister_ops(L2TP_PWTYPE_ETH);
322 }
323
324 module_init(l2tp_eth_init);
325 module_exit(l2tp_eth_exit);
326
327 MODULE_LICENSE("GPL");
328 MODULE_AUTHOR("James Chapman <jchapman@katalix.com>");
329 MODULE_DESCRIPTION("L2TP ethernet pseudowire driver");
330 MODULE_VERSION("1.0");