aboutgitcodebugslistschat
path: root/tap.c
diff options
context:
space:
mode:
Diffstat (limited to 'tap.c')
-rw-r--r--tap.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/tap.c b/tap.c
index 44b0644..eaa6111 100644
--- a/tap.c
+++ b/tap.c
@@ -130,9 +130,18 @@ unsigned long tap_l2_max_len(const struct ctx *c)
*/
void tap_send_single(const struct ctx *c, const void *data, size_t l2len)
{
- uint32_t vnet_len = htonl(l2len);
+ uint8_t padded[ETH_ZLEN] = { 0 };
struct iovec iov[2];
size_t iovcnt = 0;
+ uint32_t vnet_len;
+
+ if (l2len < ETH_ZLEN) {
+ memcpy(padded, data, l2len);
+ data = padded;
+ l2len = ETH_ZLEN;
+ }
+
+ vnet_len = htonl(l2len);
switch (c->mode) {
case MODE_PASST:
@@ -1140,10 +1149,8 @@ void tap_sock_reset(struct ctx *c)
{
info("Client connection closed%s", c->one_off ? ", exiting" : "");
- if (c->one_off) {
- fsync_pcap_and_log();
- _exit(EXIT_SUCCESS);
- }
+ if (c->one_off)
+ passt_exit(EXIT_SUCCESS);
/* Close the connected socket, wait for a new connection */
epoll_del(c->epollfd, c->fd_tap);
@@ -1484,13 +1491,16 @@ static int tap_ns_tun(void *arg)
*/
static void tap_sock_tun_init(struct ctx *c)
{
- NS_CALL(tap_ns_tun, c);
- if (c->fd_tap == -1)
- die("Failed to set up tap device in namespace");
+ if (!c->splice_only) {
+ NS_CALL(tap_ns_tun, c);
+ if (c->fd_tap == -1)
+ die("Failed to set up tap device in namespace");
+ }
pasta_ns_conf(c);
- tap_start_connection(c);
+ if (!c->splice_only)
+ tap_start_connection(c);
}
/**