2007-10-16 12:27:29 +04:00
/*
* Copyright ( C ) 2007 Jeff Dike ( jdike @ { addtoit , linux . intel } . com )
* Licensed under the GPL .
*/
# include <linux/if_arp.h>
2012-10-08 06:27:32 +04:00
# include <linux/init.h>
2007-10-16 12:27:29 +04:00
# include <linux/netdevice.h>
# include <linux/string.h>
2012-10-08 06:27:32 +04:00
# include <net_kern.h>
# include <net_user.h>
2005-04-17 02:20:36 +04:00
# include "slirp.h"
struct slirp_init {
struct arg_list_dummy_wrapper argw ; /* XXX should be simpler... */
} ;
void slirp_init ( struct net_device * dev , void * data )
{
struct uml_net_private * private ;
struct slirp_data * spri ;
struct slirp_init * init = data ;
int i ;
2008-12-05 02:07:33 +03:00
private = netdev_priv ( dev ) ;
2005-04-17 02:20:36 +04:00
spri = ( struct slirp_data * ) private - > user ;
2006-02-01 14:06:25 +03:00
spri - > argw = init - > argw ;
spri - > pid = - 1 ;
spri - > slave = - 1 ;
spri - > dev = dev ;
slip_proto_init ( & spri - > slip ) ;
2005-04-17 02:20:36 +04:00
dev - > hard_header_len = 0 ;
2007-10-18 06:35:04 +04:00
dev - > header_ops = NULL ;
2005-04-17 02:20:36 +04:00
dev - > addr_len = 0 ;
dev - > type = ARPHRD_SLIP ;
dev - > tx_queue_len = 256 ;
dev - > flags = IFF_NOARP ;
printk ( " SLIRP backend - command line: " ) ;
2007-10-16 12:27:29 +04:00
for ( i = 0 ; spri - > argw . argv [ i ] ! = NULL ; i + + )
2005-04-17 02:20:36 +04:00
printk ( " '%s' " , spri - > argw . argv [ i ] ) ;
printk ( " \n " ) ;
}
static unsigned short slirp_protocol ( struct sk_buff * skbuff )
{
2007-10-16 12:27:29 +04:00
return htons ( ETH_P_IP ) ;
2005-04-17 02:20:36 +04:00
}
2007-10-16 12:27:31 +04:00
static int slirp_read ( int fd , struct sk_buff * skb , struct uml_net_private * lp )
2005-04-17 02:20:36 +04:00
{
2007-10-16 12:27:31 +04:00
return slirp_user_read ( fd , skb_mac_header ( skb ) , skb - > dev - > mtu ,
( struct slirp_data * ) & lp - > user ) ;
2005-04-17 02:20:36 +04:00
}
2007-10-16 12:27:31 +04:00
static int slirp_write ( int fd , struct sk_buff * skb , struct uml_net_private * lp )
2005-04-17 02:20:36 +04:00
{
2007-10-16 12:27:31 +04:00
return slirp_user_write ( fd , skb - > data , skb - > len ,
( struct slirp_data * ) & lp - > user ) ;
2005-04-17 02:20:36 +04:00
}
2006-09-27 12:50:33 +04:00
const struct net_kern_info slirp_kern_info = {
2005-04-17 02:20:36 +04:00
. init = slirp_init ,
. protocol = slirp_protocol ,
. read = slirp_read ,
. write = slirp_write ,
} ;
static int slirp_setup ( char * str , char * * mac_out , void * data )
{
struct slirp_init * init = data ;
int i = 0 ;
2007-10-16 12:27:29 +04:00
* init = ( ( struct slirp_init ) { . argw = { { " slirp " , NULL } } } ) ;
2005-04-17 02:20:36 +04:00
str = split_if_spec ( str , mac_out , NULL ) ;
2007-10-16 12:27:29 +04:00
if ( str = = NULL ) /* no command line given after MAC addr */
return 1 ;
2005-04-17 02:20:36 +04:00
do {
2007-10-16 12:27:29 +04:00
if ( i > = SLIRP_MAX_ARGS - 1 ) {
printk ( KERN_WARNING " slirp_setup: truncating slirp "
" arguments \n " ) ;
2005-04-17 02:20:36 +04:00
break ;
}
init - > argw . argv [ i + + ] = str ;
while ( * str & & * str ! = ' , ' ) {
2007-10-16 12:27:29 +04:00
if ( * str = = ' _ ' )
* str = ' ' ;
2005-04-17 02:20:36 +04:00
str + + ;
}
2007-10-16 12:27:29 +04:00
if ( * str ! = ' , ' )
2005-04-17 02:20:36 +04:00
break ;
2007-10-16 12:27:29 +04:00
* str + + = ' \0 ' ;
} while ( 1 ) ;
init - > argw . argv [ i ] = NULL ;
return 1 ;
2005-04-17 02:20:36 +04:00
}
static struct transport slirp_transport = {
. list = LIST_HEAD_INIT ( slirp_transport . list ) ,
. name = " slirp " ,
. setup = slirp_setup ,
. user = & slirp_user_info ,
. kern = & slirp_kern_info ,
. private_size = sizeof ( struct slirp_data ) ,
. setup_size = sizeof ( struct slirp_init ) ,
} ;
static int register_slirp ( void )
{
register_transport ( & slirp_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_slirp ) ;