Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
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);