1cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike/* 2cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike * Copyright (C) 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 3cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike * Licensed under the GPL. 4cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike */ 5cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <stdio.h> 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <stdlib.h> 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <unistd.h> 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <errno.h> 10cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike#include <fcntl.h> 11cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike#include <string.h> 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <sys/termios.h> 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <sys/wait.h> 1437185b33240870719b6b5913a46e6a441f1ae96fAl Viro#include <net_user.h> 1537185b33240870719b6b5913a46e6a441f1ae96fAl Viro#include <os.h> 16cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike#include "slip.h" 1737185b33240870719b6b5913a46e6a441f1ae96fAl Viro#include <um_malloc.h> 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 19f34d9d2dcb7f17b64124841345b23adc0843e7a5Jeff Dikestatic int slip_user_init(void *data, void *dev) 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct slip_data *pri = data; 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pri->dev = dev; 24f34d9d2dcb7f17b64124841345b23adc0843e7a5Jeff Dike return 0; 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int set_up_tty(int fd) 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct termios tios; 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (tcgetattr(fd, &tios) < 0) { 33cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike printk(UM_KERN_ERR "could not get initial terminal " 34cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike "attributes\n"); 35cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike return -1; 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tios.c_cflag = CS8 | CREAD | HUPCL | CLOCAL; 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tios.c_iflag = IGNBRK | IGNPAR; 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tios.c_oflag = 0; 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tios.c_lflag = 0; 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < NCCS; i++) 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tios.c_cc[i] = 0; 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tios.c_cc[VMIN] = 1; 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tios.c_cc[VTIME] = 0; 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cfsetospeed(&tios, B38400); 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cfsetispeed(&tios, B38400); 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (tcsetattr(fd, TCSAFLUSH, &tios) < 0) { 51cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike printk(UM_KERN_ERR "failed to set terminal attributes\n"); 52cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike return -1; 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 54cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike return 0; 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct slip_pre_exec_data { 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int stdin; 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int stdout; 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int close_me; 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void slip_pre_exec(void *arg) 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct slip_pre_exec_data *data = arg; 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 67cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (data->stdin >= 0) 68cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike dup2(data->stdin, 0); 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dup2(data->stdout, 1); 70cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (data->close_me >= 0) 71cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike close(data->close_me); 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int slip_tramp(char **argv, int fd) 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct slip_pre_exec_data pe_data; 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *output; 784dbed85a35ed37d9608f4f32e5d69efa775d6223Stanislaw Gruszka int pid, fds[2], err, output_len; 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = os_pipe(fds, 1, 0); 81cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (err < 0) { 82cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike printk(UM_KERN_ERR "slip_tramp : pipe failed, err = %d\n", 83cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike -err); 84a3c77c67a443e631febf708bb0c376caede31657Jeff Dike goto out; 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = 0; 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pe_data.stdin = fd; 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pe_data.stdout = fds[1]; 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pe_data.close_me = fds[0]; 91c43990162fc7f9d2f15a12797fdc6f9c0905f704Jeff Dike err = run_helper(slip_pre_exec, &pe_data, argv); 92cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (err < 0) 93a3c77c67a443e631febf708bb0c376caede31657Jeff Dike goto out_close; 94a3c77c67a443e631febf708bb0c376caede31657Jeff Dike pid = err; 95a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 961ffb9164f51094b7105ce9f81600b222ddf5b82cJeff Dike output_len = UM_KERN_PAGE_SIZE; 9743f5b3085fdd27c4edf535d938b2cb0ccead4f75Jeff Dike output = uml_kmalloc(output_len, UM_GFP_KERNEL); 98cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (output == NULL) { 99cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike printk(UM_KERN_ERR "slip_tramp : failed to allocate output " 100cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike "buffer\n"); 101a3c77c67a443e631febf708bb0c376caede31657Jeff Dike os_kill_process(pid, 1); 102a3c77c67a443e631febf708bb0c376caede31657Jeff Dike err = -ENOMEM; 1039a8beb93067764344523386e0e5388d3fd78add7Vitaliy Ivanov goto out_close; 104a3c77c67a443e631febf708bb0c376caede31657Jeff Dike } 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 106cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike close(fds[1]); 107a3c77c67a443e631febf708bb0c376caede31657Jeff Dike read_output(fds[0], output, output_len); 108a3c77c67a443e631febf708bb0c376caede31657Jeff Dike printk("%s", output); 109a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 1101aa351a308d2c3ddb92b6cc45083fc54271d0010Jeff Dike err = helper_wait(pid); 111cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike close(fds[0]); 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 113a3c77c67a443e631febf708bb0c376caede31657Jeff Dike kfree(output); 114a3c77c67a443e631febf708bb0c376caede31657Jeff Dike return err; 115a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 116a3c77c67a443e631febf708bb0c376caede31657Jeff Dikeout_close: 117cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike close(fds[0]); 118cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike close(fds[1]); 119a3c77c67a443e631febf708bb0c376caede31657Jeff Dikeout: 120a3c77c67a443e631febf708bb0c376caede31657Jeff Dike return err; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int slip_open(void *data) 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct slip_data *pri = data; 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char version_buf[sizeof("nnnnn\0")]; 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")]; 128cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike char *argv[] = { "uml_net", version_buf, "slip", "up", gate_buf, 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL }; 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int sfd, mfd, err; 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 132a3c77c67a443e631febf708bb0c376caede31657Jeff Dike err = get_pty(); 133cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (err < 0) { 134cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike printk(UM_KERN_ERR "slip-open : Failed to open pty, err = %d\n", 135cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike -err); 136a3c77c67a443e631febf708bb0c376caede31657Jeff Dike goto out; 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 138a3c77c67a443e631febf708bb0c376caede31657Jeff Dike mfd = err; 139a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 140cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike err = open(ptsname(mfd), O_RDWR, 0); 141cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (err < 0) { 142cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike printk(UM_KERN_ERR "Couldn't open tty for slip line, " 143cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike "err = %d\n", -err); 144a3c77c67a443e631febf708bb0c376caede31657Jeff Dike goto out_close; 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 146a3c77c67a443e631febf708bb0c376caede31657Jeff Dike sfd = err; 147a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 148cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (set_up_tty(sfd)) 149a3c77c67a443e631febf708bb0c376caede31657Jeff Dike goto out_close2; 150a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pri->slave = sfd; 152a3c77c67a443e631febf708bb0c376caede31657Jeff Dike pri->slip.pos = 0; 153a3c77c67a443e631febf708bb0c376caede31657Jeff Dike pri->slip.esc = 0; 154cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (pri->gate_addr != NULL) { 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sprintf(version_buf, "%d", UML_NET_VERSION); 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strcpy(gate_buf, pri->gate_addr); 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = slip_tramp(argv, sfd); 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 160cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (err < 0) { 161cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike printk(UM_KERN_ERR "slip_tramp failed - err = %d\n", 162cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike -err); 163a3c77c67a443e631febf708bb0c376caede31657Jeff Dike goto out_close2; 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = os_get_ifname(pri->slave, pri->name); 166cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (err < 0) { 167cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike printk(UM_KERN_ERR "get_ifname failed, err = %d\n", 168cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike -err); 169a3c77c67a443e631febf708bb0c376caede31657Jeff Dike goto out_close2; 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds iter_addresses(pri->dev, open_addr, pri->name); 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else { 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = os_set_slip(sfd); 175cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (err < 0) { 176cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike printk(UM_KERN_ERR "Failed to set slip discipline " 177cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike "encapsulation - err = %d\n", -err); 178a3c77c67a443e631febf708bb0c376caede31657Jeff Dike goto out_close2; 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 181cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike return mfd; 182a3c77c67a443e631febf708bb0c376caede31657Jeff Dikeout_close2: 183cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike close(sfd); 184a3c77c67a443e631febf708bb0c376caede31657Jeff Dikeout_close: 185cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike close(mfd); 186a3c77c67a443e631febf708bb0c376caede31657Jeff Dikeout: 187a3c77c67a443e631febf708bb0c376caede31657Jeff Dike return err; 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void slip_close(int fd, void *data) 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct slip_data *pri = data; 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char version_buf[sizeof("nnnnn\0")]; 194cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike char *argv[] = { "uml_net", version_buf, "slip", "down", pri->name, 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NULL }; 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 198cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (pri->gate_addr != NULL) 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds iter_addresses(pri->dev, close_addr, pri->name); 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sprintf(version_buf, "%d", UML_NET_VERSION); 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = slip_tramp(argv, pri->slave); 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 205cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (err != 0) 206cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike printk(UM_KERN_ERR "slip_tramp failed - errno = %d\n", -err); 207cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike close(fd); 208cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike close(pri->slave); 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pri->slave = -1; 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint slip_user_read(int fd, void *buf, int len, struct slip_data *pri) 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 214a3c77c67a443e631febf708bb0c376caede31657Jeff Dike return slip_proto_read(fd, buf, len, &pri->slip); 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint slip_user_write(int fd, void *buf, int len, struct slip_data *pri) 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 219a3c77c67a443e631febf708bb0c376caede31657Jeff Dike return slip_proto_write(fd, buf, len, &pri->slip); 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void slip_add_addr(unsigned char *addr, unsigned char *netmask, 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void *data) 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct slip_data *pri = data; 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 227cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (pri->slave < 0) 228cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike return; 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds open_addr(addr, netmask, pri->name); 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void slip_del_addr(unsigned char *addr, unsigned char *netmask, 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void *data) 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct slip_data *pri = data; 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 237cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike if (pri->slave < 0) 238cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085Jeff Dike return; 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds close_addr(addr, netmask, pri->name); 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2425e7672ec3f059f764fcc5c78216e24bb16c44dbaJeff Dikeconst struct net_user_info slip_user_info = { 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .init = slip_user_init, 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .open = slip_open, 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .close = slip_close, 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .remove = NULL, 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .add_address = slip_add_addr, 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .delete_address = slip_del_addr, 249b53f35a8093e6aed7e8e880eaa0b89a3d2fdfb0aJeff Dike .mtu = BUF_SIZE, 250b53f35a8093e6aed7e8e880eaa0b89a3d2fdfb0aJeff Dike .max_packet = BUF_SIZE, 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 252