2019-08-25 12:49:16 +03:00
// SPDX-License-Identifier: GPL-2.0
2007-10-16 12:27:29 +04:00
/*
* Copyright ( C ) 2007 Jeff Dike ( jdike @ { addtoit , linux . intel } . com )
*/
# include <linux/if_arp.h>
# include <linux/init.h>
# include <linux/netdevice.h>
2012-10-08 06:27:32 +04:00
# include <net_kern.h>
2005-04-17 02:20:36 +04:00
# include "slip.h"
struct slip_init {
char * gate_addr ;
} ;
2008-04-28 13:13:57 +04:00
static void slip_init ( struct net_device * dev , void * data )
2005-04-17 02:20:36 +04:00
{
struct uml_net_private * private ;
struct slip_data * spri ;
struct slip_init * init = data ;
2008-12-05 02:07:33 +03:00
private = netdev_priv ( dev ) ;
2005-04-17 02:20:36 +04:00
spri = ( struct slip_data * ) private - > user ;
2006-02-01 14:06:25 +03:00
memset ( spri - > name , 0 , sizeof ( spri - > name ) ) ;
spri - > addr = NULL ;
spri - > gate_addr = init - > gate_addr ;
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-06-14 02:52:18 +04:00
dev - > addr_len = 0 ;
dev - > type = ARPHRD_SLIP ;
2005-04-17 02:20:36 +04:00
dev - > tx_queue_len = 256 ;
dev - > flags = IFF_NOARP ;
printk ( " SLIP backend - SLIP IP = %s \n " , spri - > gate_addr ) ;
}
static unsigned short slip_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 slip_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 slip_user_read ( fd , skb_mac_header ( skb ) , skb - > dev - > mtu ,
2007-10-16 12:27:29 +04:00
( struct slip_data * ) & lp - > user ) ;
2005-04-17 02:20:36 +04:00
}
2007-10-16 12:27:31 +04:00
static int slip_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 slip_user_write ( fd , skb - > data , skb - > len ,
2007-10-16 12:27:29 +04:00
( struct slip_data * ) & lp - > user ) ;
2005-04-17 02:20:36 +04:00
}
2008-04-28 13:13:57 +04:00
static const struct net_kern_info slip_kern_info = {
2005-04-17 02:20:36 +04:00
. init = slip_init ,
. protocol = slip_protocol ,
. read = slip_read ,
. write = slip_write ,
} ;
static int slip_setup ( char * str , char * * mac_out , void * data )
{
struct slip_init * init = data ;
2007-10-16 12:27:29 +04:00
* init = ( ( struct slip_init ) { . gate_addr = NULL } ) ;
2005-04-17 02:20:36 +04:00
2007-10-16 12:27:29 +04:00
if ( str [ 0 ] ! = ' \0 ' )
2005-04-17 02:20:36 +04:00
init - > gate_addr = str ;
2007-10-16 12:27:29 +04:00
return 1 ;
2005-04-17 02:20:36 +04:00
}
static struct transport slip_transport = {
. list = LIST_HEAD_INIT ( slip_transport . list ) ,
. name = " slip " ,
. setup = slip_setup ,
. user = & slip_user_info ,
. kern = & slip_kern_info ,
. private_size = sizeof ( struct slip_data ) ,
. setup_size = sizeof ( struct slip_init ) ,
} ;
static int register_slip ( void )
{
register_transport ( & slip_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_slip ) ;