Browse Source

Merge branch 'netcon' of http://10.6.6.2/zerotier/zerotierone into netcon

Joseph Henry 10 years ago
parent
commit
0027a1e152
2 changed files with 19 additions and 6 deletions
  1. 18 6
      netcon/LWIPStack.hpp
  2. 1 0
      netcon/NetconEthernetTap.cpp

+ 18 - 6
netcon/LWIPStack.hpp

@@ -97,13 +97,21 @@ typedef ip_addr ip_addr_t;
 #define NETIF_SET_UP_SIG struct netif *netif
 #define NETIF_SET_UP_SIG struct netif *netif
 #define NETIF_POLL_SIG struct netif *netif
 #define NETIF_POLL_SIG struct netif *netif
 
 
-
-
-class LWIPStack{
+/**
+ * Loads an instance of liblwip.so in a private memory arena
+ *
+ * This uses dlmopen() to load an instance of the LWIP stack into its
+ * own private memory space. This is done to get around the stack's
+ * lack of thread-safety or multi-instance support. The alternative
+ * would be to massively refactor the stack so everything lives in a
+ * state object instead of static memory space.
+ */
+class LWIPStack
+{
+private:
   void* libref;
   void* libref;
 
 
 public:
 public:
-
   void (*lwip_init)();
   void (*lwip_init)();
   err_t (*tcp_write)(TCP_WRITE_SIG);
   err_t (*tcp_write)(TCP_WRITE_SIG);
   void (*tcp_sent)(TCP_SENT_SIG);
   void (*tcp_sent)(TCP_SENT_SIG);
@@ -141,8 +149,6 @@ public:
   void (*netif_set_up)(NETIF_SET_UP_SIG);
   void (*netif_set_up)(NETIF_SET_UP_SIG);
   void (*netif_poll)(NETIF_POLL_SIG);
   void (*netif_poll)(NETIF_POLL_SIG);
 
 
-
-
   LWIPStack(const char* path)
   LWIPStack(const char* path)
   {
   {
     libref = dlmopen(LM_ID_NEWLM, path, RTLD_NOW);
     libref = dlmopen(LM_ID_NEWLM, path, RTLD_NOW);
@@ -188,6 +194,12 @@ public:
     netif_set_up = (void(*)(NETIF_SET_UP_SIG))dlsym(libref, "netif_set_up");
     netif_set_up = (void(*)(NETIF_SET_UP_SIG))dlsym(libref, "netif_set_up");
     netif_poll = (void(*)(NETIF_POLL_SIG))dlsym(libref, "netif_poll");
     netif_poll = (void(*)(NETIF_POLL_SIG))dlsym(libref, "netif_poll");
   }
   }
+
+  ~LWIPStack()
+  {
+    if (lebref)
+      dlclose(libref);
+  }
 };
 };
 
 
 #endif
 #endif

+ 1 - 0
netcon/NetconEthernetTap.cpp

@@ -96,6 +96,7 @@ NetconEthernetTap::~NetconEthernetTap()
 	_phy.whack();
 	_phy.whack();
 	Thread::join(_thread);
 	Thread::join(_thread);
 	_phy.close(_unixListenSocket,false);
 	_phy.close(_unixListenSocket,false);
+	delete lwipstack;
 }
 }
 
 
 void NetconEthernetTap::setEnabled(bool en)
 void NetconEthernetTap::setEnabled(bool en)