Compare commits

..

No commits in common. "master" and "0.1.6" have entirely different histories.

10 changed files with 756 additions and 1121 deletions

View File

@ -7,9 +7,3 @@
#define MTU_MIN 74 #define MTU_MIN 74
#define MTU_MAX 1522 #define MTU_MAX 1522
#define MTU_DEFAULT 329 #define MTU_DEFAULT 329
#define TXQUEUELEN 10
// ARP timings, in seconds
#define ARP_BASE_REACHABLE_TIME 300
#define ARP_RETRANS_TIME 5

View File

@ -6,7 +6,7 @@ Attach KISS TNC devices as network interfaces in Linux. This program allows you
Currently it is recommended to compile and install __tncattach__ from source with the below commands. Currently it is recommended to compile and install __tncattach__ from source with the below commands.
If that is not possible for you, precompiled __amd64__ and __armhf__ (Raspberry Pi and similar) binaries have been provided in the releases section. You can [download the latest release here](https://github.com/markqvist/tncattach/releases). If that is not possible for you, precompiled __amd64__ and __armhf__ (Raspberry Pi and similar) binaries have been provided in the releases section. You can [download the latest release here](https://github.com/markqvist/tncattach/releases/tag/0.1.3).
```sh ```sh
# If you don't already have a compiler installed # If you don't already have a compiler installed
@ -34,17 +34,14 @@ Usage: tncattach [OPTION...] port baudrate
Attach TNC devices as system network interfaces Attach TNC devices as system network interfaces
-m, --mtu=MTU Specify interface MTU -d, --daemon Run tncattach as a daemon
-e, --ethernet Create a full ethernet device -e, --ethernet Create a full ethernet device
-i, --ipv4=IP_ADDRESS Configure an IPv4 address on interface -i, --ipv4=IP_ADDRESS Configure an IPv4 address on interface
-m, --mtu=MTU Specify interface MTU
-n, --noipv6 Filter IPv6 traffic from reaching TNC -n, --noipv6 Filter IPv6 traffic from reaching TNC
--noup Only create interface, don't bring it up --noup Only create interface, don't bring it up
-T, --kisstcp Use KISS over TCP instead of serial port
-H, --tcphost=TCP_HOST Host to connect to when using KISS over TCP
-P, --tcpport=TCP_PORT TCP port when using KISS over TCP
-t, --interval=SECONDS Maximum interval between station identifications
-s, --id=CALLSIGN Station identification data -s, --id=CALLSIGN Station identification data
-d, --daemon Run tncattach as a daemon -t, --interval=SECONDS Maximum interval between station identifications
-v, --verbose Enable verbose output -v, --verbose Enable verbose output
-?, --help Give this help list -?, --help Give this help list
--usage Give a short usage message --usage Give a short usage message
@ -53,8 +50,6 @@ Attach TNC devices as system network interfaces
The program supports attaching TNCs as point-to-point tunnel devices, or generic ethernet devices. The ethernet mode is suitable for point-to-multipoint setups, and can be enabled with the corresponding command line switch. If you only need point-to-point links, it is advisable to just use the standard point-to-point mode, since it doesn't incur the ethernet header overhead on each packet. The program supports attaching TNCs as point-to-point tunnel devices, or generic ethernet devices. The ethernet mode is suitable for point-to-multipoint setups, and can be enabled with the corresponding command line switch. If you only need point-to-point links, it is advisable to just use the standard point-to-point mode, since it doesn't incur the ethernet header overhead on each packet.
If you want to connect to a virtual KISS TNC over a TCP connection, you can use the -T option, along with the -H and -P options to specify the host and port.
Additionally, it is worth noting that __tncattach__ can filter out IPv6 packets from reaching the TNC. Most operating systems attempts to autoconfigure IPv6 when an interface is brought up, which results in a substantial amount of IPv6 traffic generated by router solicitations and similar, which is usually unwanted for packet radio links and similar. Additionally, it is worth noting that __tncattach__ can filter out IPv6 packets from reaching the TNC. Most operating systems attempts to autoconfigure IPv6 when an interface is brought up, which results in a substantial amount of IPv6 traffic generated by router solicitations and similar, which is usually unwanted for packet radio links and similar.
If you intend to use __tncattach__ on a system with mDNS services enabled (avahi-daemon, for example), you may want to consider modifying your mDNS setup to exclude TNC interfaces, or turning it off entirely, since it will generate a lot of traffic that might be unwanted. If you intend to use __tncattach__ on a system with mDNS services enabled (avahi-daemon, for example), you may want to consider modifying your mDNS setup to exclude TNC interfaces, or turning it off entirely, since it will generate a lot of traffic that might be unwanted.
@ -80,13 +75,6 @@ Create an ethernet device with a USB-connected TNC, set the MTU, filter IPv6 tra
sudo tncattach /dev/ttyUSB0 115200 --ethernet --mtu 576 --noipv6 --ipv4 10.92.0.10/24 sudo tncattach /dev/ttyUSB0 115200 --ethernet --mtu 576 --noipv6 --ipv4 10.92.0.10/24
``` ```
Create an ethernet device with a TCP-connected TNC, set the MTU, filter IPv6 traffic, and set an IPv4 address:
```sh
# Attach interface
sudo tncattach -T -H localhost -P 8001 --ethernet --mtu 576 --noipv6 --ipv4 10.92.0.10/24
```
You can interact with the interface like any other using the __ip__ or __ifconfig__ utilities: You can interact with the interface like any other using the __ip__ or __ifconfig__ utilities:
```sh ```sh
@ -123,7 +111,6 @@ tnc0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 400
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
``` ```
## Worth Knowing on Raspbian ## Worth Knowing on Raspbian
On some versions of Raspbian (and probably other operating systems), the DHCP client daemon _dhcpcd_ interferes with TNC interfaces, by overriding their MTU and trying to auto-configure link-local addresses. You probably don't want this, and it can be disabled by editing the __/etc/dhcpcd.conf__ file, adding a statement telling _dhcpcd_ to ignore your TNC interface: On some versions of Raspbian (and probably other operating systems), the DHCP client daemon _dhcpcd_ interferes with TNC interfaces, by overriding their MTU and trying to auto-configure link-local addresses. You probably don't want this, and it can be disabled by editing the __/etc/dhcpcd.conf__ file, adding a statement telling _dhcpcd_ to ignore your TNC interface:
@ -134,10 +121,3 @@ On some versions of Raspbian (and probably other operating systems), the DHCP cl
denyinterfaces tnc0 denyinterfaces tnc0
``` ```
## Support tncattach development
You can help support the continued development of open, free and private communications systems by donating via one of the following channels:
- Ethereum: 0x81F7B979fEa6134bA9FD5c701b3501A2e61E897a
- Bitcoin: 3CPmacGm34qYvR6XWLVEJmi2aNe3PZqUuq
- Ko-Fi: https://ko-fi.com/markqvist

61
TAP.c
View File

@ -46,7 +46,7 @@ int open_tap(void) {
int inet = socket(AF_INET, SOCK_DGRAM, 0); int inet = socket(AF_INET, SOCK_DGRAM, 0);
if (inet == -1) { if (inet == -1) {
perror("Could not open AF_INET socket"); perror("Could not open AF_INET socket\r\n");
cleanup(); cleanup();
exit(1); exit(1);
} else { } else {
@ -64,65 +64,6 @@ int open_tap(void) {
exit(1); exit(1);
} }
// Configure TX queue length
if (ioctl(inet, SIOCGIFTXQLEN, &ifr) < 0) {
perror("Could not get interface flags from kernel");
close(inet);
cleanup();
exit(1);
} else {
ifr.ifr_qlen = TXQUEUELEN;
if (ioctl(inet, SIOCSIFTXQLEN, &ifr) < 0) {
perror("Could not set interface TX queue length");
close(inet);
cleanup();
exit(1);
}
}
// Configure ARP characteristics
char path_buf[256];
if (device_type == IF_TAP) {
snprintf(path_buf, sizeof(path_buf), "/proc/sys/net/ipv4/neigh/%s/base_reachable_time_ms", ifr.ifr_name);
int arp_fd = open(path_buf, O_WRONLY);
if (arp_fd < 0) {
perror("Could not open proc entry for ARP parameters");
close(inet);
cleanup();
exit(1);
} else {
if (dprintf(arp_fd, "%d", ARP_BASE_REACHABLE_TIME*1000) <= 0) {
perror("Could not configure interface ARP parameter base_reachable_time_ms");
close(inet);
close(arp_fd);
cleanup();
exit(1);
} else {
close(arp_fd);
}
}
snprintf(path_buf, sizeof(path_buf), "/proc/sys/net/ipv4/neigh/%s/retrans_time_ms", ifr.ifr_name);
arp_fd = open(path_buf, O_WRONLY);
if (arp_fd < 0) {
perror("Could not open proc entry for ARP parameters");
close(inet);
cleanup();
exit(1);
} else {
if (dprintf(arp_fd, "%d", ARP_RETRANS_TIME*1000) <= 0) {
perror("Could not configure interface ARP parameter retrans_time_ms");
close(inet);
close(arp_fd);
cleanup();
exit(1);
} else {
close(arp_fd);
}
}
}
// Bring up if requested
if (!noup) { if (!noup) {
if (ioctl(inet, SIOCGIFFLAGS, &ifr) < 0) { if (ioctl(inet, SIOCGIFFLAGS, &ifr) < 0) {
perror("Could not get interface flags from kernel"); perror("Could not get interface flags from kernel");

37
TCP.c
View File

@ -1,37 +0,0 @@
#include "TCP.h"
int open_tcp(char* ip, int port) {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Could not open AF_INET socket");
exit(1);
}
struct hostent *server;
struct sockaddr_in serv_addr;
server = gethostbyname(ip);
if (server == NULL) {
perror("Error resolving host");
exit(1);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
memcpy(server->h_addr, &serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(port);
if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
perror("Could not connect TCP socket");
exit(1);
}
return sockfd;
}
int close_tcp(int fd) {
return close(fd);
}

9
TCP.h
View File

@ -1,9 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
int open_tcp(char* ip, int port);
int close_tcp(int fd);

View File

@ -1,35 +1,26 @@
.DEFAULT_GOAL := all .DEFAULT_GOAL := all
.PHONY: all clean install uninstall tncattach .PHONY: all clean install uninstall tncattach
RM ?= rm compiler = gcc
INSTALL ?= install flags = -std=gnu11 -lm
CC ?= gcc
CFLAGS ?= -Wall -std=gnu11 -static-libgcc
LDFLAGS ?=
PREFIX ?= /usr/local
all: tncattach all: tncattach
rebuild: clean all rebuild: clean all
clean: clean:
@echo "Cleaning tncattach build..." @echo "Cleaning tncattach build..."
$(RM) -f tncattach @rm -f tncattach
tncattach: tncattach:
@echo "Making tncattach..." @echo "Making tncattach..."
@echo "Compiling with: $(CC)" @echo "Compiling with: ${compiler}"
$(CC) $(CFLAGS) $(LDFLAGS) tncattach.c Serial.c TCP.c KISS.c TAP.c -o tncattach ${compiler} ${flags} tncattach.c Serial.c KISS.c TAP.c -o tncattach -Wall
install: install:
@echo "Installing tncattach..." @echo "Installing tncattach..."
$(INSTALL) -d $(DESTDIR)/$(PREFIX)/bin chmod a+x tncattach
$(INSTALL) -Dm755 tncattach $(DESTDIR)/$(PREFIX)/bin/tncattach cp ./tncattach /usr/local/sbin/
@echo "Installing man page..."
gzip -9 tncattach.8
$(INSTALL) -d $(DESTDIR)/$(PREFIX)/share/man/man8
$(INSTALL) -Dm644 tncattach.8.gz $(DESTDIR)/$(PREFIX)/share/man/man8/tncattach.8.gz
uninstall: uninstall:
@echo "Uninstalling tncattach" @echo "Uninstalling tncattach"
$(RM) $(DESTDIR)/$(PREFIX)/bin/tncattach rm /usr/local/sbin/tncattach
$(RM) $(DESTDIR)/$(PREFIX)/share/man/man8/tncattach.8.gz

View File

@ -1,165 +0,0 @@
.TH tncattach 8 "September 12, 2020"
.SH NAME
.
.
tncattach \- Attach TNC devices as system network interfaces
.SH SYNOPSIS
.
.
\f[B]tncattach\f[R] [OPTION...] port baudrate
.SH DESCRIPTION
Attach KISS TNC devices as network interfaces in Linux. This program allows you to attach TNCs or any KISS-compatible device as a network interface. This program does not need any kernel modules, and has no external dependencies outside the standard Linux and GNU C libraries.
.SH OPTIONS
.
.
.TP
.BI \-m, \-\-mtu=MTU
.
Specify interface MTU
.
.
.TP
.BI \-e, \-\-ethernet
Create a full ethernet device
.
.
.TP
.BI \-i, \-\-ipv4=IP_ADDRESS
Configure an IPv4 address on interface
.
.
.TP
.BI \-n, \-\-noipv6
Filter IPv6 traffic from reaching TNC
.
.
.TP
.BI \-\-noup
Only create interface, don't bring it up
.
.
.TP
.BI \-T, \-\-kisstcp
Use KISS over TCP instead of serial port
.
.
.TP
.BI \-H, \-\-tcphost=TCP_HOST
Host to connect to when using KISS over TCP
.
.
.TP
.BI \-P, \-\-tcpport=TCP_PORT
TCP port when using KISS over TCP
.
.
.TP
.BI \-t, \-\-interval=SECONDS
Maximum interval between station identifications
.
.
.TP
.B \-s, \-\-id=CALLSIGN
Station identification data
.
.
.TP
.BI \-d, \-\-daemon
Run tncattach as a daemon
.
.
.TP
.BI \-v, \-\-verbose
Enable verbose output
.
.
.TP
.BI \-?, \-\-help
Show help
.
.
.TP
.BI \-\-usage
Give a short usage message
.
.
.TP
.BI \-V, \-\-version
Print program version
.
.
.SH USAGE
The program supports attaching TNCs as point-to-point tunnel devices, or generic ethernet devices. The ethernet mode is suitable for point-to-multipoint setups, and can be enabled with the corresponding command line switch. If you only need point-to-point links, it is advisable to just use the standard point-to-point mode, since it doesn't incur the ethernet header overhead on each packet.
.P
If you want to connect to a virtual KISS TNC over a TCP connection, you can use the -T option, along with the -H and -P options to specify the host and port.
.P
Additionally, it is worth noting that tncattach can filter out IPv6 packets from reaching the TNC. Most operating systems attempts to autoconfigure IPv6 when an interface is brought up, which results in a substantial amount of IPv6 traffic generated by router solicitations and similar, which is usually unwanted for packet radio links and similar.
.P
If you intend to use tncattach on a system with mDNS services enabled (avahi-daemon, for example), you may want to consider modifying your mDNS setup to exclude TNC interfaces, or turning it off entirely, since it will generate a lot of traffic that might be unwanted.
.SH STATION IDENTIFICATION
You can configure tncattach to automatically transmit station identification beacons according to a given interval, by using the --id and --interval options. Identification will be transmitted as raw data frames with whatever content has been specified in the --id option. Useful for amateur radio use, or other areas where station identification is necessary.
.P
Identification beacons will be transmitted when:
.P
.IP
There is outgoing data to send, and the specified interval has elapsed.
.IP
The specified interval elapses, and data has been sent since the last ID beacon.
.IP
The program exits, if any data frames have been transmitted since the last ID beacon.
.P
The above methodology should comply with station identification rules for amateur radio in most parts of the world, and complies with US Part 97 rules.
.SH EXAMPLES
.
Create an ethernet device with a USB-connected TNC, set the MTU, filter IPv6 traffic, and set an IPv4 address:
.IP
sudo tncattach /dev/ttyUSB0 115200 --ethernet --mtu 576 --noipv6 --ipv4 10.92.0.10/24
.P
Create an ethernet device with a TCP-connected TNC, set the MTU, filter IPv6 traffic, and set an IPv4 address:
.IP
sudo tncattach -T -H localhost -P 8001 --ethernet --mtu 576 --noipv6 --ipv4 10.92.0.10/24
.P
You can interact with the interface like any other using the ip or ifconfig utilities.
.p
Check interface is running:
.P
# ifconfig
.br
tnc0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 400
.br
inet 10.93.0.1 netmask 255.255.255.255 destination 10.93.0.2
.br
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
.br
RX packets 0 bytes 0 (0.0 B)
.br
RX errors 0 dropped 0 overruns 0 frame 0
.br
TX packets 0 bytes 0 (0.0 B)
.br
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
.P
.SH WORTH KNOWING ON RASPBIAN
On some versions of Raspbian (and probably other operating systems), the DHCP client daemon dhcpcd interferes with TNC interfaces, by overriding their MTU and trying to auto-configure link-local addresses. You probably don't want this, and it can be disabled by editing the /etc/dhcpcd.conf file, adding a statement telling dhcpcd to ignore your TNC interface:
.P
# Add the following statement somewhere at the beginning
.br
# of /etc/dhcpcd.conf to prevent dhcpcd from changing MTU
.br
denyinterfaces tnc0
.SH SEE ALSO
rnodeconfigutil(8)
.SH AUTHOR
Mark Qvist

View File

@ -9,7 +9,6 @@
#include "Constants.h" #include "Constants.h"
#include "Serial.h" #include "Serial.h"
#include "KISS.h" #include "KISS.h"
#include "TCP.h"
#include "TAP.h" #include "TAP.h"
#define BAUDRATE_DEFAULT 0 #define BAUDRATE_DEFAULT 0
@ -35,13 +34,8 @@ bool noup = false;
bool daemonize = false; bool daemonize = false;
bool set_ipv4 = false; bool set_ipv4 = false;
bool set_netmask = false; bool set_netmask = false;
bool kiss_over_tcp = false;
char* ipv4_addr; char* ipv4_addr;
char* netmask; char* netmask;
char* tcp_host;
int tcp_port;
int mtu; int mtu;
int device_type = IF_TUN; int device_type = IF_TUN;
@ -51,11 +45,7 @@ time_t last_id = 0;
bool tx_since_last_id = false; bool tx_since_last_id = false;
void cleanup(void) { void cleanup(void) {
if (kiss_over_tcp) {
close_tcp(attached_tnc);
} else {
close_port(attached_tnc); close_port(attached_tnc);
}
close_tap(attached_if); close_tap(attached_if);
} }
@ -261,23 +251,20 @@ void read_loop(void) {
exit(1); exit(1);
} }
const char *argp_program_version = "tncattach 0.1.9"; const char *argp_program_version = "tncattach 0.1.6";
const char *argp_program_bug_address = "<mark@unsigned.io>"; const char *argp_program_bug_address = "<mark@unsigned.io>";
static char doc[] = "\r\nAttach TNC devices as system network interfaces\vTo attach the TNC connected to /dev/ttyUSB0 as an ethernet device with an MTU of 512 bytes and assign an IPv4 address, while filtering IPv6 traffic, use:\r\n\r\n\ttncattach /dev/ttyUSB0 115200 -m 512 -e --noipv6 --ipv4 10.0.0.1/24\r\n\r\nStation identification can be performed automatically to comply with Part 97 rules. See the README for a complete description. Use the --id and --interval options, which should commonly be set to your callsign, and 600 seconds."; static char doc[] = "\r\nAttach TNC devices as system network interfaces\vTo attach the TNC connected to /dev/ttyUSB0 as an ethernet device with an MTU of 512 bytes and assign an IPv4 address, while filtering IPv6 traffic, use:\r\n\r\n\ttncattach /dev/ttyUSB0 115200 -m 512 -e --noipv6 --ipv4 10.0.0.1/24\r\n\r\nStation identification can be performed automatically to comply with Part 97 rules. See the README for a complete description. Use the --id and --interval options, which should commonly be set to your callsign, and 600 seconds.";
static char args_doc[] = "port baudrate"; static char args_doc[] = "port baudrate";
static struct argp_option options[] = { static struct argp_option options[] = {
{ "mtu", 'm', "MTU", 0, "Specify interface MTU", 1}, { "mtu", 'm', "MTU", 0, "Specify interface MTU"},
{ "ethernet", 'e', 0, 0, "Create a full ethernet device", 2}, { "daemon", 'd', 0, 0, "Run tncattach as a daemon"},
{ "ipv4", 'i', "IP_ADDRESS", 0, "Configure an IPv4 address on interface", 3}, { "ethernet", 'e', 0, 0, "Create a full ethernet device"},
{ "noipv6", 'n', 0, 0, "Filter IPv6 traffic from reaching TNC", 4}, { "ipv4", 'i', "IP_ADDRESS", 0, "Configure an IPv4 address on interface"},
{ "noup", 1, 0, 0, "Only create interface, don't bring it up", 5}, { "noipv6", 'n', 0, 0, "Filter IPv6 traffic from reaching TNC"},
{ "kisstcp", 'T', 0, 0, "Use KISS over TCP instead of serial port", 6}, { "noup", 1, 0, 0, "Only create interface, don't bring it up"},
{ "tcphost", 'H', "TCP_HOST", 0, "Host to connect to when using KISS over TCP", 7}, { "interval", 't', "SECONDS", 0, "Maximum interval between station identifications"},
{ "tcpport", 'P', "TCP_PORT", 0, "TCP port when using KISS over TCP", 8}, { "id", 's', "CALLSIGN", 0, "Station identification data"},
{ "interval", 't', "SECONDS", 0, "Maximum interval between station identifications", 9}, { "verbose", 'v', 0, 0, "Enable verbose output"},
{ "id", 's', "CALLSIGN", 0, "Station identification data", 10},
{ "daemon", 'd', 0, 0, "Run tncattach as a daemon", 11},
{ "verbose", 'v', 0, 0, "Enable verbose output", 12},
{ 0 } { 0 }
}; };
@ -289,7 +276,6 @@ struct arguments {
bool valid_id; bool valid_id;
int id_interval; int id_interval;
int baudrate; int baudrate;
int tcpport;
int mtu; int mtu;
bool tap; bool tap;
bool daemon; bool daemon;
@ -298,9 +284,6 @@ struct arguments {
bool set_netmask; bool set_netmask;
bool noipv6; bool noipv6;
bool noup; bool noup;
bool kiss_over_tcp;
bool set_tcp_host;
bool set_tcp_port;
}; };
static error_t parse_opt(int key, char *arg, struct argp_state *state) { static error_t parse_opt(int key, char *arg, struct argp_state *state) {
@ -476,21 +459,6 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
arguments->verbose = false; arguments->verbose = false;
break; break;
case 'T':
arguments->kiss_over_tcp = true;
break;
case 'H':
arguments->set_tcp_host = true;
tcp_host = (char*)malloc(strlen(arg)+1);
strcpy(tcp_host, arg);
break;
case 'P':
arguments->set_tcp_port = true;
tcp_port = atoi(arg);
break;
case 1: case 1:
arguments->noup = true; arguments->noup = true;
break; break;
@ -505,12 +473,7 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
case ARGP_KEY_END: case ARGP_KEY_END:
// Check if there's too few text arguments // Check if there's too few text arguments
if (!arguments->kiss_over_tcp && state->arg_num < N_ARGS) argp_usage(state); if (state->arg_num < N_ARGS) argp_usage(state);
// Check if text arguments were given when
// KISS over TCP was specified
if (arguments->kiss_over_tcp && state->arg_num != 0) argp_usage(state);
break; break;
default: default:
@ -564,21 +527,9 @@ int main(int argc, char **argv) {
arguments.noup = false; arguments.noup = false;
arguments.id_interval = -1; arguments.id_interval = -1;
arguments.valid_id = false; arguments.valid_id = false;
arguments.kiss_over_tcp = false;
argp_parse(&argp, argc, argv, 0, 0, &arguments); argp_parse(&argp, argc, argv, 0, 0, &arguments);
if (arguments.kiss_over_tcp) kiss_over_tcp = true;
if (!kiss_over_tcp) {
arguments.baudrate = atoi(arguments.args[1]); arguments.baudrate = atoi(arguments.args[1]);
} else {
if (!(arguments.set_tcp_host && arguments.set_tcp_port)) {
if (!arguments.set_tcp_host) printf("Error: KISS over TCP was requested, but no host was specified\r\n");
if (!arguments.set_tcp_port) printf("Error: KISS over TCP was requested, but no port was specified\r\n");
exit(1);
}
}
if (arguments.daemon) daemonize = true; if (arguments.daemon) daemonize = true;
if (arguments.verbose) verbose = true; if (arguments.verbose) verbose = true;
@ -606,30 +557,19 @@ int main(int argc, char **argv) {
} }
attached_if = open_tap(); attached_if = open_tap();
if (!arguments.kiss_over_tcp) {
attached_tnc = open_port(arguments.args[0]); attached_tnc = open_port(arguments.args[0]);
if (!setup_port(attached_tnc, arguments.baudrate)) { if (setup_port(attached_tnc, arguments.baudrate)) {
printf("Error during serial port setup");
return 0;
}
} else {
attached_tnc = open_tcp(tcp_host, tcp_port);
}
printf("TNC interface configured as %s\r\n", if_name); printf("TNC interface configured as %s\r\n", if_name);
fds[IF_FD_INDEX].fd = attached_if; fds[IF_FD_INDEX].fd = attached_if;
fds[IF_FD_INDEX].events = POLLIN; fds[IF_FD_INDEX].events = POLLIN;
fds[TNC_FD_INDEX].fd = attached_tnc; fds[TNC_FD_INDEX].fd = attached_tnc;
fds[TNC_FD_INDEX].events = POLLIN; fds[TNC_FD_INDEX].events = POLLIN;
if (daemonize) { if (daemonize) {
become_daemon(); become_daemon();
syslog(LOG_NOTICE, "tncattach daemon running"); syslog(LOG_NOTICE, "tncattach daemon running");
} }
read_loop(); read_loop();
}
return 0; return 0;
} }