1*1da177e4SLinus Torvalds #include "linux/kernel.h" 2*1da177e4SLinus Torvalds #include "linux/stddef.h" 3*1da177e4SLinus Torvalds #include "linux/init.h" 4*1da177e4SLinus Torvalds #include "linux/netdevice.h" 5*1da177e4SLinus Torvalds #include "linux/if_arp.h" 6*1da177e4SLinus Torvalds #include "net_kern.h" 7*1da177e4SLinus Torvalds #include "net_user.h" 8*1da177e4SLinus Torvalds #include "kern.h" 9*1da177e4SLinus Torvalds #include "slirp.h" 10*1da177e4SLinus Torvalds 11*1da177e4SLinus Torvalds struct slirp_init { 12*1da177e4SLinus Torvalds struct arg_list_dummy_wrapper argw; /* XXX should be simpler... */ 13*1da177e4SLinus Torvalds }; 14*1da177e4SLinus Torvalds 15*1da177e4SLinus Torvalds void slirp_init(struct net_device *dev, void *data) 16*1da177e4SLinus Torvalds { 17*1da177e4SLinus Torvalds struct uml_net_private *private; 18*1da177e4SLinus Torvalds struct slirp_data *spri; 19*1da177e4SLinus Torvalds struct slirp_init *init = data; 20*1da177e4SLinus Torvalds int i; 21*1da177e4SLinus Torvalds 22*1da177e4SLinus Torvalds private = dev->priv; 23*1da177e4SLinus Torvalds spri = (struct slirp_data *) private->user; 24*1da177e4SLinus Torvalds *spri = ((struct slirp_data) 25*1da177e4SLinus Torvalds { .argw = init->argw, 26*1da177e4SLinus Torvalds .pid = -1, 27*1da177e4SLinus Torvalds .slave = -1, 28*1da177e4SLinus Torvalds .ibuf = { '\0' }, 29*1da177e4SLinus Torvalds .obuf = { '\0' }, 30*1da177e4SLinus Torvalds .pos = 0, 31*1da177e4SLinus Torvalds .esc = 0, 32*1da177e4SLinus Torvalds .dev = dev }); 33*1da177e4SLinus Torvalds 34*1da177e4SLinus Torvalds dev->init = NULL; 35*1da177e4SLinus Torvalds dev->hard_header_len = 0; 36*1da177e4SLinus Torvalds dev->header_cache_update = NULL; 37*1da177e4SLinus Torvalds dev->hard_header_cache = NULL; 38*1da177e4SLinus Torvalds dev->hard_header = NULL; 39*1da177e4SLinus Torvalds dev->addr_len = 0; 40*1da177e4SLinus Torvalds dev->type = ARPHRD_SLIP; 41*1da177e4SLinus Torvalds dev->tx_queue_len = 256; 42*1da177e4SLinus Torvalds dev->flags = IFF_NOARP; 43*1da177e4SLinus Torvalds printk("SLIRP backend - command line:"); 44*1da177e4SLinus Torvalds for(i=0;spri->argw.argv[i]!=NULL;i++) { 45*1da177e4SLinus Torvalds printk(" '%s'",spri->argw.argv[i]); 46*1da177e4SLinus Torvalds } 47*1da177e4SLinus Torvalds printk("\n"); 48*1da177e4SLinus Torvalds } 49*1da177e4SLinus Torvalds 50*1da177e4SLinus Torvalds static unsigned short slirp_protocol(struct sk_buff *skbuff) 51*1da177e4SLinus Torvalds { 52*1da177e4SLinus Torvalds return(htons(ETH_P_IP)); 53*1da177e4SLinus Torvalds } 54*1da177e4SLinus Torvalds 55*1da177e4SLinus Torvalds static int slirp_read(int fd, struct sk_buff **skb, 56*1da177e4SLinus Torvalds struct uml_net_private *lp) 57*1da177e4SLinus Torvalds { 58*1da177e4SLinus Torvalds return(slirp_user_read(fd, (*skb)->mac.raw, (*skb)->dev->mtu, 59*1da177e4SLinus Torvalds (struct slirp_data *) &lp->user)); 60*1da177e4SLinus Torvalds } 61*1da177e4SLinus Torvalds 62*1da177e4SLinus Torvalds static int slirp_write(int fd, struct sk_buff **skb, 63*1da177e4SLinus Torvalds struct uml_net_private *lp) 64*1da177e4SLinus Torvalds { 65*1da177e4SLinus Torvalds return(slirp_user_write(fd, (*skb)->data, (*skb)->len, 66*1da177e4SLinus Torvalds (struct slirp_data *) &lp->user)); 67*1da177e4SLinus Torvalds } 68*1da177e4SLinus Torvalds 69*1da177e4SLinus Torvalds struct net_kern_info slirp_kern_info = { 70*1da177e4SLinus Torvalds .init = slirp_init, 71*1da177e4SLinus Torvalds .protocol = slirp_protocol, 72*1da177e4SLinus Torvalds .read = slirp_read, 73*1da177e4SLinus Torvalds .write = slirp_write, 74*1da177e4SLinus Torvalds }; 75*1da177e4SLinus Torvalds 76*1da177e4SLinus Torvalds static int slirp_setup(char *str, char **mac_out, void *data) 77*1da177e4SLinus Torvalds { 78*1da177e4SLinus Torvalds struct slirp_init *init = data; 79*1da177e4SLinus Torvalds int i=0; 80*1da177e4SLinus Torvalds 81*1da177e4SLinus Torvalds *init = ((struct slirp_init) 82*1da177e4SLinus Torvalds { argw : { { "slirp", NULL } } }); 83*1da177e4SLinus Torvalds 84*1da177e4SLinus Torvalds str = split_if_spec(str, mac_out, NULL); 85*1da177e4SLinus Torvalds 86*1da177e4SLinus Torvalds if(str == NULL) { /* no command line given after MAC addr */ 87*1da177e4SLinus Torvalds return(1); 88*1da177e4SLinus Torvalds } 89*1da177e4SLinus Torvalds 90*1da177e4SLinus Torvalds do { 91*1da177e4SLinus Torvalds if(i>=SLIRP_MAX_ARGS-1) { 92*1da177e4SLinus Torvalds printk("slirp_setup: truncating slirp arguments\n"); 93*1da177e4SLinus Torvalds break; 94*1da177e4SLinus Torvalds } 95*1da177e4SLinus Torvalds init->argw.argv[i++] = str; 96*1da177e4SLinus Torvalds while(*str && *str!=',') { 97*1da177e4SLinus Torvalds if(*str=='_') *str=' '; 98*1da177e4SLinus Torvalds str++; 99*1da177e4SLinus Torvalds } 100*1da177e4SLinus Torvalds if(*str!=',') 101*1da177e4SLinus Torvalds break; 102*1da177e4SLinus Torvalds *str++='\0'; 103*1da177e4SLinus Torvalds } while(1); 104*1da177e4SLinus Torvalds init->argw.argv[i]=NULL; 105*1da177e4SLinus Torvalds return(1); 106*1da177e4SLinus Torvalds } 107*1da177e4SLinus Torvalds 108*1da177e4SLinus Torvalds static struct transport slirp_transport = { 109*1da177e4SLinus Torvalds .list = LIST_HEAD_INIT(slirp_transport.list), 110*1da177e4SLinus Torvalds .name = "slirp", 111*1da177e4SLinus Torvalds .setup = slirp_setup, 112*1da177e4SLinus Torvalds .user = &slirp_user_info, 113*1da177e4SLinus Torvalds .kern = &slirp_kern_info, 114*1da177e4SLinus Torvalds .private_size = sizeof(struct slirp_data), 115*1da177e4SLinus Torvalds .setup_size = sizeof(struct slirp_init), 116*1da177e4SLinus Torvalds }; 117*1da177e4SLinus Torvalds 118*1da177e4SLinus Torvalds static int register_slirp(void) 119*1da177e4SLinus Torvalds { 120*1da177e4SLinus Torvalds register_transport(&slirp_transport); 121*1da177e4SLinus Torvalds return(1); 122*1da177e4SLinus Torvalds } 123*1da177e4SLinus Torvalds 124*1da177e4SLinus Torvalds __initcall(register_slirp); 125*1da177e4SLinus Torvalds 126*1da177e4SLinus Torvalds /* 127*1da177e4SLinus Torvalds * Overrides for Emacs so that we follow Linus's tabbing style. 128*1da177e4SLinus Torvalds * Emacs will notice this stuff at the end of the file and automatically 129*1da177e4SLinus Torvalds * adjust the settings for this buffer only. This must remain at the end 130*1da177e4SLinus Torvalds * of the file. 131*1da177e4SLinus Torvalds * --------------------------------------------------------------------------- 132*1da177e4SLinus Torvalds * Local variables: 133*1da177e4SLinus Torvalds * c-file-style: "linux" 134*1da177e4SLinus Torvalds * End: 135*1da177e4SLinus Torvalds */ 136