fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / xen / netback / loopback.c
1 /******************************************************************************
2  * netback/loopback.c
3  * 
4  * A two-interface loopback device to emulate a local netfront-netback
5  * connection. This ensures that local packet delivery looks identical
6  * to inter-domain delivery. Most importantly, packets delivered locally
7  * originating from other domains will get *copied* when they traverse this
8  * driver. This prevents unbounded delays in socket-buffer queues from
9  * causing the netback driver to "seize up".
10  * 
11  * This driver creates a symmetric pair of loopback interfaces with names
12  * vif0.0 and veth0. The intention is that 'vif0.0' is bound to an Ethernet
13  * bridge, just like a proper netback interface, while a local IP interface
14  * is configured on 'veth0'.
15  * 
16  * As with a real netback interface, vif0.0 is configured with a suitable
17  * dummy MAC address. No default is provided for veth0: a reasonable strategy
18  * is to transfer eth0's MAC address to veth0, and give eth0 a dummy address
19  * (to avoid confusing the Etherbridge).
20  * 
21  * Copyright (c) 2005 K A Fraser
22  * 
23  * This program is free software; you can redistribute it and/or
24  * modify it under the terms of the GNU General Public License version 2
25  * as published by the Free Software Foundation; or, when distributed
26  * separately from the Linux kernel or incorporated into other
27  * software packages, subject to the following license:
28  * 
29  * Permission is hereby granted, free of charge, to any person obtaining a copy
30  * of this source file (the "Software"), to deal in the Software without
31  * restriction, including without limitation the rights to use, copy, modify,
32  * merge, publish, distribute, sublicense, and/or sell copies of the Software,
33  * and to permit persons to whom the Software is furnished to do so, subject to
34  * the following conditions:
35  * 
36  * The above copyright notice and this permission notice shall be included in
37  * all copies or substantial portions of the Software.
38  * 
39  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
40  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
41  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
42  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
43  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
44  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
45  * IN THE SOFTWARE.
46  */
47
48 #include <linux/module.h>
49 #include <linux/netdevice.h>
50 #include <linux/inetdevice.h>
51 #include <linux/etherdevice.h>
52 #include <linux/skbuff.h>
53 #include <linux/ethtool.h>
54 #include <net/dst.h>
55 #include <net/xfrm.h>           /* secpath_reset() */
56 #include <asm/hypervisor.h>     /* is_initial_xendomain() */
57
58 #include "../../../net/core/kmap_skb.h"
59
60 static int nloopbacks = -1;
61 module_param(nloopbacks, int, 0);
62 MODULE_PARM_DESC(nloopbacks, "Number of netback-loopback devices to create");
63
64 struct net_private {
65         struct net_device *loopback_dev;
66         struct net_device_stats stats;
67 };
68
69 static int loopback_open(struct net_device *dev)
70 {
71         struct net_private *np = netdev_priv(dev);
72         memset(&np->stats, 0, sizeof(np->stats));
73         netif_start_queue(dev);
74         return 0;
75 }
76
77 static int loopback_close(struct net_device *dev)
78 {
79         netif_stop_queue(dev);
80         return 0;
81 }
82
83 #ifdef CONFIG_X86
84 static int is_foreign(unsigned long pfn)
85 {
86         /* NB. Play it safe for auto-translation mode. */
87         return (xen_feature(XENFEAT_auto_translated_physmap) ||
88                 (phys_to_machine_mapping[pfn] & FOREIGN_FRAME_BIT));
89 }
90 #else
91 /* How to detect a foreign mapping? Play it safe. */
92 #define is_foreign(pfn) (1)
93 #endif
94
95 static int skb_remove_foreign_references(struct sk_buff *skb)
96 {
97         struct page *page;
98         unsigned long pfn;
99         int i, off;
100         char *vaddr;
101
102         BUG_ON(skb_shinfo(skb)->frag_list);
103
104         for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
105                 pfn = page_to_pfn(skb_shinfo(skb)->frags[i].page);
106                 if (!is_foreign(pfn))
107                         continue;
108                 
109                 page = alloc_page(GFP_ATOMIC | __GFP_NOWARN);
110                 if (unlikely(!page))
111                         return 0;
112
113                 vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]);
114                 off = skb_shinfo(skb)->frags[i].page_offset;
115                 memcpy(page_address(page) + off,
116                        vaddr + off,
117                        skb_shinfo(skb)->frags[i].size);
118                 kunmap_skb_frag(vaddr);
119
120                 put_page(skb_shinfo(skb)->frags[i].page);
121                 skb_shinfo(skb)->frags[i].page = page;
122         }
123
124         return 1;
125 }
126
127 static int loopback_start_xmit(struct sk_buff *skb, struct net_device *dev)
128 {
129         struct net_private *np = netdev_priv(dev);
130
131         if (!skb_remove_foreign_references(skb)) {
132                 np->stats.tx_dropped++;
133                 dev_kfree_skb(skb);
134                 return 0;
135         }
136
137         dst_release(skb->dst);
138         skb->dst = NULL;
139
140         skb_orphan(skb);
141
142         np->stats.tx_bytes += skb->len;
143         np->stats.tx_packets++;
144
145         /* Switch to loopback context. */
146         dev = np->loopback_dev;
147         np  = netdev_priv(dev);
148
149         np->stats.rx_bytes += skb->len;
150         np->stats.rx_packets++;
151
152         if (skb->ip_summed == CHECKSUM_PARTIAL) {
153                 /* Defer checksum calculation. */
154                 skb->proto_csum_blank = 1;
155                 /* Must be a local packet: assert its integrity. */
156                 skb->proto_data_valid = 1;
157         }
158
159         skb->ip_summed = skb->proto_data_valid ?
160                 CHECKSUM_UNNECESSARY : CHECKSUM_NONE;
161
162         skb->pkt_type = PACKET_HOST; /* overridden by eth_type_trans() */
163         skb->protocol = eth_type_trans(skb, dev);
164         skb->dev      = dev;
165         dev->last_rx  = jiffies;
166
167         /* Flush netfilter context: rx'ed skbuffs not expected to have any. */
168         nf_reset(skb);
169         secpath_reset(skb);
170
171         netif_rx(skb);
172
173         return 0;
174 }
175
176 static struct net_device_stats *loopback_get_stats(struct net_device *dev)
177 {
178         struct net_private *np = netdev_priv(dev);
179         return &np->stats;
180 }
181
182 static struct ethtool_ops network_ethtool_ops =
183 {
184         .get_tx_csum = ethtool_op_get_tx_csum,
185         .set_tx_csum = ethtool_op_set_tx_csum,
186         .get_sg = ethtool_op_get_sg,
187         .set_sg = ethtool_op_set_sg,
188         .get_tso = ethtool_op_get_tso,
189         .set_tso = ethtool_op_set_tso,
190         .get_link = ethtool_op_get_link,
191 };
192
193 /*
194  * Nothing to do here. Virtual interface is point-to-point and the
195  * physical interface is probably promiscuous anyway.
196  */
197 static void loopback_set_multicast_list(struct net_device *dev)
198 {
199 }
200
201 static void loopback_construct(struct net_device *dev, struct net_device *lo)
202 {
203         struct net_private *np = netdev_priv(dev);
204
205         np->loopback_dev     = lo;
206
207         dev->open            = loopback_open;
208         dev->stop            = loopback_close;
209         dev->hard_start_xmit = loopback_start_xmit;
210         dev->get_stats       = loopback_get_stats;
211         dev->set_multicast_list = loopback_set_multicast_list;
212         dev->change_mtu      = NULL; /* allow arbitrary mtu */
213
214         dev->tx_queue_len    = 0;
215
216         dev->features        = (NETIF_F_HIGHDMA |
217                                 NETIF_F_LLTX |
218                                 NETIF_F_TSO |
219                                 NETIF_F_SG |
220                                 NETIF_F_IP_CSUM);
221
222         SET_ETHTOOL_OPS(dev, &network_ethtool_ops);
223
224         /*
225          * We do not set a jumbo MTU on the interface. Otherwise the network
226          * stack will try to send large packets that will get dropped by the
227          * Ethernet bridge (unless the physical Ethernet interface is
228          * configured to transfer jumbo packets). If a larger MTU is desired
229          * then the system administrator can specify it using the 'ifconfig'
230          * command.
231          */
232         /*dev->mtu             = 16*1024;*/
233 }
234
235 static int __init make_loopback(int i)
236 {
237         struct net_device *dev1, *dev2;
238         char dev_name[IFNAMSIZ];
239         int err = -ENOMEM;
240
241         sprintf(dev_name, "vif0.%d", i);
242         dev1 = alloc_netdev(sizeof(struct net_private), dev_name, ether_setup);
243         if (!dev1)
244                 return err;
245
246         sprintf(dev_name, "veth%d", i);
247         dev2 = alloc_netdev(sizeof(struct net_private), dev_name, ether_setup);
248         if (!dev2)
249                 goto fail_netdev2;
250
251         loopback_construct(dev1, dev2);
252         loopback_construct(dev2, dev1);
253
254         /*
255          * Initialise a dummy MAC address for the 'dummy backend' interface. We
256          * choose the numerically largest non-broadcast address to prevent the
257          * address getting stolen by an Ethernet bridge for STP purposes.
258          */
259         memset(dev1->dev_addr, 0xFF, ETH_ALEN);
260         dev1->dev_addr[0] &= ~0x01;
261
262         if ((err = register_netdev(dev1)) != 0)
263                 goto fail;
264
265         if ((err = register_netdev(dev2)) != 0) {
266                 unregister_netdev(dev1);
267                 goto fail;
268         }
269
270         return 0;
271
272  fail:
273         free_netdev(dev2);
274  fail_netdev2:
275         free_netdev(dev1);
276         return err;
277 }
278
279 static void __exit clean_loopback(int i)
280 {
281         struct net_device *dev1, *dev2;
282         char dev_name[IFNAMSIZ];
283
284         sprintf(dev_name, "vif0.%d", i);
285         dev1 = dev_get_by_name(dev_name);
286         sprintf(dev_name, "veth%d", i);
287         dev2 = dev_get_by_name(dev_name);
288         if (dev1 && dev2) {
289                 unregister_netdev(dev2);
290                 unregister_netdev(dev1);
291                 free_netdev(dev2);
292                 free_netdev(dev1);
293         }
294 }
295
296 static int __init loopback_init(void)
297 {
298         int i, err = 0;
299
300         if (nloopbacks == -1)
301                 nloopbacks = is_initial_xendomain() ? 4 : 0;
302
303         for (i = 0; i < nloopbacks; i++)
304                 if ((err = make_loopback(i)) != 0)
305                         break;
306
307         return err;
308 }
309
310 module_init(loopback_init);
311
312 static void __exit loopback_exit(void)
313 {
314         int i;
315
316         for (i = nloopbacks; i-- > 0; )
317                 clean_loopback(i);
318 }
319
320 module_exit(loopback_exit);
321
322 MODULE_LICENSE("Dual BSD/GPL");