Bug fix for callbacks, minor netif driver tweak, minor Makefile tweak

This commit is contained in:
Joseph Henry
2019-02-25 14:52:19 -08:00
parent 884425fc5b
commit 362f6769b2
6 changed files with 117 additions and 80 deletions

View File

@@ -58,9 +58,6 @@
extern void postEvent(uint64_t eventCode, void *arg);
extern void postEvent(uint64_t eventCode);
#include "concurrentqueue.h"
moodycamel::ConcurrentQueue<struct ZeroTier::zts_sorted_packet*> rx_queue;
#if defined(_WIN32)
#include <time.h>
#endif
@@ -70,6 +67,10 @@ moodycamel::ConcurrentQueue<struct ZeroTier::zts_sorted_packet*> rx_queue;
*/
#define ZTS_MAC_ADDRSTRLEN 18
#ifndef htonll
#define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
#endif
namespace ZeroTier {
bool _has_exited = false;
@@ -167,15 +168,6 @@ void lwip_driver_shutdown()
_run_lwip_tcpip = false;
// Wait until the main lwIP thread has exited
while (!_has_exited) { lwip_sleep(LWIP_GUARDED_BUF_CHECK_INTERVAL); }
// After we're certain the stack isn't processing anymore traffic,
// start dequeing from the RX queue. This queue should be rejecting
// new frames at this point.
struct zts_sorted_packet *sp;
for (int i = 0; i < ZTS_LWIP_MAX_RX_QUEUE_LEN; i++) {
if (rx_queue.try_dequeue(sp)) {
delete sp;
}
}
/*
if (tcpip_shutdown() == ERR_OK) {
sys_timeouts_free();
@@ -183,18 +175,14 @@ void lwip_driver_shutdown()
*/
}
void lwip_dispose_of_netif(void *tapref)
void lwip_remove_netif(void *netif)
{
VirtualTap *vtap = (VirtualTap*)tapref;
if (vtap->netif) {
LOCK_TCPIP_CORE();
netif_remove((struct netif*)(vtap->netif));
netif_set_down((struct netif*)(vtap->netif));
netif_set_link_down((struct netif*)(vtap->netif));
UNLOCK_TCPIP_CORE();
delete vtap->netif;
vtap->netif = NULL;
}
struct netif *n = (struct netif*)netif;
LOCK_TCPIP_CORE();
netif_remove(n);
netif_set_down(n);
netif_set_link_down(n);
UNLOCK_TCPIP_CORE();
}
err_t lwip_eth_tx(struct netif *n, struct pbuf *p)
@@ -299,6 +287,7 @@ void lwip_eth_rx(VirtualTap *tap, const MAC &from, const MAC &to, unsigned int e
}
}
/*
static void print_netif_info(struct netif *n) {
DEBUG_INFO("n=%p, %c%c, %d, o=%p, o6=%p, mc=%x:%x:%x:%x:%x:%x, hwln=%d, st=%p, flgs=%d\n",
n,
@@ -318,6 +307,7 @@ static void print_netif_info(struct netif *n) {
n->flags
);
}
*/
bool lwip_is_netif_up(void *n)
{
@@ -388,7 +378,7 @@ void lwip_set_callbacks(struct netif *n)
#endif
}
static void lwip_prepare_netif_status_msg(struct netif *n)
static struct zts_netif_details *lwip_prepare_netif_status_msg(struct netif *n)
{
VirtualTap *tap = (VirtualTap*)(n->state);
struct zts_netif_details *ifd = new zts_netif_details;
@@ -398,8 +388,8 @@ static void lwip_prepare_netif_status_msg(struct netif *n)
ifd->mtu = n->mtu;
// MAC
memcpy(&(ifd->mac), n->hwaddr, n->hwaddr_len);
ifd->mac = lwip_htonl(ifd->mac) >> 16;
postEvent(ZTS_EVENT_NETIF_UP, (void*)ifd);
ifd->mac = htonll(ifd->mac) >> 16;
return ifd;
}
static err_t netif_init(struct netif *n)
@@ -421,7 +411,6 @@ static err_t netif_init(struct netif *n)
n->hwaddr_len = sizeof(n->hwaddr);
VirtualTap *tap = (VirtualTap*)(n->state);
tap->_mac.copyTo(n->hwaddr, n->hwaddr_len);
lwip_prepare_netif_status_msg(n);
return ERR_OK;
}
@@ -447,6 +436,7 @@ void lwip_init_interface(void *tapref, const MAC &mac, const InetAddress &ip)
netmask.addr = *((u32_t *)ip.netmask().rawIpData());
LOCK_TCPIP_CORE();
netif_add(n, &ipaddr, &netmask, &gw, tapref, netif_init, tcpip_input);
postEvent(ZTS_EVENT_NETIF_UP, (void*)lwip_prepare_netif_status_msg(n));
UNLOCK_TCPIP_CORE();
/*
snprintf(macbuf, ZTS_MAC_ADDRSTRLEN, "%02x:%02x:%02x:%02x:%02x:%02x",
@@ -468,6 +458,7 @@ void lwip_init_interface(void *tapref, const MAC &mac, const InetAddress &ip)
netif_ip6_addr_set_state(n, 0, IP6_ADDR_TENTATIVE);
netif_ip6_addr_set_state(n, 1, IP6_ADDR_TENTATIVE);
n->output_ip6 = ethip6_output;
postEvent(ZTS_EVENT_NETIF_UP, (void*)lwip_prepare_netif_status_msg(n));
UNLOCK_TCPIP_CORE();
/*
snprintf(macbuf, ZTS_MAC_ADDRSTRLEN, "%02x:%02x:%02x:%02x:%02x:%02x",