Cleaned up indentation
This commit is contained in:
parent
c2beeee944
commit
07eeed45f5
110
KISS.c
110
KISS.c
|
@ -19,67 +19,67 @@ extern int device_type;
|
|||
extern void cleanup(void);
|
||||
|
||||
void kiss_frame_received(int frame_len) {
|
||||
if ( (device_type == IF_TUN && frame_len >= TUN_MIN_FRAME_SIZE) || (device_type == IF_TAP && frame_len >= ETHERNET_MIN_FRAME_SIZE) ) {
|
||||
int written = write(attached_if, frame_buffer, frame_len);
|
||||
if (written == -1) {
|
||||
if (verbose && !daemonize) printf("Could not write received KISS frame (%d bytes) to network interface, is the interface up?\r\n", frame_len);
|
||||
} else if (written != frame_len) {
|
||||
if (!daemonize) printf("Error: Could only write %d of %d bytes to interface", written, frame_len);
|
||||
cleanup();
|
||||
exit(1);
|
||||
}
|
||||
if (verbose && !daemonize) printf("Got %d bytes from TNC, wrote %d bytes to interface\r\n", frame_len, written);
|
||||
}
|
||||
if ( (device_type == IF_TUN && frame_len >= TUN_MIN_FRAME_SIZE) || (device_type == IF_TAP && frame_len >= ETHERNET_MIN_FRAME_SIZE) ) {
|
||||
int written = write(attached_if, frame_buffer, frame_len);
|
||||
if (written == -1) {
|
||||
if (verbose && !daemonize) printf("Could not write received KISS frame (%d bytes) to network interface, is the interface up?\r\n", frame_len);
|
||||
} else if (written != frame_len) {
|
||||
if (!daemonize) printf("Error: Could only write %d of %d bytes to interface", written, frame_len);
|
||||
cleanup();
|
||||
exit(1);
|
||||
}
|
||||
if (verbose && !daemonize) printf("Got %d bytes from TNC, wrote %d bytes to interface\r\n", frame_len, written);
|
||||
}
|
||||
}
|
||||
|
||||
void kiss_serial_read(uint8_t sbyte) {
|
||||
if (IN_FRAME && sbyte == FEND && kiss_command == CMD_DATA) {
|
||||
IN_FRAME = false;
|
||||
kiss_frame_received(frame_len);
|
||||
} else if (sbyte == FEND) {
|
||||
IN_FRAME = true;
|
||||
kiss_command = CMD_UNKNOWN;
|
||||
frame_len = 0;
|
||||
} else if (IN_FRAME && frame_len < MAX_PAYLOAD) {
|
||||
// Have a look at the command byte first
|
||||
if (frame_len == 0 && kiss_command == CMD_UNKNOWN) {
|
||||
// Strip of port nibble
|
||||
kiss_command = sbyte & 0x0F;
|
||||
} else if (kiss_command == CMD_DATA) {
|
||||
if (sbyte == FESC) {
|
||||
ESCAPE = true;
|
||||
} else {
|
||||
if (ESCAPE) {
|
||||
if (sbyte == TFEND) sbyte = FEND;
|
||||
if (sbyte == TFESC) sbyte = FESC;
|
||||
ESCAPE = false;
|
||||
}
|
||||
if (IN_FRAME && sbyte == FEND && kiss_command == CMD_DATA) {
|
||||
IN_FRAME = false;
|
||||
kiss_frame_received(frame_len);
|
||||
} else if (sbyte == FEND) {
|
||||
IN_FRAME = true;
|
||||
kiss_command = CMD_UNKNOWN;
|
||||
frame_len = 0;
|
||||
} else if (IN_FRAME && frame_len < MAX_PAYLOAD) {
|
||||
// Have a look at the command byte first
|
||||
if (frame_len == 0 && kiss_command == CMD_UNKNOWN) {
|
||||
// Strip of port nibble
|
||||
kiss_command = sbyte & 0x0F;
|
||||
} else if (kiss_command == CMD_DATA) {
|
||||
if (sbyte == FESC) {
|
||||
ESCAPE = true;
|
||||
} else {
|
||||
if (ESCAPE) {
|
||||
if (sbyte == TFEND) sbyte = FEND;
|
||||
if (sbyte == TFESC) sbyte = FESC;
|
||||
ESCAPE = false;
|
||||
}
|
||||
|
||||
if (frame_len < MAX_PAYLOAD) {
|
||||
frame_buffer[frame_len++] = sbyte;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (frame_len < MAX_PAYLOAD) {
|
||||
frame_buffer[frame_len++] = sbyte;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int kiss_write_frame(int serial_port, uint8_t* buffer, int frame_len) {
|
||||
int write_len = 0;
|
||||
write_buffer[write_len++] = FEND;
|
||||
write_buffer[write_len++] = CMD_DATA;
|
||||
for (int i = 0; i < frame_len; i++) {
|
||||
uint8_t byte = buffer[i];
|
||||
if (byte == FEND) {
|
||||
write_buffer[write_len++] = FESC;
|
||||
write_buffer[write_len++] = TFEND;
|
||||
} else if (byte == FESC) {
|
||||
write_buffer[write_len++] = FESC;
|
||||
write_buffer[write_len++] = TFESC;
|
||||
} else {
|
||||
write_buffer[write_len++] = byte;
|
||||
}
|
||||
}
|
||||
write_buffer[write_len++] = FEND;
|
||||
int write_len = 0;
|
||||
write_buffer[write_len++] = FEND;
|
||||
write_buffer[write_len++] = CMD_DATA;
|
||||
for (int i = 0; i < frame_len; i++) {
|
||||
uint8_t byte = buffer[i];
|
||||
if (byte == FEND) {
|
||||
write_buffer[write_len++] = FESC;
|
||||
write_buffer[write_len++] = TFEND;
|
||||
} else if (byte == FESC) {
|
||||
write_buffer[write_len++] = FESC;
|
||||
write_buffer[write_len++] = TFESC;
|
||||
} else {
|
||||
write_buffer[write_len++] = byte;
|
||||
}
|
||||
}
|
||||
write_buffer[write_len++] = FEND;
|
||||
|
||||
return write(serial_port, write_buffer, write_len);
|
||||
return write(serial_port, write_buffer, write_len);
|
||||
}
|
284
Serial.c
284
Serial.c
|
@ -3,172 +3,172 @@
|
|||
extern void cleanup();
|
||||
|
||||
int open_port(char* port) {
|
||||
int fd;
|
||||
fd = open(port, O_RDWR | O_NOCTTY | O_SYNC | O_NDELAY);
|
||||
int fd;
|
||||
fd = open(port, O_RDWR | O_NOCTTY | O_SYNC | O_NDELAY);
|
||||
|
||||
if (fd == -1) {
|
||||
perror("The serial port could not be opened");
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
fcntl(fd, F_SETFL, 0);
|
||||
}
|
||||
if (fd == -1) {
|
||||
perror("The serial port could not be opened");
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
fcntl(fd, F_SETFL, 0);
|
||||
}
|
||||
|
||||
return fd;
|
||||
return fd;
|
||||
}
|
||||
|
||||
int close_port(int fd) {
|
||||
return close(fd);
|
||||
return close(fd);
|
||||
}
|
||||
|
||||
void set_speed(void *tty_s, int speed) {
|
||||
cfsetospeed(tty_s, speed);
|
||||
cfsetispeed(tty_s, speed);
|
||||
cfsetospeed(tty_s, speed);
|
||||
cfsetispeed(tty_s, speed);
|
||||
}
|
||||
|
||||
bool setup_port(int fd, int speed) {
|
||||
struct termios tty;
|
||||
if (tcgetattr(fd, &tty) != 0) {
|
||||
perror("Error setting port speed, could not read port parameters");
|
||||
return false;
|
||||
}
|
||||
struct termios tty;
|
||||
if (tcgetattr(fd, &tty) != 0) {
|
||||
perror("Error setting port speed, could not read port parameters");
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (speed) {
|
||||
case 0:
|
||||
set_speed(&tty, B0);
|
||||
break;
|
||||
case 50:
|
||||
set_speed(&tty, B50);
|
||||
break;
|
||||
case 75:
|
||||
set_speed(&tty, B75);
|
||||
break;
|
||||
case 110:
|
||||
set_speed(&tty, B110);
|
||||
break;
|
||||
case 134:
|
||||
set_speed(&tty, B134);
|
||||
break;
|
||||
case 150:
|
||||
set_speed(&tty, B150);
|
||||
break;
|
||||
case 200:
|
||||
set_speed(&tty, B200);
|
||||
break;
|
||||
case 300:
|
||||
set_speed(&tty, B300);
|
||||
break;
|
||||
case 600:
|
||||
set_speed(&tty, B600);
|
||||
break;
|
||||
case 1200:
|
||||
set_speed(&tty, B1200);
|
||||
break;
|
||||
case 2400:
|
||||
set_speed(&tty, B2400);
|
||||
break;
|
||||
case 4800:
|
||||
set_speed(&tty, B4800);
|
||||
break;
|
||||
case 9600:
|
||||
set_speed(&tty, B9600);
|
||||
break;
|
||||
case 19200:
|
||||
set_speed(&tty, B19200);
|
||||
break;
|
||||
case 38400:
|
||||
set_speed(&tty, B38400);
|
||||
break;
|
||||
case 57600:
|
||||
set_speed(&tty, B57600);
|
||||
break;
|
||||
case 115200:
|
||||
set_speed(&tty, B115200);
|
||||
break;
|
||||
case 230400:
|
||||
set_speed(&tty, B230400);
|
||||
break;
|
||||
default:
|
||||
printf("Error: Invalid port speed %d specified\r\n", speed);
|
||||
cleanup();
|
||||
exit(1);
|
||||
return false;
|
||||
}
|
||||
switch (speed) {
|
||||
case 0:
|
||||
set_speed(&tty, B0);
|
||||
break;
|
||||
case 50:
|
||||
set_speed(&tty, B50);
|
||||
break;
|
||||
case 75:
|
||||
set_speed(&tty, B75);
|
||||
break;
|
||||
case 110:
|
||||
set_speed(&tty, B110);
|
||||
break;
|
||||
case 134:
|
||||
set_speed(&tty, B134);
|
||||
break;
|
||||
case 150:
|
||||
set_speed(&tty, B150);
|
||||
break;
|
||||
case 200:
|
||||
set_speed(&tty, B200);
|
||||
break;
|
||||
case 300:
|
||||
set_speed(&tty, B300);
|
||||
break;
|
||||
case 600:
|
||||
set_speed(&tty, B600);
|
||||
break;
|
||||
case 1200:
|
||||
set_speed(&tty, B1200);
|
||||
break;
|
||||
case 2400:
|
||||
set_speed(&tty, B2400);
|
||||
break;
|
||||
case 4800:
|
||||
set_speed(&tty, B4800);
|
||||
break;
|
||||
case 9600:
|
||||
set_speed(&tty, B9600);
|
||||
break;
|
||||
case 19200:
|
||||
set_speed(&tty, B19200);
|
||||
break;
|
||||
case 38400:
|
||||
set_speed(&tty, B38400);
|
||||
break;
|
||||
case 57600:
|
||||
set_speed(&tty, B57600);
|
||||
break;
|
||||
case 115200:
|
||||
set_speed(&tty, B115200);
|
||||
break;
|
||||
case 230400:
|
||||
set_speed(&tty, B230400);
|
||||
break;
|
||||
default:
|
||||
printf("Error: Invalid port speed %d specified\r\n", speed);
|
||||
cleanup();
|
||||
exit(1);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set 8-bit characters, no parity, one stop bit
|
||||
tty.c_cflag |= CS8;
|
||||
tty.c_cflag &= ~PARENB;
|
||||
tty.c_cflag &= ~CSTOPB;
|
||||
// Set 8-bit characters, no parity, one stop bit
|
||||
tty.c_cflag |= CS8;
|
||||
tty.c_cflag &= ~PARENB;
|
||||
tty.c_cflag &= ~CSTOPB;
|
||||
|
||||
// Disable hardware flow control
|
||||
tty.c_cflag &= ~CRTSCTS;
|
||||
// Disable hardware flow control
|
||||
tty.c_cflag &= ~CRTSCTS;
|
||||
|
||||
// Enable reading and ignore modem
|
||||
// control lines
|
||||
tty.c_cflag |= CREAD | CLOCAL;
|
||||
// Enable reading and ignore modem
|
||||
// control lines
|
||||
tty.c_cflag |= CREAD | CLOCAL;
|
||||
|
||||
// Disable canonical mode, echo
|
||||
// and signal characters.
|
||||
tty.c_lflag &= ~ICANON;
|
||||
tty.c_lflag &= ~ECHO;
|
||||
tty.c_lflag &= ~ECHOE;
|
||||
tty.c_lflag &= ~ECHONL;
|
||||
tty.c_lflag &= ~ISIG;
|
||||
// Disable canonical mode, echo
|
||||
// and signal characters.
|
||||
tty.c_lflag &= ~ICANON;
|
||||
tty.c_lflag &= ~ECHO;
|
||||
tty.c_lflag &= ~ECHOE;
|
||||
tty.c_lflag &= ~ECHONL;
|
||||
tty.c_lflag &= ~ISIG;
|
||||
|
||||
// Disable processing of input,
|
||||
// just pass the raw data.
|
||||
tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL);
|
||||
// Disable processing of input,
|
||||
// just pass the raw data.
|
||||
tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL);
|
||||
|
||||
// Disable XON/XOFF software flow control.
|
||||
tty.c_iflag &= ~(IXON | IXOFF | IXANY);
|
||||
// Disable XON/XOFF software flow control.
|
||||
tty.c_iflag &= ~(IXON | IXOFF | IXANY);
|
||||
|
||||
// Disable processing output bytes
|
||||
// and new line conversions
|
||||
tty.c_oflag &= ~OPOST;
|
||||
tty.c_oflag &= ~ONLCR;
|
||||
// Disable processing output bytes
|
||||
// and new line conversions
|
||||
tty.c_oflag &= ~OPOST;
|
||||
tty.c_oflag &= ~ONLCR;
|
||||
|
||||
// Block forever until at least one byte is read.
|
||||
tty.c_cc[VMIN] = 1;
|
||||
tty.c_cc[VTIME] = 0;
|
||||
// Block forever until at least one byte is read.
|
||||
tty.c_cc[VMIN] = 1;
|
||||
tty.c_cc[VTIME] = 0;
|
||||
|
||||
// TODO: Check these
|
||||
// Prevent conversion of tabs to spaces (NOT PRESENT IN LINUX)
|
||||
// tty.c_oflag &= ~OXTABS;
|
||||
// Prevent removal of C-d chars (0x004) in output (NOT PRESENT IN LINUX)
|
||||
// tty.c_oflag &= ~ONOEOT;
|
||||
// TODO: Check these
|
||||
// Prevent conversion of tabs to spaces (NOT PRESENT IN LINUX)
|
||||
// tty.c_oflag &= ~OXTABS;
|
||||
// Prevent removal of C-d chars (0x004) in output (NOT PRESENT IN LINUX)
|
||||
// tty.c_oflag &= ~ONOEOT;
|
||||
|
||||
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
|
||||
perror("Could not configure serial port parameters");
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
|
||||
perror("Could not configure serial port parameters");
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool set_port_blocking(int fd, bool should_block) {
|
||||
struct termios tty;
|
||||
memset(&tty, 0, sizeof tty);
|
||||
struct termios tty;
|
||||
memset(&tty, 0, sizeof tty);
|
||||
|
||||
if (tcgetattr(fd, &tty) != 0) {
|
||||
perror("Error configuring port blocking behaviour, could not read port parameters");
|
||||
return false;
|
||||
} else {
|
||||
// TODO: Implement this correctly
|
||||
if (should_block) {
|
||||
// Block forever until at least one byte is read.
|
||||
tty.c_cc[VMIN] = 1;
|
||||
tty.c_cc[VTIME] = 0;
|
||||
} else {
|
||||
// Never block, always return immediately with
|
||||
// whatever is available.
|
||||
tty.c_cc[VMIN] = 0;
|
||||
tty.c_cc[VTIME] = 0;
|
||||
}
|
||||
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
|
||||
perror("Could not set port parameters while configuring blocking behaviour");
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (tcgetattr(fd, &tty) != 0) {
|
||||
perror("Error configuring port blocking behaviour, could not read port parameters");
|
||||
return false;
|
||||
} else {
|
||||
// TODO: Implement this correctly
|
||||
if (should_block) {
|
||||
// Block forever until at least one byte is read.
|
||||
tty.c_cc[VMIN] = 1;
|
||||
tty.c_cc[VTIME] = 0;
|
||||
} else {
|
||||
// Never block, always return immediately with
|
||||
// whatever is available.
|
||||
tty.c_cc[VMIN] = 0;
|
||||
tty.c_cc[VTIME] = 0;
|
||||
}
|
||||
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
|
||||
perror("Could not set port parameters while configuring blocking behaviour");
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
332
TAP.c
332
TAP.c
|
@ -15,184 +15,184 @@ extern char* netmask;
|
|||
extern void cleanup();
|
||||
|
||||
int open_tap(void) {
|
||||
struct ifreq ifr;
|
||||
int fd = open("/dev/net/tun", O_RDWR);
|
||||
struct ifreq ifr;
|
||||
int fd = open("/dev/net/tun", O_RDWR);
|
||||
|
||||
if (fd < 0) {
|
||||
perror("Could not open clone device");
|
||||
exit(1);
|
||||
} else {
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
// TODO: Enable PI header again?
|
||||
if (fd < 0) {
|
||||
perror("Could not open clone device");
|
||||
exit(1);
|
||||
} else {
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
// TODO: Enable PI header again?
|
||||
|
||||
if (device_type == IF_TAP) {
|
||||
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
|
||||
} else if (device_type == IF_TUN) {
|
||||
ifr.ifr_flags = IFF_TUN;
|
||||
} else {
|
||||
printf("Error: Unsupported interface type\r\n");
|
||||
cleanup();
|
||||
exit(1);
|
||||
}
|
||||
if (device_type == IF_TAP) {
|
||||
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
|
||||
} else if (device_type == IF_TUN) {
|
||||
ifr.ifr_flags = IFF_TUN;
|
||||
} else {
|
||||
printf("Error: Unsupported interface type\r\n");
|
||||
cleanup();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
strcpy(tap_name, "tnc%d");
|
||||
strncpy(ifr.ifr_name, tap_name, IFNAMSIZ);
|
||||
strcpy(tap_name, "tnc%d");
|
||||
strncpy(ifr.ifr_name, tap_name, IFNAMSIZ);
|
||||
|
||||
if (ioctl(fd, TUNSETIFF, &ifr) < 0) {
|
||||
perror("Could not configure network interface");
|
||||
exit(1);
|
||||
} else {
|
||||
strcpy(if_name, ifr.ifr_name);
|
||||
|
||||
int inet = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (inet == -1) {
|
||||
perror("Could not open AF_INET socket");
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
if (ioctl(inet, SIOCGIFMTU, &ifr) < 0) {
|
||||
perror("Could not get interface flags from kernel");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
ifr.ifr_mtu = mtu;
|
||||
if (ioctl(inet, SIOCSIFMTU, &ifr) < 0) {
|
||||
perror("Could not configure interface MTU");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
}
|
||||
if (ioctl(fd, TUNSETIFF, &ifr) < 0) {
|
||||
perror("Could not configure network interface");
|
||||
exit(1);
|
||||
} else {
|
||||
strcpy(if_name, ifr.ifr_name);
|
||||
|
||||
int inet = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (inet == -1) {
|
||||
perror("Could not open AF_INET socket");
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
if (ioctl(inet, SIOCGIFMTU, &ifr) < 0) {
|
||||
perror("Could not get interface flags from kernel");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
ifr.ifr_mtu = mtu;
|
||||
if (ioctl(inet, SIOCSIFMTU, &ifr) < 0) {
|
||||
perror("Could not configure interface MTU");
|
||||
close(inet);
|
||||
cleanup();
|
||||
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 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);
|
||||
}
|
||||
}
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
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 (ioctl(inet, SIOCGIFFLAGS, &ifr) < 0) {
|
||||
perror("Could not get interface flags from kernel");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
|
||||
if (ioctl(inet, SIOCSIFFLAGS, &ifr) < 0) {
|
||||
perror("Could not bring up interface");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
if (set_ipv4) {
|
||||
struct ifreq a_ifr;
|
||||
struct sockaddr_in addr, snm;
|
||||
// Bring up if requested
|
||||
if (!noup) {
|
||||
if (ioctl(inet, SIOCGIFFLAGS, &ifr) < 0) {
|
||||
perror("Could not get interface flags from kernel");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
|
||||
if (ioctl(inet, SIOCSIFFLAGS, &ifr) < 0) {
|
||||
perror("Could not bring up interface");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
if (set_ipv4) {
|
||||
struct ifreq a_ifr;
|
||||
struct sockaddr_in addr, snm;
|
||||
|
||||
memset(&a_ifr, 0, sizeof(a_ifr));
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
memset(&snm, 0, sizeof(addr));
|
||||
strncpy(a_ifr.ifr_name, ifr.ifr_name, IFNAMSIZ);
|
||||
addr.sin_family = AF_INET;
|
||||
snm.sin_family = AF_INET;
|
||||
memset(&a_ifr, 0, sizeof(a_ifr));
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
memset(&snm, 0, sizeof(addr));
|
||||
strncpy(a_ifr.ifr_name, ifr.ifr_name, IFNAMSIZ);
|
||||
addr.sin_family = AF_INET;
|
||||
snm.sin_family = AF_INET;
|
||||
|
||||
int addr_conversion = inet_pton(AF_INET, ipv4_addr, &(addr.sin_addr));
|
||||
if (addr_conversion != 1) {
|
||||
printf("Error: Invalid IPv4 address specified\r\n");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
a_ifr.ifr_addr = *(struct sockaddr*)&addr;
|
||||
if (ioctl(inet, SIOCSIFADDR, &a_ifr) < 0) {
|
||||
perror("Could not set IP-address");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
if (set_netmask) {
|
||||
int snm_conversion = inet_pton(AF_INET, netmask, &(snm.sin_addr));
|
||||
if (snm_conversion != 1) {
|
||||
printf("Error: Invalid subnet mask specified\r\n");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
a_ifr.ifr_addr = *(struct sockaddr*)&snm;
|
||||
if (ioctl(inet, SIOCSIFNETMASK, &a_ifr) < 0) {
|
||||
perror("Could not set subnet mask");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int addr_conversion = inet_pton(AF_INET, ipv4_addr, &(addr.sin_addr));
|
||||
if (addr_conversion != 1) {
|
||||
printf("Error: Invalid IPv4 address specified\r\n");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
a_ifr.ifr_addr = *(struct sockaddr*)&addr;
|
||||
if (ioctl(inet, SIOCSIFADDR, &a_ifr) < 0) {
|
||||
perror("Could not set IP-address");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
if (set_netmask) {
|
||||
int snm_conversion = inet_pton(AF_INET, netmask, &(snm.sin_addr));
|
||||
if (snm_conversion != 1) {
|
||||
printf("Error: Invalid subnet mask specified\r\n");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
} else {
|
||||
a_ifr.ifr_addr = *(struct sockaddr*)&snm;
|
||||
if (ioctl(inet, SIOCSIFNETMASK, &a_ifr) < 0) {
|
||||
perror("Could not set subnet mask");
|
||||
close(inet);
|
||||
cleanup();
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return fd;
|
||||
}
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int close_tap(int tap_fd) {
|
||||
return close(tap_fd);
|
||||
return close(tap_fd);
|
||||
}
|
2
TCP.c
2
TCP.c
|
@ -33,5 +33,5 @@ int open_tcp(char* ip, int port) {
|
|||
}
|
||||
|
||||
int close_tcp(int fd) {
|
||||
return close(fd);
|
||||
return close(fd);
|
||||
}
|
916
tncattach.c
916
tncattach.c
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue