Parcourir la source

Fix for MacOS interface setup and config timing bugs.

Adam Ierymenko il y a 3 ans
Parent
commit
1b8917a57c
4 fichiers modifiés avec 26 ajouts et 9 suppressions
  1. 23 1
      osdep/MacEthernetTap.cpp
  2. 2 2
      osdep/MacEthernetTapAgent.c
  3. 1 3
      osdep/ManagedRoute.cpp
  4. 0 3
      service/OneService.cpp

+ 23 - 1
osdep/MacEthernetTap.cpp

@@ -209,8 +209,30 @@ MacEthernetTap::MacEthernetTap(
 		::_exit(-1);
 	} else {
 		_agentPid = apid;
+
+		// Wait up to 10 seconds for the subprocess to actually create the device. This prevents
+		// things like routes from being created before the device exists.
+		for(int waitLoops=0;;++waitLoops) {
+			struct ifaddrs *ifa = (struct ifaddrs *)0;
+			if (!getifaddrs(&ifa)) {
+				struct ifaddrs *p = ifa;
+				while (p) {
+					if ((p->ifa_name)&&(!strcmp(devstr, p->ifa_name))) {
+						waitLoops = -1;
+						break;
+					}
+					p = p->ifa_next;
+				}
+				freeifaddrs(ifa);
+			}
+			if (waitLoops == -1) {
+				break;
+			} else if (waitLoops >= 100) { // 10 seconds
+				throw std::runtime_error("feth device creation timed out");
+			}
+			Thread::sleep(100);
+		}
 	}
-	Thread::sleep(100); // this causes them to come up in a more user-friendly order on launch
 
 	_thread = Thread::start(this);
 }

+ 2 - 2
osdep/MacEthernetTapAgent.c

@@ -176,10 +176,10 @@ static void die()
 		close(s_ndrvfd);
 	if (s_bpffd >= 0)
 		close(s_bpffd);
-	if (s_deviceName[0])
-		run("/sbin/ifconfig",s_deviceName,"destroy",(char *)0);
 	if (s_peerDeviceName[0])
 		run("/sbin/ifconfig",s_peerDeviceName,"destroy",(char *)0);
+	if (s_deviceName[0])
+		run("/sbin/ifconfig",s_deviceName,"destroy",(char *)0);
 }
 
 static inline void close_inherited_fds()

+ 1 - 3
osdep/ManagedRoute.cpp

@@ -405,9 +405,7 @@ ManagedRoute::ManagedRoute(const InetAddress &target,const InetAddress &via,cons
 }
 
 ManagedRoute::~ManagedRoute()
-{
-	this->remove();
-}
+{}
 
 /* Linux NOTE: for default route override, some Linux distributions will
  * require a change to the rp_filter parameter. A value of '1' will prevent

+ 0 - 3
service/OneService.cpp

@@ -542,10 +542,7 @@ public:
 		~NetworkState()
 		{
 			this->managedRoutes.clear();
-#ifdef __APPLE__
-			Thread::sleep(10);
 			this->tap.reset();
-#endif
 		}
 
 		std::shared_ptr<EthernetTap> tap;