2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) 2001 Lennert Buytenhek ( buytenh @ gnu . org ) and
* James Leu ( jleu @ mindspring . net ) .
* Copyright ( C ) 2001 by various other people who didn ' t put their name here .
* Licensed under the GPL .
*/
# include "linux/kernel.h"
# include "linux/init.h"
# include "linux/netdevice.h"
# include "linux/etherdevice.h"
# include "net_kern.h"
# include "net_user.h"
# include "daemon.h"
struct daemon_init {
char * sock_type ;
char * ctl_sock ;
} ;
2006-02-01 14:06:29 +03:00
static void daemon_init ( struct net_device * dev , void * data )
2005-04-17 02:20:36 +04:00
{
struct uml_net_private * pri ;
struct daemon_data * dpri ;
struct daemon_init * init = data ;
pri = dev - > priv ;
dpri = ( struct daemon_data * ) pri - > user ;
dpri - > sock_type = init - > sock_type ;
dpri - > ctl_sock = init - > ctl_sock ;
dpri - > fd = - 1 ;
dpri - > control = - 1 ;
dpri - > dev = dev ;
2006-01-19 04:42:53 +03:00
/* We will free this pointer. If it contains crap we're burned. */
dpri - > ctl_addr = NULL ;
dpri - > data_addr = NULL ;
dpri - > local_addr = NULL ;
2005-04-17 02:20:36 +04:00
printk ( " daemon backend (uml_switch version %d) - %s:%s " ,
SWITCH_VERSION , dpri - > sock_type , dpri - > ctl_sock ) ;
printk ( " \n " ) ;
}
static int daemon_read ( int fd , struct sk_buff * * skb ,
struct uml_net_private * lp )
{
* skb = ether_adjust_skb ( * skb , ETH_HEADER_OTHER ) ;
if ( * skb = = NULL ) return ( - ENOMEM ) ;
2007-03-20 01:33:04 +03:00
return ( net_recvfrom ( fd , skb_mac_header ( * skb ) ,
2005-04-17 02:20:36 +04:00
( * skb ) - > dev - > mtu + ETH_HEADER_OTHER ) ) ;
}
static int daemon_write ( int fd , struct sk_buff * * skb ,
struct uml_net_private * lp )
{
return ( daemon_user_write ( fd , ( * skb ) - > data , ( * skb ) - > len ,
( struct daemon_data * ) & lp - > user ) ) ;
}
2006-09-27 12:50:33 +04:00
static const struct net_kern_info daemon_kern_info = {
2005-04-17 02:20:36 +04:00
. init = daemon_init ,
. protocol = eth_protocol ,
. read = daemon_read ,
. write = daemon_write ,
} ;
2006-02-01 14:06:29 +03:00
static int daemon_setup ( char * str , char * * mac_out , void * data )
2005-04-17 02:20:36 +04:00
{
struct daemon_init * init = data ;
char * remain ;
* init = ( ( struct daemon_init )
{ . sock_type = " unix " ,
. ctl_sock = " /tmp/uml.ctl " } ) ;
remain = split_if_spec ( str , mac_out , & init - > sock_type , & init - > ctl_sock ,
NULL ) ;
if ( remain ! = NULL )
printk ( KERN_WARNING " daemon_setup : Ignoring data socket "
" specification \n " ) ;
return ( 1 ) ;
}
static struct transport daemon_transport = {
. list = LIST_HEAD_INIT ( daemon_transport . list ) ,
. name = " daemon " ,
. setup = daemon_setup ,
. user = & daemon_user_info ,
. kern = & daemon_kern_info ,
. private_size = sizeof ( struct daemon_data ) ,
. setup_size = sizeof ( struct daemon_init ) ,
} ;
static int register_daemon ( void )
{
register_transport ( & daemon_transport ) ;
2006-03-31 14:30:10 +04:00
return 0 ;
2005-04-17 02:20:36 +04:00
}
2006-12-07 07:34:55 +03:00
late_initcall ( register_daemon ) ;