Compare commits
5 Commits
v0.0.81-mu
...
v0.0.82-mu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7779e61c15 | ||
|
|
2cc8caec35 | ||
|
|
8c8715187b | ||
|
|
c591a4d3cc | ||
|
|
76cd7ed4b8 |
2
mud
2
mud
Submodule mud updated: fd1a1285ac...7cc6e7ad72
7
src/ip.h
7
src/ip.h
@@ -10,8 +10,8 @@ struct ip_common {
|
|||||||
uint16_t size;
|
uint16_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
_pure_
|
_pure_ static inline uint8_t
|
||||||
static inline uint8_t ip_get_version (const uint8_t *data, size_t size)
|
ip_get_version(const uint8_t *data, size_t size)
|
||||||
{
|
{
|
||||||
if (size < 20)
|
if (size < 20)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -19,7 +19,8 @@ static inline uint8_t ip_get_version (const uint8_t *data, size_t size)
|
|||||||
return data[0] >> 4;
|
return data[0] >> 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int ip_get_common (struct ip_common *ic, const uint8_t *data, size_t size)
|
static inline int
|
||||||
|
ip_get_common(struct ip_common *ic, const uint8_t *data, size_t size)
|
||||||
{
|
{
|
||||||
ic->version = ip_get_version(data, size);
|
ic->version = ip_get_version(data, size);
|
||||||
|
|
||||||
|
|||||||
14
src/main.c
14
src/main.c
@@ -385,10 +385,11 @@ main(int argc, char **argv)
|
|||||||
if (FD_ISSET(tun_fd, &rfds)) {
|
if (FD_ISSET(tun_fd, &rfds)) {
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
|
|
||||||
while (sizeof(buf) - size > gt.mtu) {
|
while (sizeof(buf) - size >= gt.mtu) {
|
||||||
const ssize_t r = tun_read(tun_fd, &buf[size],
|
const int r = tun_read(tun_fd, &buf[size],
|
||||||
sizeof(buf) - size);
|
sizeof(buf) - size);
|
||||||
if (r <= 0)
|
|
||||||
|
if (r <= 0 || r > gt.mtu)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
struct ip_common ic;
|
struct ip_common ic;
|
||||||
@@ -409,10 +410,8 @@ main(int argc, char **argv)
|
|||||||
struct ip_common ic;
|
struct ip_common ic;
|
||||||
|
|
||||||
if ((ip_get_common(&ic, &buf[q], size - q)) ||
|
if ((ip_get_common(&ic, &buf[q], size - q)) ||
|
||||||
(ic.size > size - q)) {
|
(ic.size > size - q))
|
||||||
size = q;
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
if (q + ic.size > p + gt.mtu)
|
if (q + ic.size > p + gt.mtu)
|
||||||
break;
|
break;
|
||||||
@@ -423,6 +422,9 @@ main(int argc, char **argv)
|
|||||||
tc = ic.tc & 0xFC;
|
tc = ic.tc & 0xFC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p == q)
|
||||||
|
break;
|
||||||
|
|
||||||
int r = mud_send(mud, &buf[p], q - p, tc);
|
int r = mud_send(mud, &buf[p], q - p, tc);
|
||||||
|
|
||||||
if (r == -1 && errno == EMSGSIZE) {
|
if (r == -1 && errno == EMSGSIZE) {
|
||||||
|
|||||||
18
src/str.h
18
src/str.h
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
static inline size_t str_cpy (char *restrict dst, const char *restrict src, size_t len)
|
static inline size_t
|
||||||
|
str_cpy(char *restrict dst, const char *restrict src, size_t len)
|
||||||
{
|
{
|
||||||
if (!dst || !src)
|
if (!dst || !src)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -17,14 +18,14 @@ static inline size_t str_cpy (char *restrict dst, const char *restrict src, size
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
_pure_
|
_pure_ static inline int
|
||||||
static inline int str_empty (const char *restrict str)
|
str_empty(const char *restrict str)
|
||||||
{
|
{
|
||||||
return !str || !str[0];
|
return !str || !str[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
_pure_
|
_pure_ static inline size_t
|
||||||
static inline size_t str_cmp (const char *restrict sa, const char *restrict sb)
|
str_cmp(const char *restrict sa, const char *restrict sb)
|
||||||
{
|
{
|
||||||
if (!sa || !sb)
|
if (!sa || !sb)
|
||||||
return 1;
|
return 1;
|
||||||
@@ -38,8 +39,8 @@ static inline size_t str_cmp (const char *restrict sa, const char *restrict sb)
|
|||||||
return i + 1;
|
return i + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
_pure_
|
_pure_ static inline size_t
|
||||||
static inline size_t str_len (const char *restrict str)
|
str_len(const char *restrict str)
|
||||||
{
|
{
|
||||||
if (!str)
|
if (!str)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -47,7 +48,8 @@ static inline size_t str_len (const char *restrict str)
|
|||||||
return strlen(str);
|
return strlen(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline char *str_cat (const char **strs, size_t count)
|
static inline char *
|
||||||
|
str_cat(const char **strs, size_t count)
|
||||||
{
|
{
|
||||||
size_t size = 1;
|
size_t size = 1;
|
||||||
|
|
||||||
|
|||||||
55
src/tun.c
55
src/tun.c
@@ -45,7 +45,9 @@ tun_create_by_id(char *name, size_t size, unsigned id)
|
|||||||
str_cpy(ci.ctl_name, UTUN_CONTROL_NAME, sizeof(ci.ctl_name) - 1);
|
str_cpy(ci.ctl_name, UTUN_CONTROL_NAME, sizeof(ci.ctl_name) - 1);
|
||||||
|
|
||||||
if (ioctl(fd, CTLIOCGINFO, &ci)) {
|
if (ioctl(fd, CTLIOCGINFO, &ci)) {
|
||||||
|
int err = errno;
|
||||||
close(fd);
|
close(fd);
|
||||||
|
errno = err;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,7 +60,9 @@ tun_create_by_id(char *name, size_t size, unsigned id)
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (connect(fd, (struct sockaddr *)&sc, sizeof(sc))) {
|
if (connect(fd, (struct sockaddr *)&sc, sizeof(sc))) {
|
||||||
|
int err = errno;
|
||||||
close(fd);
|
close(fd);
|
||||||
|
errno = err;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,8 +76,10 @@ tun_create_by_name(char *name, size_t size, char *dev_name)
|
|||||||
{
|
{
|
||||||
unsigned id = 0;
|
unsigned id = 0;
|
||||||
|
|
||||||
if (sscanf(dev_name, "utun%u", &id) != 1)
|
if (sscanf(dev_name, "utun%u", &id) != 1) {
|
||||||
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return tun_create_by_id(name, size, id);
|
return tun_create_by_id(name, size, id);
|
||||||
}
|
}
|
||||||
@@ -152,11 +158,11 @@ tun_create(char *dev_name, char **ret_name)
|
|||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t
|
int
|
||||||
tun_read(int fd, void *data, size_t size)
|
tun_read(int fd, void *data, size_t size)
|
||||||
{
|
{
|
||||||
if (!size)
|
if (!size)
|
||||||
return -1;
|
return 0;
|
||||||
|
|
||||||
#ifdef GT_BSD_TUN
|
#ifdef GT_BSD_TUN
|
||||||
uint32_t family;
|
uint32_t family;
|
||||||
@@ -173,35 +179,24 @@ tun_read(int fd, void *data, size_t size)
|
|||||||
};
|
};
|
||||||
|
|
||||||
ssize_t ret = readv(fd, iov, 2);
|
ssize_t ret = readv(fd, iov, 2);
|
||||||
#else
|
|
||||||
ssize_t ret = read(fd, data, size);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ret == -1) {
|
if (ret <= (ssize_t)0)
|
||||||
if (errno == EAGAIN || errno == EINTR)
|
return ret;
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (errno)
|
if (ret <= (ssize_t)sizeof(family))
|
||||||
perror("tun read");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef GT_BSD_TUN
|
|
||||||
if (ret < (ssize_t)sizeof(family))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return ret - sizeof(family);
|
return ret - sizeof(family);
|
||||||
#else
|
#else
|
||||||
return ret;
|
return read(fd, data, size);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t
|
int
|
||||||
tun_write(int fd, const void *data, size_t size)
|
tun_write(int fd, const void *data, size_t size)
|
||||||
{
|
{
|
||||||
if (!size)
|
if (!size)
|
||||||
return -1;
|
return 0;
|
||||||
|
|
||||||
#ifdef GT_BSD_TUN
|
#ifdef GT_BSD_TUN
|
||||||
uint32_t family;
|
uint32_t family;
|
||||||
@@ -214,6 +209,7 @@ tun_write(int fd, const void *data, size_t size)
|
|||||||
family = htonl(AF_INET6);
|
family = htonl(AF_INET6);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,27 +225,16 @@ tun_write(int fd, const void *data, size_t size)
|
|||||||
};
|
};
|
||||||
|
|
||||||
ssize_t ret = writev(fd, iov, 2);
|
ssize_t ret = writev(fd, iov, 2);
|
||||||
#else
|
|
||||||
ssize_t ret = write(fd, data, size);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ret == -1) {
|
if (ret <= (ssize_t)0)
|
||||||
if (errno == EAGAIN || errno == EINTR)
|
return ret;
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (errno)
|
if (ret <= (ssize_t)sizeof(family))
|
||||||
perror("tun write");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef GT_BSD_TUN
|
|
||||||
if (ret < (ssize_t)sizeof(family))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return ret - sizeof(family);
|
return ret - sizeof(family);
|
||||||
#else
|
#else
|
||||||
return ret;
|
return write(fd, data, size);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
int tun_create (char *, char **);
|
int tun_create (char *, char **);
|
||||||
ssize_t tun_read (int, void *, size_t);
|
int tun_read (int, void *, size_t);
|
||||||
ssize_t tun_write (int, const void *, size_t);
|
int tun_write (int, const void *, size_t);
|
||||||
int tun_set_mtu (char *, int);
|
int tun_set_mtu (char *, int);
|
||||||
|
|||||||
Reference in New Issue
Block a user