فهرست منبع

Windows build fixes for MAC changes (in tap driver), some comments and cleanup in MAC.hpp.

Adam Ierymenko 11 سال پیش
والد
کامیت
2861229558
3فایلهای تغییر یافته به همراه12 افزوده شده و 16 حذف شده
  1. 3 4
      node/MAC.hpp
  2. 8 12
      node/WindowsEthernetTap.cpp
  3. 1 0
      node/WindowsEthernetTap.hpp

+ 3 - 4
node/MAC.hpp

@@ -188,8 +188,7 @@ public:
 		throw()
 	{
 		uint64_t m = ((uint64_t)firstOctetForNetwork(nwid)) << 40;
-		uint64_t a = ztaddr.toInt();
-		m |= a; // a is 40 bits
+		m |= ztaddr.toInt(); // a is 40 bits
 		m ^= ((nwid >> 8) & 0xff) << 32;
 		m ^= ((nwid >> 16) & 0xff) << 24;
 		m ^= ((nwid >> 24) & 0xff) << 16;
@@ -208,8 +207,8 @@ public:
 	inline Address toAddress(uint64_t nwid) const
 		throw()
 	{
-		uint64_t a = _m & 0xffffffffffULL;
-		a ^= ((nwid >> 8) & 0xff) << 32;
+		uint64_t a = _m & 0xffffffffffULL; // least significant 40 bits of MAC are formed from address
+		a ^= ((nwid >> 8) & 0xff) << 32; // ... XORed with bits 8-48 of the nwid in little-endian byte order, so unmask it
 		a ^= ((nwid >> 16) & 0xff) << 24;
 		a ^= ((nwid >> 24) & 0xff) << 16;
 		a ^= ((nwid >> 32) & 0xff) << 8;

+ 8 - 12
node/WindowsEthernetTap.cpp

@@ -351,7 +351,7 @@ WindowsEthernetTap::WindowsEthernetTap(
 
 	if (_netCfgInstanceId.length() > 0) {
 		char tmps[4096];
-		unsigned int tmpsl = Utils::snprintf(tmps,sizeof(tmps),"%.2X-%.2X-%.2X-%.2X-%.2X-%.2X",(unsigned int)mac.data[0],(unsigned int)mac.data[1],(unsigned int)mac.data[2],(unsigned int)mac.data[3],(unsigned int)mac.data[4],(unsigned int)mac.data[5]) + 1;
+		unsigned int tmpsl = Utils::snprintf(tmps,sizeof(tmps),"%.2X-%.2X-%.2X-%.2X-%.2X-%.2X",(unsigned int)mac[0],(unsigned int)mac[1],(unsigned int)mac[2],(unsigned int)mac[3],(unsigned int)mac[4],(unsigned int)mac[5]) + 1;
 		RegSetKeyValueA(nwAdapters,mySubkeyName.c_str(),"NetworkAddress",REG_SZ,tmps,tmpsl);
 		RegSetKeyValueA(nwAdapters,mySubkeyName.c_str(),"MAC",REG_SZ,tmps,tmpsl);
 		DWORD tmp = mtu;
@@ -557,8 +557,8 @@ void WindowsEthernetTap::put(const MAC &from,const MAC &to,unsigned int etherTyp
 		Mutex::Lock _l(_injectPending_m);
 		_injectPending.push( std::pair<Array<char,ZT_IF_MTU + 32>,unsigned int>(Array<char,ZT_IF_MTU + 32>(),len + 14) );
 		char *d = _injectPending.back().first.data;
-		memcpy(d,to.data,6);
-		memcpy(d + 6,from.data,6);
+		to.copyTo(d,6);
+		from.copyTo(d + 6,6);
 		d[12] = (char)((etherType >> 8) & 0xff);
 		d[13] = (char)(etherType & 0xff);
 		memcpy(d + 14,data,len);
@@ -603,13 +603,9 @@ bool WindowsEthernetTap::updateMulticastGroups(std::set<MulticastGroup> &groups)
 		MAC mac;
 		DWORD i = 0;
 		while ((i + 6) <= bytesReturned) {
-			mac.data[0] = mcastbuf[i++];
-			mac.data[1] = mcastbuf[i++];
-			mac.data[2] = mcastbuf[i++];
-			mac.data[3] = mcastbuf[i++];
-			mac.data[4] = mcastbuf[i++];
-			mac.data[5] = mcastbuf[i++];
-			if (mac.isMulticast()) {
+			mac.setTo(mcastbuf + i,6);
+			i += 6;
+			if ((mac.isMulticast())&&(!mac.isBroadcast())) {
 				// exclude the nulls that may be returned or any other junk Windows puts in there
 				newGroups.insert(MulticastGroup(mac,0));
 			}
@@ -712,8 +708,8 @@ void WindowsEthernetTap::threadMain()
 			DWORD bytesRead = 0;
 			if (GetOverlappedResult(_tap,&tapOvlRead,&bytesRead,FALSE)) {
 				if ((bytesRead > 14)&&(_enabled)) {
-					MAC to(tapReadBuf);
-					MAC from(tapReadBuf + 6);
+					MAC to(tapReadBuf,6);
+					MAC from(tapReadBuf + 6,6);
 					unsigned int etherType = ((((unsigned int)tapReadBuf[12]) & 0xff) << 8) | (((unsigned int)tapReadBuf[13]) & 0xff);
 					try {
 						Buffer<4096> tmp(tapReadBuf + 14,bytesRead - 14);

+ 1 - 0
node/WindowsEthernetTap.hpp

@@ -39,6 +39,7 @@
 #include "EthernetTap.hpp"
 #include "Mutex.hpp"
 #include "Thread.hpp"
+#include "Array.hpp"
 
 #include <WinSock2.h>
 #include <Windows.h>