2 * Copyright (C) 2007 Luca Bigliardi (shammash@artha.org).
3 * Licensed under the GPL.
6 * ethN=vde,<vde_switch>,<mac addr>,<port>,<group>,<mode>,<description>
10 #include <linux/init.h>
11 #include <linux/netdevice.h>
16 static void vde_init(struct net_device
*dev
, void *data
)
18 struct vde_init
*init
= data
;
19 struct uml_net_private
*pri
;
20 struct vde_data
*vpri
;
22 pri
= netdev_priv(dev
);
23 vpri
= (struct vde_data
*) pri
->user
;
25 vpri
->vde_switch
= init
->vde_switch
;
26 vpri
->descr
= init
->descr
? init
->descr
: "UML vde_transport";
31 printk("vde backend - %s, ", vpri
->vde_switch
?
32 vpri
->vde_switch
: "(default socket)");
34 vde_init_libstuff(vpri
, init
);
39 static int vde_read(int fd
, struct sk_buff
*skb
, struct uml_net_private
*lp
)
41 struct vde_data
*pri
= (struct vde_data
*) &lp
->user
;
43 if (pri
->conn
!= NULL
)
44 return vde_user_read(pri
->conn
, skb_mac_header(skb
),
45 skb
->dev
->mtu
+ ETH_HEADER_OTHER
);
47 printk(KERN_ERR
"vde_read - we have no VDECONN to read from");
51 static int vde_write(int fd
, struct sk_buff
*skb
, struct uml_net_private
*lp
)
53 struct vde_data
*pri
= (struct vde_data
*) &lp
->user
;
55 if (pri
->conn
!= NULL
)
56 return vde_user_write((void *)pri
->conn
, skb
->data
,
59 printk(KERN_ERR
"vde_write - we have no VDECONN to write to");
63 static const struct net_kern_info vde_kern_info
= {
65 .protocol
= eth_protocol
,
70 static int vde_setup(char *str
, char **mac_out
, void *data
)
72 struct vde_init
*init
= data
;
73 char *remain
, *port_str
= NULL
, *mode_str
= NULL
, *last
;
75 *init
= ((struct vde_init
)
82 remain
= split_if_spec(str
, &init
->vde_switch
, mac_out
, &port_str
,
83 &init
->group
, &mode_str
, &init
->descr
, NULL
);
86 printk(KERN_WARNING
"vde_setup - Ignoring extra data :"
89 if (port_str
!= NULL
) {
90 init
->port
= simple_strtoul(port_str
, &last
, 10);
91 if ((*last
!= '\0') || (last
== port_str
)) {
92 printk(KERN_ERR
"vde_setup - Bad port : '%s'\n",
98 if (mode_str
!= NULL
) {
99 init
->mode
= simple_strtoul(mode_str
, &last
, 8);
100 if ((*last
!= '\0') || (last
== mode_str
)) {
101 printk(KERN_ERR
"vde_setup - Bad mode : '%s'\n",
107 printk(KERN_INFO
"Configured vde device: %s\n", init
->vde_switch
?
108 init
->vde_switch
: "(default socket)");
113 static struct transport vde_transport
= {
114 .list
= LIST_HEAD_INIT(vde_transport
.list
),
117 .user
= &vde_user_info
,
118 .kern
= &vde_kern_info
,
119 .private_size
= sizeof(struct vde_data
),
120 .setup_size
= sizeof(struct vde_init
),
123 static int register_vde(void)
125 register_transport(&vde_transport
);
129 late_initcall(register_vde
);