From 55d81ddd3a651d732be6cf478246b7f47d9874a9 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Tue, 18 Aug 2015 14:57:08 +0200 Subject: [PATCH 1/3] tunslip6: support MTU configuration, XON/XOFF flow control, and baudrates up to 1000000 mbps --- tools/tunslip6.c | 91 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 82 insertions(+), 9 deletions(-) diff --git a/tools/tunslip6.c b/tools/tunslip6.c index 75659e270..3029eb536 100644 --- a/tools/tunslip6.c +++ b/tools/tunslip6.c @@ -62,7 +62,7 @@ const char *netmask; int slipfd = 0; uint16_t basedelay=0,delaymsec=0; uint32_t startsec,startmsec,delaystartsec,delaystartmsec; -int timestamp = 0, flowcontrol=0, showprogress=0; +int timestamp = 0, flowcontrol=0, showprogress=0, flowcontrol_xonxoff=0; int ssystem(const char *fmt, ...) __attribute__((__format__ (__printf__, 1, 2))); @@ -75,6 +75,10 @@ void slip_send_char(int fd, unsigned char c); char tundev[1024] = { "" }; +/* IPv6 required minimum MTU */ +#define MIN_DEVMTU 1500 +int devmtu = MIN_DEVMTU; + int ssystem(const char *fmt, ...) __attribute__((__format__ (__printf__, 1, 2))); @@ -91,11 +95,15 @@ ssystem(const char *fmt, ...) return system(cmd); } -#define SLIP_END 0300 -#define SLIP_ESC 0333 -#define SLIP_ESC_END 0334 -#define SLIP_ESC_ESC 0335 +#define SLIP_END 0300 +#define SLIP_ESC 0333 +#define SLIP_ESC_END 0334 +#define SLIP_ESC_ESC 0335 +#define SLIP_ESC_XON 0336 +#define SLIP_ESC_XOFF 0337 +#define XON 17 +#define XOFF 19 /* get sockaddr, IPv4 or IPv6: */ void * @@ -287,6 +295,12 @@ serial_to_tun(FILE *inslip, int outfd) case SLIP_ESC_ESC: c = SLIP_ESC; break; + case SLIP_ESC_XON: + c = XON; + break; + case SLIP_ESC_XOFF: + c = XOFF; + break; } /* FALLTHROUGH */ default: @@ -330,6 +344,22 @@ slip_send_char(int fd, unsigned char c) slip_send(fd, SLIP_ESC); slip_send(fd, SLIP_ESC_ESC); break; + case XON: + if(flowcontrol_xonxoff) { + slip_send(fd, SLIP_ESC); + slip_send(fd, SLIP_ESC_XON); + } else { + slip_send(fd, c); + } + break; + case XOFF: + if(flowcontrol_xonxoff) { + slip_send(fd, SLIP_ESC); + slip_send(fd, SLIP_ESC_XOFF); + } else { + slip_send(fd, c); + } + break; default: slip_send(fd, c); break; @@ -415,6 +445,22 @@ write_to_serial(int outfd, void *inbuf, int len) slip_send(outfd, SLIP_ESC); slip_send(outfd, SLIP_ESC_ESC); break; + case XON: + if(flowcontrol_xonxoff) { + slip_send(outfd, SLIP_ESC); + slip_send(outfd, SLIP_ESC_XON); + } else { + slip_send(outfd, p[i]); + } + break; + case XOFF: + if(flowcontrol_xonxoff) { + slip_send(outfd, SLIP_ESC); + slip_send(outfd, SLIP_ESC_XOFF); + } else { + slip_send(outfd, p[i]); + } + break; default: slip_send(outfd, p[i]); break; @@ -467,6 +513,12 @@ stty_telos(int fd) tty.c_cflag |= CRTSCTS; else tty.c_cflag &= ~CRTSCTS; + tty.c_iflag &= ~IXON; + if(flowcontrol_xonxoff) { + tty.c_iflag |= IXOFF | IXANY; + } else { + tty.c_iflag &= ~IXOFF & ~IXANY; + } tty.c_cflag &= ~HUPCL; tty.c_cflag &= ~CLOCAL; @@ -609,7 +661,7 @@ ifconf(const char *tundev, const char *ipaddr) { #ifdef linux if (timestamp) stamptime(); - ssystem("ifconfig %s inet `hostname` up", tundev); + ssystem("ifconfig %s inet `hostname` mtu %d up", tundev, devmtu); if (timestamp) stamptime(); ssystem("ifconfig %s add %s", tundev, ipaddr); @@ -670,7 +722,7 @@ ifconf(const char *tundev, const char *ipaddr) prefix = "64"; } if (timestamp) stamptime(); - ssystem("ifconfig %s inet6 up", tundev ); + ssystem("ifconfig %s inet6 mtu %d up", tundev, devmtu); if (timestamp) stamptime(); ssystem("ifconfig %s inet6 %s add", tundev, ipaddr ); if (timestamp) stamptime(); @@ -679,7 +731,7 @@ ifconf(const char *tundev, const char *ipaddr) } #else if (timestamp) stamptime(); - ssystem("ifconfig %s inet `hostname` %s up", tundev, ipaddr); + ssystem("ifconfig %s inet `hostname` %s mtu %d up", tundev, ipaddr, devmtu); if (timestamp) stamptime(); ssystem("sysctl -w net.inet.ip.forwarding=1"); #endif /* !linux */ @@ -708,7 +760,7 @@ main(int argc, char **argv) prog = argv[0]; setvbuf(stdout, NULL, _IOLBF, 0); /* Line buffered output. */ - while((c = getopt(argc, argv, "B:HILPhs:t:v::d::a:p:T")) != -1) { + while((c = getopt(argc, argv, "B:HILPhXM:s:t:v::d::a:p:T")) != -1) { switch(c) { case 'B': baudrate = atoi(optarg); @@ -718,10 +770,20 @@ main(int argc, char **argv) flowcontrol=1; break; + case 'X': + flowcontrol_xonxoff=1; + break; + case 'L': timestamp=1; break; + case 'M': + devmtu=atoi(optarg); + if(devmtu < MIN_DEVMTU) { + devmtu = MIN_DEVMTU; + } + case 'P': showprogress=1; break; @@ -782,8 +844,10 @@ fprintf(stderr," -B baudrate 9600,19200,38400,57600,115200 (default),230400\n #endif fprintf(stderr," -H Hardware CTS/RTS flow control (default disabled)\n"); fprintf(stderr," -I Inquire IP address\n"); +fprintf(stderr," -X Software XON/XOFF flow control (default disabled)\n"); fprintf(stderr," -L Log output format (adds time stamps)\n"); fprintf(stderr," -s siodev Serial device (default /dev/ttyUSB0)\n"); +fprintf(stderr," -M Interface MTU (default and min: 1280)\n"); fprintf(stderr," -T Make tap interface (default is tun interface)\n"); fprintf(stderr," -t tundev Name of interface (default tap0 or tun0)\n"); fprintf(stderr," -v[level] Verbosity level\n"); @@ -836,9 +900,18 @@ exit(1); case 460800: b_rate = B460800; break; + case 500000: + b_rate = B500000; + break; + case 576000: + b_rate = B576000; + break; case 921600: b_rate = B921600; break; + case 1000000: + b_rate = B1000000; + break; #endif default: err(1, "unknown baudrate %d", baudrate); From 88118482a80ccb327d68fd0f8559f38983eeb8aa Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Thu, 20 Aug 2015 10:40:23 +0200 Subject: [PATCH 2/3] Added more baudrates, added missing defs for MacOS --- tools/tunslip6.c | 166 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 160 insertions(+), 6 deletions(-) diff --git a/tools/tunslip6.c b/tools/tunslip6.c index 3029eb536..e654930ed 100644 --- a/tools/tunslip6.c +++ b/tools/tunslip6.c @@ -56,6 +56,50 @@ #include +#if __APPLE__ +#ifndef B460800 +#define B460800 460800 +#endif +#ifndef B500000 +#define B500000 500000 +#endif +#ifndef B576000 +#define B576000 576000 +#endif +#ifndef B921600 +#define B921600 921600 +#endif +#ifndef B1000000 +#define B1000000 1000000 +#endif +#ifndef B1152000 +#define B1152000 1152000 +#endif +#ifndef B1500000 +#define B1500000 1500000 +#endif +#ifndef B2000000 +#define B2000000 2000000 +#endif +#ifndef B2500000 +#define B2500000 2500000 +#endif +#ifndef B3000000 +#define B3000000 3000000 +#endif +#ifndef B3500000 +#define B3500000 3500000 +#endif +#ifndef B4000000 +#define B4000000 4000000 +#endif +#endif + +#ifndef BAUDRATE +#define BAUDRATE B115200 +#endif +speed_t b_rate = BAUDRATE; + int verbose = 1; const char *ipaddr; const char *netmask; @@ -488,11 +532,6 @@ tun_to_serial(int infd, int outfd) return size; } -#ifndef BAUDRATE -#define BAUDRATE B115200 -#endif -speed_t b_rate = BAUDRATE; - void stty_telos(int fd) { @@ -878,40 +917,155 @@ exit(1); switch(baudrate) { case -2: break; /* Use default. */ +#ifdef B50 + case 50: + b_rate = B50; + break; +#endif +#ifdef B75 + case 75: + b_rate = B75; + break; +#endif +#ifdef B110 + case 110: + b_rate = B110; + break; +#endif +#ifdef B134 + case 134: + b_rate = B134; + break; +#endif +#ifdef B150 + case 150: + b_rate = B150; + break; +#endif +#ifdef B200 + case 200: + b_rate = B200; + break; +#endif +#ifdef B300 + case 300: + b_rate = B300; + break; +#endif +#ifdef B600 + case 600: + b_rate = B600; + break; +#endif +#ifdef B1200 + case 1200: + b_rate = B1200; + break; +#endif +#ifdef B1800 + case 1800: + b_rate = B1800; + break; +#endif +#ifdef B2400 + case 2400: + b_rate = B2400; + break; +#endif +#ifdef B4800 + case 4800: + b_rate = B4800; + break; +#endif +#ifdef B9600 case 9600: b_rate = B9600; break; +#endif +#ifdef B19200 case 19200: b_rate = B19200; break; +#endif +#ifdef B38400 case 38400: b_rate = B38400; break; +#endif +#ifdef B57600 case 57600: b_rate = B57600; break; +#endif +#ifdef B115200 case 115200: b_rate = B115200; break; +#endif +#ifdef B230400 case 230400: b_rate = B230400; break; -#ifndef __APPLE__ +#endif +#ifdef B460800 case 460800: b_rate = B460800; break; +#endif +#ifdef B500000 case 500000: b_rate = B500000; break; +#endif +#ifdef B576000 case 576000: b_rate = B576000; break; +#endif +#ifdef B921600 case 921600: b_rate = B921600; break; +#endif +#ifdef B1000000 case 1000000: b_rate = B1000000; break; +#endif +#ifdef B1152000 + case 1152000: + b_rate = B1152000; + break; +#endif +#ifdef B1500000 + case 1500000: + b_rate = B1500000; + break; +#endif +#ifdef B2000000 + case 2000000: + b_rate = B2000000; + break; +#endif +#ifdef B2500000 + case 2500000: + b_rate = B2500000; + break; +#endif +#ifdef B3000000 + case 3000000: + b_rate = B3000000; + break; +#endif +#ifdef B3500000 + case 3500000: + b_rate = B3500000; + break; +#endif +#ifdef B4000000 + case 4000000: + b_rate = B4000000; + break; #endif default: err(1, "unknown baudrate %d", baudrate); From 0e31bb12ea2b432da2081db248e5da25c9059eac Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Thu, 20 Aug 2015 11:40:22 +0200 Subject: [PATCH 3/3] Moved generic baudrate defines and selection code to a new module tools/tools-utils.[ch] --- tools/Makefile | 2 + tools/tools-utils.c | 161 +++++++++++++++++++++++++++++++++++ tools/tools-utils.h | 79 +++++++++++++++++ tools/tunslip6.c | 200 ++------------------------------------------ 4 files changed, 248 insertions(+), 194 deletions(-) create mode 100644 tools/tools-utils.c create mode 100644 tools/tools-utils.h diff --git a/tools/Makefile b/tools/Makefile index 87f14d317..3dab44216 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -1,5 +1,7 @@ all: tunslip +tunslip6: tools-utils.c tunslip6.c + gitclean: @git clean -d -x -n .. @echo "Enter yes to delete these files"; diff --git a/tools/tools-utils.c b/tools/tools-utils.c new file mode 100644 index 000000000..6ad0a9365 --- /dev/null +++ b/tools/tools-utils.c @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2015, SICS Swedish ICT + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + */ + +#include "tools-utils.h" + +speed_t +select_baudrate(int baudrate) { + switch(baudrate) { +#ifdef B50 + case 50: + return B50; +#endif +#ifdef B75 + case 75: + return B75; +#endif +#ifdef B110 + case 110: + return B110; +#endif +#ifdef B134 + case 134: + return B134; +#endif +#ifdef B150 + case 150: + return B150; +#endif +#ifdef B200 + case 200: + return B200; +#endif +#ifdef B300 + case 300: + return B300; +#endif +#ifdef B600 + case 600: + return B600; +#endif +#ifdef B1200 + case 1200: + return B1200; +#endif +#ifdef B1800 + case 1800: + return B1800; +#endif +#ifdef B2400 + case 2400: + return B2400; +#endif +#ifdef B4800 + case 4800: + return B4800; +#endif +#ifdef B9600 + case 9600: + return B9600; +#endif +#ifdef B19200 + case 19200: + return B19200; +#endif +#ifdef B38400 + case 38400: + return B38400; +#endif +#ifdef B57600 + case 57600: + return B57600; +#endif +#ifdef B115200 + case 115200: + return B115200; +#endif +#ifdef B230400 + return B230400; +#endif +#ifdef B460800 + case 460800: + return B460800; +#endif +#ifdef B500000 + case 500000: + return B500000; +#endif +#ifdef B576000 + case 576000: + return B576000; +#endif +#ifdef B921600 + case 921600: + return B921600; +#endif +#ifdef B1000000 + case 1000000: + return B1000000; +#endif +#ifdef B1152000 + case 1152000: + return B1152000; +#endif +#ifdef B1500000 + case 1500000: + return B1500000; +#endif +#ifdef B2000000 + case 2000000: + return B2000000; +#endif +#ifdef B2500000 + case 2500000: + return B2500000; +#endif +#ifdef B3000000 + case 3000000: + return B3000000; +#endif +#ifdef B3500000 + case 3500000: + return B3500000; +#endif +#ifdef B4000000 + case 4000000: + return B4000000; +#endif + default: + return 0; + } +} + diff --git a/tools/tools-utils.h b/tools/tools-utils.h new file mode 100644 index 000000000..4b996cc75 --- /dev/null +++ b/tools/tools-utils.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015, SICS Swedish ICT + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + */ + +#ifndef TOOLS_UTILS +#define TOOLS_UTILS + +#include + +#if __APPLE__ +#ifndef B460800 +#define B460800 460800 +#endif +#ifndef B500000 +#define B500000 500000 +#endif +#ifndef B576000 +#define B576000 576000 +#endif +#ifndef B921600 +#define B921600 921600 +#endif +#ifndef B1000000 +#define B1000000 1000000 +#endif +#ifndef B1152000 +#define B1152000 1152000 +#endif +#ifndef B1500000 +#define B1500000 1500000 +#endif +#ifndef B2000000 +#define B2000000 2000000 +#endif +#ifndef B2500000 +#define B2500000 2500000 +#endif +#ifndef B3000000 +#define B3000000 3000000 +#endif +#ifndef B3500000 +#define B3500000 3500000 +#endif +#ifndef B4000000 +#define B4000000 4000000 +#endif +#endif + +speed_t select_baudrate(int baudrate); + +#endif /* TOOLS_UTILS */ diff --git a/tools/tunslip6.c b/tools/tunslip6.c index e654930ed..0f10a72bf 100644 --- a/tools/tunslip6.c +++ b/tools/tunslip6.c @@ -56,44 +56,7 @@ #include -#if __APPLE__ -#ifndef B460800 -#define B460800 460800 -#endif -#ifndef B500000 -#define B500000 500000 -#endif -#ifndef B576000 -#define B576000 576000 -#endif -#ifndef B921600 -#define B921600 921600 -#endif -#ifndef B1000000 -#define B1000000 1000000 -#endif -#ifndef B1152000 -#define B1152000 1152000 -#endif -#ifndef B1500000 -#define B1500000 1500000 -#endif -#ifndef B2000000 -#define B2000000 2000000 -#endif -#ifndef B2500000 -#define B2500000 2500000 -#endif -#ifndef B3000000 -#define B3000000 3000000 -#endif -#ifndef B3500000 -#define B3500000 3500000 -#endif -#ifndef B4000000 -#define B4000000 4000000 -#endif -#endif +#include "tools-utils.h" #ifndef BAUDRATE #define BAUDRATE B115200 @@ -914,162 +877,11 @@ exit(1); } ipaddr = argv[1]; - switch(baudrate) { - case -2: - break; /* Use default. */ -#ifdef B50 - case 50: - b_rate = B50; - break; -#endif -#ifdef B75 - case 75: - b_rate = B75; - break; -#endif -#ifdef B110 - case 110: - b_rate = B110; - break; -#endif -#ifdef B134 - case 134: - b_rate = B134; - break; -#endif -#ifdef B150 - case 150: - b_rate = B150; - break; -#endif -#ifdef B200 - case 200: - b_rate = B200; - break; -#endif -#ifdef B300 - case 300: - b_rate = B300; - break; -#endif -#ifdef B600 - case 600: - b_rate = B600; - break; -#endif -#ifdef B1200 - case 1200: - b_rate = B1200; - break; -#endif -#ifdef B1800 - case 1800: - b_rate = B1800; - break; -#endif -#ifdef B2400 - case 2400: - b_rate = B2400; - break; -#endif -#ifdef B4800 - case 4800: - b_rate = B4800; - break; -#endif -#ifdef B9600 - case 9600: - b_rate = B9600; - break; -#endif -#ifdef B19200 - case 19200: - b_rate = B19200; - break; -#endif -#ifdef B38400 - case 38400: - b_rate = B38400; - break; -#endif -#ifdef B57600 - case 57600: - b_rate = B57600; - break; -#endif -#ifdef B115200 - case 115200: - b_rate = B115200; - break; -#endif -#ifdef B230400 - case 230400: - b_rate = B230400; - break; -#endif -#ifdef B460800 - case 460800: - b_rate = B460800; - break; -#endif -#ifdef B500000 - case 500000: - b_rate = B500000; - break; -#endif -#ifdef B576000 - case 576000: - b_rate = B576000; - break; -#endif -#ifdef B921600 - case 921600: - b_rate = B921600; - break; -#endif -#ifdef B1000000 - case 1000000: - b_rate = B1000000; - break; -#endif -#ifdef B1152000 - case 1152000: - b_rate = B1152000; - break; -#endif -#ifdef B1500000 - case 1500000: - b_rate = B1500000; - break; -#endif -#ifdef B2000000 - case 2000000: - b_rate = B2000000; - break; -#endif -#ifdef B2500000 - case 2500000: - b_rate = B2500000; - break; -#endif -#ifdef B3000000 - case 3000000: - b_rate = B3000000; - break; -#endif -#ifdef B3500000 - case 3500000: - b_rate = B3500000; - break; -#endif -#ifdef B4000000 - case 4000000: - b_rate = B4000000; - break; -#endif - default: - err(1, "unknown baudrate %d", baudrate); - break; + if(baudrate != -2) { /* -2: use default baudrate */ + b_rate = select_baudrate(baudrate); + if(b_rate == 0) { + err(1, "unknown baudrate %d", baudrate); + } } if(*tundev == '\0') {