1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
6 #include <linux/netdevice.h>
7 #include <linux/init.h>
8 #include <linux/skbuff.h>
18 static void tuntap_init(struct net_device
*dev
, void *data
)
20 struct uml_net_private
*pri
;
21 struct tuntap_data
*tpri
;
22 struct tuntap_init
*init
= data
;
24 pri
= netdev_priv(dev
);
25 tpri
= (struct tuntap_data
*) pri
->user
;
26 tpri
->dev_name
= init
->dev_name
;
27 tpri
->fixed_config
= (init
->dev_name
!= NULL
);
28 tpri
->gate_addr
= init
->gate_addr
;
32 printk(KERN_INFO
"TUN/TAP backend - ");
33 if (tpri
->gate_addr
!= NULL
)
34 printk(KERN_CONT
"IP = %s", tpri
->gate_addr
);
35 printk(KERN_CONT
"\n");
38 static int tuntap_read(int fd
, struct sk_buff
*skb
, struct uml_net_private
*lp
)
40 return net_read(fd
, skb_mac_header(skb
),
41 skb
->dev
->mtu
+ ETH_HEADER_OTHER
);
44 static int tuntap_write(int fd
, struct sk_buff
*skb
, struct uml_net_private
*lp
)
46 return net_write(fd
, skb
->data
, skb
->len
);
49 const struct net_kern_info tuntap_kern_info
= {
51 .protocol
= eth_protocol
,
53 .write
= tuntap_write
,
56 int tuntap_setup(char *str
, char **mac_out
, void *data
)
58 struct tuntap_init
*init
= data
;
60 *init
= ((struct tuntap_init
)
63 if (tap_setup_common(str
, "tuntap", &init
->dev_name
, mac_out
,
70 static struct transport tuntap_transport
= {
71 .list
= LIST_HEAD_INIT(tuntap_transport
.list
),
73 .setup
= tuntap_setup
,
74 .user
= &tuntap_user_info
,
75 .kern
= &tuntap_kern_info
,
76 .private_size
= sizeof(struct tuntap_data
),
77 .setup_size
= sizeof(struct tuntap_init
),
80 static int register_tuntap(void)
82 register_transport(&tuntap_transport
);
86 late_initcall(register_tuntap
);