0001
0002
0003
0004
0005
0006 #include <linux/netdevice.h>
0007 #include <linux/init.h>
0008 #include <linux/skbuff.h>
0009 #include <asm/errno.h>
0010 #include <net_kern.h>
0011 #include "tuntap.h"
0012
0013 struct tuntap_init {
0014 char *dev_name;
0015 char *gate_addr;
0016 };
0017
0018 static void tuntap_init(struct net_device *dev, void *data)
0019 {
0020 struct uml_net_private *pri;
0021 struct tuntap_data *tpri;
0022 struct tuntap_init *init = data;
0023
0024 pri = netdev_priv(dev);
0025 tpri = (struct tuntap_data *) pri->user;
0026 tpri->dev_name = init->dev_name;
0027 tpri->fixed_config = (init->dev_name != NULL);
0028 tpri->gate_addr = init->gate_addr;
0029 tpri->fd = -1;
0030 tpri->dev = dev;
0031
0032 printk(KERN_INFO "TUN/TAP backend - ");
0033 if (tpri->gate_addr != NULL)
0034 printk(KERN_CONT "IP = %s", tpri->gate_addr);
0035 printk(KERN_CONT "\n");
0036 }
0037
0038 static int tuntap_read(int fd, struct sk_buff *skb, struct uml_net_private *lp)
0039 {
0040 return net_read(fd, skb_mac_header(skb),
0041 skb->dev->mtu + ETH_HEADER_OTHER);
0042 }
0043
0044 static int tuntap_write(int fd, struct sk_buff *skb, struct uml_net_private *lp)
0045 {
0046 return net_write(fd, skb->data, skb->len);
0047 }
0048
0049 const struct net_kern_info tuntap_kern_info = {
0050 .init = tuntap_init,
0051 .protocol = eth_protocol,
0052 .read = tuntap_read,
0053 .write = tuntap_write,
0054 };
0055
0056 int tuntap_setup(char *str, char **mac_out, void *data)
0057 {
0058 struct tuntap_init *init = data;
0059
0060 *init = ((struct tuntap_init)
0061 { .dev_name = NULL,
0062 .gate_addr = NULL });
0063 if (tap_setup_common(str, "tuntap", &init->dev_name, mac_out,
0064 &init->gate_addr))
0065 return 0;
0066
0067 return 1;
0068 }
0069
0070 static struct transport tuntap_transport = {
0071 .list = LIST_HEAD_INIT(tuntap_transport.list),
0072 .name = "tuntap",
0073 .setup = tuntap_setup,
0074 .user = &tuntap_user_info,
0075 .kern = &tuntap_kern_info,
0076 .private_size = sizeof(struct tuntap_data),
0077 .setup_size = sizeof(struct tuntap_init),
0078 };
0079
0080 static int register_tuntap(void)
0081 {
0082 register_transport(&tuntap_transport);
0083 return 0;
0084 }
0085
0086 late_initcall(register_tuntap);