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