1#include "linux/kernel.h" 2#include "linux/stddef.h" 3#include "linux/init.h" 4#include "linux/netdevice.h" 5#include "linux/if_arp.h" 6#include "net_kern.h" 7#include "net_user.h" 8#include "kern.h" 9#include "slip.h" 10 11struct slip_init { 12 char *gate_addr; 13}; 14 15void slip_init(struct net_device *dev, void *data) 16{ 17 struct uml_net_private *private; 18 struct slip_data *spri; 19 struct slip_init *init = data; 20 21 private = dev->priv; 22 spri = (struct slip_data *) private->user; 23 24 memset(spri->name, 0, sizeof(spri->name)); 25 spri->addr = NULL; 26 spri->gate_addr = init->gate_addr; 27 spri->slave = -1; 28 spri->dev = dev; 29 30 slip_proto_init(&spri->slip); 31 32 dev->init = NULL; 33 dev->header_cache_update = NULL; 34 dev->hard_header_cache = NULL; 35 dev->hard_header = NULL; 36 dev->hard_header_len = 0; 37 dev->addr_len = 0; 38 dev->type = ARPHRD_SLIP; 39 dev->tx_queue_len = 256; 40 dev->flags = IFF_NOARP; 41 printk("SLIP backend - SLIP IP = %s\n", spri->gate_addr); 42} 43 44static unsigned short slip_protocol(struct sk_buff *skbuff) 45{ 46 return(htons(ETH_P_IP)); 47} 48 49static int slip_read(int fd, struct sk_buff **skb, 50 struct uml_net_private *lp) 51{ 52 return(slip_user_read(fd, skb_mac_header(*skb), (*skb)->dev->mtu, 53 (struct slip_data *) &lp->user)); 54} 55 56static int slip_write(int fd, struct sk_buff **skb, 57 struct uml_net_private *lp) 58{ 59 return(slip_user_write(fd, (*skb)->data, (*skb)->len, 60 (struct slip_data *) &lp->user)); 61} 62 63const struct net_kern_info slip_kern_info = { 64 .init = slip_init, 65 .protocol = slip_protocol, 66 .read = slip_read, 67 .write = slip_write, 68}; 69 70static int slip_setup(char *str, char **mac_out, void *data) 71{ 72 struct slip_init *init = data; 73 74 *init = ((struct slip_init) 75 { .gate_addr = NULL }); 76 77 if(str[0] != '\0') 78 init->gate_addr = str; 79 return(1); 80} 81 82static struct transport slip_transport = { 83 .list = LIST_HEAD_INIT(slip_transport.list), 84 .name = "slip", 85 .setup = slip_setup, 86 .user = &slip_user_info, 87 .kern = &slip_kern_info, 88 .private_size = sizeof(struct slip_data), 89 .setup_size = sizeof(struct slip_init), 90}; 91 92static int register_slip(void) 93{ 94 register_transport(&slip_transport); 95 return 0; 96} 97 98late_initcall(register_slip); 99