updated included ZTO version
@@ -7,6 +7,10 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
7C0463271DE362BD003E2B0E /* json.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C0463251DE362BD003E2B0E /* json.c */; };
|
||||||
|
7C0463281DE362D9003E2B0E /* json.c in Sources */ = {isa = PBXBuildFile; fileRef = 7C0463251DE362BD003E2B0E /* json.c */; };
|
||||||
|
7C04632B1DE363BA003E2B0E /* ManagedRoute.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C0463291DE363BA003E2B0E /* ManagedRoute.cpp */; };
|
||||||
|
7C04632C1DE363C9003E2B0E /* ManagedRoute.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C0463291DE363BA003E2B0E /* ManagedRoute.cpp */; };
|
||||||
7C2228D11DCC1193006A2661 /* lwip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2228CF1DCC1193006A2661 /* lwip.cpp */; };
|
7C2228D11DCC1193006A2661 /* lwip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2228CF1DCC1193006A2661 /* lwip.cpp */; };
|
||||||
7C2228D41DCC11A8006A2661 /* picotcp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2228D21DCC11A8006A2661 /* picotcp.cpp */; };
|
7C2228D41DCC11A8006A2661 /* picotcp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2228D21DCC11A8006A2661 /* picotcp.cpp */; };
|
||||||
7C2228D51DCC11B8006A2661 /* picotcp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2228D21DCC11A8006A2661 /* picotcp.cpp */; };
|
7C2228D51DCC11B8006A2661 /* picotcp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2228D21DCC11A8006A2661 /* picotcp.cpp */; };
|
||||||
@@ -39,7 +43,6 @@
|
|||||||
7C7F16501DBEB7AB00C7AFFD /* C25519.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5121DBAC872006585E7 /* C25519.cpp */; };
|
7C7F16501DBEB7AB00C7AFFD /* C25519.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5121DBAC872006585E7 /* C25519.cpp */; };
|
||||||
7C7F16511DBEB7AB00C7AFFD /* CertificateOfMembership.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5141DBAC872006585E7 /* CertificateOfMembership.cpp */; };
|
7C7F16511DBEB7AB00C7AFFD /* CertificateOfMembership.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5141DBAC872006585E7 /* CertificateOfMembership.cpp */; };
|
||||||
7C7F16521DBEB7AB00C7AFFD /* Cluster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5161DBAC872006585E7 /* Cluster.cpp */; };
|
7C7F16521DBEB7AB00C7AFFD /* Cluster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5161DBAC872006585E7 /* Cluster.cpp */; };
|
||||||
7C7F16531DBEB7AB00C7AFFD /* Dictionary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF51B1DBAC872006585E7 /* Dictionary.cpp */; };
|
|
||||||
7C7F16541DBEB7AB00C7AFFD /* Identity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF51E1DBAC872006585E7 /* Identity.cpp */; };
|
7C7F16541DBEB7AB00C7AFFD /* Identity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF51E1DBAC872006585E7 /* Identity.cpp */; };
|
||||||
7C7F16551DBEB7AB00C7AFFD /* IncomingPacket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5201DBAC872006585E7 /* IncomingPacket.cpp */; };
|
7C7F16551DBEB7AB00C7AFFD /* IncomingPacket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5201DBAC872006585E7 /* IncomingPacket.cpp */; };
|
||||||
7C7F16561DBEB7AB00C7AFFD /* InetAddress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5221DBAC872006585E7 /* InetAddress.cpp */; };
|
7C7F16561DBEB7AB00C7AFFD /* InetAddress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5221DBAC872006585E7 /* InetAddress.cpp */; };
|
||||||
@@ -166,11 +169,9 @@
|
|||||||
7CEAF5091DBAC841006585E7 /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4FD1DBAC841006585E7 /* Http.cpp */; };
|
7CEAF5091DBAC841006585E7 /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4FD1DBAC841006585E7 /* Http.cpp */; };
|
||||||
7CEAF50A1DBAC841006585E7 /* OSUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4FF1DBAC841006585E7 /* OSUtils.cpp */; };
|
7CEAF50A1DBAC841006585E7 /* OSUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4FF1DBAC841006585E7 /* OSUtils.cpp */; };
|
||||||
7CEAF50B1DBAC841006585E7 /* PortMapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5021DBAC841006585E7 /* PortMapper.cpp */; };
|
7CEAF50B1DBAC841006585E7 /* PortMapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5021DBAC841006585E7 /* PortMapper.cpp */; };
|
||||||
7CEAF50C1DBAC841006585E7 /* RoutingTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5041DBAC841006585E7 /* RoutingTable.cpp */; };
|
|
||||||
7CEAF54B1DBAC872006585E7 /* C25519.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5121DBAC872006585E7 /* C25519.cpp */; };
|
7CEAF54B1DBAC872006585E7 /* C25519.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5121DBAC872006585E7 /* C25519.cpp */; };
|
||||||
7CEAF54C1DBAC872006585E7 /* CertificateOfMembership.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5141DBAC872006585E7 /* CertificateOfMembership.cpp */; };
|
7CEAF54C1DBAC872006585E7 /* CertificateOfMembership.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5141DBAC872006585E7 /* CertificateOfMembership.cpp */; };
|
||||||
7CEAF54D1DBAC872006585E7 /* Cluster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5161DBAC872006585E7 /* Cluster.cpp */; };
|
7CEAF54D1DBAC872006585E7 /* Cluster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5161DBAC872006585E7 /* Cluster.cpp */; };
|
||||||
7CEAF54F1DBAC872006585E7 /* Dictionary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF51B1DBAC872006585E7 /* Dictionary.cpp */; };
|
|
||||||
7CEAF5501DBAC872006585E7 /* Identity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF51E1DBAC872006585E7 /* Identity.cpp */; };
|
7CEAF5501DBAC872006585E7 /* Identity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF51E1DBAC872006585E7 /* Identity.cpp */; };
|
||||||
7CEAF5511DBAC872006585E7 /* IncomingPacket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5201DBAC872006585E7 /* IncomingPacket.cpp */; };
|
7CEAF5511DBAC872006585E7 /* IncomingPacket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5201DBAC872006585E7 /* IncomingPacket.cpp */; };
|
||||||
7CEAF5521DBAC872006585E7 /* InetAddress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5221DBAC872006585E7 /* InetAddress.cpp */; };
|
7CEAF5521DBAC872006585E7 /* InetAddress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5221DBAC872006585E7 /* InetAddress.cpp */; };
|
||||||
@@ -192,7 +193,6 @@
|
|||||||
7CEAF5621DBAC975006585E7 /* C25519.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5121DBAC872006585E7 /* C25519.cpp */; };
|
7CEAF5621DBAC975006585E7 /* C25519.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5121DBAC872006585E7 /* C25519.cpp */; };
|
||||||
7CEAF5631DBAC975006585E7 /* CertificateOfMembership.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5141DBAC872006585E7 /* CertificateOfMembership.cpp */; };
|
7CEAF5631DBAC975006585E7 /* CertificateOfMembership.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5141DBAC872006585E7 /* CertificateOfMembership.cpp */; };
|
||||||
7CEAF5641DBAC975006585E7 /* Cluster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5161DBAC872006585E7 /* Cluster.cpp */; };
|
7CEAF5641DBAC975006585E7 /* Cluster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5161DBAC872006585E7 /* Cluster.cpp */; };
|
||||||
7CEAF5661DBAC975006585E7 /* Dictionary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF51B1DBAC872006585E7 /* Dictionary.cpp */; };
|
|
||||||
7CEAF5671DBAC975006585E7 /* Identity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF51E1DBAC872006585E7 /* Identity.cpp */; };
|
7CEAF5671DBAC975006585E7 /* Identity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF51E1DBAC872006585E7 /* Identity.cpp */; };
|
||||||
7CEAF5681DBAC975006585E7 /* IncomingPacket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5201DBAC872006585E7 /* IncomingPacket.cpp */; };
|
7CEAF5681DBAC975006585E7 /* IncomingPacket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5201DBAC872006585E7 /* IncomingPacket.cpp */; };
|
||||||
7CEAF5691DBAC975006585E7 /* InetAddress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5221DBAC872006585E7 /* InetAddress.cpp */; };
|
7CEAF5691DBAC975006585E7 /* InetAddress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5221DBAC872006585E7 /* InetAddress.cpp */; };
|
||||||
@@ -215,7 +215,6 @@
|
|||||||
7CEAF57B1DBAC975006585E7 /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4FD1DBAC841006585E7 /* Http.cpp */; };
|
7CEAF57B1DBAC975006585E7 /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4FD1DBAC841006585E7 /* Http.cpp */; };
|
||||||
7CEAF57C1DBAC975006585E7 /* OSUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4FF1DBAC841006585E7 /* OSUtils.cpp */; };
|
7CEAF57C1DBAC975006585E7 /* OSUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4FF1DBAC841006585E7 /* OSUtils.cpp */; };
|
||||||
7CEAF57D1DBAC975006585E7 /* PortMapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5021DBAC841006585E7 /* PortMapper.cpp */; };
|
7CEAF57D1DBAC975006585E7 /* PortMapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5021DBAC841006585E7 /* PortMapper.cpp */; };
|
||||||
7CEAF57E1DBAC975006585E7 /* RoutingTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5041DBAC841006585E7 /* RoutingTable.cpp */; };
|
|
||||||
7CEAF5801DBAC975006585E7 /* ControlPlane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4F11DBAC80C006585E7 /* ControlPlane.cpp */; };
|
7CEAF5801DBAC975006585E7 /* ControlPlane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF4F11DBAC80C006585E7 /* ControlPlane.cpp */; };
|
||||||
7CEAF5841DBACB3E006585E7 /* OneService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5821DBACB3E006585E7 /* OneService.cpp */; };
|
7CEAF5841DBACB3E006585E7 /* OneService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5821DBACB3E006585E7 /* OneService.cpp */; };
|
||||||
7CEAF5861DBACE7E006585E7 /* ethernet.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5851DBACE7E006585E7 /* ethernet.c */; };
|
7CEAF5861DBACE7E006585E7 /* ethernet.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAF5851DBACE7E006585E7 /* ethernet.c */; };
|
||||||
@@ -227,6 +226,10 @@
|
|||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
7C0463251DE362BD003E2B0E /* json.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = json.c; path = "../../../zerotierone/ext/json-parser/json.c"; sourceTree = "<group>"; };
|
||||||
|
7C0463261DE362BD003E2B0E /* json.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = json.h; path = "../../../zerotierone/ext/json-parser/json.h"; sourceTree = "<group>"; };
|
||||||
|
7C0463291DE363BA003E2B0E /* ManagedRoute.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ManagedRoute.cpp; path = ../../../zerotierone/osdep/ManagedRoute.cpp; sourceTree = "<group>"; };
|
||||||
|
7C04632A1DE363BA003E2B0E /* ManagedRoute.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ManagedRoute.hpp; path = ../../../zerotierone/osdep/ManagedRoute.hpp; sourceTree = "<group>"; };
|
||||||
7C2228CF1DCC1193006A2661 /* lwip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = lwip.cpp; path = ../../../src/stack_drivers/lwip/lwip.cpp; sourceTree = "<group>"; };
|
7C2228CF1DCC1193006A2661 /* lwip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = lwip.cpp; path = ../../../src/stack_drivers/lwip/lwip.cpp; sourceTree = "<group>"; };
|
||||||
7C2228D01DCC1193006A2661 /* lwip.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = lwip.hpp; path = ../../../src/stack_drivers/lwip/lwip.hpp; sourceTree = "<group>"; };
|
7C2228D01DCC1193006A2661 /* lwip.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = lwip.hpp; path = ../../../src/stack_drivers/lwip/lwip.hpp; sourceTree = "<group>"; };
|
||||||
7C2228D21DCC11A8006A2661 /* picotcp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = picotcp.cpp; path = ../../../src/stack_drivers/picotcp/picotcp.cpp; sourceTree = "<group>"; };
|
7C2228D21DCC11A8006A2661 /* picotcp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = picotcp.cpp; path = ../../../src/stack_drivers/picotcp/picotcp.cpp; sourceTree = "<group>"; };
|
||||||
@@ -357,8 +360,6 @@
|
|||||||
7CEAF5011DBAC841006585E7 /* Phy.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Phy.hpp; path = ../../../zerotierone/osdep/Phy.hpp; sourceTree = "<group>"; };
|
7CEAF5011DBAC841006585E7 /* Phy.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Phy.hpp; path = ../../../zerotierone/osdep/Phy.hpp; sourceTree = "<group>"; };
|
||||||
7CEAF5021DBAC841006585E7 /* PortMapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PortMapper.cpp; path = ../../../zerotierone/osdep/PortMapper.cpp; sourceTree = "<group>"; };
|
7CEAF5021DBAC841006585E7 /* PortMapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PortMapper.cpp; path = ../../../zerotierone/osdep/PortMapper.cpp; sourceTree = "<group>"; };
|
||||||
7CEAF5031DBAC841006585E7 /* PortMapper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = PortMapper.hpp; path = ../../../zerotierone/osdep/PortMapper.hpp; sourceTree = "<group>"; };
|
7CEAF5031DBAC841006585E7 /* PortMapper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = PortMapper.hpp; path = ../../../zerotierone/osdep/PortMapper.hpp; sourceTree = "<group>"; };
|
||||||
7CEAF5041DBAC841006585E7 /* RoutingTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RoutingTable.cpp; path = ../../../zerotierone/osdep/RoutingTable.cpp; sourceTree = "<group>"; };
|
|
||||||
7CEAF5051DBAC841006585E7 /* RoutingTable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = RoutingTable.hpp; path = ../../../zerotierone/osdep/RoutingTable.hpp; sourceTree = "<group>"; };
|
|
||||||
7CEAF5061DBAC841006585E7 /* Thread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Thread.hpp; path = ../../../zerotierone/osdep/Thread.hpp; sourceTree = "<group>"; };
|
7CEAF5061DBAC841006585E7 /* Thread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Thread.hpp; path = ../../../zerotierone/osdep/Thread.hpp; sourceTree = "<group>"; };
|
||||||
7CEAF50D1DBAC872006585E7 /* Address.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Address.hpp; path = ../../../zerotierone/node/Address.hpp; sourceTree = "<group>"; };
|
7CEAF50D1DBAC872006585E7 /* Address.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Address.hpp; path = ../../../zerotierone/node/Address.hpp; sourceTree = "<group>"; };
|
||||||
7CEAF50E1DBAC872006585E7 /* Array.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Array.hpp; path = ../../../zerotierone/node/Array.hpp; sourceTree = "<group>"; };
|
7CEAF50E1DBAC872006585E7 /* Array.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Array.hpp; path = ../../../zerotierone/node/Array.hpp; sourceTree = "<group>"; };
|
||||||
@@ -372,7 +373,6 @@
|
|||||||
7CEAF5161DBAC872006585E7 /* Cluster.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Cluster.cpp; path = ../../../zerotierone/node/Cluster.cpp; sourceTree = "<group>"; };
|
7CEAF5161DBAC872006585E7 /* Cluster.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Cluster.cpp; path = ../../../zerotierone/node/Cluster.cpp; sourceTree = "<group>"; };
|
||||||
7CEAF5171DBAC872006585E7 /* Cluster.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Cluster.hpp; path = ../../../zerotierone/node/Cluster.hpp; sourceTree = "<group>"; };
|
7CEAF5171DBAC872006585E7 /* Cluster.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Cluster.hpp; path = ../../../zerotierone/node/Cluster.hpp; sourceTree = "<group>"; };
|
||||||
7CEAF5181DBAC872006585E7 /* Constants.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Constants.hpp; path = ../../../zerotierone/node/Constants.hpp; sourceTree = "<group>"; };
|
7CEAF5181DBAC872006585E7 /* Constants.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Constants.hpp; path = ../../../zerotierone/node/Constants.hpp; sourceTree = "<group>"; };
|
||||||
7CEAF51B1DBAC872006585E7 /* Dictionary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Dictionary.cpp; path = ../../../zerotierone/node/Dictionary.cpp; sourceTree = "<group>"; };
|
|
||||||
7CEAF51C1DBAC872006585E7 /* Dictionary.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Dictionary.hpp; path = ../../../zerotierone/node/Dictionary.hpp; sourceTree = "<group>"; };
|
7CEAF51C1DBAC872006585E7 /* Dictionary.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Dictionary.hpp; path = ../../../zerotierone/node/Dictionary.hpp; sourceTree = "<group>"; };
|
||||||
7CEAF51D1DBAC872006585E7 /* Hashtable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Hashtable.hpp; path = ../../../zerotierone/node/Hashtable.hpp; sourceTree = "<group>"; };
|
7CEAF51D1DBAC872006585E7 /* Hashtable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Hashtable.hpp; path = ../../../zerotierone/node/Hashtable.hpp; sourceTree = "<group>"; };
|
||||||
7CEAF51E1DBAC872006585E7 /* Identity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Identity.cpp; path = ../../../zerotierone/node/Identity.cpp; sourceTree = "<group>"; };
|
7CEAF51E1DBAC872006585E7 /* Identity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Identity.cpp; path = ../../../zerotierone/node/Identity.cpp; sourceTree = "<group>"; };
|
||||||
@@ -390,7 +390,6 @@
|
|||||||
7CEAF52A1DBAC872006585E7 /* Network.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Network.hpp; path = ../../../zerotierone/node/Network.hpp; sourceTree = "<group>"; };
|
7CEAF52A1DBAC872006585E7 /* Network.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Network.hpp; path = ../../../zerotierone/node/Network.hpp; sourceTree = "<group>"; };
|
||||||
7CEAF52B1DBAC872006585E7 /* NetworkConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkConfig.cpp; path = ../../../zerotierone/node/NetworkConfig.cpp; sourceTree = "<group>"; };
|
7CEAF52B1DBAC872006585E7 /* NetworkConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkConfig.cpp; path = ../../../zerotierone/node/NetworkConfig.cpp; sourceTree = "<group>"; };
|
||||||
7CEAF52C1DBAC872006585E7 /* NetworkConfig.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = NetworkConfig.hpp; path = ../../../zerotierone/node/NetworkConfig.hpp; sourceTree = "<group>"; };
|
7CEAF52C1DBAC872006585E7 /* NetworkConfig.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = NetworkConfig.hpp; path = ../../../zerotierone/node/NetworkConfig.hpp; sourceTree = "<group>"; };
|
||||||
7CEAF52D1DBAC872006585E7 /* NetworkConfigRequestMetaData.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = NetworkConfigRequestMetaData.hpp; path = ../../../zerotierone/node/NetworkConfigRequestMetaData.hpp; sourceTree = "<group>"; };
|
|
||||||
7CEAF52F1DBAC872006585E7 /* Node.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Node.cpp; path = ../../../zerotierone/node/Node.cpp; sourceTree = "<group>"; };
|
7CEAF52F1DBAC872006585E7 /* Node.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Node.cpp; path = ../../../zerotierone/node/Node.cpp; sourceTree = "<group>"; };
|
||||||
7CEAF5301DBAC872006585E7 /* Node.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Node.hpp; path = ../../../zerotierone/node/Node.hpp; sourceTree = "<group>"; };
|
7CEAF5301DBAC872006585E7 /* Node.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Node.hpp; path = ../../../zerotierone/node/Node.hpp; sourceTree = "<group>"; };
|
||||||
7CEAF5311DBAC872006585E7 /* NonCopyable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = NonCopyable.hpp; path = ../../../zerotierone/node/NonCopyable.hpp; sourceTree = "<group>"; };
|
7CEAF5311DBAC872006585E7 /* NonCopyable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = NonCopyable.hpp; path = ../../../zerotierone/node/NonCopyable.hpp; sourceTree = "<group>"; };
|
||||||
@@ -500,6 +499,8 @@
|
|||||||
7CC003101D12166B003E68DC /* ext */ = {
|
7CC003101D12166B003E68DC /* ext */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
7C0463251DE362BD003E2B0E /* json.c */,
|
||||||
|
7C0463261DE362BD003E2B0E /* json.h */,
|
||||||
7CC0035A1D1217B2003E68DC /* lz4.c */,
|
7CC0035A1D1217B2003E68DC /* lz4.c */,
|
||||||
7CC0035B1D1217B2003E68DC /* lz4.h */,
|
7CC0035B1D1217B2003E68DC /* lz4.h */,
|
||||||
7CC003571D1217A1003E68DC /* http_parser.c */,
|
7CC003571D1217A1003E68DC /* http_parser.c */,
|
||||||
@@ -610,6 +611,8 @@
|
|||||||
7CC003121D121677003E68DC /* ZeroTier */ = {
|
7CC003121D121677003E68DC /* ZeroTier */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
7C0463291DE363BA003E2B0E /* ManagedRoute.cpp */,
|
||||||
|
7C04632A1DE363BA003E2B0E /* ManagedRoute.hpp */,
|
||||||
7CEAF58E1DBAD10A006585E7 /* BackgroundResolver.cpp */,
|
7CEAF58E1DBAD10A006585E7 /* BackgroundResolver.cpp */,
|
||||||
7CEAF5891DBAD0BF006585E7 /* DeferredPackets.cpp */,
|
7CEAF5891DBAD0BF006585E7 /* DeferredPackets.cpp */,
|
||||||
7CEAF58A1DBAD0BF006585E7 /* DeferredPackets.hpp */,
|
7CEAF58A1DBAD0BF006585E7 /* DeferredPackets.hpp */,
|
||||||
@@ -627,7 +630,6 @@
|
|||||||
7CEAF5161DBAC872006585E7 /* Cluster.cpp */,
|
7CEAF5161DBAC872006585E7 /* Cluster.cpp */,
|
||||||
7CEAF5171DBAC872006585E7 /* Cluster.hpp */,
|
7CEAF5171DBAC872006585E7 /* Cluster.hpp */,
|
||||||
7CEAF5181DBAC872006585E7 /* Constants.hpp */,
|
7CEAF5181DBAC872006585E7 /* Constants.hpp */,
|
||||||
7CEAF51B1DBAC872006585E7 /* Dictionary.cpp */,
|
|
||||||
7CEAF51C1DBAC872006585E7 /* Dictionary.hpp */,
|
7CEAF51C1DBAC872006585E7 /* Dictionary.hpp */,
|
||||||
7CEAF51D1DBAC872006585E7 /* Hashtable.hpp */,
|
7CEAF51D1DBAC872006585E7 /* Hashtable.hpp */,
|
||||||
7CEAF51E1DBAC872006585E7 /* Identity.cpp */,
|
7CEAF51E1DBAC872006585E7 /* Identity.cpp */,
|
||||||
@@ -645,7 +647,6 @@
|
|||||||
7CEAF52A1DBAC872006585E7 /* Network.hpp */,
|
7CEAF52A1DBAC872006585E7 /* Network.hpp */,
|
||||||
7CEAF52B1DBAC872006585E7 /* NetworkConfig.cpp */,
|
7CEAF52B1DBAC872006585E7 /* NetworkConfig.cpp */,
|
||||||
7CEAF52C1DBAC872006585E7 /* NetworkConfig.hpp */,
|
7CEAF52C1DBAC872006585E7 /* NetworkConfig.hpp */,
|
||||||
7CEAF52D1DBAC872006585E7 /* NetworkConfigRequestMetaData.hpp */,
|
|
||||||
7CEAF52F1DBAC872006585E7 /* Node.cpp */,
|
7CEAF52F1DBAC872006585E7 /* Node.cpp */,
|
||||||
7CEAF5301DBAC872006585E7 /* Node.hpp */,
|
7CEAF5301DBAC872006585E7 /* Node.hpp */,
|
||||||
7CEAF5311DBAC872006585E7 /* NonCopyable.hpp */,
|
7CEAF5311DBAC872006585E7 /* NonCopyable.hpp */,
|
||||||
@@ -684,8 +685,6 @@
|
|||||||
7CEAF5011DBAC841006585E7 /* Phy.hpp */,
|
7CEAF5011DBAC841006585E7 /* Phy.hpp */,
|
||||||
7CEAF5021DBAC841006585E7 /* PortMapper.cpp */,
|
7CEAF5021DBAC841006585E7 /* PortMapper.cpp */,
|
||||||
7CEAF5031DBAC841006585E7 /* PortMapper.hpp */,
|
7CEAF5031DBAC841006585E7 /* PortMapper.hpp */,
|
||||||
7CEAF5041DBAC841006585E7 /* RoutingTable.cpp */,
|
|
||||||
7CEAF5051DBAC841006585E7 /* RoutingTable.hpp */,
|
|
||||||
7CEAF5061DBAC841006585E7 /* Thread.hpp */,
|
7CEAF5061DBAC841006585E7 /* Thread.hpp */,
|
||||||
7CEAF4EE1DBAC80C006585E7 /* ClusterDefinition.hpp */,
|
7CEAF4EE1DBAC80C006585E7 /* ClusterDefinition.hpp */,
|
||||||
7CEAF4F11DBAC80C006585E7 /* ControlPlane.cpp */,
|
7CEAF4F11DBAC80C006585E7 /* ControlPlane.cpp */,
|
||||||
@@ -924,6 +923,7 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
7C0463271DE362BD003E2B0E /* json.c in Sources */,
|
||||||
7C969B7F1DB99E9A00BD3F7F /* nd6.c in Sources */,
|
7C969B7F1DB99E9A00BD3F7F /* nd6.c in Sources */,
|
||||||
7CEAF5531DBAC872006585E7 /* Multicaster.cpp in Sources */,
|
7CEAF5531DBAC872006585E7 /* Multicaster.cpp in Sources */,
|
||||||
7C2228D41DCC11A8006A2661 /* picotcp.cpp in Sources */,
|
7C2228D41DCC11A8006A2661 /* picotcp.cpp in Sources */,
|
||||||
@@ -965,12 +965,12 @@
|
|||||||
7C969B681DB99E8E00BD3F7F /* etharp.c in Sources */,
|
7C969B681DB99E8E00BD3F7F /* etharp.c in Sources */,
|
||||||
7CEAF5581DBAC872006585E7 /* Packet.cpp in Sources */,
|
7CEAF5581DBAC872006585E7 /* Packet.cpp in Sources */,
|
||||||
7C969B671DB99E8E00BD3F7F /* dhcp.c in Sources */,
|
7C969B671DB99E8E00BD3F7F /* dhcp.c in Sources */,
|
||||||
7CEAF54F1DBAC872006585E7 /* Dictionary.cpp in Sources */,
|
|
||||||
7C969B771DB99E9A00BD3F7F /* dhcp6.c in Sources */,
|
7C969B771DB99E9A00BD3F7F /* dhcp6.c in Sources */,
|
||||||
7C7D52851DBEADD200896C93 /* rpc.c in Sources */,
|
7C7D52851DBEADD200896C93 /* rpc.c in Sources */,
|
||||||
7C7D52871DBEADD200896C93 /* sockets.c in Sources */,
|
7C7D52871DBEADD200896C93 /* sockets.c in Sources */,
|
||||||
7CEAF5561DBAC872006585E7 /* Node.cpp in Sources */,
|
7CEAF5561DBAC872006585E7 /* Node.cpp in Sources */,
|
||||||
7C7D52841DBEADD200896C93 /* proxy.cpp in Sources */,
|
7C7D52841DBEADD200896C93 /* proxy.cpp in Sources */,
|
||||||
|
7C04632B1DE363BA003E2B0E /* ManagedRoute.cpp in Sources */,
|
||||||
7CC003591D1217A1003E68DC /* http_parser.c in Sources */,
|
7CC003591D1217A1003E68DC /* http_parser.c in Sources */,
|
||||||
7C969B6A1DB99E8E00BD3F7F /* igmp.c in Sources */,
|
7C969B6A1DB99E8E00BD3F7F /* igmp.c in Sources */,
|
||||||
7C969B5D1DB99E7900BD3F7F /* udp.c in Sources */,
|
7C969B5D1DB99E7900BD3F7F /* udp.c in Sources */,
|
||||||
@@ -988,7 +988,6 @@
|
|||||||
7C969B531DB99E7900BD3F7F /* memp.c in Sources */,
|
7C969B531DB99E7900BD3F7F /* memp.c in Sources */,
|
||||||
7CEAF5591DBAC872006585E7 /* Path.cpp in Sources */,
|
7CEAF5591DBAC872006585E7 /* Path.cpp in Sources */,
|
||||||
7CEAF55D1DBAC872006585E7 /* SelfAwareness.cpp in Sources */,
|
7CEAF55D1DBAC872006585E7 /* SelfAwareness.cpp in Sources */,
|
||||||
7CEAF50C1DBAC841006585E7 /* RoutingTable.cpp in Sources */,
|
|
||||||
7CEAF54C1DBAC872006585E7 /* CertificateOfMembership.cpp in Sources */,
|
7CEAF54C1DBAC872006585E7 /* CertificateOfMembership.cpp in Sources */,
|
||||||
7CEAF55B1DBAC872006585E7 /* Poly1305.cpp in Sources */,
|
7CEAF55B1DBAC872006585E7 /* Poly1305.cpp in Sources */,
|
||||||
7C969B5A1DB99E7900BD3F7F /* tcp_out.c in Sources */,
|
7C969B5A1DB99E7900BD3F7F /* tcp_out.c in Sources */,
|
||||||
@@ -1043,7 +1042,6 @@
|
|||||||
7C7F16501DBEB7AB00C7AFFD /* C25519.cpp in Sources */,
|
7C7F16501DBEB7AB00C7AFFD /* C25519.cpp in Sources */,
|
||||||
7C7F16511DBEB7AB00C7AFFD /* CertificateOfMembership.cpp in Sources */,
|
7C7F16511DBEB7AB00C7AFFD /* CertificateOfMembership.cpp in Sources */,
|
||||||
7C7F16521DBEB7AB00C7AFFD /* Cluster.cpp in Sources */,
|
7C7F16521DBEB7AB00C7AFFD /* Cluster.cpp in Sources */,
|
||||||
7C7F16531DBEB7AB00C7AFFD /* Dictionary.cpp in Sources */,
|
|
||||||
7C7F16541DBEB7AB00C7AFFD /* Identity.cpp in Sources */,
|
7C7F16541DBEB7AB00C7AFFD /* Identity.cpp in Sources */,
|
||||||
7C7F16551DBEB7AB00C7AFFD /* IncomingPacket.cpp in Sources */,
|
7C7F16551DBEB7AB00C7AFFD /* IncomingPacket.cpp in Sources */,
|
||||||
7C7F16561DBEB7AB00C7AFFD /* InetAddress.cpp in Sources */,
|
7C7F16561DBEB7AB00C7AFFD /* InetAddress.cpp in Sources */,
|
||||||
@@ -1080,6 +1078,8 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
7C04632C1DE363C9003E2B0E /* ManagedRoute.cpp in Sources */,
|
||||||
|
7C0463281DE362D9003E2B0E /* json.c in Sources */,
|
||||||
7C5B40971DCC14E300C43410 /* picotcp.cpp in Sources */,
|
7C5B40971DCC14E300C43410 /* picotcp.cpp in Sources */,
|
||||||
7C5B40981DCC14E300C43410 /* lwip.cpp in Sources */,
|
7C5B40981DCC14E300C43410 /* lwip.cpp in Sources */,
|
||||||
7C7D528B1DBEADE600896C93 /* intercept.c in Sources */,
|
7C7D528B1DBEADE600896C93 /* intercept.c in Sources */,
|
||||||
@@ -1109,7 +1109,6 @@
|
|||||||
7CEAF5621DBAC975006585E7 /* C25519.cpp in Sources */,
|
7CEAF5621DBAC975006585E7 /* C25519.cpp in Sources */,
|
||||||
7CEAF5631DBAC975006585E7 /* CertificateOfMembership.cpp in Sources */,
|
7CEAF5631DBAC975006585E7 /* CertificateOfMembership.cpp in Sources */,
|
||||||
7CEAF5641DBAC975006585E7 /* Cluster.cpp in Sources */,
|
7CEAF5641DBAC975006585E7 /* Cluster.cpp in Sources */,
|
||||||
7CEAF5661DBAC975006585E7 /* Dictionary.cpp in Sources */,
|
|
||||||
7CEAF5671DBAC975006585E7 /* Identity.cpp in Sources */,
|
7CEAF5671DBAC975006585E7 /* Identity.cpp in Sources */,
|
||||||
7CEAF5681DBAC975006585E7 /* IncomingPacket.cpp in Sources */,
|
7CEAF5681DBAC975006585E7 /* IncomingPacket.cpp in Sources */,
|
||||||
7CEAF5691DBAC975006585E7 /* InetAddress.cpp in Sources */,
|
7CEAF5691DBAC975006585E7 /* InetAddress.cpp in Sources */,
|
||||||
@@ -1132,7 +1131,6 @@
|
|||||||
7CEAF57B1DBAC975006585E7 /* Http.cpp in Sources */,
|
7CEAF57B1DBAC975006585E7 /* Http.cpp in Sources */,
|
||||||
7CEAF57C1DBAC975006585E7 /* OSUtils.cpp in Sources */,
|
7CEAF57C1DBAC975006585E7 /* OSUtils.cpp in Sources */,
|
||||||
7CEAF57D1DBAC975006585E7 /* PortMapper.cpp in Sources */,
|
7CEAF57D1DBAC975006585E7 /* PortMapper.cpp in Sources */,
|
||||||
7CEAF57E1DBAC975006585E7 /* RoutingTable.cpp in Sources */,
|
|
||||||
7CEAF5801DBAC975006585E7 /* ControlPlane.cpp in Sources */,
|
7CEAF5801DBAC975006585E7 /* ControlPlane.cpp in Sources */,
|
||||||
7C969C7C1DBAA61700BD3F7F /* tcpip.c in Sources */,
|
7C969C7C1DBAA61700BD3F7F /* tcpip.c in Sources */,
|
||||||
7C969BC21DB99F9E00BD3F7F /* def.c in Sources */,
|
7C969BC21DB99F9E00BD3F7F /* def.c in Sources */,
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
OBJS=\
|
OBJS=\
|
||||||
zerotierone/ext/lz4/lz4.o \
|
|
||||||
zerotierone/ext/json-parser/json.o \
|
zerotierone/ext/json-parser/json.o \
|
||||||
zerotierone/ext/http-parser/http_parser.o \
|
zerotierone/ext/http-parser/http_parser.o \
|
||||||
|
zerotierone/ext/lz4/lz4.o \
|
||||||
zerotierone/node/C25519.o \
|
zerotierone/node/C25519.o \
|
||||||
zerotierone/node/CertificateOfMembership.o \
|
zerotierone/node/CertificateOfMembership.o \
|
||||||
zerotierone/node/Cluster.o \
|
zerotierone/node/Cluster.o \
|
||||||
zerotierone/node/DeferredPackets.o \
|
zerotierone/node/DeferredPackets.o \
|
||||||
zerotierone/node/Dictionary.o \
|
|
||||||
zerotierone/node/Identity.o \
|
zerotierone/node/Identity.o \
|
||||||
zerotierone/node/IncomingPacket.o \
|
zerotierone/node/IncomingPacket.o \
|
||||||
zerotierone/node/InetAddress.o \
|
zerotierone/node/InetAddress.o \
|
||||||
@@ -26,6 +25,7 @@ OBJS=\
|
|||||||
zerotierone/node/Topology.o \
|
zerotierone/node/Topology.o \
|
||||||
zerotierone/node/Utils.o \
|
zerotierone/node/Utils.o \
|
||||||
zerotierone/osdep/BackgroundResolver.o \
|
zerotierone/osdep/BackgroundResolver.o \
|
||||||
|
zerotierone/osdep/ManagedRoute.o \
|
||||||
zerotierone/osdep/Http.o \
|
zerotierone/osdep/Http.o \
|
||||||
zerotierone/osdep/OSUtils.o \
|
zerotierone/osdep/OSUtils.o \
|
||||||
zerotierone/service/ClusterGeoIpService.o \
|
zerotierone/service/ClusterGeoIpService.o \
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
## Primary Authors
|
## Primary Authors
|
||||||
|
|
||||||
* ZeroTier protocol design and core network virtualization engine, ZeroTier One service, React web UI, packaging for most platforms, kitchen sink...<br>
|
* ZeroTier Core and ZeroTier One virtual networking service<br>
|
||||||
Adam Ierymenko / adam.ierymenko@zerotier.com
|
Adam Ierymenko / adam.ierymenko@zerotier.com
|
||||||
|
|
||||||
* Java JNI Interface to enable Android application development, and Android app itself (code for that is elsewhere)<br>
|
* Java JNI Interface to enable Android application development, and Android app itself (code for that is elsewhere)<br>
|
||||||
Grant Limberg / glimberg@gmail.com
|
Grant Limberg / glimberg@gmail.com
|
||||||
|
|
||||||
* Network Containers for Linux, iOS, Android<br>
|
* ZeroTier SDK (formerly known as Network Containers)<br>
|
||||||
Joseph Henry / joseph.henry@zerotier.com
|
Joseph Henry / joseph.henry@zerotier.com
|
||||||
|
|
||||||
## Third Party Contributors
|
## Third Party Contributors
|
||||||
@@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
## Third-Party Code
|
## Third-Party Code
|
||||||
|
|
||||||
|
These are included in ext/ for platforms that do not have them available in common repositories. Otherwise they may be linked and the package may ship with them as dependencies.
|
||||||
|
|
||||||
* LZ4 compression algorithm by Yann Collet
|
* LZ4 compression algorithm by Yann Collet
|
||||||
|
|
||||||
* Files: ext/lz4/*
|
* Files: ext/lz4/*
|
||||||
@@ -48,14 +50,15 @@
|
|||||||
* Files: ext/tap-mac/tuntap/*
|
* Files: ext/tap-mac/tuntap/*
|
||||||
* Home page: http://tuntaposx.sourceforge.net/
|
* Home page: http://tuntaposx.sourceforge.net/
|
||||||
* License grant: BSD attribution no-endorsement
|
* License grant: BSD attribution no-endorsement
|
||||||
|
* ZeroTier Modifications: change interface name to zt#, increase max MTU, increase max devices
|
||||||
|
|
||||||
* tap-windows and tap-windows6 by the OpenVPN project
|
* tap-windows6 by the OpenVPN project
|
||||||
|
|
||||||
* Files: windows/TapDriver6/*
|
* Files: windows/TapDriver6/*
|
||||||
* Home page:
|
* Home page:
|
||||||
https://github.com/OpenVPN/tap-windows/
|
|
||||||
https://github.com/OpenVPN/tap-windows6/
|
https://github.com/OpenVPN/tap-windows6/
|
||||||
* License grant: GNU GPL v2
|
* License grant: GNU GPL v2
|
||||||
|
* ZeroTier Modifications: change name of driver to ZeroTier, add ioctl() to get L2 multicast memberships (source is in ext/ and modifications inherit GPL)
|
||||||
|
|
||||||
* Salsa20 stream cipher, Curve25519 elliptic curve cipher, Ed25519
|
* Salsa20 stream cipher, Curve25519 elliptic curve cipher, Ed25519
|
||||||
digital signature algorithm, and Poly1305 MAC algorithm, all by
|
digital signature algorithm, and Poly1305 MAC algorithm, all by
|
||||||
@@ -68,7 +71,7 @@
|
|||||||
* Home page: http://cr.yp.to/
|
* Home page: http://cr.yp.to/
|
||||||
* License grant: public domain
|
* License grant: public domain
|
||||||
|
|
||||||
* MiniUPNPC by Thomas Bernard
|
* MiniUPNPC and libnatpmp by Thomas Bernard
|
||||||
|
|
||||||
* Files:
|
* Files:
|
||||||
ext/libnatpmp/*
|
ext/libnatpmp/*
|
||||||
|
|||||||
@@ -1,35 +1,51 @@
|
|||||||
ZeroTier One
|
ZeroTier - A Planetary Ethernet Switch
|
||||||
======
|
======
|
||||||
|
|
||||||
ZeroTier is a software defined networking layer for Earth.
|
ZeroTier is a software-based managed Ethernet switch for planet Earth.
|
||||||
|
|
||||||
It can be used for on-premise network virtualization, as a peer to peer VPN for mobile teams, for hybrid or multi-data-center cloud deployments, or just about anywhere else secure software defined virtual networking is useful.
|
It erases the LAN/WAN distinction and makes VPNs, tunnels, proxies, and other kludges arising from the inflexible nature of physical networks obsolete. Everything is encrypted end-to-end and traffic takes the most direct (peer to peer) path available.
|
||||||
|
|
||||||
ZeroTier One is our OS-level client service. It allows Mac, Linux, Windows, FreeBSD, and soon other types of clients to join ZeroTier virtual networks like conventional VPNs or VLANs. It can run on native systems, VMs, or containers (Docker, OpenVZ, etc.).
|
This repository contains ZeroTier One, a service that provides ZeroTier network connectivity to devices running Windows, Mac, Linux, iOS, Android, and FreeBSD and makes joining virtual networks as easy as joining IRC or Slack channels. It also contains the OS-independent core ZeroTier protocol implementation in [node/](node/).
|
||||||
|
|
||||||
Visit [ZeroTier's site](https://www.zerotier.com/) for more information. You can also download professionally packaged binary installers/packages for a variety of supported OSes there if you don't want to build ZeroTier One from source.
|
Visit [ZeroTier's site](https://www.zerotier.com/) for more information and [pre-built binary packages](https://www.zerotier.com/download.shtml). Apps for Android and iOS are available for free in the Google Play and Apple app stores.
|
||||||
|
|
||||||
|
### Getting Started
|
||||||
|
|
||||||
|
ZeroTier's basic operation is easy to understand. Devices have 10-digit *ZeroTier addresses* like `89e92ceee5` and networks have 16-digit network IDs like `8056c2e21c000001`. All it takes for a device to join a network is its 16-digit ID, and all it takes for a network to authorize a device is its 10-digit address. Everything else is automatic.
|
||||||
|
|
||||||
|
A "device" can be anything really: desktops, laptops, phones, servers, VMs/VPSes, containers, and even (soon) apps.
|
||||||
|
|
||||||
|
For testing we provide a public virtual network called *Earth* with network ID `8056c2e21c000001`. On Linux and Mac you can do this with:
|
||||||
|
|
||||||
|
sudo zerotier-cli join 8056c2e21c000001
|
||||||
|
|
||||||
|
Now wait about 30 seconds and check your system with `ip addr list` or `ifconfig`. You'll see a new interface whose name starts with *zt* and it should quickly get an IPv4 and an IPv6 address. Once you see it get an IP, try pinging `earth.zerotier.net` at `29.209.112.93`. If you've joined Earth from more than one system, try pinging your other machine.
|
||||||
|
|
||||||
|
*(IPv4 addresses for Earth are assigned from the block 28.0.0.0/7, which is not a part of the public Internet but is non-standard for private networks. It's used to avoid IP conflicts during testing. Your networks can run any IP addressing scheme you want.)*
|
||||||
|
|
||||||
|
If you don't want to belong to a giant Ethernet party line anymore, just type:
|
||||||
|
|
||||||
|
sudo zerotier-cli leave 8056c2e21c000001
|
||||||
|
|
||||||
|
The *zt* interface will disappear. You're no longer on the network.
|
||||||
|
|
||||||
|
To create networks of your own you'll need a network controller. You can use [our hosted controller at my.zerotier.com](https://my.zerotier.com) which is free for up to 100 devices on an unlimited number of networks, or you can build your own controller and run it through its local JSON API. See [README.md in controller/](controller/) for more information.
|
||||||
|
|
||||||
### Building from Source
|
### Building from Source
|
||||||
|
|
||||||
For Mac, Linux, and BSD, just type "make" (or "gmake" on BSD). You won't need much installed; here are the requirements for various platforms:
|
For Mac, Linux, and BSD, just type "make" (or "gmake" on BSD). You won't need much installed; here are the requirements for various platforms:
|
||||||
|
|
||||||
* Mac: Xcode command line tools, and [Packages](http://s.sudre.free.fr/Software/Packages/about.html) if you want to build an OSX .pkg installer ("make mac-dist-pkg"). It should build on OSX 10.7 or newer.
|
* **Mac**: Xcode command line tools. It should build on OSX 10.7 or newer.
|
||||||
* Linux: gcc/g++ or clang/clang++ (Makefile will use clang by default if available.)
|
* **Linux**: gcc/g++ (4.9 or newer recommended) or clang/clang++ (3.4 or newer recommended) Makefile will use clang by default if available. The Linux build will auto-detect the presence of development headers for *json-parser*, *http-parser*, *li8bnatpmp*, and *libminiupnpc* and will link against the system libraries for these if they are present and recent enough. Otherwise the bundled versions in [ext/](ext/) will be used. Type `make install` to install the binaries and other files on the system, though this will not create init.d or systemd links.
|
||||||
* FreeBSD (and other BSD): C++ compiler (G++ usually) and GNU make (gmake).
|
* **FreeBSD**: C++ compiler (G++ usually) and GNU make (gmake).
|
||||||
|
|
||||||
Each supported platform has its own *make-XXX.mk* file that contains the actual make rules for the platform. The right .mk file is included by the main Makefile based on the GNU make *OSTYPE* variable. Take a look at the .mk file for your platform for other targets, debug build rules, etc.
|
Each supported platform has its own *make-XXX.mk* file that contains the actual make rules for the platform. The right .mk file is included by the main Makefile based on the GNU make *OSTYPE* variable. Take a look at the .mk file for your platform for other targets, debug build rules, etc.
|
||||||
|
|
||||||
Windows, of course, is special. We build for Windows with Microsoft Visual Studio 2012 on Windows 7. A solution file is located in the *windows* subfolder. Newer versions of Visual Studio (and Windows) may work but haven't been tested. Older versions almost certainly will not, since they lack things like *stdint.h* and certain STL features. MinGW or other ports of gcc/clang to Windows should also work but haven't been tested. Build steps for Windows are a bit more complicated. For the moment you are on your own there.
|
Typing `make selftest` will build a *zerotier-selftest* binary which unit tests various internals and reports on a few aspects of the build environment. It's a good idea to try this on novel platforms or architectures.
|
||||||
|
|
||||||
Mobile versions are in progress. They don't work yet, and in any case only the glue code will be included in this repository. The full mobile apps are in private repositories on our own git server.
|
Windows, of course, is special. We build for Windows with Microsoft Visual Studio 2012 on Windows 7. A solution file is located in the *windows/* subfolder. Newer versions of Visual Studio (and Windows) may work but haven't been tested. Older versions almost certainly will not, since they lack things like *stdint.h* and certain STL features. MinGW or other ports of gcc/clang to Windows should also work but haven't been tested.
|
||||||
|
|
||||||
### Supported Platforms
|
32 and 64 bit X86 and ARM (e.g. Raspberry Pi, Android) are officially supported. Community members have built for MIPS and Sparc without issues.
|
||||||
|
|
||||||
CPU architecture shouldn't matter unless it's smaller than 32-bit or something really bizarre like a "middle-endian" processor. We have reports of ZeroTier One running on arm32, arm64, and MIPS. It builds and runs out of the box on Raspberry Pi, BeagleBone, BananaPi, and other ARM-based developer/hobbyist boards.
|
|
||||||
|
|
||||||
ZeroTier is written in C and C++ (C++03 / ISO/IEC 14882:2003) and uses data structures and algorithms from the C++03 STL. We do not use any C++11 features (yet), since we want to support a few old and embedded platforms that don't have C++11 compilers. You *will* require a compiler and headers new enough to support 64-bit integers (long long) and the *stdint.h* header. The latter could also be faked by adding defines for things like *uint32\_t*, *int64\_t*, etc.
|
|
||||||
|
|
||||||
Typing "make selftest" will build a *zerotier-selftest* binary which unit tests various internals and reports on a few aspects of the build environment. It's a good idea to try this on novel platforms or architectures.
|
|
||||||
|
|
||||||
### Running
|
### Running
|
||||||
|
|
||||||
@@ -45,10 +61,10 @@ The service is controlled via the JSON API, which by default is available at 127
|
|||||||
|
|
||||||
Here's where home folders live (by default) on each OS:
|
Here's where home folders live (by default) on each OS:
|
||||||
|
|
||||||
* Linux: /var/lib/zerotier-one
|
* **Linux**: `/var/lib/zerotier-one`
|
||||||
* BSD: /var/db/zerotier-one
|
* **FreeBSD**: `/var/db/zerotier-one`
|
||||||
* Mac: /Library/Application Support/ZeroTier/One
|
* **Mac**: `/Library/Application Support/ZeroTier/One`
|
||||||
* Windows: \\ProgramData\\ZeroTier\\One (That's for Windows 7. The base 'shared app data' folder might be different on different Windows versions.)
|
* **Windows**: `\ProgramData\ZeroTier\One` (That's for Windows 7. The base 'shared app data' folder might be different on different Windows versions.)
|
||||||
|
|
||||||
Running ZeroTier One on a Mac is the same, but OSX requires a kernel extension. We ship a signed binary build of the ZeroTier tap device driver, which can be installed on Mac with:
|
Running ZeroTier One on a Mac is the same, but OSX requires a kernel extension. We ship a signed binary build of the ZeroTier tap device driver, which can be installed on Mac with:
|
||||||
|
|
||||||
@@ -56,96 +72,6 @@ Running ZeroTier One on a Mac is the same, but OSX requires a kernel extension.
|
|||||||
|
|
||||||
This will create the home folder for Mac, place *tap.kext* there, and set its modes correctly to enable ZeroTier One to manage it with *kextload* and *kextunload*.
|
This will create the home folder for Mac, place *tap.kext* there, and set its modes correctly to enable ZeroTier One to manage it with *kextload* and *kextunload*.
|
||||||
|
|
||||||
We recommend using our binary packages on Windows, since there are several prerequisites such as a tap driver that must be installed on the system *and* in the home folder.
|
|
||||||
|
|
||||||
### Joining A Network
|
|
||||||
|
|
||||||
ZeroTier virtual networks are identified by 16-digit hexadecimal network IDs, while devices are identified by 10-digit addresses. To get your address run:
|
|
||||||
|
|
||||||
sudo zerotier-cli status
|
|
||||||
|
|
||||||
(Use ./zerotier-cli if you're running it right from your build folder.)
|
|
||||||
|
|
||||||
You should see something like:
|
|
||||||
|
|
||||||
200 info ########## ONLINE #.#.#
|
|
||||||
|
|
||||||
That 10-digit hex code is you. It's derived via a one-way proof of work function from your cryptographic public key. Your public key can be found in *identity.public* in ZeroTier's home folder, while *identity.secret* contains your full identity including the secret portion of the key pair.
|
|
||||||
|
|
||||||
(The identity files define your device's *identity*. Moving them to another system will move that identity. Be careful when cloning virtual machines that have identities stored on them. If two devices have the same identity, they'll "fight" over it and you won't know which device will receive network packets.)
|
|
||||||
|
|
||||||
If you want to do a quick test, you can join [Earth](https://www.zerotier.com/earth.html). It's a global public network that anyone can join. Type:
|
|
||||||
|
|
||||||
sudo zerotier-cli join 8056c2e21c000001
|
|
||||||
|
|
||||||
Then:
|
|
||||||
|
|
||||||
sudo zerotier-cli listnetworks
|
|
||||||
|
|
||||||
At first it'll be in *REQUESTING\_CONFIGURATION* state. In a few seconds to a minute you should see something like:
|
|
||||||
|
|
||||||
200 listnetworks 8056c2e21c000001 earth.zerotier.net ##:##:##:##:##:## OK PUBLIC zt0 ##.##.##.##/##
|
|
||||||
|
|
||||||
Earth will assign you an IP address in the "unofficially available" globally unrouted 28.0.0.0/7 IP block so as to avoid conflicts with local networks. (Your networks can use any IP scheme, or can even leave IP addresses unmanaged.) Once you get an IP, you should be able to ping something:
|
|
||||||
|
|
||||||
ping earth.zerotier.net
|
|
||||||
|
|
||||||
Go to [http://earth.zerotier.net/](http://earth.zerotier.net/) to see a short little welcome page that will tell you your IP and Ethernet MAC address.
|
|
||||||
|
|
||||||
Earth is a public place. If you don't want to stick around run:
|
|
||||||
|
|
||||||
sudo zerotier-cli leave 8056c2e21c000001
|
|
||||||
|
|
||||||
The network (and associated interface) should be gone.
|
|
||||||
|
|
||||||
Networks are created and administrated by network controllers. Most users will want to use our hosted controllers. Visit [our web site](https://www.zerotier.com/) for more information. Later in this README there are brief instructions about building ZeroTier One with network controller support for those who want to try running their own.
|
|
||||||
|
|
||||||
Macintosh and Windows installers also install a GUI application.
|
|
||||||
|
|
||||||
### Installing
|
|
||||||
|
|
||||||
We don't have a "make install" rule quite yet. On Linux you can type:
|
|
||||||
|
|
||||||
make installer
|
|
||||||
|
|
||||||
This will build a binary that, when run, will install ZeroTier One on most current Linux distributions. We also have RPM and DEB build files in *ext/installfiles/linux* that wrap this installer in packages for RedHat/CentOS and Debian/Ubuntu derived distributions. If *rpmbuild* is present on the system, the RPM will be built. If *dpkg-deb* is present, the DEB package will be built.
|
|
||||||
|
|
||||||
On Mac the best way is to install [Packages](http://s.sudre.free.fr/Software/Packages/about.html) and use:
|
|
||||||
|
|
||||||
make mac-dist-pkg
|
|
||||||
|
|
||||||
This builds a .pkg file that can be installed.
|
|
||||||
|
|
||||||
In FreeBSD there is now an official .pkg in the FreeBSD repository. Type "pkg install zerotier". It can also be built and installed from source.
|
|
||||||
|
|
||||||
Linux/BSD and Mac installations have an *uninstall.sh* file in their ZeroTier home folder that cleanly removes ZeroTier One from the system. Run this with:
|
|
||||||
|
|
||||||
sudo /path/to/ZeroTier/home/folder/uninstall.sh
|
|
||||||
|
|
||||||
Windows installers are insane. We build our .MSI installers with [Advanced Installer Enterprise](http://www.advancedinstaller.com). The Advanced Installer project file is in *ext/installfiles/windows*. To avoid lasting psychological trauma we recommend leaving Windows installers alone and using the pre-built Windows binaries on our web site.
|
|
||||||
|
|
||||||
### Using ZeroTier One in Docker Containers
|
|
||||||
|
|
||||||
To run the ZeroTier One service in a Docker container, run it with "--device=/dev/net/tun --cap-add=NET_ADMIN". This will allow ZeroTier One to open a "tap" virtual network port inside the container.
|
|
||||||
|
|
||||||
Alternately, you can use Ethernet bridging to bridge the *docker0* device on your system to a ZeroTier virtual network. This allows you to run ZeroTier One on the host and bridge the entire Docker network backplane to a virtual network or other hosts.
|
|
||||||
|
|
||||||
We're working on better "official" Docker support. In the meantime there is a [user-contributed project here](https://github.com/davide/docker-zerotier).
|
|
||||||
|
|
||||||
### Building with Network Controller Support
|
|
||||||
|
|
||||||
**Warning: as of beta version 1.0.3 the new network controller is not heavily tested. We recommend waiting for 1.0.4 to deploy this in production.**
|
|
||||||
|
|
||||||
Network controllers are nodes responsible for issuing configurations and certificates to members of ZeroTier virtual networks. Most users won't need to run their own, so this code is by default not included in the ZeroTier One binary.
|
|
||||||
|
|
||||||
You can build a network controller on Linux or Mac with:
|
|
||||||
|
|
||||||
make ZT_ENABLE_NETWORK_CONTROLLER=1
|
|
||||||
|
|
||||||
This will build a version that contains the Sqlite-backed network controller and associated extensions to the JSON local service control API. You will need the development headers for sqlite3 installed. On Mac these ship as part of Xcode, while on Linux they'll be found in packages for the various distributions.
|
|
||||||
|
|
||||||
See the JSON API documentation in [service/](service/) for more information about how to control controllers.
|
|
||||||
|
|
||||||
### Troubleshooting
|
### Troubleshooting
|
||||||
|
|
||||||
For most users, it just works.
|
For most users, it just works.
|
||||||
@@ -156,7 +82,7 @@ The Mac firewall can be found under "Security" in System Preferences. Linux has
|
|||||||
|
|
||||||
sudo ufw allow 9993/udp
|
sudo ufw allow 9993/udp
|
||||||
|
|
||||||
On CentOS check */etc/sysconfig/iptables* for IPTables rules. For other distributions consult your distribution's documentation. You'll also have to check the UIs or documentation for commercial third party firewall applications like Little Snitch (Mac), McAfee Firewall Enterprise (Windows), etc. if you are running any of those. Some corporate environments might have centrally managed firewall software, so you might also have to contact IT.
|
On CentOS check `/etc/sysconfig/iptables` for IPTables rules. For other distributions consult your distribution's documentation. You'll also have to check the UIs or documentation for commercial third party firewall applications like Little Snitch (Mac), McAfee Firewall Enterprise (Windows), etc. if you are running any of those. Some corporate environments might have centrally managed firewall software, so you might also have to contact IT.
|
||||||
|
|
||||||
ZeroTier One peers will automatically locate each other and communicate directly over a local wired LAN *if UDP port 9993 inbound is open*. If that port is filtered, they won't be able to see each others' LAN announcement packets. If you're experiencing poor performance between devices on the same physical network, check their firewall settings. Without LAN auto-location peers must attempt "loopback" NAT traversal, which sometimes fails and in any case requires that every packet traverse your external router twice.
|
ZeroTier One peers will automatically locate each other and communicate directly over a local wired LAN *if UDP port 9993 inbound is open*. If that port is filtered, they won't be able to see each others' LAN announcement packets. If you're experiencing poor performance between devices on the same physical network, check their firewall settings. Without LAN auto-location peers must attempt "loopback" NAT traversal, which sometimes fails and in any case requires that every packet traverse your external router twice.
|
||||||
|
|
||||||
@@ -168,7 +94,7 @@ If a firewall between you and the Internet blocks ZeroTier's UDP traffic, you wi
|
|||||||
|
|
||||||
### Contributing
|
### Contributing
|
||||||
|
|
||||||
There are three main branches: **edge**, **test**, and **master**. Other branches may be for specific features, tests, or use cases. In general **edge** is "bleeding" and may or may not work, while **test** should be relatively stable and **master** is the latest tagged release. Pull requests should generally be done against **test** or **edge**, since pull requests against **master** may be working against a branch that is somewhat out of date.
|
Please make pull requests against the `dev` branch. The `master` branch is release, and `edge` is for unstable and work in progress changes and is not likely to work.
|
||||||
|
|
||||||
### License
|
### License
|
||||||
|
|
||||||
|
|||||||
@@ -1,84 +0,0 @@
|
|||||||
ZeroTier Security
|
|
||||||
======
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
|
|
||||||
## Using ZeroTier Securely
|
|
||||||
|
|
||||||
### Overall Recommendations
|
|
||||||
|
|
||||||
*TL;DR: same as anything else: defense in depth defense in depth defense in depth.*
|
|
||||||
|
|
||||||
We encourage our users to treat private ZeroTier networks as being rougly equivalent in security to WPA2-enterprise securied WiFi or on-premise wired Ethernet. (Public networks on the other hand are open by design.) That means they're networks with perimeters, but like all networks the compromise of any participating device or network controller allows an attacker to breach this perimeter.
|
|
||||||
|
|
||||||
**Never trust the network.** Many modern security professionals discourage reliance on network perimeters as major components in any security strategy, and we strongly agree regardless of whether your network is physical or virtual.
|
|
||||||
|
|
||||||
As part of a defense in depth approach **we specifically encourage the use of other secure protocols and authentication systems over ZeroTier networks**. While the use of secure encrypted protocols like SSH and SSL over ZeroTier adds a bit more overhead, it greatly reduces the chance of total compromise.
|
|
||||||
|
|
||||||
Imagine that the per-day probability of a major "0-day" security flaw in ZeroTier and OpenSSH are both roughly 0.001 or one per thousand days. Using both at the same time gives you a cumulative 0-day risk of roughly 0.000001 or one per one million days.
|
|
||||||
|
|
||||||
Those are made-up numbers. In reality these probabilities can't be known ahead of time. History shows that a 0-day could be found in anything tomorrow, next week, or never. But layers of security give you an overall posture that is the product -- more than the sum -- of its parts. That's how defense in depth works.
|
|
||||||
|
|
||||||
### ZeroTier Specifics
|
|
||||||
|
|
||||||
#### Protect Your Identity
|
|
||||||
|
|
||||||
Each ZeroTier device has an identity. The secret portion of this identity is stored in a file called "identity.secret." *Protect this file.* If it's stolen your device's identity (as represented by its 10-digit ZeroTier address) can easily be stolen or impersonated and your traffic can be decrypted or man-in-the-middle'd.
|
|
||||||
|
|
||||||
#### Protect Your Controller
|
|
||||||
|
|
||||||
The second major component of ZeroTier network security is the network controller. It's responsible for issuing certificates and configuration information to all network members. That makes it a certificate authority. Compromise of the controller allows an attacker to join or disrupt any network the controller controls. It does *not*, however, allow an attacker to decrypt peer to peer unicast traffic.
|
|
||||||
|
|
||||||
If you are using our controller-as-a-service at [my.zerotier.com](https://my.zerotier.com), you are delegating this responsibility to us.
|
|
||||||
|
|
||||||
## Security Priorities
|
|
||||||
|
|
||||||
These are our security "must-haves." If the system fails in any of these objectives it is broken.
|
|
||||||
|
|
||||||
* ZeroTier must be secure against remote vulnerabilities. This includes things like unauthorized remote control, remote penetration of the device using ZeroTier as a vector, or remote injection of malware.
|
|
||||||
|
|
||||||
* The content (but not meta-data) of communication must be secure against eavesdropping on the wire by any known means. (We can't warrant against secret vulnerabilities against ciphers, etc., or anything else we don't know about.)
|
|
||||||
|
|
||||||
* Communication must be secure against man-in-the-middle attacks and remote device impersonation.
|
|
||||||
|
|
||||||
## Security Non-Priorities
|
|
||||||
|
|
||||||
There are a few aspects of security we knowingly do not address, since doing so would be beyond scope or would conflict too greatly with other priorities.
|
|
||||||
|
|
||||||
* ZeroTier makes no effort to conceal communication meta-data such as source and destination addresses and the amount of information transferred between peers. To do this more or less requires onion routing or other "heavy" approaches to anonymity, and this is beyond scope.
|
|
||||||
|
|
||||||
* ZeroTier does not implement complex certificate chains, X.509, or other feature-rich (some would say feature-laden) cryptographic stuff. We only implement the crypto we need to get the job done.
|
|
||||||
|
|
||||||
* We don't take extraordinary measures to preserve security under conditions in which an endpoint device has been penetrated by other means (e.g. "rooted" by third party malware) or physicall compromised. If someone steals your keys they've stolen your keys, and if they've "pwned" your device they can easily eavesdrop on everything directly.
|
|
||||||
|
|
||||||
## Insecurities and Areas for Improvement
|
|
||||||
|
|
||||||
The only perfectly secure system is one that is off. All real world systems have potential security weaknesses. If possible, we like to know what these are and acknowledge their existence.
|
|
||||||
|
|
||||||
In some cases we plan to improve these. In other cases we have deliberately decided to "punt" on them in favor of some other priority (see philosophy). We may or may not revisit this decision in the future.
|
|
||||||
|
|
||||||
* We don't implement forward secrecy / ephemeral keys. A [discussion of this can be found at the closed GitHub issue for this feature](https://github.com/zerotier/ZeroTierOne/issues/204). In short: we've decided to "punt" on this feature because it introduces complexity and state negotiation. One of the design goals of ZeroTier is "reliability convergence" -- the reliability of ZeroTier virtual networks should rapidly converge with that of the underlying physical wire. Any state that must be negotiated prior to communication multiplies the probability of delay or failure due to packet loss. We *may* revisit this decision at a later date.
|
|
||||||
|
|
||||||
## Secure Coding Practices
|
|
||||||
|
|
||||||
The first line of defense employed against remote vulnerabilities and other major security flaws is the use of secure coding practices. These are, in no particular order:
|
|
||||||
|
|
||||||
* All parsing of remote messages is performed via higher level safe bounds-checked data structures and interfaces. See node/Buffer.hpp for one of the core elements of this.
|
|
||||||
|
|
||||||
* C++ exceptions are used to ensure that any unhandled failure or error condition (such as a bounds checking violation) results in the safe and complete termination of message processing. Invalid messages are dropped and ignored.
|
|
||||||
|
|
||||||
* Minimalism is a secure coding practice. There is an exponential relationship between complexity and the probability of bugs, and complex designs are much harder to audit and reason about.
|
|
||||||
|
|
||||||
* Our build scripts try to enable any OS and compiler level security features such as ASLR and "stack canaries" on non-debug builds.
|
|
||||||
|
|
||||||
## Cryptographic Security Practices
|
|
||||||
|
|
||||||
* We use [boring crypto](https://cr.yp.to/talks/2015.10.05/slides-djb-20151005-a4.pdf). A single symmetric algorithm (Salsa20/12), a single asymmetric algorithm (Curve25519 ECDH-256), and a single MAC (Poly1305). The way these algorithms are used is identical to how they're used in the NaCl reference implementation. The protocol supports selection of alternative algorithms but only for "future proofing" in the case that a serious flaw is discovered in any of these. Avoding algorithm bloat and cryptographic state negotiation helps guard against down-grade, "oracle," and other protocol level attacks.
|
|
||||||
|
|
||||||
* Authenticated encryption is employed with authentication being performed prior to any other operations on received messages. See also: [the cryptographic doom principle](https://moxie.org/blog/the-cryptographic-doom-principle/).
|
|
||||||
|
|
||||||
* "Never branch on anything secret" -- deterministic-time comparisons and other operations are used in cryptographic operations. See Utils::secureEq() in node/Utils.hpp.
|
|
||||||
|
|
||||||
* OS-derived crypographic random numbers (/dev/urandom or Windows CryptGenRandom) are further randomized using encryption by a secondary key with a secondary source of entropy to guard against CSPRNG bugs. Such OS-level CSPRNG bugs have been found in the past. See Utils::getSecureRandom() in node/Utils.hpp.
|
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 361 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 50 KiB |
@@ -1,37 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<style type="text/css">
|
|
||||||
html,body {
|
|
||||||
background: #aaaaaa;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
font-family: "Helvetica";
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 12pt;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
div.icon {
|
|
||||||
background: #ffb354;
|
|
||||||
color: #000000;
|
|
||||||
font-size: 150pt;
|
|
||||||
border-radius: 2.5rem;
|
|
||||||
display: inline-block;
|
|
||||||
width: 1.3em;
|
|
||||||
height: 1.3em;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
line-height: 1.4em;
|
|
||||||
vertical-align: middle;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<br><br><br><br><br><br>
|
|
||||||
<!-- Yes, our logo is a Unicode character. It sort of just turned out that way. -->
|
|
||||||
<center>
|
|
||||||
<div class="icon">⏁</div>
|
|
||||||
</center>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,408 +0,0 @@
|
|||||||
/*
|
|
||||||
* ZeroTier One - Network Virtualization Everywhere
|
|
||||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* --
|
|
||||||
*
|
|
||||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
|
||||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
|
||||||
*
|
|
||||||
* If you would like to embed ZeroTier into a commercial application or
|
|
||||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
|
||||||
* LLC. Start here: http://www.zerotier.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
#include "RuntimeEnvironment.hpp"
|
|
||||||
#include "Logger.hpp"
|
|
||||||
#include "Filter.hpp"
|
|
||||||
#include "Utils.hpp"
|
|
||||||
|
|
||||||
namespace ZeroTier {
|
|
||||||
|
|
||||||
const char *const Filter::UNKNOWN_NAME = "(unknown)";
|
|
||||||
const Range<unsigned int> Filter::ANY;
|
|
||||||
|
|
||||||
static inline Range<unsigned int> __parseRange(char *r)
|
|
||||||
throw(std::invalid_argument)
|
|
||||||
{
|
|
||||||
char *saveptr = (char *)0;
|
|
||||||
unsigned int a = 0;
|
|
||||||
unsigned int b = 0;
|
|
||||||
unsigned int fn = 0;
|
|
||||||
for(char *f=Utils::stok(r,"-",&saveptr);(f);f=Utils::stok((char *)0,"-",&saveptr)) {
|
|
||||||
if (*f) {
|
|
||||||
switch(fn++) {
|
|
||||||
case 0:
|
|
||||||
if (*f != '*')
|
|
||||||
a = b = (unsigned int)strtoul(f,(char **)0,10);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if (*f != '*')
|
|
||||||
b = (unsigned int)strtoul(f,(char **)0,10);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw std::invalid_argument("rule range must be <int>, <int>-<int>, or *");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Range<unsigned int>(a,b);
|
|
||||||
}
|
|
||||||
|
|
||||||
Filter::Rule::Rule(const char *s)
|
|
||||||
throw(std::invalid_argument)
|
|
||||||
{
|
|
||||||
char *saveptr = (char *)0;
|
|
||||||
char tmp[256];
|
|
||||||
if (!Utils::scopy(tmp,sizeof(tmp),s))
|
|
||||||
throw std::invalid_argument("rule string too long");
|
|
||||||
unsigned int fn = 0;
|
|
||||||
for(char *f=Utils::stok(tmp,";",&saveptr);(f);f=Utils::stok((char *)0,";",&saveptr)) {
|
|
||||||
if (*f) {
|
|
||||||
switch(fn++) {
|
|
||||||
case 0:
|
|
||||||
_etherType = __parseRange(f);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
_protocol = __parseRange(f);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
_port = __parseRange(f);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw std::invalid_argument("rule string has unknown extra fields");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (fn != 3)
|
|
||||||
throw std::invalid_argument("rule string must contain 3 fields");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Filter::Rule::operator()(unsigned int etype,const void *data,unsigned int len) const
|
|
||||||
throw(std::invalid_argument)
|
|
||||||
{
|
|
||||||
if ((!_etherType)||(_etherType(etype))) { // ethertype is ANY, or matches
|
|
||||||
// Ethertype determines meaning of protocol and port
|
|
||||||
switch(etype) {
|
|
||||||
case ZT_ETHERTYPE_IPV4:
|
|
||||||
if (len > 20) {
|
|
||||||
if ((!_protocol)||(_protocol(((const uint8_t *)data)[9]))) { // protocol is ANY or match
|
|
||||||
if (!_port) // port is ANY
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Don't match on fragments beyond fragment 0. If we've blocked
|
|
||||||
// fragment 0, further fragments will fall on deaf ears anyway.
|
|
||||||
if ((Utils::ntoh(((const uint16_t *)data)[3]) & 0x1fff))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Internet header length determines where data begins, in multiples of 32 bits
|
|
||||||
unsigned int ihl = 4 * (((const uint8_t *)data)[0] & 0x0f);
|
|
||||||
|
|
||||||
switch(((const uint8_t *)data)[9]) { // port's meaning depends on IP protocol
|
|
||||||
case ZT_IPPROTO_ICMP:
|
|
||||||
// For ICMP, port is ICMP type
|
|
||||||
return _port(((const uint8_t *)data)[ihl]);
|
|
||||||
case ZT_IPPROTO_TCP:
|
|
||||||
case ZT_IPPROTO_UDP:
|
|
||||||
case ZT_IPPROTO_SCTP:
|
|
||||||
case ZT_IPPROTO_UDPLITE:
|
|
||||||
// For these, port is destination port. Protocol designers were
|
|
||||||
// nice enough to put the field in the same place.
|
|
||||||
return _port(((const uint16_t *)data)[(ihl / 2) + 1]);
|
|
||||||
default:
|
|
||||||
// port has no meaning for other IP types, so ignore it
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false; // no match on port
|
|
||||||
}
|
|
||||||
} else throw std::invalid_argument("undersized IPv4 packet");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ZT_ETHERTYPE_IPV6:
|
|
||||||
if (len > 40) {
|
|
||||||
int nextHeader = ((const uint8_t *)data)[6];
|
|
||||||
unsigned int pos = 40;
|
|
||||||
while ((pos < len)&&(nextHeader >= 0)&&(nextHeader != 59)) { // 59 == no next header
|
|
||||||
fprintf(stderr,"[rule] V6: start header parse, header %.2x pos %d\n",nextHeader,pos);
|
|
||||||
|
|
||||||
switch(nextHeader) {
|
|
||||||
case 0: // hop-by-hop options
|
|
||||||
case 60: // destination options
|
|
||||||
case 43: // routing
|
|
||||||
case 135: // mobility (mobile IPv6 options)
|
|
||||||
if (_protocol((unsigned int)nextHeader))
|
|
||||||
return true; // match if our goal was to match any of these
|
|
||||||
nextHeader = ((const uint8_t *)data)[pos];
|
|
||||||
pos += 8 + (8 * ((const uint8_t *)data)[pos + 1]);
|
|
||||||
break;
|
|
||||||
case 44: // fragment
|
|
||||||
if (_protocol(44))
|
|
||||||
return true; // match if our goal was to match fragments
|
|
||||||
nextHeader = ((const uint8_t *)data)[pos];
|
|
||||||
pos += 8;
|
|
||||||
break;
|
|
||||||
case ZT_IPPROTO_AH: // AH
|
|
||||||
return _protocol(ZT_IPPROTO_AH); // true if AH is matched protocol, otherwise false since packet will be IPsec
|
|
||||||
case ZT_IPPROTO_ESP: // ESP
|
|
||||||
return _protocol(ZT_IPPROTO_ESP); // true if ESP is matched protocol, otherwise false since packet will be IPsec
|
|
||||||
case ZT_IPPROTO_ICMPV6:
|
|
||||||
// Only match ICMPv6 if we've selected it specifically
|
|
||||||
if (_protocol(ZT_IPPROTO_ICMPV6)) {
|
|
||||||
// Port is interpreted as ICMPv6 type
|
|
||||||
if ((!_port)||(_port(((const uint8_t *)data)[pos])))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ZT_IPPROTO_TCP:
|
|
||||||
case ZT_IPPROTO_UDP:
|
|
||||||
case ZT_IPPROTO_SCTP:
|
|
||||||
case ZT_IPPROTO_UDPLITE:
|
|
||||||
// If we encounter any of these, match if protocol matches or is wildcard as
|
|
||||||
// we'll consider these the "real payload" if present.
|
|
||||||
if ((!_protocol)||(_protocol(nextHeader))) {
|
|
||||||
if ((!_port)||(_port(((const uint16_t *)data)[(pos / 2) + 1])))
|
|
||||||
return true; // protocol matches or is ANY, port is ANY or matches
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default: {
|
|
||||||
char foo[128];
|
|
||||||
Utils::snprintf(foo,sizeof(foo),"unrecognized IPv6 header type %d",(int)nextHeader);
|
|
||||||
throw std::invalid_argument(foo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr,"[rule] V6: end header parse, next header %.2x, new pos %d\n",nextHeader,pos);
|
|
||||||
}
|
|
||||||
} else throw std::invalid_argument("undersized IPv6 packet");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// For other ethertypes, protocol and port are ignored. What would they mean?
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Filter::Rule::toString() const
|
|
||||||
{
|
|
||||||
char buf[128];
|
|
||||||
std::string s;
|
|
||||||
|
|
||||||
switch(_etherType.magnitude()) {
|
|
||||||
case 0:
|
|
||||||
s.push_back('*');
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
Utils::snprintf(buf,sizeof(buf),"%u",_etherType.start);
|
|
||||||
s.append(buf);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Utils::snprintf(buf,sizeof(buf),"%u-%u",_etherType.start,_etherType.end);
|
|
||||||
s.append(buf);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
s.push_back(';');
|
|
||||||
switch(_protocol.magnitude()) {
|
|
||||||
case 0:
|
|
||||||
s.push_back('*');
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
Utils::snprintf(buf,sizeof(buf),"%u",_protocol.start);
|
|
||||||
s.append(buf);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Utils::snprintf(buf,sizeof(buf),"%u-%u",_protocol.start,_protocol.end);
|
|
||||||
s.append(buf);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
s.push_back(';');
|
|
||||||
switch(_port.magnitude()) {
|
|
||||||
case 0:
|
|
||||||
s.push_back('*');
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
Utils::snprintf(buf,sizeof(buf),"%u",_port.start);
|
|
||||||
s.append(buf);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Utils::snprintf(buf,sizeof(buf),"%u-%u",_port.start,_port.end);
|
|
||||||
s.append(buf);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
Filter::Filter(const char *s)
|
|
||||||
throw(std::invalid_argument)
|
|
||||||
{
|
|
||||||
char tmp[16384];
|
|
||||||
if (!Utils::scopy(tmp,sizeof(tmp),s))
|
|
||||||
throw std::invalid_argument("filter string too long");
|
|
||||||
char *saveptr = (char *)0;
|
|
||||||
unsigned int fn = 0;
|
|
||||||
for(char *f=Utils::stok(tmp,",",&saveptr);(f);f=Utils::stok((char *)0,",",&saveptr)) {
|
|
||||||
try {
|
|
||||||
_rules.push_back(Rule(f));
|
|
||||||
++fn;
|
|
||||||
} catch (std::invalid_argument &exc) {
|
|
||||||
char tmp[256];
|
|
||||||
Utils::snprintf(tmp,sizeof(tmp),"invalid rule at index %u: %s",fn,exc.what());
|
|
||||||
throw std::invalid_argument(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::sort(_rules.begin(),_rules.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Filter::toString() const
|
|
||||||
{
|
|
||||||
std::string s;
|
|
||||||
|
|
||||||
for(std::vector<Rule>::const_iterator r(_rules.begin());r!=_rules.end();++r) {
|
|
||||||
if (s.length() > 0)
|
|
||||||
s.push_back(',');
|
|
||||||
s.append(r->toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Filter::add(const Rule &r)
|
|
||||||
{
|
|
||||||
for(std::vector<Rule>::iterator rr(_rules.begin());rr!=_rules.end();++rr) {
|
|
||||||
if (r == *rr)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_rules.push_back(r);
|
|
||||||
std::sort(_rules.begin(),_rules.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *Filter::etherTypeName(const unsigned int etherType)
|
|
||||||
throw()
|
|
||||||
{
|
|
||||||
switch(etherType) {
|
|
||||||
case ZT_ETHERTYPE_IPV4: return "ETHERTYPE_IPV4";
|
|
||||||
case ZT_ETHERTYPE_ARP: return "ETHERTYPE_ARP";
|
|
||||||
case ZT_ETHERTYPE_RARP: return "ETHERTYPE_RARP";
|
|
||||||
case ZT_ETHERTYPE_ATALK: return "ETHERTYPE_ATALK";
|
|
||||||
case ZT_ETHERTYPE_AARP: return "ETHERTYPE_AARP";
|
|
||||||
case ZT_ETHERTYPE_IPX_A: return "ETHERTYPE_IPX_A";
|
|
||||||
case ZT_ETHERTYPE_IPX_B: return "ETHERTYPE_IPX_B";
|
|
||||||
case ZT_ETHERTYPE_IPV6: return "ETHERTYPE_IPV6";
|
|
||||||
}
|
|
||||||
return UNKNOWN_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *Filter::ipProtocolName(const unsigned int ipp)
|
|
||||||
throw()
|
|
||||||
{
|
|
||||||
switch(ipp) {
|
|
||||||
case ZT_IPPROTO_ICMP: return "IPPROTO_ICMP";
|
|
||||||
case ZT_IPPROTO_IGMP: return "IPPROTO_IGMP";
|
|
||||||
case ZT_IPPROTO_TCP: return "IPPROTO_TCP";
|
|
||||||
case ZT_IPPROTO_UDP: return "IPPROTO_UDP";
|
|
||||||
case ZT_IPPROTO_GRE: return "IPPROTO_GRE";
|
|
||||||
case ZT_IPPROTO_ESP: return "IPPROTO_ESP";
|
|
||||||
case ZT_IPPROTO_AH: return "IPPROTO_AH";
|
|
||||||
case ZT_IPPROTO_ICMPV6: return "IPPROTO_ICMPV6";
|
|
||||||
case ZT_IPPROTO_OSPF: return "IPPROTO_OSPF";
|
|
||||||
case ZT_IPPROTO_IPIP: return "IPPROTO_IPIP";
|
|
||||||
case ZT_IPPROTO_IPCOMP: return "IPPROTO_IPCOMP";
|
|
||||||
case ZT_IPPROTO_L2TP: return "IPPROTO_L2TP";
|
|
||||||
case ZT_IPPROTO_SCTP: return "IPPROTO_SCTP";
|
|
||||||
case ZT_IPPROTO_FC: return "IPPROTO_FC";
|
|
||||||
case ZT_IPPROTO_UDPLITE: return "IPPROTO_UDPLITE";
|
|
||||||
case ZT_IPPROTO_HIP: return "IPPROTO_HIP";
|
|
||||||
}
|
|
||||||
return UNKNOWN_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *Filter::icmpTypeName(const unsigned int icmpType)
|
|
||||||
throw()
|
|
||||||
{
|
|
||||||
switch(icmpType) {
|
|
||||||
case ZT_ICMP_ECHO_REPLY: return "ICMP_ECHO_REPLY";
|
|
||||||
case ZT_ICMP_DESTINATION_UNREACHABLE: return "ICMP_DESTINATION_UNREACHABLE";
|
|
||||||
case ZT_ICMP_SOURCE_QUENCH: return "ICMP_SOURCE_QUENCH";
|
|
||||||
case ZT_ICMP_REDIRECT: return "ICMP_REDIRECT";
|
|
||||||
case ZT_ICMP_ALTERNATE_HOST_ADDRESS: return "ICMP_ALTERNATE_HOST_ADDRESS";
|
|
||||||
case ZT_ICMP_ECHO_REQUEST: return "ICMP_ECHO_REQUEST";
|
|
||||||
case ZT_ICMP_ROUTER_ADVERTISEMENT: return "ICMP_ROUTER_ADVERTISEMENT";
|
|
||||||
case ZT_ICMP_ROUTER_SOLICITATION: return "ICMP_ROUTER_SOLICITATION";
|
|
||||||
case ZT_ICMP_TIME_EXCEEDED: return "ICMP_TIME_EXCEEDED";
|
|
||||||
case ZT_ICMP_BAD_IP_HEADER: return "ICMP_BAD_IP_HEADER";
|
|
||||||
case ZT_ICMP_TIMESTAMP: return "ICMP_TIMESTAMP";
|
|
||||||
case ZT_ICMP_TIMESTAMP_REPLY: return "ICMP_TIMESTAMP_REPLY";
|
|
||||||
case ZT_ICMP_INFORMATION_REQUEST: return "ICMP_INFORMATION_REQUEST";
|
|
||||||
case ZT_ICMP_INFORMATION_REPLY: return "ICMP_INFORMATION_REPLY";
|
|
||||||
case ZT_ICMP_ADDRESS_MASK_REQUEST: return "ICMP_ADDRESS_MASK_REQUEST";
|
|
||||||
case ZT_ICMP_ADDRESS_MASK_REPLY: return "ICMP_ADDRESS_MASK_REPLY";
|
|
||||||
case ZT_ICMP_TRACEROUTE: return "ICMP_TRACEROUTE";
|
|
||||||
case ZT_ICMP_MOBILE_HOST_REDIRECT: return "ICMP_MOBILE_HOST_REDIRECT";
|
|
||||||
case ZT_ICMP_MOBILE_REGISTRATION_REQUEST: return "ICMP_MOBILE_REGISTRATION_REQUEST";
|
|
||||||
case ZT_ICMP_MOBILE_REGISTRATION_REPLY: return "ICMP_MOBILE_REGISTRATION_REPLY";
|
|
||||||
}
|
|
||||||
return UNKNOWN_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *Filter::icmp6TypeName(const unsigned int icmp6Type)
|
|
||||||
throw()
|
|
||||||
{
|
|
||||||
switch(icmp6Type) {
|
|
||||||
case ZT_ICMP6_DESTINATION_UNREACHABLE: return "ICMP6_DESTINATION_UNREACHABLE";
|
|
||||||
case ZT_ICMP6_PACKET_TOO_BIG: return "ICMP6_PACKET_TOO_BIG";
|
|
||||||
case ZT_ICMP6_TIME_EXCEEDED: return "ICMP6_TIME_EXCEEDED";
|
|
||||||
case ZT_ICMP6_PARAMETER_PROBLEM: return "ICMP6_PARAMETER_PROBLEM";
|
|
||||||
case ZT_ICMP6_ECHO_REQUEST: return "ICMP6_ECHO_REQUEST";
|
|
||||||
case ZT_ICMP6_ECHO_REPLY: return "ICMP6_ECHO_REPLY";
|
|
||||||
case ZT_ICMP6_MULTICAST_LISTENER_QUERY: return "ICMP6_MULTICAST_LISTENER_QUERY";
|
|
||||||
case ZT_ICMP6_MULTICAST_LISTENER_REPORT: return "ICMP6_MULTICAST_LISTENER_REPORT";
|
|
||||||
case ZT_ICMP6_MULTICAST_LISTENER_DONE: return "ICMP6_MULTICAST_LISTENER_DONE";
|
|
||||||
case ZT_ICMP6_ROUTER_SOLICITATION: return "ICMP6_ROUTER_SOLICITATION";
|
|
||||||
case ZT_ICMP6_ROUTER_ADVERTISEMENT: return "ICMP6_ROUTER_ADVERTISEMENT";
|
|
||||||
case ZT_ICMP6_NEIGHBOR_SOLICITATION: return "ICMP6_NEIGHBOR_SOLICITATION";
|
|
||||||
case ZT_ICMP6_NEIGHBOR_ADVERTISEMENT: return "ICMP6_NEIGHBOR_ADVERTISEMENT";
|
|
||||||
case ZT_ICMP6_REDIRECT_MESSAGE: return "ICMP6_REDIRECT_MESSAGE";
|
|
||||||
case ZT_ICMP6_ROUTER_RENUMBERING: return "ICMP6_ROUTER_RENUMBERING";
|
|
||||||
case ZT_ICMP6_NODE_INFORMATION_QUERY: return "ICMP6_NODE_INFORMATION_QUERY";
|
|
||||||
case ZT_ICMP6_NODE_INFORMATION_RESPONSE: return "ICMP6_NODE_INFORMATION_RESPONSE";
|
|
||||||
case ZT_ICMP6_INV_NEIGHBOR_SOLICITATION: return "ICMP6_INV_NEIGHBOR_SOLICITATION";
|
|
||||||
case ZT_ICMP6_INV_NEIGHBOR_ADVERTISEMENT: return "ICMP6_INV_NEIGHBOR_ADVERTISEMENT";
|
|
||||||
case ZT_ICMP6_MLDV2: return "ICMP6_MLDV2";
|
|
||||||
case ZT_ICMP6_HOME_AGENT_ADDRESS_DISCOVERY_REQUEST: return "ICMP6_HOME_AGENT_ADDRESS_DISCOVERY_REQUEST";
|
|
||||||
case ZT_ICMP6_HOME_AGENT_ADDRESS_DISCOVERY_REPLY: return "ICMP6_HOME_AGENT_ADDRESS_DISCOVERY_REPLY";
|
|
||||||
case ZT_ICMP6_MOBILE_PREFIX_SOLICITATION: return "ICMP6_MOBILE_PREFIX_SOLICITATION";
|
|
||||||
case ZT_ICMP6_MOBILE_PREFIX_ADVERTISEMENT: return "ICMP6_MOBILE_PREFIX_ADVERTISEMENT";
|
|
||||||
case ZT_ICMP6_CERTIFICATION_PATH_SOLICITATION: return "ICMP6_CERTIFICATION_PATH_SOLICITATION";
|
|
||||||
case ZT_ICMP6_CERTIFICATION_PATH_ADVERTISEMENT: return "ICMP6_CERTIFICATION_PATH_ADVERTISEMENT";
|
|
||||||
case ZT_ICMP6_MULTICAST_ROUTER_ADVERTISEMENT: return "ICMP6_MULTICAST_ROUTER_ADVERTISEMENT";
|
|
||||||
case ZT_ICMP6_MULTICAST_ROUTER_SOLICITATION: return "ICMP6_MULTICAST_ROUTER_SOLICITATION";
|
|
||||||
case ZT_ICMP6_MULTICAST_ROUTER_TERMINATION: return "ICMP6_MULTICAST_ROUTER_TERMINATION";
|
|
||||||
case ZT_ICMP6_RPL_CONTROL_MESSAGE: return "ICMP6_RPL_CONTROL_MESSAGE";
|
|
||||||
}
|
|
||||||
return UNKNOWN_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace ZeroTier
|
|
||||||
@@ -1,284 +0,0 @@
|
|||||||
/*
|
|
||||||
* ZeroTier One - Network Virtualization Everywhere
|
|
||||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* --
|
|
||||||
*
|
|
||||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
|
||||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
|
||||||
*
|
|
||||||
* If you would like to embed ZeroTier into a commercial application or
|
|
||||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
|
||||||
* LLC. Start here: http://www.zerotier.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _ZT_FILTER_HPP
|
|
||||||
#define _ZT_FILTER_HPP
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <utility>
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
#include "Range.hpp"
|
|
||||||
|
|
||||||
/* Ethernet frame types that might be relevant to us */
|
|
||||||
#define ZT_ETHERTYPE_IPV4 0x0800
|
|
||||||
#define ZT_ETHERTYPE_ARP 0x0806
|
|
||||||
#define ZT_ETHERTYPE_RARP 0x8035
|
|
||||||
#define ZT_ETHERTYPE_ATALK 0x809b
|
|
||||||
#define ZT_ETHERTYPE_AARP 0x80f3
|
|
||||||
#define ZT_ETHERTYPE_IPX_A 0x8137
|
|
||||||
#define ZT_ETHERTYPE_IPX_B 0x8138
|
|
||||||
#define ZT_ETHERTYPE_IPV6 0x86dd
|
|
||||||
|
|
||||||
/* IP protocols we might care about */
|
|
||||||
#define ZT_IPPROTO_ICMP 0x01
|
|
||||||
#define ZT_IPPROTO_IGMP 0x02
|
|
||||||
#define ZT_IPPROTO_TCP 0x06
|
|
||||||
#define ZT_IPPROTO_UDP 0x11
|
|
||||||
#define ZT_IPPROTO_GRE 0x2f
|
|
||||||
#define ZT_IPPROTO_ESP 0x32
|
|
||||||
#define ZT_IPPROTO_AH 0x33
|
|
||||||
#define ZT_IPPROTO_ICMPV6 0x3a
|
|
||||||
#define ZT_IPPROTO_OSPF 0x59
|
|
||||||
#define ZT_IPPROTO_IPIP 0x5e
|
|
||||||
#define ZT_IPPROTO_IPCOMP 0x6c
|
|
||||||
#define ZT_IPPROTO_L2TP 0x73
|
|
||||||
#define ZT_IPPROTO_SCTP 0x84
|
|
||||||
#define ZT_IPPROTO_FC 0x85
|
|
||||||
#define ZT_IPPROTO_UDPLITE 0x88
|
|
||||||
#define ZT_IPPROTO_HIP 0x8b
|
|
||||||
|
|
||||||
/* IPv4 ICMP types */
|
|
||||||
#define ZT_ICMP_ECHO_REPLY 0
|
|
||||||
#define ZT_ICMP_DESTINATION_UNREACHABLE 3
|
|
||||||
#define ZT_ICMP_SOURCE_QUENCH 4
|
|
||||||
#define ZT_ICMP_REDIRECT 5
|
|
||||||
#define ZT_ICMP_ALTERNATE_HOST_ADDRESS 6
|
|
||||||
#define ZT_ICMP_ECHO_REQUEST 8
|
|
||||||
#define ZT_ICMP_ROUTER_ADVERTISEMENT 9
|
|
||||||
#define ZT_ICMP_ROUTER_SOLICITATION 10
|
|
||||||
#define ZT_ICMP_TIME_EXCEEDED 11
|
|
||||||
#define ZT_ICMP_BAD_IP_HEADER 12
|
|
||||||
#define ZT_ICMP_TIMESTAMP 13
|
|
||||||
#define ZT_ICMP_TIMESTAMP_REPLY 14
|
|
||||||
#define ZT_ICMP_INFORMATION_REQUEST 15
|
|
||||||
#define ZT_ICMP_INFORMATION_REPLY 16
|
|
||||||
#define ZT_ICMP_ADDRESS_MASK_REQUEST 17
|
|
||||||
#define ZT_ICMP_ADDRESS_MASK_REPLY 18
|
|
||||||
#define ZT_ICMP_TRACEROUTE 30
|
|
||||||
#define ZT_ICMP_MOBILE_HOST_REDIRECT 32
|
|
||||||
#define ZT_ICMP_MOBILE_REGISTRATION_REQUEST 35
|
|
||||||
#define ZT_ICMP_MOBILE_REGISTRATION_REPLY 36
|
|
||||||
|
|
||||||
/* IPv6 ICMP types */
|
|
||||||
#define ZT_ICMP6_DESTINATION_UNREACHABLE 1
|
|
||||||
#define ZT_ICMP6_PACKET_TOO_BIG 2
|
|
||||||
#define ZT_ICMP6_TIME_EXCEEDED 3
|
|
||||||
#define ZT_ICMP6_PARAMETER_PROBLEM 4
|
|
||||||
#define ZT_ICMP6_ECHO_REQUEST 128
|
|
||||||
#define ZT_ICMP6_ECHO_REPLY 129
|
|
||||||
#define ZT_ICMP6_MULTICAST_LISTENER_QUERY 130
|
|
||||||
#define ZT_ICMP6_MULTICAST_LISTENER_REPORT 131
|
|
||||||
#define ZT_ICMP6_MULTICAST_LISTENER_DONE 132
|
|
||||||
#define ZT_ICMP6_ROUTER_SOLICITATION 133
|
|
||||||
#define ZT_ICMP6_ROUTER_ADVERTISEMENT 134
|
|
||||||
#define ZT_ICMP6_NEIGHBOR_SOLICITATION 135
|
|
||||||
#define ZT_ICMP6_NEIGHBOR_ADVERTISEMENT 136
|
|
||||||
#define ZT_ICMP6_REDIRECT_MESSAGE 137
|
|
||||||
#define ZT_ICMP6_ROUTER_RENUMBERING 138
|
|
||||||
#define ZT_ICMP6_NODE_INFORMATION_QUERY 139
|
|
||||||
#define ZT_ICMP6_NODE_INFORMATION_RESPONSE 140
|
|
||||||
#define ZT_ICMP6_INV_NEIGHBOR_SOLICITATION 141
|
|
||||||
#define ZT_ICMP6_INV_NEIGHBOR_ADVERTISEMENT 142
|
|
||||||
#define ZT_ICMP6_MLDV2 143
|
|
||||||
#define ZT_ICMP6_HOME_AGENT_ADDRESS_DISCOVERY_REQUEST 144
|
|
||||||
#define ZT_ICMP6_HOME_AGENT_ADDRESS_DISCOVERY_REPLY 145
|
|
||||||
#define ZT_ICMP6_MOBILE_PREFIX_SOLICITATION 146
|
|
||||||
#define ZT_ICMP6_MOBILE_PREFIX_ADVERTISEMENT 147
|
|
||||||
#define ZT_ICMP6_CERTIFICATION_PATH_SOLICITATION 148
|
|
||||||
#define ZT_ICMP6_CERTIFICATION_PATH_ADVERTISEMENT 149
|
|
||||||
#define ZT_ICMP6_MULTICAST_ROUTER_ADVERTISEMENT 151
|
|
||||||
#define ZT_ICMP6_MULTICAST_ROUTER_SOLICITATION 152
|
|
||||||
#define ZT_ICMP6_MULTICAST_ROUTER_TERMINATION 153
|
|
||||||
#define ZT_ICMP6_RPL_CONTROL_MESSAGE 155
|
|
||||||
|
|
||||||
namespace ZeroTier {
|
|
||||||
|
|
||||||
class RuntimeEnvironment;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simple Ethernet frame level filter
|
|
||||||
*
|
|
||||||
* This doesn't specify actions, since it's used as a deny filter. The rule
|
|
||||||
* in ZT1 is "that which is not explicitly prohibited is allowed." (Except for
|
|
||||||
* ethertypes, which are handled by a whitelist.)
|
|
||||||
*/
|
|
||||||
class Filter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Value returned by etherTypeName, etc. on unknown
|
|
||||||
*
|
|
||||||
* These static methods return precisely this, so a pointer equality
|
|
||||||
* check will work.
|
|
||||||
*/
|
|
||||||
static const char *const UNKNOWN_NAME;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An empty range as a more idiomatic way of specifying a wildcard match
|
|
||||||
*/
|
|
||||||
static const Range<unsigned int> ANY;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A filter rule
|
|
||||||
*/
|
|
||||||
class Rule
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Rule()
|
|
||||||
throw() :
|
|
||||||
_etherType(),
|
|
||||||
_protocol(),
|
|
||||||
_port()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct a rule from a string-serialized value
|
|
||||||
*
|
|
||||||
* @param s String formatted rule, such as returned by toString()
|
|
||||||
* @throws std::invalid_argument String formatted rule is not valid
|
|
||||||
*/
|
|
||||||
Rule(const char *s)
|
|
||||||
throw(std::invalid_argument);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct a new rule
|
|
||||||
*
|
|
||||||
* @param etype Ethernet type or empty range for ANY
|
|
||||||
* @param prot Protocol or empty range for ANY (meaning depends on ethertype, e.g. IP protocol numbers)
|
|
||||||
* @param prt Port or empty range for ANY (only applies to some protocols)
|
|
||||||
*/
|
|
||||||
Rule(const Range<unsigned int> &etype,const Range<unsigned int> &prot,const Range<unsigned int> &prt)
|
|
||||||
throw() :
|
|
||||||
_etherType(etype),
|
|
||||||
_protocol(prot),
|
|
||||||
_port(prt)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const Range<unsigned int> ðerType() const throw() { return _etherType; }
|
|
||||||
inline const Range<unsigned int> &protocol() const throw() { return _protocol; }
|
|
||||||
inline const Range<unsigned int> &port() const throw() { return _port; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test this rule against a frame
|
|
||||||
*
|
|
||||||
* @param etype Type of ethernet frame
|
|
||||||
* @param data Ethernet frame data
|
|
||||||
* @param len Length of ethernet frame
|
|
||||||
* @return True if rule matches
|
|
||||||
* @throws std::invalid_argument Frame invalid or not parseable
|
|
||||||
*/
|
|
||||||
bool operator()(unsigned int etype,const void *data,unsigned int len) const
|
|
||||||
throw(std::invalid_argument);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serialize rule as string
|
|
||||||
*
|
|
||||||
* @return Human readable representation of rule
|
|
||||||
*/
|
|
||||||
std::string toString() const;
|
|
||||||
|
|
||||||
inline bool operator==(const Rule &r) const throw() { return ((_etherType == r._etherType)&&(_protocol == r._protocol)&&(_port == r._port)); }
|
|
||||||
inline bool operator!=(const Rule &r) const throw() { return !(*this == r); }
|
|
||||||
inline bool operator<(const Rule &r) const
|
|
||||||
throw()
|
|
||||||
{
|
|
||||||
if (_etherType < r._etherType)
|
|
||||||
return true;
|
|
||||||
else if (_etherType == r._etherType) {
|
|
||||||
if (_protocol < r._protocol)
|
|
||||||
return true;
|
|
||||||
else if (_protocol == r._protocol) {
|
|
||||||
if (_port < r._port)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
inline bool operator>(const Rule &r) const throw() { return (r < *this); }
|
|
||||||
inline bool operator<=(const Rule &r) const throw() { return !(r < *this); }
|
|
||||||
inline bool operator>=(const Rule &r) const throw() { return !(*this < r); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
Range<unsigned int> _etherType;
|
|
||||||
Range<unsigned int> _protocol;
|
|
||||||
Range<unsigned int> _port;
|
|
||||||
};
|
|
||||||
|
|
||||||
Filter() {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param s String-serialized filter representation
|
|
||||||
*/
|
|
||||||
Filter(const char *s)
|
|
||||||
throw(std::invalid_argument);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Comma-delimited list of string-format rules
|
|
||||||
*/
|
|
||||||
std::string toString() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a rule to this filter
|
|
||||||
*
|
|
||||||
* @param r Rule to add to filter
|
|
||||||
*/
|
|
||||||
void add(const Rule &r);
|
|
||||||
|
|
||||||
inline bool operator()(unsigned int etype,const void *data,unsigned int len) const
|
|
||||||
throw(std::invalid_argument)
|
|
||||||
{
|
|
||||||
for(std::vector<Rule>::const_iterator r(_rules.begin());r!=_rules.end();++r) {
|
|
||||||
if ((*r)(etype,data,len))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *etherTypeName(const unsigned int etherType)
|
|
||||||
throw();
|
|
||||||
static const char *ipProtocolName(const unsigned int ipp)
|
|
||||||
throw();
|
|
||||||
static const char *icmpTypeName(const unsigned int icmpType)
|
|
||||||
throw();
|
|
||||||
static const char *icmp6TypeName(const unsigned int icmp6Type)
|
|
||||||
throw();
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector<Rule> _rules;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace ZeroTier
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,651 +0,0 @@
|
|||||||
/*
|
|
||||||
* ZeroTier One - Network Virtualization Everywhere
|
|
||||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* --
|
|
||||||
*
|
|
||||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
|
||||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
|
||||||
*
|
|
||||||
* If you would like to embed ZeroTier into a commercial application or
|
|
||||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
|
||||||
* LLC. Start here: http://www.zerotier.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/select.h>
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
#include <sys/uio.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <net/route.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <net/if_arp.h>
|
|
||||||
#include <net/if_dl.h>
|
|
||||||
#include <net/if_media.h>
|
|
||||||
#include <netinet6/in6_var.h>
|
|
||||||
#include <netinet/in_var.h>
|
|
||||||
#include <netinet/icmp6.h>
|
|
||||||
|
|
||||||
#include <pcap/pcap.h>
|
|
||||||
|
|
||||||
// OSX compile fix... in6_var defines this in a struct which namespaces it for C++ ... why?!?
|
|
||||||
struct prf_ra {
|
|
||||||
u_char onlink : 1;
|
|
||||||
u_char autonomous : 1;
|
|
||||||
u_char reserved : 6;
|
|
||||||
} prf_ra;
|
|
||||||
|
|
||||||
#include <netinet6/nd6.h>
|
|
||||||
#include <ifaddrs.h>
|
|
||||||
|
|
||||||
// These are KERNEL_PRIVATE... why?
|
|
||||||
#ifndef SIOCAUTOCONF_START
|
|
||||||
#define SIOCAUTOCONF_START _IOWR('i', 132, struct in6_ifreq) /* accept rtadvd on this interface */
|
|
||||||
#endif
|
|
||||||
#ifndef SIOCAUTOCONF_STOP
|
|
||||||
#define SIOCAUTOCONF_STOP _IOWR('i', 133, struct in6_ifreq) /* stop accepting rtadv for this interface */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ETH_ALEN
|
|
||||||
#define ETH_ALEN 6
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
// This source is from:
|
|
||||||
// http://www.opensource.apple.com/source/Libinfo/Libinfo-406.17/gen.subproj/getifmaddrs.c?txt
|
|
||||||
// It's here because OSX 10.6 does not have this convenience function.
|
|
||||||
|
|
||||||
#define SALIGN (sizeof(uint32_t) - 1)
|
|
||||||
#define SA_RLEN(sa) ((sa)->sa_len ? (((sa)->sa_len + SALIGN) & ~SALIGN) : \
|
|
||||||
(SALIGN + 1))
|
|
||||||
#define MAX_SYSCTL_TRY 5
|
|
||||||
#define RTA_MASKS (RTA_GATEWAY | RTA_IFP | RTA_IFA)
|
|
||||||
|
|
||||||
/* FreeBSD uses NET_RT_IFMALIST and RTM_NEWMADDR from <sys/socket.h> */
|
|
||||||
/* We can use NET_RT_IFLIST2 and RTM_NEWMADDR2 on Darwin */
|
|
||||||
//#define DARWIN_COMPAT
|
|
||||||
|
|
||||||
//#ifdef DARWIN_COMPAT
|
|
||||||
#define GIM_SYSCTL_MIB NET_RT_IFLIST2
|
|
||||||
#define GIM_RTM_ADDR RTM_NEWMADDR2
|
|
||||||
//#else
|
|
||||||
//#define GIM_SYSCTL_MIB NET_RT_IFMALIST
|
|
||||||
//#define GIM_RTM_ADDR RTM_NEWMADDR
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
// Not in 10.6 includes so use our own
|
|
||||||
struct _intl_ifmaddrs {
|
|
||||||
struct _intl_ifmaddrs *ifma_next;
|
|
||||||
struct sockaddr *ifma_name;
|
|
||||||
struct sockaddr *ifma_addr;
|
|
||||||
struct sockaddr *ifma_lladdr;
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline int _intl_getifmaddrs(struct _intl_ifmaddrs **pif)
|
|
||||||
{
|
|
||||||
int icnt = 1;
|
|
||||||
int dcnt = 0;
|
|
||||||
int ntry = 0;
|
|
||||||
size_t len;
|
|
||||||
size_t needed;
|
|
||||||
int mib[6];
|
|
||||||
int i;
|
|
||||||
char *buf;
|
|
||||||
char *data;
|
|
||||||
char *next;
|
|
||||||
char *p;
|
|
||||||
struct ifma_msghdr2 *ifmam;
|
|
||||||
struct _intl_ifmaddrs *ifa, *ift;
|
|
||||||
struct rt_msghdr *rtm;
|
|
||||||
struct sockaddr *sa;
|
|
||||||
|
|
||||||
mib[0] = CTL_NET;
|
|
||||||
mib[1] = PF_ROUTE;
|
|
||||||
mib[2] = 0; /* protocol */
|
|
||||||
mib[3] = 0; /* wildcard address family */
|
|
||||||
mib[4] = GIM_SYSCTL_MIB;
|
|
||||||
mib[5] = 0; /* no flags */
|
|
||||||
do {
|
|
||||||
if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
|
|
||||||
return (-1);
|
|
||||||
if ((buf = (char *)malloc(needed)) == NULL)
|
|
||||||
return (-1);
|
|
||||||
if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
|
|
||||||
if (errno != ENOMEM || ++ntry >= MAX_SYSCTL_TRY) {
|
|
||||||
free(buf);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
free(buf);
|
|
||||||
buf = NULL;
|
|
||||||
}
|
|
||||||
} while (buf == NULL);
|
|
||||||
|
|
||||||
for (next = buf; next < buf + needed; next += rtm->rtm_msglen) {
|
|
||||||
rtm = (struct rt_msghdr *)(void *)next;
|
|
||||||
if (rtm->rtm_version != RTM_VERSION)
|
|
||||||
continue;
|
|
||||||
switch (rtm->rtm_type) {
|
|
||||||
case GIM_RTM_ADDR:
|
|
||||||
ifmam = (struct ifma_msghdr2 *)(void *)rtm;
|
|
||||||
if ((ifmam->ifmam_addrs & RTA_IFA) == 0)
|
|
||||||
break;
|
|
||||||
icnt++;
|
|
||||||
p = (char *)(ifmam + 1);
|
|
||||||
for (i = 0; i < RTAX_MAX; i++) {
|
|
||||||
if ((RTA_MASKS & ifmam->ifmam_addrs &
|
|
||||||
(1 << i)) == 0)
|
|
||||||
continue;
|
|
||||||
sa = (struct sockaddr *)(void *)p;
|
|
||||||
len = SA_RLEN(sa);
|
|
||||||
dcnt += len;
|
|
||||||
p += len;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data = (char *)malloc(sizeof(struct _intl_ifmaddrs) * icnt + dcnt);
|
|
||||||
if (data == NULL) {
|
|
||||||
free(buf);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
ifa = (struct _intl_ifmaddrs *)(void *)data;
|
|
||||||
data += sizeof(struct _intl_ifmaddrs) * icnt;
|
|
||||||
|
|
||||||
memset(ifa, 0, sizeof(struct _intl_ifmaddrs) * icnt);
|
|
||||||
ift = ifa;
|
|
||||||
|
|
||||||
for (next = buf; next < buf + needed; next += rtm->rtm_msglen) {
|
|
||||||
rtm = (struct rt_msghdr *)(void *)next;
|
|
||||||
if (rtm->rtm_version != RTM_VERSION)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
switch (rtm->rtm_type) {
|
|
||||||
case GIM_RTM_ADDR:
|
|
||||||
ifmam = (struct ifma_msghdr2 *)(void *)rtm;
|
|
||||||
if ((ifmam->ifmam_addrs & RTA_IFA) == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
p = (char *)(ifmam + 1);
|
|
||||||
for (i = 0; i < RTAX_MAX; i++) {
|
|
||||||
if ((RTA_MASKS & ifmam->ifmam_addrs &
|
|
||||||
(1 << i)) == 0)
|
|
||||||
continue;
|
|
||||||
sa = (struct sockaddr *)(void *)p;
|
|
||||||
len = SA_RLEN(sa);
|
|
||||||
switch (i) {
|
|
||||||
case RTAX_GATEWAY:
|
|
||||||
ift->ifma_lladdr =
|
|
||||||
(struct sockaddr *)(void *)data;
|
|
||||||
memcpy(data, p, len);
|
|
||||||
data += len;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RTAX_IFP:
|
|
||||||
ift->ifma_name =
|
|
||||||
(struct sockaddr *)(void *)data;
|
|
||||||
memcpy(data, p, len);
|
|
||||||
data += len;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RTAX_IFA:
|
|
||||||
ift->ifma_addr =
|
|
||||||
(struct sockaddr *)(void *)data;
|
|
||||||
memcpy(data, p, len);
|
|
||||||
data += len;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
data += len;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p += len;
|
|
||||||
}
|
|
||||||
ift->ifma_next = ift + 1;
|
|
||||||
ift = ift->ifma_next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(buf);
|
|
||||||
|
|
||||||
if (ift > ifa) {
|
|
||||||
ift--;
|
|
||||||
ift->ifma_next = NULL;
|
|
||||||
*pif = ifa;
|
|
||||||
} else {
|
|
||||||
*pif = NULL;
|
|
||||||
free(ifa);
|
|
||||||
}
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void _intl_freeifmaddrs(struct _intl_ifmaddrs *ifmp)
|
|
||||||
{
|
|
||||||
free(ifmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
#include <set>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
#include "../node/Constants.hpp"
|
|
||||||
#include "../node/Utils.hpp"
|
|
||||||
#include "../node/Mutex.hpp"
|
|
||||||
#include "../node/Dictionary.hpp"
|
|
||||||
#include "OSUtils.hpp"
|
|
||||||
#include "OSXEthernetTap.hpp"
|
|
||||||
|
|
||||||
// ff:ff:ff:ff:ff:ff with no ADI
|
|
||||||
static const ZeroTier::MulticastGroup _blindWildcardMulticastGroup(ZeroTier::MAC(0xff),0);
|
|
||||||
|
|
||||||
static inline bool _setIpv6Stuff(const char *ifname,bool performNUD,bool acceptRouterAdverts)
|
|
||||||
{
|
|
||||||
struct in6_ndireq nd;
|
|
||||||
struct in6_ifreq ifr;
|
|
||||||
|
|
||||||
int s = socket(AF_INET6,SOCK_DGRAM,0);
|
|
||||||
if (s <= 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
memset(&nd,0,sizeof(nd));
|
|
||||||
strncpy(nd.ifname,ifname,sizeof(nd.ifname));
|
|
||||||
|
|
||||||
if (ioctl(s,SIOCGIFINFO_IN6,&nd)) {
|
|
||||||
close(s);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long oldFlags = (unsigned long)nd.ndi.flags;
|
|
||||||
|
|
||||||
if (performNUD)
|
|
||||||
nd.ndi.flags |= ND6_IFF_PERFORMNUD;
|
|
||||||
else nd.ndi.flags &= ~ND6_IFF_PERFORMNUD;
|
|
||||||
|
|
||||||
if (oldFlags != (unsigned long)nd.ndi.flags) {
|
|
||||||
if (ioctl(s,SIOCSIFINFO_FLAGS,&nd)) {
|
|
||||||
close(s);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&ifr,0,sizeof(ifr));
|
|
||||||
strncpy(ifr.ifr_name,ifname,sizeof(ifr.ifr_name));
|
|
||||||
if (ioctl(s,acceptRouterAdverts ? SIOCAUTOCONF_START : SIOCAUTOCONF_STOP,&ifr)) {
|
|
||||||
close(s);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
close(s);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace ZeroTier {
|
|
||||||
|
|
||||||
static std::set<std::string> globalDeviceNames;
|
|
||||||
static Mutex globalTapCreateLock;
|
|
||||||
|
|
||||||
OSXEthernetTap::OSXEthernetTap(
|
|
||||||
const char *homePath,
|
|
||||||
const MAC &mac,
|
|
||||||
unsigned int mtu,
|
|
||||||
unsigned int metric,
|
|
||||||
uint64_t nwid,
|
|
||||||
const char *friendlyName,
|
|
||||||
void (*handler)(void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *data,unsigned int len),
|
|
||||||
void *arg) :
|
|
||||||
_handler(handler),
|
|
||||||
_arg(arg),
|
|
||||||
_pcap((void *)0),
|
|
||||||
_nwid(nwid),
|
|
||||||
_mac(mac),
|
|
||||||
_homePath(homePath),
|
|
||||||
_mtu(mtu),
|
|
||||||
_metric(metric),
|
|
||||||
_enabled(true)
|
|
||||||
{
|
|
||||||
char errbuf[PCAP_ERRBUF_SIZE];
|
|
||||||
char devname[64],ethaddr[64],mtustr[32],metstr[32],nwids[32];
|
|
||||||
|
|
||||||
Utils::snprintf(nwids,sizeof(nwids),"%.16llx",nwid);
|
|
||||||
|
|
||||||
if (mtu > 2800)
|
|
||||||
throw std::runtime_error("max tap MTU is 2800");
|
|
||||||
|
|
||||||
Mutex::Lock _gl(globalTapCreateLock);
|
|
||||||
|
|
||||||
std::string desiredDevice;
|
|
||||||
Dictionary devmap;
|
|
||||||
{
|
|
||||||
std::string devmapbuf;
|
|
||||||
if (OSUtils::readFile((_homePath + ZT_PATH_SEPARATOR_S + "devicemap").c_str(),devmapbuf)) {
|
|
||||||
devmap.fromString(devmapbuf);
|
|
||||||
desiredDevice = devmap.get(nwids,"");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((desiredDevice.length() >= 9)&&(desiredDevice.substr(0,6) == "bridge")) {
|
|
||||||
// length() >= 9 matches bridge### or bridge####
|
|
||||||
_dev = desiredDevice;
|
|
||||||
} else {
|
|
||||||
if (globalDeviceNames.size() >= (10000 - 128)) // sanity check... this would be nuts
|
|
||||||
throw std::runtime_error("too many devices!");
|
|
||||||
unsigned int pseudoBridgeNo = (unsigned int)((nwid ^ (nwid >> 32)) % (10000 - 128)) + 128; // range: bridge128 to bridge9999
|
|
||||||
sprintf(devname,"bridge%u",pseudoBridgeNo);
|
|
||||||
while (globalDeviceNames.count(std::string(devname)) > 0) {
|
|
||||||
++pseudoBridgeNo;
|
|
||||||
if (pseudoBridgeNo > 9999)
|
|
||||||
pseudoBridgeNo = 64;
|
|
||||||
sprintf(devname,"bridge%u",pseudoBridgeNo);
|
|
||||||
}
|
|
||||||
_dev = devname;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure MAC address and MTU, bring interface up
|
|
||||||
long cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"create",(const char *)0);
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(cpid,&exitcode,0);
|
|
||||||
if (exitcode != 0)
|
|
||||||
throw std::runtime_error("ifconfig failure setting link-layer address and activating tap interface");
|
|
||||||
} else throw std::runtime_error("unable to fork()");
|
|
||||||
Utils::snprintf(ethaddr,sizeof(ethaddr),"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",(int)mac[0],(int)mac[1],(int)mac[2],(int)mac[3],(int)mac[4],(int)mac[5]);
|
|
||||||
Utils::snprintf(mtustr,sizeof(mtustr),"%u",_mtu);
|
|
||||||
Utils::snprintf(metstr,sizeof(metstr),"%u",_metric);
|
|
||||||
cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"lladdr",ethaddr,"mtu",mtustr,"metric",metstr,"up",(const char *)0);
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(cpid,&exitcode,0);
|
|
||||||
if (exitcode != 0)
|
|
||||||
throw std::runtime_error("ifconfig failure setting link-layer address and activating tap interface");
|
|
||||||
} else throw std::runtime_error("unable to fork()");
|
|
||||||
|
|
||||||
_setIpv6Stuff(_dev.c_str(),true,false);
|
|
||||||
|
|
||||||
_pcap = (void *)pcap_create(_dev.c_str(),errbuf);
|
|
||||||
if (!_pcap) {
|
|
||||||
cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"destroy",(const char *)0);
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(cpid,&exitcode,0);
|
|
||||||
}
|
|
||||||
throw std::runtime_error((std::string("pcap_create() on new bridge device failed: ") + errbuf).c_str());
|
|
||||||
}
|
|
||||||
pcap_set_promisc(reinterpret_cast<pcap_t *>(_pcap),1);
|
|
||||||
pcap_set_timeout(reinterpret_cast<pcap_t *>(_pcap),120000);
|
|
||||||
pcap_set_immediate_mode(reinterpret_cast<pcap_t *>(_pcap),1);
|
|
||||||
if (pcap_set_buffer_size(reinterpret_cast<pcap_t *>(_pcap),1024 * 1024 * 16) != 0) // 16MB
|
|
||||||
fprintf(stderr,"WARNING: pcap_set_buffer_size() failed!\n");
|
|
||||||
if (pcap_set_snaplen(reinterpret_cast<pcap_t *>(_pcap),4096) != 0)
|
|
||||||
fprintf(stderr,"WARNING: pcap_set_snaplen() failed!\n");
|
|
||||||
if (pcap_activate(reinterpret_cast<pcap_t *>(_pcap)) != 0) {
|
|
||||||
pcap_close(reinterpret_cast<pcap_t *>(_pcap));
|
|
||||||
cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"destroy",(const char *)0);
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(cpid,&exitcode,0);
|
|
||||||
}
|
|
||||||
throw std::runtime_error("pcap_activate() on new bridge device failed.");
|
|
||||||
}
|
|
||||||
|
|
||||||
globalDeviceNames.insert(_dev);
|
|
||||||
|
|
||||||
devmap[nwids] = _dev;
|
|
||||||
OSUtils::writeFile((_homePath + ZT_PATH_SEPARATOR_S + "devicemap").c_str(),devmap.toString());
|
|
||||||
|
|
||||||
_thread = Thread::start(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
OSXEthernetTap::~OSXEthernetTap()
|
|
||||||
{
|
|
||||||
_enabled = false;
|
|
||||||
|
|
||||||
Mutex::Lock _gl(globalTapCreateLock);
|
|
||||||
globalDeviceNames.erase(_dev);
|
|
||||||
|
|
||||||
long cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"destroy",(const char *)0);
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(cpid,&exitcode,0);
|
|
||||||
if (exitcode == 0) {
|
|
||||||
// Destroying the interface nukes pcap and terminates the thread.
|
|
||||||
Thread::join(_thread);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pcap_close(reinterpret_cast<pcap_t *>(_pcap));
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool ___removeIp(const std::string &_dev,const InetAddress &ip)
|
|
||||||
{
|
|
||||||
long cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"inet",ip.toIpString().c_str(),"-alias",(const char *)0);
|
|
||||||
_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
waitpid(cpid,&exitcode,0);
|
|
||||||
return (exitcode == 0);
|
|
||||||
}
|
|
||||||
return false; // never reached, make compiler shut up about return value
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OSXEthernetTap::addIp(const InetAddress &ip)
|
|
||||||
{
|
|
||||||
if (!ip)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
std::vector<InetAddress> allIps(ips());
|
|
||||||
if (std::binary_search(allIps.begin(),allIps.end(),ip))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Remove and reconfigure if address is the same but netmask is different
|
|
||||||
for(std::vector<InetAddress>::iterator i(allIps.begin());i!=allIps.end();++i) {
|
|
||||||
if ((i->ipsEqual(ip))&&(i->netmaskBits() != ip.netmaskBits())) {
|
|
||||||
if (___removeIp(_dev,*i))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
long cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),ip.isV4() ? "inet" : "inet6",ip.toString().c_str(),"alias",(const char *)0);
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(cpid,&exitcode,0);
|
|
||||||
return (exitcode == 0);
|
|
||||||
} // else return false...
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OSXEthernetTap::removeIp(const InetAddress &ip)
|
|
||||||
{
|
|
||||||
if (!ip)
|
|
||||||
return true;
|
|
||||||
std::vector<InetAddress> allIps(ips());
|
|
||||||
if (!std::binary_search(allIps.begin(),allIps.end(),ip)) {
|
|
||||||
if (___removeIp(_dev,ip))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<InetAddress> OSXEthernetTap::ips() const
|
|
||||||
{
|
|
||||||
struct ifaddrs *ifa = (struct ifaddrs *)0;
|
|
||||||
if (getifaddrs(&ifa))
|
|
||||||
return std::vector<InetAddress>();
|
|
||||||
|
|
||||||
std::vector<InetAddress> r;
|
|
||||||
|
|
||||||
struct ifaddrs *p = ifa;
|
|
||||||
while (p) {
|
|
||||||
if ((!strcmp(p->ifa_name,_dev.c_str()))&&(p->ifa_addr)&&(p->ifa_netmask)&&(p->ifa_addr->sa_family == p->ifa_netmask->sa_family)) {
|
|
||||||
switch(p->ifa_addr->sa_family) {
|
|
||||||
case AF_INET: {
|
|
||||||
struct sockaddr_in *sin = (struct sockaddr_in *)p->ifa_addr;
|
|
||||||
struct sockaddr_in *nm = (struct sockaddr_in *)p->ifa_netmask;
|
|
||||||
r.push_back(InetAddress(&(sin->sin_addr.s_addr),4,Utils::countBits((uint32_t)nm->sin_addr.s_addr)));
|
|
||||||
} break;
|
|
||||||
case AF_INET6: {
|
|
||||||
struct sockaddr_in6 *sin = (struct sockaddr_in6 *)p->ifa_addr;
|
|
||||||
struct sockaddr_in6 *nm = (struct sockaddr_in6 *)p->ifa_netmask;
|
|
||||||
uint32_t b[4];
|
|
||||||
memcpy(b,nm->sin6_addr.s6_addr,sizeof(b));
|
|
||||||
r.push_back(InetAddress(sin->sin6_addr.s6_addr,16,Utils::countBits(b[0]) + Utils::countBits(b[1]) + Utils::countBits(b[2]) + Utils::countBits(b[3])));
|
|
||||||
} break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p = p->ifa_next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ifa)
|
|
||||||
freeifaddrs(ifa);
|
|
||||||
|
|
||||||
std::sort(r.begin(),r.end());
|
|
||||||
std::unique(r.begin(),r.end());
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXEthernetTap::put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len)
|
|
||||||
{
|
|
||||||
char putBuf[4096];
|
|
||||||
if ((len <= _mtu)&&(_enabled)) {
|
|
||||||
to.copyTo(putBuf,6);
|
|
||||||
from.copyTo(putBuf + 6,6);
|
|
||||||
*((uint16_t *)(putBuf + 12)) = htons((uint16_t)etherType);
|
|
||||||
memcpy(putBuf + 14,data,len);
|
|
||||||
len += 14;
|
|
||||||
int r = pcap_inject(reinterpret_cast<pcap_t *>(_pcap),putBuf,len);
|
|
||||||
if (r <= 0) {
|
|
||||||
printf("%s: pcap_inject() failed\n",_dev.c_str());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
printf("%s: inject %s -> %s etherType==%u len=%u r==%d\n",_dev.c_str(),from.toString().c_str(),to.toString().c_str(),etherType,len,r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string OSXEthernetTap::deviceName() const
|
|
||||||
{
|
|
||||||
return _dev;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXEthernetTap::setFriendlyName(const char *friendlyName)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXEthernetTap::scanMulticastGroups(std::vector<MulticastGroup> &added,std::vector<MulticastGroup> &removed)
|
|
||||||
{
|
|
||||||
std::vector<MulticastGroup> newGroups;
|
|
||||||
|
|
||||||
struct _intl_ifmaddrs *ifmap = (struct _intl_ifmaddrs *)0;
|
|
||||||
if (!_intl_getifmaddrs(&ifmap)) {
|
|
||||||
struct _intl_ifmaddrs *p = ifmap;
|
|
||||||
while (p) {
|
|
||||||
if (p->ifma_addr->sa_family == AF_LINK) {
|
|
||||||
struct sockaddr_dl *in = (struct sockaddr_dl *)p->ifma_name;
|
|
||||||
struct sockaddr_dl *la = (struct sockaddr_dl *)p->ifma_addr;
|
|
||||||
if ((la->sdl_alen == 6)&&(in->sdl_nlen <= _dev.length())&&(!memcmp(_dev.data(),in->sdl_data,in->sdl_nlen)))
|
|
||||||
newGroups.push_back(MulticastGroup(MAC(la->sdl_data + la->sdl_nlen,6),0));
|
|
||||||
}
|
|
||||||
p = p->ifma_next;
|
|
||||||
}
|
|
||||||
_intl_freeifmaddrs(ifmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<InetAddress> allIps(ips());
|
|
||||||
for(std::vector<InetAddress>::iterator ip(allIps.begin());ip!=allIps.end();++ip)
|
|
||||||
newGroups.push_back(MulticastGroup::deriveMulticastGroupForAddressResolution(*ip));
|
|
||||||
|
|
||||||
std::sort(newGroups.begin(),newGroups.end());
|
|
||||||
std::unique(newGroups.begin(),newGroups.end());
|
|
||||||
|
|
||||||
for(std::vector<MulticastGroup>::iterator m(newGroups.begin());m!=newGroups.end();++m) {
|
|
||||||
if (!std::binary_search(_multicastGroups.begin(),_multicastGroups.end(),*m))
|
|
||||||
added.push_back(*m);
|
|
||||||
}
|
|
||||||
for(std::vector<MulticastGroup>::iterator m(_multicastGroups.begin());m!=_multicastGroups.end();++m) {
|
|
||||||
if (!std::binary_search(newGroups.begin(),newGroups.end(),*m))
|
|
||||||
removed.push_back(*m);
|
|
||||||
}
|
|
||||||
|
|
||||||
_multicastGroups.swap(newGroups);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _pcapHandler(u_char *ptr,const struct pcap_pkthdr *hdr,const u_char *data)
|
|
||||||
{
|
|
||||||
OSXEthernetTap *tap = reinterpret_cast<OSXEthernetTap *>(ptr);
|
|
||||||
if (hdr->caplen > 14) {
|
|
||||||
MAC to(data,6);
|
|
||||||
MAC from(data + 6,6);
|
|
||||||
if (from == tap->_mac) {
|
|
||||||
unsigned int etherType = ntohs(((const uint16_t *)data)[6]);
|
|
||||||
printf("%s: %s -> %s etherType==%u len==%u\n",tap->_dev.c_str(),from.toString().c_str(),to.toString().c_str(),etherType,(unsigned int)hdr->caplen);
|
|
||||||
// TODO: VLAN support
|
|
||||||
tap->_handler(tap->_arg,tap->_nwid,from,to,etherType,0,(const void *)(data + 14),hdr->len - 14);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXEthernetTap::threadMain()
|
|
||||||
throw()
|
|
||||||
{
|
|
||||||
pcap_loop(reinterpret_cast<pcap_t *>(_pcap),-1,&_pcapHandler,reinterpret_cast<u_char *>(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace ZeroTier
|
|
||||||
@@ -1,832 +0,0 @@
|
|||||||
/*
|
|
||||||
* ZeroTier One - Network Virtualization Everywhere
|
|
||||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* --
|
|
||||||
*
|
|
||||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
|
||||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
|
||||||
*
|
|
||||||
* If you would like to embed ZeroTier into a commercial application or
|
|
||||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
|
||||||
* LLC. Start here: http://www.zerotier.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/select.h>
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
#include <sys/uio.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/sys_domain.h>
|
|
||||||
#include <sys/kern_control.h>
|
|
||||||
#include <net/if_utun.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <net/route.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <net/if_arp.h>
|
|
||||||
#include <net/if_dl.h>
|
|
||||||
#include <net/if_media.h>
|
|
||||||
#include <netinet6/in6_var.h>
|
|
||||||
#include <netinet/in_var.h>
|
|
||||||
#include <netinet/icmp6.h>
|
|
||||||
|
|
||||||
// OSX compile fix... in6_var defines this in a struct which namespaces it for C++ ... why?!?
|
|
||||||
struct prf_ra {
|
|
||||||
u_char onlink : 1;
|
|
||||||
u_char autonomous : 1;
|
|
||||||
u_char reserved : 6;
|
|
||||||
} prf_ra;
|
|
||||||
|
|
||||||
#include <netinet6/nd6.h>
|
|
||||||
#include <ifaddrs.h>
|
|
||||||
|
|
||||||
// These are KERNEL_PRIVATE... why?
|
|
||||||
#ifndef SIOCAUTOCONF_START
|
|
||||||
#define SIOCAUTOCONF_START _IOWR('i', 132, struct in6_ifreq) /* accept rtadvd on this interface */
|
|
||||||
#endif
|
|
||||||
#ifndef SIOCAUTOCONF_STOP
|
|
||||||
#define SIOCAUTOCONF_STOP _IOWR('i', 133, struct in6_ifreq) /* stop accepting rtadv for this interface */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
// This source is from:
|
|
||||||
// http://www.opensource.apple.com/source/Libinfo/Libinfo-406.17/gen.subproj/getifmaddrs.c?txt
|
|
||||||
// It's here because OSX 10.6 does not have this convenience function.
|
|
||||||
|
|
||||||
#define SALIGN (sizeof(uint32_t) - 1)
|
|
||||||
#define SA_RLEN(sa) ((sa)->sa_len ? (((sa)->sa_len + SALIGN) & ~SALIGN) : \
|
|
||||||
(SALIGN + 1))
|
|
||||||
#define MAX_SYSCTL_TRY 5
|
|
||||||
#define RTA_MASKS (RTA_GATEWAY | RTA_IFP | RTA_IFA)
|
|
||||||
|
|
||||||
/* FreeBSD uses NET_RT_IFMALIST and RTM_NEWMADDR from <sys/socket.h> */
|
|
||||||
/* We can use NET_RT_IFLIST2 and RTM_NEWMADDR2 on Darwin */
|
|
||||||
//#define DARWIN_COMPAT
|
|
||||||
|
|
||||||
//#ifdef DARWIN_COMPAT
|
|
||||||
#define GIM_SYSCTL_MIB NET_RT_IFLIST2
|
|
||||||
#define GIM_RTM_ADDR RTM_NEWMADDR2
|
|
||||||
//#else
|
|
||||||
//#define GIM_SYSCTL_MIB NET_RT_IFMALIST
|
|
||||||
//#define GIM_RTM_ADDR RTM_NEWMADDR
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
// Not in 10.6 includes so use our own
|
|
||||||
struct _intl_ifmaddrs {
|
|
||||||
struct _intl_ifmaddrs *ifma_next;
|
|
||||||
struct sockaddr *ifma_name;
|
|
||||||
struct sockaddr *ifma_addr;
|
|
||||||
struct sockaddr *ifma_lladdr;
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline int _intl_getifmaddrs(struct _intl_ifmaddrs **pif)
|
|
||||||
{
|
|
||||||
int icnt = 1;
|
|
||||||
int dcnt = 0;
|
|
||||||
int ntry = 0;
|
|
||||||
size_t len;
|
|
||||||
size_t needed;
|
|
||||||
int mib[6];
|
|
||||||
int i;
|
|
||||||
char *buf;
|
|
||||||
char *data;
|
|
||||||
char *next;
|
|
||||||
char *p;
|
|
||||||
struct ifma_msghdr2 *ifmam;
|
|
||||||
struct _intl_ifmaddrs *ifa, *ift;
|
|
||||||
struct rt_msghdr *rtm;
|
|
||||||
struct sockaddr *sa;
|
|
||||||
|
|
||||||
mib[0] = CTL_NET;
|
|
||||||
mib[1] = PF_ROUTE;
|
|
||||||
mib[2] = 0; /* protocol */
|
|
||||||
mib[3] = 0; /* wildcard address family */
|
|
||||||
mib[4] = GIM_SYSCTL_MIB;
|
|
||||||
mib[5] = 0; /* no flags */
|
|
||||||
do {
|
|
||||||
if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
|
|
||||||
return (-1);
|
|
||||||
if ((buf = (char *)malloc(needed)) == NULL)
|
|
||||||
return (-1);
|
|
||||||
if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
|
|
||||||
if (errno != ENOMEM || ++ntry >= MAX_SYSCTL_TRY) {
|
|
||||||
free(buf);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
free(buf);
|
|
||||||
buf = NULL;
|
|
||||||
}
|
|
||||||
} while (buf == NULL);
|
|
||||||
|
|
||||||
for (next = buf; next < buf + needed; next += rtm->rtm_msglen) {
|
|
||||||
rtm = (struct rt_msghdr *)(void *)next;
|
|
||||||
if (rtm->rtm_version != RTM_VERSION)
|
|
||||||
continue;
|
|
||||||
switch (rtm->rtm_type) {
|
|
||||||
case GIM_RTM_ADDR:
|
|
||||||
ifmam = (struct ifma_msghdr2 *)(void *)rtm;
|
|
||||||
if ((ifmam->ifmam_addrs & RTA_IFA) == 0)
|
|
||||||
break;
|
|
||||||
icnt++;
|
|
||||||
p = (char *)(ifmam + 1);
|
|
||||||
for (i = 0; i < RTAX_MAX; i++) {
|
|
||||||
if ((RTA_MASKS & ifmam->ifmam_addrs &
|
|
||||||
(1 << i)) == 0)
|
|
||||||
continue;
|
|
||||||
sa = (struct sockaddr *)(void *)p;
|
|
||||||
len = SA_RLEN(sa);
|
|
||||||
dcnt += len;
|
|
||||||
p += len;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data = (char *)malloc(sizeof(struct _intl_ifmaddrs) * icnt + dcnt);
|
|
||||||
if (data == NULL) {
|
|
||||||
free(buf);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
ifa = (struct _intl_ifmaddrs *)(void *)data;
|
|
||||||
data += sizeof(struct _intl_ifmaddrs) * icnt;
|
|
||||||
|
|
||||||
memset(ifa, 0, sizeof(struct _intl_ifmaddrs) * icnt);
|
|
||||||
ift = ifa;
|
|
||||||
|
|
||||||
for (next = buf; next < buf + needed; next += rtm->rtm_msglen) {
|
|
||||||
rtm = (struct rt_msghdr *)(void *)next;
|
|
||||||
if (rtm->rtm_version != RTM_VERSION)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
switch (rtm->rtm_type) {
|
|
||||||
case GIM_RTM_ADDR:
|
|
||||||
ifmam = (struct ifma_msghdr2 *)(void *)rtm;
|
|
||||||
if ((ifmam->ifmam_addrs & RTA_IFA) == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
p = (char *)(ifmam + 1);
|
|
||||||
for (i = 0; i < RTAX_MAX; i++) {
|
|
||||||
if ((RTA_MASKS & ifmam->ifmam_addrs &
|
|
||||||
(1 << i)) == 0)
|
|
||||||
continue;
|
|
||||||
sa = (struct sockaddr *)(void *)p;
|
|
||||||
len = SA_RLEN(sa);
|
|
||||||
switch (i) {
|
|
||||||
case RTAX_GATEWAY:
|
|
||||||
ift->ifma_lladdr =
|
|
||||||
(struct sockaddr *)(void *)data;
|
|
||||||
memcpy(data, p, len);
|
|
||||||
data += len;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RTAX_IFP:
|
|
||||||
ift->ifma_name =
|
|
||||||
(struct sockaddr *)(void *)data;
|
|
||||||
memcpy(data, p, len);
|
|
||||||
data += len;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RTAX_IFA:
|
|
||||||
ift->ifma_addr =
|
|
||||||
(struct sockaddr *)(void *)data;
|
|
||||||
memcpy(data, p, len);
|
|
||||||
data += len;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
data += len;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p += len;
|
|
||||||
}
|
|
||||||
ift->ifma_next = ift + 1;
|
|
||||||
ift = ift->ifma_next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(buf);
|
|
||||||
|
|
||||||
if (ift > ifa) {
|
|
||||||
ift--;
|
|
||||||
ift->ifma_next = NULL;
|
|
||||||
*pif = ifa;
|
|
||||||
} else {
|
|
||||||
*pif = NULL;
|
|
||||||
free(ifa);
|
|
||||||
}
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void _intl_freeifmaddrs(struct _intl_ifmaddrs *ifmp)
|
|
||||||
{
|
|
||||||
free(ifmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
#include <set>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
#include "../node/Constants.hpp"
|
|
||||||
#include "../node/Utils.hpp"
|
|
||||||
#include "../node/Mutex.hpp"
|
|
||||||
#include "../node/Dictionary.hpp"
|
|
||||||
#include "Arp.hpp"
|
|
||||||
#include "OSUtils.hpp"
|
|
||||||
#include "OSXEthernetTap.hpp"
|
|
||||||
|
|
||||||
// ff:ff:ff:ff:ff:ff with no ADI
|
|
||||||
static const ZeroTier::MulticastGroup _blindWildcardMulticastGroup(ZeroTier::MAC(0xff),0);
|
|
||||||
|
|
||||||
static inline bool _setIpv6Stuff(const char *ifname,bool performNUD,bool acceptRouterAdverts)
|
|
||||||
{
|
|
||||||
struct in6_ndireq nd;
|
|
||||||
struct in6_ifreq ifr;
|
|
||||||
|
|
||||||
int s = socket(AF_INET6,SOCK_DGRAM,0);
|
|
||||||
if (s <= 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
memset(&nd,0,sizeof(nd));
|
|
||||||
strncpy(nd.ifname,ifname,sizeof(nd.ifname));
|
|
||||||
|
|
||||||
if (ioctl(s,SIOCGIFINFO_IN6,&nd)) {
|
|
||||||
close(s);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long oldFlags = (unsigned long)nd.ndi.flags;
|
|
||||||
|
|
||||||
if (performNUD)
|
|
||||||
nd.ndi.flags |= ND6_IFF_PERFORMNUD;
|
|
||||||
else nd.ndi.flags &= ~ND6_IFF_PERFORMNUD;
|
|
||||||
|
|
||||||
if (oldFlags != (unsigned long)nd.ndi.flags) {
|
|
||||||
if (ioctl(s,SIOCSIFINFO_FLAGS,&nd)) {
|
|
||||||
close(s);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&ifr,0,sizeof(ifr));
|
|
||||||
strncpy(ifr.ifr_name,ifname,sizeof(ifr.ifr_name));
|
|
||||||
if (ioctl(s,acceptRouterAdverts ? SIOCAUTOCONF_START : SIOCAUTOCONF_STOP,&ifr)) {
|
|
||||||
close(s);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
close(s);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create an OSX-native utun device (utun# where # is desiredNumber)
|
|
||||||
// Adapted from public domain utun example code by Jonathan Levin
|
|
||||||
static int _make_utun(int desiredNumber)
|
|
||||||
{
|
|
||||||
struct sockaddr_ctl sc;
|
|
||||||
struct ctl_info ctlInfo;
|
|
||||||
struct ifreq ifr;
|
|
||||||
|
|
||||||
memset(&ctlInfo, 0, sizeof(ctlInfo));
|
|
||||||
if (strlcpy(ctlInfo.ctl_name, UTUN_CONTROL_NAME, sizeof(ctlInfo.ctl_name)) >= sizeof(ctlInfo.ctl_name)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL);
|
|
||||||
if (fd == -1)
|
|
||||||
return -1;
|
|
||||||
if (ioctl(fd, CTLIOCGINFO, &ctlInfo) == -1) {
|
|
||||||
close(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sc.sc_id = ctlInfo.ctl_id;
|
|
||||||
sc.sc_len = sizeof(sc);
|
|
||||||
sc.sc_family = AF_SYSTEM;
|
|
||||||
sc.ss_sysaddr = AF_SYS_CONTROL;
|
|
||||||
sc.sc_unit = desiredNumber + 1;
|
|
||||||
|
|
||||||
if (connect(fd, (struct sockaddr *)&sc, sizeof(sc)) == -1) {
|
|
||||||
close(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&ifr,0,sizeof(ifr));
|
|
||||||
sprintf(ifr.ifr_name,"utun%d",desiredNumber);
|
|
||||||
if (ioctl(fd,SIOCGIFFLAGS,(void *)&ifr) < 0) {
|
|
||||||
printf("SIOCGIFFLAGS failed\n");
|
|
||||||
}
|
|
||||||
ifr.ifr_flags &= ~IFF_POINTOPOINT;
|
|
||||||
if (ioctl(fd,SIOCSIFFLAGS,(void *)&ifr) < 0) {
|
|
||||||
printf("clear IFF_POINTOPOINT failed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace ZeroTier {
|
|
||||||
|
|
||||||
static long globalTapsRunning = 0;
|
|
||||||
static Mutex globalTapCreateLock;
|
|
||||||
|
|
||||||
OSXEthernetTap::OSXEthernetTap(
|
|
||||||
const char *homePath,
|
|
||||||
const MAC &mac,
|
|
||||||
unsigned int mtu,
|
|
||||||
unsigned int metric,
|
|
||||||
uint64_t nwid,
|
|
||||||
const char *friendlyName,
|
|
||||||
void (*handler)(void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *data,unsigned int len),
|
|
||||||
void *arg) :
|
|
||||||
_handler(handler),
|
|
||||||
_arg(arg),
|
|
||||||
_arp((Arp *)0),
|
|
||||||
_nwid(nwid),
|
|
||||||
_homePath(homePath),
|
|
||||||
_mtu(mtu),
|
|
||||||
_metric(metric),
|
|
||||||
_fd(0),
|
|
||||||
_utun(false),
|
|
||||||
_enabled(true)
|
|
||||||
{
|
|
||||||
char devpath[64],ethaddr[64],mtustr[32],metstr[32],nwids[32];
|
|
||||||
struct stat stattmp;
|
|
||||||
|
|
||||||
Utils::snprintf(nwids,sizeof(nwids),"%.16llx",nwid);
|
|
||||||
|
|
||||||
if (mtu > 2800)
|
|
||||||
throw std::runtime_error("max tap MTU is 2800");
|
|
||||||
|
|
||||||
Mutex::Lock _gl(globalTapCreateLock);
|
|
||||||
|
|
||||||
// Read remembered previous device name, if any -- we'll try to reuse
|
|
||||||
Dictionary devmap;
|
|
||||||
std::string desiredDevice;
|
|
||||||
{
|
|
||||||
std::string devmapbuf;
|
|
||||||
if (OSUtils::readFile((_homePath + ZT_PATH_SEPARATOR_S + "devicemap").c_str(),devmapbuf)) {
|
|
||||||
devmap.fromString(devmapbuf);
|
|
||||||
desiredDevice = devmap.get(nwids,"");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (::stat((_homePath + ZT_PATH_SEPARATOR_S + "tap.kext").c_str(),&stattmp) == 0) {
|
|
||||||
// Try to init kext if it's there, otherwise revert to utun mode
|
|
||||||
|
|
||||||
if (::stat("/dev/zt0",&stattmp)) {
|
|
||||||
long kextpid = (long)vfork();
|
|
||||||
if (kextpid == 0) {
|
|
||||||
::chdir(homePath);
|
|
||||||
OSUtils::redirectUnixOutputs("/dev/null",(const char *)0);
|
|
||||||
::execl("/sbin/kextload","/sbin/kextload","-q","-repository",homePath,"tap.kext",(const char *)0);
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (kextpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(kextpid,&exitcode,0);
|
|
||||||
}
|
|
||||||
::usleep(500); // give tap device driver time to start up and try again
|
|
||||||
if (::stat("/dev/zt0",&stattmp))
|
|
||||||
_utun = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_utun) {
|
|
||||||
// See if we can re-use the last device we had.
|
|
||||||
bool recalledDevice = false;
|
|
||||||
if (desiredDevice.length() > 2) {
|
|
||||||
Utils::snprintf(devpath,sizeof(devpath),"/dev/%s",desiredDevice.c_str());
|
|
||||||
if (stat(devpath,&stattmp) == 0) {
|
|
||||||
_fd = ::open(devpath,O_RDWR);
|
|
||||||
if (_fd > 0) {
|
|
||||||
_dev = desiredDevice;
|
|
||||||
recalledDevice = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open the first unused tap device if we didn't recall a previous one.
|
|
||||||
if (!recalledDevice) {
|
|
||||||
for(int i=0;i<64;++i) {
|
|
||||||
Utils::snprintf(devpath,sizeof(devpath),"/dev/zt%d",i);
|
|
||||||
if (stat(devpath,&stattmp)) {
|
|
||||||
_utun = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
_fd = ::open(devpath,O_RDWR);
|
|
||||||
if (_fd > 0) {
|
|
||||||
char foo[16];
|
|
||||||
Utils::snprintf(foo,sizeof(foo),"zt%d",i);
|
|
||||||
_dev = foo;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (_fd <= 0)
|
|
||||||
_utun = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_utun = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_utun) {
|
|
||||||
// Use OSX built-in utun device if kext is not available or doesn't work
|
|
||||||
|
|
||||||
int utunNo = 0;
|
|
||||||
|
|
||||||
if ((desiredDevice.length() > 4)&&(desiredDevice.substr(0,4) == "utun")) {
|
|
||||||
utunNo = Utils::strToInt(desiredDevice.substr(4).c_str());
|
|
||||||
if (utunNo >= 0)
|
|
||||||
_fd = _make_utun(utunNo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_fd <= 0) {
|
|
||||||
// Start at utun8 to leave lower utuns unused since other stuff might
|
|
||||||
// want them -- OpenVPN, cjdns, etc. I'm not sure if those are smart
|
|
||||||
// enough to scan upward like this.
|
|
||||||
for(utunNo=8;utunNo<=256;++utunNo) {
|
|
||||||
if ((_fd = _make_utun(utunNo)) > 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_fd <= 0)
|
|
||||||
throw std::runtime_error("unable to find/load ZeroTier tap driver OR use built-in utun driver in OSX; permission or system problem or too many open devices?");
|
|
||||||
|
|
||||||
Utils::snprintf(devpath,sizeof(devpath),"utun%d",utunNo);
|
|
||||||
_dev = devpath;
|
|
||||||
|
|
||||||
// Configure address and bring it up
|
|
||||||
Utils::snprintf(mtustr,sizeof(mtustr),"%u",_mtu);
|
|
||||||
Utils::snprintf(metstr,sizeof(metstr),"%u",_metric);
|
|
||||||
long cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"mtu",mtustr,"metric",metstr,"up",(const char *)0);
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(cpid,&exitcode,0);
|
|
||||||
if (exitcode) {
|
|
||||||
::close(_fd);
|
|
||||||
throw std::runtime_error("ifconfig failure activating utun interface");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// Use our ZeroTier OSX tun/tap driver for zt# Ethernet tap device
|
|
||||||
|
|
||||||
if (fcntl(_fd,F_SETFL,fcntl(_fd,F_GETFL) & ~O_NONBLOCK) == -1) {
|
|
||||||
::close(_fd);
|
|
||||||
throw std::runtime_error("unable to set flags on file descriptor for TAP device");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure MAC address and MTU, bring interface up
|
|
||||||
Utils::snprintf(ethaddr,sizeof(ethaddr),"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",(int)mac[0],(int)mac[1],(int)mac[2],(int)mac[3],(int)mac[4],(int)mac[5]);
|
|
||||||
Utils::snprintf(mtustr,sizeof(mtustr),"%u",_mtu);
|
|
||||||
Utils::snprintf(metstr,sizeof(metstr),"%u",_metric);
|
|
||||||
long cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"lladdr",ethaddr,"mtu",mtustr,"metric",metstr,"up",(const char *)0);
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(cpid,&exitcode,0);
|
|
||||||
if (exitcode) {
|
|
||||||
::close(_fd);
|
|
||||||
throw std::runtime_error("ifconfig failure setting link-layer address and activating tap interface");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_setIpv6Stuff(_dev.c_str(),true,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set close-on-exec so that devices cannot persist if we fork/exec for update
|
|
||||||
fcntl(_fd,F_SETFD,fcntl(_fd,F_GETFD) | FD_CLOEXEC);
|
|
||||||
|
|
||||||
::pipe(_shutdownSignalPipe);
|
|
||||||
|
|
||||||
++globalTapsRunning;
|
|
||||||
|
|
||||||
devmap[nwids] = _dev;
|
|
||||||
OSUtils::writeFile((_homePath + ZT_PATH_SEPARATOR_S + "devicemap").c_str(),devmap.toString());
|
|
||||||
|
|
||||||
_thread = Thread::start(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
OSXEthernetTap::~OSXEthernetTap()
|
|
||||||
{
|
|
||||||
Mutex::Lock _gl(globalTapCreateLock);
|
|
||||||
|
|
||||||
::write(_shutdownSignalPipe[1],(const void *)this,1); // writing a byte causes thread to exit
|
|
||||||
Thread::join(_thread);
|
|
||||||
|
|
||||||
::close(_fd);
|
|
||||||
::close(_shutdownSignalPipe[0]);
|
|
||||||
::close(_shutdownSignalPipe[1]);
|
|
||||||
|
|
||||||
if (_utun) {
|
|
||||||
delete _arp;
|
|
||||||
} else {
|
|
||||||
if (--globalTapsRunning <= 0) {
|
|
||||||
globalTapsRunning = 0; // sanity check -- should not be possible
|
|
||||||
|
|
||||||
char tmp[16384];
|
|
||||||
sprintf(tmp,"%s/%s",_homePath.c_str(),"tap.kext");
|
|
||||||
long kextpid = (long)vfork();
|
|
||||||
if (kextpid == 0) {
|
|
||||||
OSUtils::redirectUnixOutputs("/dev/null",(const char *)0);
|
|
||||||
::execl("/sbin/kextunload","/sbin/kextunload",tmp,(const char *)0);
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (kextpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(kextpid,&exitcode,0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXEthernetTap::setEnabled(bool en)
|
|
||||||
{
|
|
||||||
_enabled = en;
|
|
||||||
// TODO: interface status change
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OSXEthernetTap::enabled() const
|
|
||||||
{
|
|
||||||
return _enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool ___removeIp(const std::string &_dev,const InetAddress &ip)
|
|
||||||
{
|
|
||||||
long cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"inet",ip.toIpString().c_str(),"-alias",(const char *)0);
|
|
||||||
_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
waitpid(cpid,&exitcode,0);
|
|
||||||
return (exitcode == 0);
|
|
||||||
}
|
|
||||||
return false; // never reached, make compiler shut up about return value
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OSXEthernetTap::addIp(const InetAddress &ip)
|
|
||||||
{
|
|
||||||
if (!ip)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
std::vector<InetAddress> allIps(ips());
|
|
||||||
if (std::binary_search(allIps.begin(),allIps.end(),ip))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Remove and reconfigure if address is the same but netmask is different
|
|
||||||
for(std::vector<InetAddress>::iterator i(allIps.begin());i!=allIps.end();++i) {
|
|
||||||
if ((i->ipsEqual(ip))&&(i->netmaskBits() != ip.netmaskBits())) {
|
|
||||||
if (___removeIp(_dev,*i))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_utun) {
|
|
||||||
long cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
if (ip.ss_family == AF_INET6) {
|
|
||||||
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),"inet6",ip.toString().c_str(),"alias",(const char *)0);
|
|
||||||
} else {
|
|
||||||
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),ip.toString().c_str(),ip.toIpString().c_str(),"alias",(const char *)0);
|
|
||||||
}
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(cpid,&exitcode,0);
|
|
||||||
|
|
||||||
if (exitcode == 0) {
|
|
||||||
if (ip.ss_family == AF_INET) {
|
|
||||||
// Add route to network over tun for IPv4 -- otherwise it behaves
|
|
||||||
// as a simple point to point tunnel instead of a true route.
|
|
||||||
cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
::close(STDERR_FILENO);
|
|
||||||
::close(STDOUT_FILENO);
|
|
||||||
::execl("/sbin/route","/sbin/route","add",ip.network().toString().c_str(),ip.toIpString().c_str(),(const char *)0);
|
|
||||||
::exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(cpid,&exitcode,0);
|
|
||||||
return (exitcode == 0);
|
|
||||||
}
|
|
||||||
} else return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
long cpid = (long)vfork();
|
|
||||||
if (cpid == 0) {
|
|
||||||
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),ip.isV4() ? "inet" : "inet6",ip.toString().c_str(),"alias",(const char *)0);
|
|
||||||
::_exit(-1);
|
|
||||||
} else if (cpid > 0) {
|
|
||||||
int exitcode = -1;
|
|
||||||
::waitpid(cpid,&exitcode,0);
|
|
||||||
return (exitcode == 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OSXEthernetTap::removeIp(const InetAddress &ip)
|
|
||||||
{
|
|
||||||
if (!ip)
|
|
||||||
return true;
|
|
||||||
std::vector<InetAddress> allIps(ips());
|
|
||||||
if (!std::binary_search(allIps.begin(),allIps.end(),ip)) {
|
|
||||||
if (___removeIp(_dev,ip))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<InetAddress> OSXEthernetTap::ips() const
|
|
||||||
{
|
|
||||||
struct ifaddrs *ifa = (struct ifaddrs *)0;
|
|
||||||
if (getifaddrs(&ifa))
|
|
||||||
return std::vector<InetAddress>();
|
|
||||||
|
|
||||||
std::vector<InetAddress> r;
|
|
||||||
|
|
||||||
struct ifaddrs *p = ifa;
|
|
||||||
while (p) {
|
|
||||||
if ((!strcmp(p->ifa_name,_dev.c_str()))&&(p->ifa_addr)&&(p->ifa_netmask)&&(p->ifa_addr->sa_family == p->ifa_netmask->sa_family)) {
|
|
||||||
switch(p->ifa_addr->sa_family) {
|
|
||||||
case AF_INET: {
|
|
||||||
struct sockaddr_in *sin = (struct sockaddr_in *)p->ifa_addr;
|
|
||||||
struct sockaddr_in *nm = (struct sockaddr_in *)p->ifa_netmask;
|
|
||||||
r.push_back(InetAddress(&(sin->sin_addr.s_addr),4,Utils::countBits((uint32_t)nm->sin_addr.s_addr)));
|
|
||||||
} break;
|
|
||||||
case AF_INET6: {
|
|
||||||
struct sockaddr_in6 *sin = (struct sockaddr_in6 *)p->ifa_addr;
|
|
||||||
struct sockaddr_in6 *nm = (struct sockaddr_in6 *)p->ifa_netmask;
|
|
||||||
uint32_t b[4];
|
|
||||||
memcpy(b,nm->sin6_addr.s6_addr,sizeof(b));
|
|
||||||
r.push_back(InetAddress(sin->sin6_addr.s6_addr,16,Utils::countBits(b[0]) + Utils::countBits(b[1]) + Utils::countBits(b[2]) + Utils::countBits(b[3])));
|
|
||||||
} break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p = p->ifa_next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ifa)
|
|
||||||
freeifaddrs(ifa);
|
|
||||||
|
|
||||||
std::sort(r.begin(),r.end());
|
|
||||||
std::unique(r.begin(),r.end());
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXEthernetTap::put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len)
|
|
||||||
{
|
|
||||||
char putBuf[4096];
|
|
||||||
if ((_fd > 0)&&(len <= _mtu)&&(_enabled)) {
|
|
||||||
to.copyTo(putBuf,6);
|
|
||||||
from.copyTo(putBuf + 6,6);
|
|
||||||
*((uint16_t *)(putBuf + 12)) = htons((uint16_t)etherType);
|
|
||||||
memcpy(putBuf + 14,data,len);
|
|
||||||
len += 14;
|
|
||||||
::write(_fd,putBuf,len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string OSXEthernetTap::deviceName() const
|
|
||||||
{
|
|
||||||
return _dev;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXEthernetTap::setFriendlyName(const char *friendlyName)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXEthernetTap::scanMulticastGroups(std::vector<MulticastGroup> &added,std::vector<MulticastGroup> &removed)
|
|
||||||
{
|
|
||||||
std::vector<MulticastGroup> newGroups;
|
|
||||||
|
|
||||||
struct _intl_ifmaddrs *ifmap = (struct _intl_ifmaddrs *)0;
|
|
||||||
if (!_intl_getifmaddrs(&ifmap)) {
|
|
||||||
struct _intl_ifmaddrs *p = ifmap;
|
|
||||||
while (p) {
|
|
||||||
if (p->ifma_addr->sa_family == AF_LINK) {
|
|
||||||
struct sockaddr_dl *in = (struct sockaddr_dl *)p->ifma_name;
|
|
||||||
struct sockaddr_dl *la = (struct sockaddr_dl *)p->ifma_addr;
|
|
||||||
if ((la->sdl_alen == 6)&&(in->sdl_nlen <= _dev.length())&&(!memcmp(_dev.data(),in->sdl_data,in->sdl_nlen)))
|
|
||||||
newGroups.push_back(MulticastGroup(MAC(la->sdl_data + la->sdl_nlen,6),0));
|
|
||||||
}
|
|
||||||
p = p->ifma_next;
|
|
||||||
}
|
|
||||||
_intl_freeifmaddrs(ifmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<InetAddress> allIps(ips());
|
|
||||||
for(std::vector<InetAddress>::iterator ip(allIps.begin());ip!=allIps.end();++ip)
|
|
||||||
newGroups.push_back(MulticastGroup::deriveMulticastGroupForAddressResolution(*ip));
|
|
||||||
|
|
||||||
std::sort(newGroups.begin(),newGroups.end());
|
|
||||||
std::unique(newGroups.begin(),newGroups.end());
|
|
||||||
|
|
||||||
for(std::vector<MulticastGroup>::iterator m(newGroups.begin());m!=newGroups.end();++m) {
|
|
||||||
if (!std::binary_search(_multicastGroups.begin(),_multicastGroups.end(),*m))
|
|
||||||
added.push_back(*m);
|
|
||||||
}
|
|
||||||
for(std::vector<MulticastGroup>::iterator m(_multicastGroups.begin());m!=_multicastGroups.end();++m) {
|
|
||||||
if (!std::binary_search(newGroups.begin(),newGroups.end(),*m))
|
|
||||||
removed.push_back(*m);
|
|
||||||
}
|
|
||||||
|
|
||||||
_multicastGroups.swap(newGroups);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSXEthernetTap::threadMain()
|
|
||||||
throw()
|
|
||||||
{
|
|
||||||
fd_set readfds,nullfds;
|
|
||||||
MAC to,from;
|
|
||||||
int n,nfds,r;
|
|
||||||
char getBuf[8194];
|
|
||||||
|
|
||||||
Thread::sleep(500);
|
|
||||||
|
|
||||||
FD_ZERO(&readfds);
|
|
||||||
FD_ZERO(&nullfds);
|
|
||||||
nfds = (int)std::max(_shutdownSignalPipe[0],_fd) + 1;
|
|
||||||
|
|
||||||
r = 0;
|
|
||||||
for(;;) {
|
|
||||||
FD_SET(_shutdownSignalPipe[0],&readfds);
|
|
||||||
FD_SET(_fd,&readfds);
|
|
||||||
select(nfds,&readfds,&nullfds,&nullfds,(struct timeval *)0);
|
|
||||||
|
|
||||||
if (FD_ISSET(_shutdownSignalPipe[0],&readfds)) // writes to shutdown pipe terminate thread
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (FD_ISSET(_fd,&readfds)) {
|
|
||||||
n = (int)::read(_fd,getBuf + r,sizeof(getBuf) - r);
|
|
||||||
if (n < 0) {
|
|
||||||
if ((errno != EINTR)&&(errno != ETIMEDOUT))
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
// Some tap drivers like to send the ethernet frame and the
|
|
||||||
// payload in two chunks, so handle that by accumulating
|
|
||||||
// data until we have at least a frame.
|
|
||||||
r += n;
|
|
||||||
if (r > 14) {
|
|
||||||
if (r > ((int)_mtu + 14)) // sanity check for weird TAP behavior on some platforms
|
|
||||||
r = _mtu + 14;
|
|
||||||
|
|
||||||
if (_enabled) {
|
|
||||||
to.setTo(getBuf,6);
|
|
||||||
from.setTo(getBuf + 6,6);
|
|
||||||
unsigned int etherType = ntohs(((const uint16_t *)getBuf)[6]);
|
|
||||||
// TODO: VLAN support
|
|
||||||
_handler(_arg,_nwid,from,to,etherType,0,(const void *)(getBuf + 14),r - 14);
|
|
||||||
}
|
|
||||||
|
|
||||||
r = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace ZeroTier
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
/*
|
|
||||||
* ZeroTier One - Network Virtualization Everywhere
|
|
||||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* --
|
|
||||||
*
|
|
||||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
|
||||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
|
||||||
*
|
|
||||||
* If you would like to embed ZeroTier into a commercial application or
|
|
||||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
|
||||||
* LLC. Start here: http://www.zerotier.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ZT_OSXETHERNETTAP_HPP
|
|
||||||
#define ZT_OSXETHERNETTAP_HPP
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "../node/Constants.hpp"
|
|
||||||
#include "../node/MAC.hpp"
|
|
||||||
#include "../node/InetAddress.hpp"
|
|
||||||
#include "../node/MulticastGroup.hpp"
|
|
||||||
|
|
||||||
#include "Thread.hpp"
|
|
||||||
|
|
||||||
namespace ZeroTier {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OSX Ethernet tap using ZeroTier kernel extension zt# devices
|
|
||||||
*/
|
|
||||||
class OSXEthernetTap
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
OSXEthernetTap(
|
|
||||||
const char *homePath,
|
|
||||||
const MAC &mac,
|
|
||||||
unsigned int mtu,
|
|
||||||
unsigned int metric,
|
|
||||||
uint64_t nwid,
|
|
||||||
const char *friendlyName,
|
|
||||||
void (*handler)(void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int),
|
|
||||||
void *arg);
|
|
||||||
|
|
||||||
~OSXEthernetTap();
|
|
||||||
|
|
||||||
inline void setEnabled(bool en) { _enabled = en; }
|
|
||||||
inline bool enabled() const { return _enabled; }
|
|
||||||
bool addIp(const InetAddress &ip);
|
|
||||||
bool removeIp(const InetAddress &ip);
|
|
||||||
std::vector<InetAddress> ips() const;
|
|
||||||
void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len);
|
|
||||||
std::string deviceName() const;
|
|
||||||
void setFriendlyName(const char *friendlyName);
|
|
||||||
void scanMulticastGroups(std::vector<MulticastGroup> &added,std::vector<MulticastGroup> &removed);
|
|
||||||
|
|
||||||
void threadMain()
|
|
||||||
throw();
|
|
||||||
|
|
||||||
// Private members of OSXEthernetTap have public visibility to be accessable
|
|
||||||
// from an internal bounce function; don't modify directly.
|
|
||||||
void (*_handler)(void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int);
|
|
||||||
void *_arg;
|
|
||||||
void *_pcap; // pcap_t *
|
|
||||||
uint64_t _nwid;
|
|
||||||
MAC _mac;
|
|
||||||
Thread _thread;
|
|
||||||
std::string _homePath;
|
|
||||||
std::string _dev;
|
|
||||||
std::vector<MulticastGroup> _multicastGroups;
|
|
||||||
unsigned int _mtu;
|
|
||||||
unsigned int _metric;
|
|
||||||
volatile bool _enabled;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace ZeroTier
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
/*
|
|
||||||
* ZeroTier One - Network Virtualization Everywhere
|
|
||||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* --
|
|
||||||
*
|
|
||||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
|
||||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
|
||||||
*
|
|
||||||
* If you would like to embed ZeroTier into a commercial application or
|
|
||||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
|
||||||
* LLC. Start here: http://www.zerotier.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ZT_OSXETHERNETTAP_HPP
|
|
||||||
#define ZT_OSXETHERNETTAP_HPP
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "../node/Constants.hpp"
|
|
||||||
#include "../node/MAC.hpp"
|
|
||||||
#include "../node/InetAddress.hpp"
|
|
||||||
#include "../node/MulticastGroup.hpp"
|
|
||||||
|
|
||||||
#include "Thread.hpp"
|
|
||||||
|
|
||||||
namespace ZeroTier {
|
|
||||||
|
|
||||||
class Arp;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* OSX Ethernet tap supporting either ZeroTier tun/tap kext or OSX-native utun
|
|
||||||
*/
|
|
||||||
class OSXEthernetTap
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
OSXEthernetTap(
|
|
||||||
const char *homePath,
|
|
||||||
const MAC &mac,
|
|
||||||
unsigned int mtu,
|
|
||||||
unsigned int metric,
|
|
||||||
uint64_t nwid,
|
|
||||||
const char *friendlyName,
|
|
||||||
void (*handler)(void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int),
|
|
||||||
void *arg);
|
|
||||||
|
|
||||||
~OSXEthernetTap();
|
|
||||||
|
|
||||||
void setEnabled(bool en);
|
|
||||||
bool enabled() const;
|
|
||||||
bool addIp(const InetAddress &ip);
|
|
||||||
bool removeIp(const InetAddress &ip);
|
|
||||||
std::vector<InetAddress> ips() const;
|
|
||||||
void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,unsigned int len);
|
|
||||||
std::string deviceName() const;
|
|
||||||
void setFriendlyName(const char *friendlyName);
|
|
||||||
void scanMulticastGroups(std::vector<MulticastGroup> &added,std::vector<MulticastGroup> &removed);
|
|
||||||
|
|
||||||
inline bool isNativeUtun() const { return _utun; }
|
|
||||||
|
|
||||||
void threadMain()
|
|
||||||
throw();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void (*_handler)(void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int);
|
|
||||||
void *_arg;
|
|
||||||
Arp *_arp; // created and used if utun is enabled
|
|
||||||
uint64_t _nwid;
|
|
||||||
Thread _thread;
|
|
||||||
std::string _homePath;
|
|
||||||
std::string _dev;
|
|
||||||
std::vector<MulticastGroup> _multicastGroups;
|
|
||||||
unsigned int _mtu;
|
|
||||||
unsigned int _metric;
|
|
||||||
int _fd;
|
|
||||||
int _shutdownSignalPipe[2];
|
|
||||||
bool _utun;
|
|
||||||
volatile bool _enabled;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace ZeroTier
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
Retired Code and Miscellaneous Junk
|
|
||||||
======
|
|
||||||
|
|
||||||
This directory is for old code that isn't used but we don't want to lose track of, and for anything else random like debug scripts.
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
FROM centos:latest
|
|
||||||
|
|
||||||
MAINTAINER https://www.zerotier.com/
|
|
||||||
|
|
||||||
EXPOSE 9993/udp
|
|
||||||
|
|
||||||
ADD nodesource-el.repo /etc/yum.repos.d/nodesource-el.repo
|
|
||||||
RUN yum -y update && yum install -y nodejs && yum clean all
|
|
||||||
|
|
||||||
RUN mkdir -p /var/lib/zerotier-one
|
|
||||||
RUN mkdir -p /var/lib/zerotier-one/networks.d
|
|
||||||
RUN touch /var/lib/zerotier-one/networks.d/ffffffffffffffff.conf
|
|
||||||
|
|
||||||
ADD package.json /
|
|
||||||
RUN npm install
|
|
||||||
|
|
||||||
ADD zerotier-one /
|
|
||||||
RUN chmod a+x /zerotier-one
|
|
||||||
|
|
||||||
ADD agent.js /
|
|
||||||
ADD docker-main.sh /
|
|
||||||
RUN chmod a+x /docker-main.sh
|
|
||||||
|
|
||||||
CMD ["./docker-main.sh"]
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
HTTP one-to-all test
|
|
||||||
======
|
|
||||||
|
|
||||||
*This is really internal use code. You're free to test it out but expect to do some editing/tweaking to make it work. We used this to run some massive scale tests of our new geo-cluster-based root server infrastructure prior to taking it live.*
|
|
||||||
|
|
||||||
Before using this code you will want to edit agent.js to change SERVER_HOST to the IP address of where you will run server.js. This should typically be an open Internet IP, since this makes reporting not dependent upon the thing being tested. Also note that this thing does no security of any kind. It's designed for one-off tests run over a short period of time, not to be anything that runs permanently. You will also want to edit the Dockerfile if you want to build containers and change the network ID to the network you want to run tests over.
|
|
||||||
|
|
||||||
This code can be deployed across a large number of VMs or containers to test and benchmark HTTP traffic within a virtual network at scale. The agent acts as a server and can query other agents, while the server collects agent data and tells agents about each other. It's designed to use RFC4193-based ZeroTier IPv6 addresses within the cluster, which allows the easy provisioning of a large cluster without IP conflicts.
|
|
||||||
|
|
||||||
The Dockerfile builds an image that launches the agent. The image must be "docker run" with "--device=/dev/net/tun --privileged" to permit it to open a tun/tap device within the container. (Unfortunately CAP_NET_ADMIN may not work due to a bug in Docker and/or Linux.) You can run a bunch with a command like:
|
|
||||||
|
|
||||||
for ((n=0;n<10;n++)); do docker run --device=/dev/net/tun --privileged -d zerotier/http-test; done
|
|
||||||
@@ -1,196 +0,0 @@
|
|||||||
// ZeroTier distributed HTTP test agent
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
// Customizable parameters:
|
|
||||||
|
|
||||||
// Time between startup and first test attempt
|
|
||||||
var TEST_STARTUP_LAG = 10000;
|
|
||||||
|
|
||||||
// Maximum interval between test attempts (actual timing is random % this)
|
|
||||||
var TEST_INTERVAL_MAX = (60000 * 10);
|
|
||||||
|
|
||||||
// Test timeout in ms
|
|
||||||
var TEST_TIMEOUT = 30000;
|
|
||||||
|
|
||||||
// Where should I get other agents' IDs and POST results?
|
|
||||||
var SERVER_HOST = '52.26.196.147';
|
|
||||||
var SERVER_PORT = 18080;
|
|
||||||
|
|
||||||
// Which port do agents use to serve up test data to each other?
|
|
||||||
var AGENT_PORT = 18888;
|
|
||||||
|
|
||||||
// Payload size in bytes
|
|
||||||
var PAYLOAD_SIZE = 5000;
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
var ipaddr = require('ipaddr.js');
|
|
||||||
var os = require('os');
|
|
||||||
var http = require('http');
|
|
||||||
var async = require('async');
|
|
||||||
|
|
||||||
var express = require('express');
|
|
||||||
var app = express();
|
|
||||||
|
|
||||||
// Find our ZeroTier-assigned RFC4193 IPv6 address
|
|
||||||
var thisAgentId = null;
|
|
||||||
var interfaces = os.networkInterfaces();
|
|
||||||
if (!interfaces) {
|
|
||||||
console.error('FATAL: os.networkInterfaces() failed.');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
for(var ifname in interfaces) {
|
|
||||||
var ifaddrs = interfaces[ifname];
|
|
||||||
if (Array.isArray(ifaddrs)) {
|
|
||||||
for(var i=0;i<ifaddrs.length;++i) {
|
|
||||||
if (ifaddrs[i].family == 'IPv6') {
|
|
||||||
try {
|
|
||||||
var ipbytes = ipaddr.parse(ifaddrs[i].address).toByteArray();
|
|
||||||
if ((ipbytes.length === 16)&&(ipbytes[0] == 0xfd)&&(ipbytes[9] == 0x99)&&(ipbytes[10] == 0x93)) {
|
|
||||||
thisAgentId = '';
|
|
||||||
for(var j=0;j<16;++j) {
|
|
||||||
var tmp = ipbytes[j].toString(16);
|
|
||||||
if (tmp.length === 1)
|
|
||||||
thisAgentId += '0';
|
|
||||||
thisAgentId += tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (thisAgentId === null) {
|
|
||||||
console.error('FATAL: no ZeroTier-assigned RFC4193 IPv6 addresses found on any local interface!');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
//console.log(thisAgentId);
|
|
||||||
|
|
||||||
// Create a random (and therefore not very compressable) payload
|
|
||||||
var payload = new Buffer(PAYLOAD_SIZE);
|
|
||||||
for(var xx=0;xx<PAYLOAD_SIZE;++xx) {
|
|
||||||
payload.writeUInt8(Math.round(Math.random() * 255.0),xx);
|
|
||||||
}
|
|
||||||
|
|
||||||
function agentIdToIp(agentId)
|
|
||||||
{
|
|
||||||
var ip = '';
|
|
||||||
ip += agentId.substr(0,4);
|
|
||||||
ip += ':';
|
|
||||||
ip += agentId.substr(4,4);
|
|
||||||
ip += ':';
|
|
||||||
ip += agentId.substr(8,4);
|
|
||||||
ip += ':';
|
|
||||||
ip += agentId.substr(12,4);
|
|
||||||
ip += ':';
|
|
||||||
ip += agentId.substr(16,4);
|
|
||||||
ip += ':';
|
|
||||||
ip += agentId.substr(20,4);
|
|
||||||
ip += ':';
|
|
||||||
ip += agentId.substr(24,4);
|
|
||||||
ip += ':';
|
|
||||||
ip += agentId.substr(28,4);
|
|
||||||
return ip;
|
|
||||||
};
|
|
||||||
|
|
||||||
var lastTestResult = null;
|
|
||||||
var allOtherAgents = {};
|
|
||||||
|
|
||||||
function doTest()
|
|
||||||
{
|
|
||||||
var submit = http.request({
|
|
||||||
host: SERVER_HOST,
|
|
||||||
port: SERVER_PORT,
|
|
||||||
path: '/'+thisAgentId,
|
|
||||||
method: 'POST'
|
|
||||||
},function(res) {
|
|
||||||
var body = '';
|
|
||||||
res.on('data',function(chunk) { body += chunk.toString(); });
|
|
||||||
res.on('end',function() {
|
|
||||||
|
|
||||||
if (body) {
|
|
||||||
try {
|
|
||||||
var peers = JSON.parse(body);
|
|
||||||
if (Array.isArray(peers)) {
|
|
||||||
for(var xx=0;xx<peers.length;++xx)
|
|
||||||
allOtherAgents[peers[xx]] = true;
|
|
||||||
}
|
|
||||||
} catch (e) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
var agents = Object.keys(allOtherAgents);
|
|
||||||
if (agents.length > 1) {
|
|
||||||
|
|
||||||
var target = agents[Math.floor(Math.random() * agents.length)];
|
|
||||||
while (target === thisAgentId)
|
|
||||||
target = agents[Math.floor(Math.random() * agents.length)];
|
|
||||||
|
|
||||||
var testRequest = null;
|
|
||||||
var timeoutId = null;
|
|
||||||
timeoutId = setTimeout(function() {
|
|
||||||
if (testRequest !== null)
|
|
||||||
testRequest.abort();
|
|
||||||
timeoutId = null;
|
|
||||||
},TEST_TIMEOUT);
|
|
||||||
var startTime = Date.now();
|
|
||||||
|
|
||||||
testRequest = http.get({
|
|
||||||
host: agentIdToIp(target),
|
|
||||||
port: AGENT_PORT,
|
|
||||||
path: '/'
|
|
||||||
},function(res) {
|
|
||||||
var bytes = 0;
|
|
||||||
res.on('data',function(chunk) { bytes += chunk.length; });
|
|
||||||
res.on('end',function() {
|
|
||||||
lastTestResult = {
|
|
||||||
source: thisAgentId,
|
|
||||||
target: target,
|
|
||||||
time: (Date.now() - startTime),
|
|
||||||
bytes: bytes,
|
|
||||||
timedOut: (timeoutId === null),
|
|
||||||
error: null
|
|
||||||
};
|
|
||||||
if (timeoutId !== null)
|
|
||||||
clearTimeout(timeoutId);
|
|
||||||
return setTimeout(doTest,Math.round(Math.random() * TEST_INTERVAL_MAX) + 1);
|
|
||||||
});
|
|
||||||
}).on('error',function(e) {
|
|
||||||
lastTestResult = {
|
|
||||||
source: thisAgentId,
|
|
||||||
target: target,
|
|
||||||
time: (Date.now() - startTime),
|
|
||||||
bytes: 0,
|
|
||||||
timedOut: (timeoutId === null),
|
|
||||||
error: e.toString()
|
|
||||||
};
|
|
||||||
if (timeoutId !== null)
|
|
||||||
clearTimeout(timeoutId);
|
|
||||||
return setTimeout(doTest,Math.round(Math.random() * TEST_INTERVAL_MAX) + 1);
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return setTimeout(doTest,1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
}).on('error',function(e) {
|
|
||||||
console.log('POST failed: '+e.toString());
|
|
||||||
return setTimeout(doTest,1000);
|
|
||||||
});
|
|
||||||
if (lastTestResult !== null) {
|
|
||||||
submit.write(JSON.stringify(lastTestResult));
|
|
||||||
lastTestResult = null;
|
|
||||||
}
|
|
||||||
submit.end();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Agents just serve up a test payload
|
|
||||||
app.get('/',function(req,res) { return res.status(200).send(payload); });
|
|
||||||
|
|
||||||
var expressServer = app.listen(AGENT_PORT,function () {
|
|
||||||
// Start timeout-based loop
|
|
||||||
setTimeout(doTest(),TEST_STARTUP_LAG);
|
|
||||||
});
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Kills all running Docker containers on all big-test-hosts
|
|
||||||
|
|
||||||
export PATH=/bin:/usr/bin:/usr/local/bin:/usr/sbin:/sbin
|
|
||||||
|
|
||||||
pssh -h big-test-hosts -x '-t -t' -i -OUserKnownHostsFile=/dev/null -OStrictHostKeyChecking=no -t 0 -p 256 "sudo docker ps -aq | xargs -r sudo docker rm -f"
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# More than 500 container seems to result in a lot of sporadic failures, probably due to Linux kernel scaling issues with virtual network ports
|
|
||||||
# 250 with a 16GB RAM VM like Amazon m4.xlarge seems good
|
|
||||||
NUM_CONTAINERS=250
|
|
||||||
CONTAINER_IMAGE=zerotier/http-test
|
|
||||||
SCALE_UP_DELAY=10
|
|
||||||
|
|
||||||
export PATH=/bin:/usr/bin:/usr/local/bin:/usr/sbin:/sbin
|
|
||||||
|
|
||||||
pssh -h big-test-hosts -x '-t -t' -i -OUserKnownHostsFile=/dev/null -OStrictHostKeyChecking=no -t 0 -p 256 "sudo sysctl -w net.netfilter.nf_conntrack_max=262144 ; for ((n=0;n<$NUM_CONTAINERS;n++)); do sudo docker run --device=/dev/net/tun --privileged -d $CONTAINER_IMAGE; sleep $SCALE_UP_DELAY; done"
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
//
|
|
||||||
// Pipe the output of server.js into this to convert raw test results into bracketed statistics
|
|
||||||
// suitable for graphing.
|
|
||||||
//
|
|
||||||
|
|
||||||
// Time duration per statistical bracket
|
|
||||||
var BRACKET_SIZE = 10000;
|
|
||||||
|
|
||||||
// Number of bytes expected from each test
|
|
||||||
var EXPECTED_BYTES = 5000;
|
|
||||||
|
|
||||||
var readline = require('readline');
|
|
||||||
var rl = readline.createInterface({
|
|
||||||
input: process.stdin,
|
|
||||||
output: process.stdout,
|
|
||||||
terminal: false
|
|
||||||
});
|
|
||||||
|
|
||||||
var count = 0.0;
|
|
||||||
var overallCount = 0.0;
|
|
||||||
var totalFailures = 0.0;
|
|
||||||
var totalOverallFailures = 0.0;
|
|
||||||
var totalMs = 0;
|
|
||||||
var totalData = 0;
|
|
||||||
var devices = {};
|
|
||||||
var lastBracketTs = 0;
|
|
||||||
|
|
||||||
rl.on('line',function(line) {
|
|
||||||
line = line.trim();
|
|
||||||
var ls = line.split(',');
|
|
||||||
if (ls.length == 7) {
|
|
||||||
var ts = parseInt(ls[0]);
|
|
||||||
var fromId = ls[1];
|
|
||||||
var toId = ls[2];
|
|
||||||
var ms = parseFloat(ls[3]);
|
|
||||||
var bytes = parseInt(ls[4]);
|
|
||||||
var timedOut = (ls[5] == 'true') ? true : false;
|
|
||||||
var errMsg = ls[6];
|
|
||||||
|
|
||||||
count += 1.0;
|
|
||||||
overallCount += 1.0;
|
|
||||||
if ((bytes !== EXPECTED_BYTES)||(timedOut)) {
|
|
||||||
totalFailures += 1.0;
|
|
||||||
totalOverallFailures += 1.0;
|
|
||||||
}
|
|
||||||
totalMs += ms;
|
|
||||||
totalData += bytes;
|
|
||||||
|
|
||||||
devices[fromId] = true;
|
|
||||||
devices[toId] = true;
|
|
||||||
|
|
||||||
if (lastBracketTs === 0)
|
|
||||||
lastBracketTs = ts;
|
|
||||||
|
|
||||||
if (((ts - lastBracketTs) >= BRACKET_SIZE)&&(count > 0.0)) {
|
|
||||||
console.log(count.toString()+','+overallCount.toString()+','+(totalMs / count)+','+(totalFailures / count)+','+(totalOverallFailures / overallCount)+','+totalData+','+Object.keys(devices).length);
|
|
||||||
|
|
||||||
count = 0.0;
|
|
||||||
totalFailures = 0.0;
|
|
||||||
totalMs = 0;
|
|
||||||
totalData = 0;
|
|
||||||
lastBracketTs = ts;
|
|
||||||
}
|
|
||||||
} // else ignore junk
|
|
||||||
});
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin
|
|
||||||
|
|
||||||
/zerotier-one -d >>zerotier-one.out 2>&1
|
|
||||||
|
|
||||||
# Wait for ZeroTier to start and join the network
|
|
||||||
while [ ! -d "/proc/sys/net/ipv6/conf/zt0" ]; do
|
|
||||||
sleep 0.25
|
|
||||||
done
|
|
||||||
|
|
||||||
# Wait just a bit longer for stuff to settle
|
|
||||||
sleep 5
|
|
||||||
|
|
||||||
exec node --harmony /agent.js >>agent.out 2>&1
|
|
||||||
#exec node --harmony /agent.js
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
[nodesource]
|
|
||||||
name=Node.js Packages for Enterprise Linux 7 - $basearch
|
|
||||||
baseurl=https://rpm.nodesource.com/pub_4.x/el/7/$basearch
|
|
||||||
failovermethod=priority
|
|
||||||
enabled=1
|
|
||||||
gpgcheck=0
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "zerotier-test-http",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "ZeroTier in-network HTTP test",
|
|
||||||
"main": "agent.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"author": "ZeroTier, Inc.",
|
|
||||||
"license": "GPL-3.0",
|
|
||||||
"dependencies": {
|
|
||||||
"async": "^1.5.0",
|
|
||||||
"express": "^4.13.3",
|
|
||||||
"ipaddr.js": "^1.0.3"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
// ZeroTier distributed HTTP test coordinator and result-reporting server
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
// Customizable parameters:
|
|
||||||
|
|
||||||
var SERVER_PORT = 18080;
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
var fs = require('fs');
|
|
||||||
|
|
||||||
var express = require('express');
|
|
||||||
var app = express();
|
|
||||||
|
|
||||||
app.use(function(req,res,next) {
|
|
||||||
req.rawBody = '';
|
|
||||||
req.on('data', function(chunk) { req.rawBody += chunk.toString(); });
|
|
||||||
req.on('end', function() { return next(); });
|
|
||||||
});
|
|
||||||
|
|
||||||
var knownAgents = {};
|
|
||||||
|
|
||||||
app.post('/:agentId',function(req,res) {
|
|
||||||
var agentId = req.params.agentId;
|
|
||||||
if ((!agentId)||(agentId.length !== 32))
|
|
||||||
return res.status(404).send('');
|
|
||||||
|
|
||||||
if (req.rawBody) {
|
|
||||||
var receiveTime = Date.now();
|
|
||||||
var resultData = null;
|
|
||||||
try {
|
|
||||||
resultData = JSON.parse(req.rawBody);
|
|
||||||
console.log(Date.now().toString()+','+resultData.source+','+resultData.target+','+resultData.time+','+resultData.bytes+','+resultData.timedOut+',"'+((resultData.error) ? resultData.error : '')+'"');
|
|
||||||
} catch (e) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
knownAgents[agentId] = true;
|
|
||||||
var thisUpdate = [];
|
|
||||||
var agents = Object.keys(knownAgents);
|
|
||||||
if (agents.length < 100)
|
|
||||||
thisUpdate = agents;
|
|
||||||
else {
|
|
||||||
for(var xx=0;xx<100;++xx)
|
|
||||||
thisUpdate.push(agents[Math.floor(Math.random() * agents.length)]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.status(200).send(JSON.stringify(thisUpdate));
|
|
||||||
});
|
|
||||||
|
|
||||||
var expressServer = app.listen(SERVER_PORT,function () {
|
|
||||||
console.log('LISTENING ON '+SERVER_PORT);
|
|
||||||
console.log('');
|
|
||||||
});
|
|
||||||
@@ -1,764 +0,0 @@
|
|||||||
*****************************************************************************
|
|
||||||
Anode Protocol Specification Draft
|
|
||||||
Version 0.8
|
|
||||||
|
|
||||||
(c)2009-2010 Adam Ierymenko
|
|
||||||
*****************************************************************************
|
|
||||||
|
|
||||||
Table of Contents
|
|
||||||
|
|
||||||
*****************************************************************************
|
|
||||||
|
|
||||||
1. Introduction
|
|
||||||
|
|
||||||
Anode provides three components that work together to provide a global,
|
|
||||||
secure, and mobile addressing system for computer networks:
|
|
||||||
|
|
||||||
1) An addressing system based on public key cryptography enabling network
|
|
||||||
devices or applications to assign themselves secure, unique, and globally
|
|
||||||
reachable network addresses in a flat address space.
|
|
||||||
|
|
||||||
2) A system enabling network participants holding global addresses to locate
|
|
||||||
one another on local or global networks with "zero configuration."
|
|
||||||
|
|
||||||
3) A communications protocol for communication between addressed network
|
|
||||||
participants that requires no special operating system support and no
|
|
||||||
changes to existing network infrastructure.
|
|
||||||
|
|
||||||
Using Anode, both fixed and mobile applications and devices can communicate
|
|
||||||
directly as if they were all connected to the same VPN. Anode restores the
|
|
||||||
original vision of the Internet as a "flat" network where anything can talk
|
|
||||||
to anything, and adds the added benefits of address mobility and strong
|
|
||||||
protection against address spoofing and other protocol level attacks.
|
|
||||||
|
|
||||||
1.1. Design Philosophy
|
|
||||||
|
|
||||||
Anode's design philosophy is the classical "KISS" principle: "Keep It Simple
|
|
||||||
Stupid." Anode's design principles are:
|
|
||||||
|
|
||||||
#1: Do not try to solve too many problems at once, and stay in scope.
|
|
||||||
|
|
||||||
Anode does not attempt to solve too many problems at once. It attempts to
|
|
||||||
solve the problems of mobile addressing, address portability, and "flat"
|
|
||||||
addressing in the presence of NAT or other barriers.
|
|
||||||
|
|
||||||
It does not attempt to duplicate the full functionality of SSL, X.509, SSH,
|
|
||||||
XMPP, an enterprise service bus, a pub/sub architecture, BitTorrent, etc. All
|
|
||||||
of those protocols and services can be used over Anode if their functionality
|
|
||||||
is desired.
|
|
||||||
|
|
||||||
#2: Avoid state management.
|
|
||||||
|
|
||||||
State multiplies the complexity and failure modes of network protocols. State
|
|
||||||
also tends to get in the way of the achievement of new features implicitly
|
|
||||||
(see principle #4). Avoid state whenever possible.
|
|
||||||
|
|
||||||
#3: Avoid algorithm and dependency bloat.
|
|
||||||
|
|
||||||
Anode uses only elliptic curve Diffie-Hellman (EC-DH) and AES-256. No other
|
|
||||||
cryptographic algorithms or hash functions are presently necessary. This
|
|
||||||
yields implementations compact enough for embedded devices.
|
|
||||||
|
|
||||||
Anode also requires few or no dependencies, depending on whether the two
|
|
||||||
needed cryptographic algorithms are obtained through a library or included.
|
|
||||||
No other protocols or libraries are required in an implementation.
|
|
||||||
|
|
||||||
#4: Achieve features implicitly.
|
|
||||||
|
|
||||||
Use a simple stateless design that allows features to be achieved implicitly
|
|
||||||
rather than specified explicitly. For example, Anode can do multi-homing and
|
|
||||||
could be used to build a mesh network, but neither of these features is
|
|
||||||
explicitly specified.
|
|
||||||
|
|
||||||
*****************************************************************************
|
|
||||||
|
|
||||||
2. Core Concepts and Algorithms
|
|
||||||
|
|
||||||
This section describes addresses, zones, common algorithms, and other core
|
|
||||||
concepts.
|
|
||||||
|
|
||||||
2.1. Zones
|
|
||||||
|
|
||||||
A zone is a 32-bit integer encoded into every Anode address. Zones serve to
|
|
||||||
assist in the location of peers by address on global IP networks. They are
|
|
||||||
not presently significant for local communications, though they could be
|
|
||||||
used to partition addresses into groups or link them with configuration
|
|
||||||
options.
|
|
||||||
|
|
||||||
Each zone has a corresponding zone file which can be fetched in a number of
|
|
||||||
ways (see below). A zone file is a flat text format dictionary of the format
|
|
||||||
"key=value" separated by carriage returns. Line feeds are ignored, and any
|
|
||||||
character may be escaped with a backslash (\) character. Blank lines are
|
|
||||||
ignored.
|
|
||||||
|
|
||||||
The following entries must appear in a zone file:
|
|
||||||
|
|
||||||
n=<zone name>
|
|
||||||
d=<zone description>
|
|
||||||
c=<zone contact, e-mail address of zone administrator>
|
|
||||||
r=<zone revision, monotonically increasing integer with each edit>
|
|
||||||
ttl=<seconds before zone file should be re-checked for changes>
|
|
||||||
|
|
||||||
Additional fields may appear as well, including fields specific to special
|
|
||||||
applications or protocols supported within the zone. Some of these are
|
|
||||||
defined in this document.
|
|
||||||
|
|
||||||
Zone file fetching mechanisms are described below. Multiple mechanisms are
|
|
||||||
specified to enable fallback in the event that one mechanism is not available.
|
|
||||||
|
|
||||||
2.1.1. Zone File Retrieval
|
|
||||||
|
|
||||||
Zone files are retrieved via HTTP, with the HTTP address being formed in one
|
|
||||||
of two ways.
|
|
||||||
|
|
||||||
The preferred DNS method:
|
|
||||||
|
|
||||||
To fetch a zone file via DNS, use the zone ID to generate a host name and URI
|
|
||||||
of the form:
|
|
||||||
|
|
||||||
http://a--XXXXXXXX.net/z
|
|
||||||
|
|
||||||
The XXXXXXXX field is the zone ID in hexadecimal.
|
|
||||||
|
|
||||||
The fallback IP method:
|
|
||||||
|
|
||||||
For fallback in the absence of DNS, the zone ID can be used directly as an
|
|
||||||
IPv4 or IPv4-mapped-to-IPv6 IP address. A URI is generated of the form:
|
|
||||||
|
|
||||||
http://ip_address/z
|
|
||||||
|
|
||||||
Support for this method requires that a zone ID be chosen to correspond to a
|
|
||||||
permanent IPv4 (preferably mappable to IPv6 space as well) IP address.
|
|
||||||
|
|
||||||
2.1.2. Zone ID Reservation
|
|
||||||
|
|
||||||
By convention, a zone ID is considered reserved when a domain of the form
|
|
||||||
"a--XXXXXXXX.net" (where XXXXXXXX is the ID in hex) is registered.
|
|
||||||
|
|
||||||
It is recommended that this be done even for zone IDs not used for global
|
|
||||||
address location in order to globally reserve them.
|
|
||||||
|
|
||||||
2.2. Addresses
|
|
||||||
|
|
||||||
Anode addresses are binary strings containing a 32-bit zone ID, a public key,
|
|
||||||
and possibly other fields. Only one address type is presently defined:
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Name | Type ID | Elliptic Curve Parameters | Total Length |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| ANODE-256-40 | 1 | NIST-P-256 | 40 |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Name | Binary Layout |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| ANODE-256-40 | <type[1]><zone[4]><unused[2]><public key[33]> |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
The public key is a "compressed" form elliptic curve public key as described
|
|
||||||
in RFC5480.
|
|
||||||
|
|
||||||
The unused section of the address must be zero. These bytes are reserved for
|
|
||||||
future use.
|
|
||||||
|
|
||||||
2.2.1. ASCII Format For Addresses
|
|
||||||
|
|
||||||
Addresses are encoded in ASCII using base-32, which provides a quotable and
|
|
||||||
printable encoding that is of manageable length and is case-insensitive. For
|
|
||||||
example, an ANODE-256-40 address is 64 characters long in base-32 encoding.
|
|
||||||
|
|
||||||
2.3. Relaying
|
|
||||||
|
|
||||||
An Anode peer may optionally relay packets to any other reachable peer.
|
|
||||||
Relaying is accomplished by sending a packet to a peer with the recipient set
|
|
||||||
to the final recipient. The receiving peer will, if relaying is allowed and if
|
|
||||||
it knows of or can reach the recipient, forward the packet.
|
|
||||||
|
|
||||||
No error is returned if relaying fails, so relay paths are treated as possible
|
|
||||||
paths for communication until a return is received in the same way as direct
|
|
||||||
paths.
|
|
||||||
|
|
||||||
Relaying can be used by peers to send messages indirectly, locate one
|
|
||||||
another, and determine network location information to facilitate the
|
|
||||||
establishment of direct communications.
|
|
||||||
|
|
||||||
Peers may refuse to relay or may limit the transmission rate at which packets
|
|
||||||
can be relayed.
|
|
||||||
|
|
||||||
2.3.1. Zone Relays
|
|
||||||
|
|
||||||
If a zone's addresses are globally reachable on global IP networks, it must
|
|
||||||
have one or more zone relays. These must have globally reachable public
|
|
||||||
static IP addresses.
|
|
||||||
|
|
||||||
Zone relays are specified in the zone file in the following format:
|
|
||||||
|
|
||||||
zr.<address checksum>=<ip>[,<ip>]:<udp port>:<tcp port>:<anode addresses>
|
|
||||||
|
|
||||||
The address checksum is the sum of the bytes in the Anode address modulus
|
|
||||||
the number of "zr" entries, in hexadecimal. For example, if a zone had four
|
|
||||||
global relays its zone file could contain the lines:
|
|
||||||
|
|
||||||
zr.0=1.2.3.4:4343:4344:klj4j3...
|
|
||||||
zr.1=2.3.4.5:4343:4344:00194j...
|
|
||||||
zr.2=3.4.5.6:4343:4344:1j42zz...
|
|
||||||
zr.3=4.5.6.7:4343:4344:z94j1q...
|
|
||||||
|
|
||||||
The relay would be chosen by taking the sum of the bytes in the address
|
|
||||||
modulo 4. For example, if the bytes of an address sum to 5081 then relay
|
|
||||||
zr.1 would be used to communicate with that address.
|
|
||||||
|
|
||||||
If more than one IP address is listed for a given relay, the peer must choose
|
|
||||||
at random from among the addresses of the desired type (IPv4 or IPv6).
|
|
||||||
|
|
||||||
Each relay must have one Anode address for every address type supported within
|
|
||||||
the zone. (At present there is only one address type defined.)
|
|
||||||
|
|
||||||
Peers should prefer UDP and fall back to TCP only if UDP is not available.
|
|
||||||
|
|
||||||
To make itself available, a peer must make itself known to its designated zone
|
|
||||||
relay. This is accomplished by sending a PING message.
|
|
||||||
|
|
||||||
2.4. Key Agreement and Derivation
|
|
||||||
|
|
||||||
Key agreement is performed using elliptic curve Diffie-Hellman. This yields
|
|
||||||
a raw key whose size depends on the elliptic curve parameters in use.
|
|
||||||
|
|
||||||
The following algorithm is used to derive a key of any length from a raw
|
|
||||||
key generated through key agreement:
|
|
||||||
|
|
||||||
1) Zero the derived key buffer.
|
|
||||||
2) Determine the largest of the original raw key or the derived key.
|
|
||||||
3) Loop from 0 to the largest length determined in step 2, XOR each byte of
|
|
||||||
the derived key buffer with the corresponding byte of the original key
|
|
||||||
buffer with each index being modulus the length of the respective buffer.
|
|
||||||
|
|
||||||
2.5. Message Authentication
|
|
||||||
|
|
||||||
For message authentication, CMAC-AES (with AES-256) is used. This is also
|
|
||||||
known in some literature as OMAC1-AES. The key is derived from key agreement
|
|
||||||
between the key pair of the sending peer and the address of the recipient.
|
|
||||||
|
|
||||||
2.6. AES-DIGEST
|
|
||||||
|
|
||||||
To maintain cryptographic algorithm frugality, a cryptographic hash function
|
|
||||||
is constructed from the AES-256 cipher. This hash function uses the common
|
|
||||||
Davis-Meyer construction with Merkle-Damgård length padding.
|
|
||||||
|
|
||||||
It is described by the following pseudocode:
|
|
||||||
|
|
||||||
byte previous_digest[16]
|
|
||||||
byte digest[16] = { 0,0,... }
|
|
||||||
byte block[32] = { 0,0,... }
|
|
||||||
integer block_counter = 0
|
|
||||||
|
|
||||||
; digest message
|
|
||||||
for each byte b of message
|
|
||||||
block[block_counter] = b
|
|
||||||
block_counter = block_counter + 1
|
|
||||||
if block_counter == 32 then
|
|
||||||
block_counter = 0
|
|
||||||
save digest[] in previous_digest[]
|
|
||||||
encrypt digest[] with aes-256 using block[] as 256-bit aes-256 key
|
|
||||||
xor digest[] with previous_digest[]
|
|
||||||
end if
|
|
||||||
next
|
|
||||||
|
|
||||||
; append end marker, do final block
|
|
||||||
block[block_counter] = 0x80
|
|
||||||
block_counter = block_counter + 1
|
|
||||||
zero rest of block[] from block_counter to 15
|
|
||||||
save digest[] in previous_digest[]
|
|
||||||
encrypt digest[] with aes-256 using block[] as 256-bit aes-256 key
|
|
||||||
xor digest[] with previous_digest[]
|
|
||||||
|
|
||||||
; Merkle-Damgård length padding
|
|
||||||
zero first 8 bytes of block[]
|
|
||||||
fill last 8 bytes of block[] w/64-bit length in big-endian order
|
|
||||||
save digest[] in previous_digest[]
|
|
||||||
encrypt digest[] with aes-256 using block[] as 256-bit aes-128 key
|
|
||||||
xor digest[] with previous_digest[]
|
|
||||||
|
|
||||||
; digest[] now contains 128-bit message digest
|
|
||||||
|
|
||||||
2.7. Short Address Identifiers (Address IDs)
|
|
||||||
|
|
||||||
A short 8-byte version of the Anode address is used in the protocol to reduce
|
|
||||||
transmission overhead when both sides are already aware of the other's full
|
|
||||||
address.
|
|
||||||
|
|
||||||
The short address identifier is formed by computing the AES-DIGEST of the
|
|
||||||
full address and then XORing the first 8 bytes of the digest with the last
|
|
||||||
8 bytes to yield an 8-byte shortened digest.
|
|
||||||
|
|
||||||
2.8. DNS Resolution of Anode Addresses
|
|
||||||
|
|
||||||
Anode addresses can be saved in DNS TXT records in the following format:
|
|
||||||
|
|
||||||
anode:<address in base32 ASCII encoding>
|
|
||||||
|
|
||||||
This permits Anode addresses to be resolved from normal DNS host name.
|
|
||||||
|
|
||||||
2.9. Packet Transmission Mechanisms
|
|
||||||
|
|
||||||
2.9.1. UDP Transmission
|
|
||||||
|
|
||||||
The recommended method of sending Anode packets is UDP. Each packet is simply
|
|
||||||
sent as a UDP packet.
|
|
||||||
|
|
||||||
2.9.2. TCP Transmission
|
|
||||||
|
|
||||||
To send packets over TCP, each packet is prefixed by its size as a 16-bit
|
|
||||||
integer.
|
|
||||||
|
|
||||||
2.9.3. HTTP Transmission
|
|
||||||
|
|
||||||
Anode packets may be submitted in HTTP POST transactions for transport over
|
|
||||||
networks where HTTP is the only available protocol.
|
|
||||||
|
|
||||||
Anode packets are simply prefixed with a 16-byte packet size and concatenated
|
|
||||||
together just as they are in a TCP stream. One or more packets may be sent
|
|
||||||
with each HTTP POST transaction for improved performance.
|
|
||||||
|
|
||||||
Since this method is intended for use in "hostile" or highly restricted
|
|
||||||
circumstances, no additional details such as special headers or MIME types
|
|
||||||
are specified to allow maximum flexibility. Peers should ignore anything
|
|
||||||
other than the payload.
|
|
||||||
|
|
||||||
2.10. Endpoints
|
|
||||||
|
|
||||||
An endpoint indicates a place where Anode packets may be sent. The following
|
|
||||||
endpoint types are specified:
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Endpoint Type | Description | Address Format |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| 0x00 | Unspecified | (none) |
|
|
||||||
| 0x01 | Ethernet | <mac[6]> |
|
|
||||||
| 0x02 | UDP/IPv4 | <ip[4]><port[2]> |
|
|
||||||
| 0x03 | TCP/IPv4 | <ip[4]><port[2]> |
|
|
||||||
| 0x04 | UDP/IPv6 | <ip[16]><port[2]> |
|
|
||||||
| 0x05 | TCP/IPv6 | <ip[16]><port[2]> |
|
|
||||||
| 0x06 | HTTP | <null-terminated full URI> |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
Endpoints are encoded by beginning with a single byte indicating the endpoint
|
|
||||||
type followed by the address information required for the given type.
|
|
||||||
|
|
||||||
Note that IP ports bear no relationship to Anode protocol ports.
|
|
||||||
|
|
||||||
2.11. Notes
|
|
||||||
|
|
||||||
All integers in the protocol are transmitted in network (big endian) byte
|
|
||||||
order.
|
|
||||||
|
|
||||||
*****************************************************************************
|
|
||||||
|
|
||||||
3. Common Packet Format
|
|
||||||
|
|
||||||
A common header is used for all Anode packets:
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Hop Count | 1 | 8-bit hop count (not included in MAC) |
|
|
||||||
| Flags | 1 | 8-bit flags |
|
|
||||||
| MAC | 8 | 8 byte shortened CMAC-AES of packet |
|
|
||||||
| Sender Address | ? | Full address or short ID of sender |
|
|
||||||
| Recipient Address | ? | Full address or short ID of recipient |
|
|
||||||
| Peer IDs | 1 | Two 4-bit peer IDs: sender, recipient |
|
|
||||||
| Message Type | 1 | 8-bit message type |
|
|
||||||
| Message | ? | Message payload |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
3.1. Hop Count
|
|
||||||
|
|
||||||
The hop count begins at zero and must be incremented by each peer that relays
|
|
||||||
the packet to another peer. The hop count must not wrap to zero at 255.
|
|
||||||
|
|
||||||
Because the hop count is modified in transit, it is not included in MAC
|
|
||||||
calculation or authentication.
|
|
||||||
|
|
||||||
The hop count is used to prioritize endpoints that are direct over endpoints
|
|
||||||
that involve relaying, or to prioritize closer routes over more distant
|
|
||||||
ones.
|
|
||||||
|
|
||||||
3.2. Flags and Flag Behavior
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Flag | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| 0x01 | Sender address fully specified |
|
|
||||||
| 0x02 | Recipient address fully specified |
|
|
||||||
| 0x04 | Authentication error response |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
If flag 0x01 is set, then the sender address will be the full address rather
|
|
||||||
than a short address identifier. The length of the address can be determined
|
|
||||||
from the first byte of the address, which always specifies the address type.
|
|
||||||
Flag 0x02 has the same meaning for the recipient address.
|
|
||||||
|
|
||||||
A peer must send fully specified sender addresses until it receives a response
|
|
||||||
from the recipient. At this point the sender may assume that the recipient
|
|
||||||
knows its address and use short a short sender address instead. This
|
|
||||||
assumption should time out, with a recommended timeout of 60 seconds.
|
|
||||||
|
|
||||||
There is presently no need to send fully specified recipient addresses, but
|
|
||||||
the flag is present in case it is needed and must be honored.
|
|
||||||
|
|
||||||
Flag 0x04 indicates that this is an error response containing a failed
|
|
||||||
authentication error. Since authentication failed, this packet may not have
|
|
||||||
a valid MAC. Packets with this flag must never have any effect other than
|
|
||||||
to inform of an error. This error, since it is unauthenticated, must never
|
|
||||||
have any side effects such as terminating a connection.
|
|
||||||
|
|
||||||
3.3. MAC
|
|
||||||
|
|
||||||
The MAC is calculated as follows:
|
|
||||||
|
|
||||||
1) Temporarily set the 64-bit/8-byte MAC field in the packet to the packet's
|
|
||||||
size as a 64-bit big-endian integer.
|
|
||||||
2) Calculate the MAC for the entire packet (excluding the first byte) using
|
|
||||||
the key agreed upon between the sender and the recipient, resulting in a
|
|
||||||
16 byte full CMAC-AES MAC.
|
|
||||||
3) Derive the 8 byte packet MAC by XORing the first 8 bytes of the full 16
|
|
||||||
byte CMAC-AES MAC with the last 8 bytes. Place this into the packet's MAC
|
|
||||||
field.
|
|
||||||
|
|
||||||
3.4. Peer IDs
|
|
||||||
|
|
||||||
Peer IDs provide a method for up to 15 different peers to share an address,
|
|
||||||
each with a unique ID allowing packets to be routed to them individually.
|
|
||||||
|
|
||||||
A peer ID of zero indicates "any" or "unspecified." Real peers must have a
|
|
||||||
nonzero peer ID. In the normal single peer per address case, any peer ID may
|
|
||||||
be used. If multiple peers are to share an address, some implementation-
|
|
||||||
dependent method must be used to ensure that each peer has a unique peer ID.
|
|
||||||
|
|
||||||
Relaying peers must follow these rules based on the recipient peer ID when
|
|
||||||
relaying messages:
|
|
||||||
|
|
||||||
- IF the peer ID is zero or if the peer ID is not known, the message must
|
|
||||||
be forwarded to a random endpoint for the given recipient address.
|
|
||||||
- IF the peer ID is nonzero and matches one or more known endpoints for the
|
|
||||||
given recipient address and peer ID, the message must only be sent to
|
|
||||||
a matching endpoint.
|
|
||||||
|
|
||||||
A receiving peer should process any message that it receives regardless of
|
|
||||||
whether its recipient peer ID is correct. The peer ID is primarily for relays.
|
|
||||||
|
|
||||||
Peers should typically send messages with a nonzero recipient peer ID when
|
|
||||||
responding to or involved in a conversation with a specific peer (e.g. a
|
|
||||||
streaming connection), and send zero recipient peer IDs otherwise.
|
|
||||||
|
|
||||||
3.5. Short Address Conflict Disambiguation
|
|
||||||
|
|
||||||
In the unlikely event of two Anode addresses with the same short identifier,
|
|
||||||
the recipient should use MAC validation to disambiguate. The peer ID must not
|
|
||||||
be relied upon for this purpose.
|
|
||||||
|
|
||||||
*****************************************************************************
|
|
||||||
|
|
||||||
4. Basic Signaling and Transport Protocol
|
|
||||||
|
|
||||||
4.1. Message Types
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Type | ID | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| ERROR | 0x00 | Error response |
|
|
||||||
| PING | 0x01 | Echo request |
|
|
||||||
| PONG | 0x02 | Echo response |
|
|
||||||
| EPC_REQ | 0x03 | Endpoint check request |
|
|
||||||
| EPC | 0x04 | Endpoint check response |
|
|
||||||
| EPI | 0x05 | Endpoint information |
|
|
||||||
| NAT_T | 0x06 | NAT traversal message |
|
|
||||||
| NETID_REQ | 0x07 | Request network address identification and/or test |
|
|
||||||
| NETID | 0x08 | Response to network address identification request |
|
|
||||||
| DGRAM | 0x09 | Simple UDP-like datagram |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
4.2. Message Details
|
|
||||||
|
|
||||||
4.2.1. ERROR
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Error Code | 2 | 16-bit error code |
|
|
||||||
| Error Arguments | ? | Error arguments, depending on error type |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
Error arguments are empty unless otherwise stated below.
|
|
||||||
|
|
||||||
Error codes:
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Error Code | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| 0x01 | Message not valid |
|
|
||||||
| 0x02 | Message authentication or decryption failed |
|
|
||||||
| 0x03 | Relaying and related features not authorized |
|
|
||||||
| 0x04 | Relay recipient not reachable |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
Generation of errors is optional. A peer may choose to ignore invalid
|
|
||||||
messages or to throttle the sending of errors.
|
|
||||||
|
|
||||||
4.2.2. PING
|
|
||||||
|
|
||||||
(Payload unspecified.)
|
|
||||||
|
|
||||||
Request echo of payload as PONG message.
|
|
||||||
|
|
||||||
4.2.3. PONG
|
|
||||||
|
|
||||||
(Payload unspecified.)
|
|
||||||
|
|
||||||
Echoed payload of received PING message.
|
|
||||||
|
|
||||||
4.2.4. EPC_REQ
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Request ID | 4 | 32-bit request ID |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
Request echo of request ID in EPC message, used to check and learn endpoints.
|
|
||||||
|
|
||||||
To learn a network endpoint for a peer, CHECK_REQ is sent. If CHECK is
|
|
||||||
returned with a valid request ID, the endpoint is considered valid.
|
|
||||||
|
|
||||||
4.2.5. EPC
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Request ID | 4 | 32-bit request ID echoed back |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
Response to EPC_REQ containing request ID.
|
|
||||||
|
|
||||||
4.2.6. EPI
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Flags | 1 | 8-bit flags |
|
|
||||||
| Endpoint | ? | Endpoint type and address |
|
|
||||||
| NAT-T mode | 1 | 8-bit NAT traversal mode |
|
|
||||||
| NAT-T options | ? | Options related to specified NAT-T mode |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
EPI stands for EndPoint Identification, and is sent to notify another peer of
|
|
||||||
a network endpoint where the sending peer is reachable.
|
|
||||||
|
|
||||||
If the receiving peer is interested in communicating with the sending peer,
|
|
||||||
the receiving peer must send EPC_REQ to the sending peer at the specified
|
|
||||||
endpoint to check the validity of that endpoint. The endpoint is learned if a
|
|
||||||
valid EPC is returned.
|
|
||||||
|
|
||||||
If the endpoint in EPI is unspecified, the actual source of the EPI message
|
|
||||||
is the endpoint. This allows EPI messages to be broadcast on a local LAN
|
|
||||||
segment to advertise the presence of an address on a local network. EPI
|
|
||||||
broadcasts on local IP networks must be made to UDP port 8737.
|
|
||||||
|
|
||||||
Usually EPI is sent via relays (usually zone relays) to inform a peer of an
|
|
||||||
endpoint for direct communication.
|
|
||||||
|
|
||||||
There are presently no flags, so flags must be zero.
|
|
||||||
|
|
||||||
4.2.7. NAT_T
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| NAT-T mode | 1 | 8-bit NAT traversal mode |
|
|
||||||
| NAT-T options | ? | Options related to specified NAT-T mode |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
NAT_T is used to send messages specific to certain NAT traversal modes.
|
|
||||||
|
|
||||||
4.2.8. NETID_REQ
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Request ID | 4 | 32-bit request ID |
|
|
||||||
| Endpoint | ? | Endpoint type and address information |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
When a NETID_REQ message is received, the recipient attempts to echo it back
|
|
||||||
as a NETID message to the specified endpoint address. If the endpoint is
|
|
||||||
unspecified, the recipient must fill it in with the actual origin of the
|
|
||||||
NETID_REQ message. This allows a peer to cooperate with another peer (usually
|
|
||||||
a zone relay) to empirically determine its externally visible network
|
|
||||||
address information.
|
|
||||||
|
|
||||||
A peer may ignore NETID_REQ or respond with an error if it does not allow
|
|
||||||
relaying.
|
|
||||||
|
|
||||||
4.2.9. NETID
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Request ID | 4 | 32-bit request ID echoed back |
|
|
||||||
| Endpoint Type | 1 | 8-bit endpoint type |
|
|
||||||
| Endpoint Address | ? | Endpoint Address (size depends on type) |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
NETID is sent in response to NETID_REQ to the specified endpoint address. It
|
|
||||||
always contains the endpoint address to which it was sent.
|
|
||||||
|
|
||||||
4.2.10. DGRAM
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Source Port | 2 | 16-bit source port |
|
|
||||||
| Destination Port | 2 | 16-bit destination port |
|
|
||||||
| Payload | ? | Datagram packet payload |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
A datagram is a UDP-like message without flow control or delivery assurance.
|
|
||||||
|
|
||||||
*****************************************************************************
|
|
||||||
|
|
||||||
5. Stream Protocol
|
|
||||||
|
|
||||||
The stream protocol is very similar to TCP, though it omits some features
|
|
||||||
that are not required since they are taken care of by the encapsulating
|
|
||||||
protocol. SCTP was also an inspiration in the design.
|
|
||||||
|
|
||||||
5.1. Message Types
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Type | ID | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| S_OPEN | 20 | Initiate a streaming connection (like TCP SYN) |
|
|
||||||
| S_CLOSE | 21 | Terminate a streaming connection (like TCP RST/FIN) |
|
|
||||||
| S_DATA | 22 | Data packet |
|
|
||||||
| S_ACK | 23 | Acknowedge receipt of one or more data packets |
|
|
||||||
| S_DACK | 24 | Combination of DATA and ACK |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
5.2. Message Details
|
|
||||||
|
|
||||||
5.2.1. S_OPEN
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Sender Link ID | 2 | 16-bit sender link ID |
|
|
||||||
| Destination Port | 2 | 16-bit destination port |
|
|
||||||
| Window Size | 2 | 16-bit window size in 1024-byte increments |
|
|
||||||
| Init. Seq. Number | 4 | 32-bit initial sequence number |
|
|
||||||
| Flags | 1 | 8-bit flags |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
The OPEN message corresponds to TCP SYN, and initiates a connection. It
|
|
||||||
specifies the initial window size for the sender and the sender's initial
|
|
||||||
sequence number, which should be randomly chosen to prevent replay attacks.
|
|
||||||
|
|
||||||
If OPEN is successful, the recipient sends its own OPEN to establish the
|
|
||||||
connetion. If OPEN is unsuccessful, CLOSE is sent with its initial and current
|
|
||||||
sequence numbers equal and an appropriate reason such as "connection refused."
|
|
||||||
|
|
||||||
The sender link ID must be unique for a given recipient.
|
|
||||||
|
|
||||||
If flag 01 is set, the sender link ID is actually a source port where the
|
|
||||||
sender might be listening for connections as well. This exactly duplicates
|
|
||||||
the behavior of standard TCP. Otherwise, the sender link ID is simply an
|
|
||||||
arbitrary number that the sender uses to identify the connection with this
|
|
||||||
recipient and there is no port of origin. Ports of origin are optional for
|
|
||||||
Anode streaming connections to permit greater scalability.
|
|
||||||
|
|
||||||
5.2.2. S_CLOSE
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Sender Link ID | 2 | 16-bit sender link ID |
|
|
||||||
| Destination Port | 2 | 16-bit destination port |
|
|
||||||
| Flags | 1 | 8-bit flags |
|
|
||||||
| Reason | 1 | 8-bit close reason |
|
|
||||||
| Init. Seq. Number | 4 | 32-bit initial sequence number |
|
|
||||||
| Sequence Number | 4 | 32-bit current sequence number |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
The CLOSE message serves a function similar to TCP FIN. The initial sequence
|
|
||||||
number is the original starting sequence number sent with S_OPEN, while the
|
|
||||||
current sequence number is the sequence number corresponding to the close
|
|
||||||
and must be ACKed to complete the close operation. The use of the initial
|
|
||||||
sequence number helps to serve as a key to prevent replay attacks.
|
|
||||||
|
|
||||||
CLOSE is also used to indicate a failed OPEN attempt. In this case the current
|
|
||||||
sequence number will be equal to the initial sequence number and no ACK will
|
|
||||||
be expected.
|
|
||||||
|
|
||||||
There are currently no flags, so flags must be zero.
|
|
||||||
|
|
||||||
The reason field describes the reason for the close:
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Reason Code | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| 00 | Application closed connection |
|
|
||||||
| 01 | Connection refused |
|
|
||||||
| 02 | Protocol error |
|
|
||||||
| 03 | Timed out |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
Established connections will usually be closed with reason 00, while reason
|
|
||||||
01 is usually provided if an OPEN is received but the port is not bound.
|
|
||||||
|
|
||||||
5.2.3. S_DATA
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Sender Link ID | 2 | 16-bit sender link ID |
|
|
||||||
| Destination Port | 2 | 16-bit destination port |
|
|
||||||
| Sequence Number | 4 | 32-bit sequence number |
|
|
||||||
| Payload | ? | Data payload |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
The DATA message carries a packet of data, with the sequence number
|
|
||||||
determining order. The sequence number is monotonically incremented with
|
|
||||||
each data packet, and wraps at the maximum value of an unsigned 32-bit
|
|
||||||
integer.
|
|
||||||
|
|
||||||
5.2.4. S_ACK
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Sender Link ID | 2 | 16-bit sender link ID |
|
|
||||||
| Destination Port | 2 | 16-bit destination port |
|
|
||||||
| Window Size | 2 | 16-bit window size in 1024-byte increments |
|
|
||||||
| Acknowledgements | ? | One or more acknowledgements (see below) |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
Each acknowledgement is a 32-bit integer followed by an 8-bit integer (5 bytes
|
|
||||||
total). The 32-bit integer is the first sequence number to acknowledge, and
|
|
||||||
the 8-bit integer is the number of sequential following sequence numbers to
|
|
||||||
acknowledge. For example "1, 4" would acknowledge sequence numbers 1, 2, 3,
|
|
||||||
and 4.
|
|
||||||
|
|
||||||
5.2.5. S_DACK
|
|
||||||
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Field | Length | Description |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
| Sender Link ID | 2 | 16-bit sender link ID |
|
|
||||||
| Destination Port | 2 | 16-bit destination port |
|
|
||||||
| Window Size | 2 | 16-bit window size in 1024-byte increments |
|
|
||||||
| Num. Acks | 1 | 8-bit number of acknowledgements |
|
|
||||||
| Acknowledgements | ? | One or more acknowledgements |
|
|
||||||
| Payload | ? | Data payload |
|
|
||||||
|---------------------------------------------------------------------------|
|
|
||||||
|
|
||||||
The DACK message combines ACK and DATA, allowing two peers that are both
|
|
||||||
transmitting data to efficiently ACK without a separate packet.
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
Network Controller Implementation
|
|
||||||
======
|
|
||||||
|
|
||||||
This folder contains code implementing the node/NetworkController.hpp interface to allow ZeroTier nodes to create and manage virtual networks.
|
|
||||||
|
|
||||||
### Building
|
|
||||||
|
|
||||||
By default this code is not built or included in the client. To build on Linux, BSD, or Mac add `ZT_ENABLE_NETWORK_CONTROLLER=1` to the make command line. You'll need the development headers for Sqlite3 installed. They ship as part of OSX and Xcode. On Linux or BSD you'll probably need to install a package.
|
|
||||||
|
|
||||||
### Running
|
|
||||||
|
|
||||||
When started, a controller-enabled build of ZeroTier One will automatically create and initialize a *controller.db* in its home folder. This is where all the controller's data and persistent state lives.
|
|
||||||
|
|
||||||
Since Sqlite3 supports multiple processes attached to the same database, it is safe to back up a running database with the command line *sqlite3* utility:
|
|
||||||
|
|
||||||
sqlite3 /path/to/controller.db .dump
|
|
||||||
|
|
||||||
In production ZeroTier runs this frequently and keeps many timestamped copies going back about a week. These are also backed up (encrypted) to Amazon S3 along with the rest of our data.
|
|
||||||
|
|
||||||
### Administrating
|
|
||||||
|
|
||||||
See service/README.md for documentation on the JSON API presented by this network controller implementation. Also see *nodejs-zt1-client* for a NodeJS JavaScript interface.
|
|
||||||
|
|
||||||
### Reliability
|
|
||||||
|
|
||||||
Network controllers can go offline without affecting already-configured members of running networks. You just won't be able to change anything and new members will not be able to join.
|
|
||||||
|
|
||||||
High-availability can be implemented through fail-over. A simple method involves making a frequent backup of the SQLite database (use the SQLite command line client to do this safely) and the network configuration master's working directory. Then, if the master goes down, another instance of it can rapidly be provisioned elsewhere. Since ZeroTier addresses are mobile, the new instance will quickly (usually no more than 30s) take over for the old one and service requests.
|
|
||||||
|
|
||||||
### Limits
|
|
||||||
|
|
||||||
A single network configuration master can administrate up to 2^24 (~16m) networks as per the ZeroTier protocol limit. There is no hard limit on the number of clients, though millions or more would impose significant CPU demands on a server. Optimizations could be implemented such as memoization/caching to reduce this.
|
|
||||||
@@ -1,191 +0,0 @@
|
|||||||
/*
|
|
||||||
* ZeroTier One - Network Virtualization Everywhere
|
|
||||||
* Copyright (C) 2011-2015 ZeroTier, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* --
|
|
||||||
*
|
|
||||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
|
||||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
|
||||||
*
|
|
||||||
* If you would like to embed ZeroTier into a commercial application or
|
|
||||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
|
||||||
* LLC. Start here: http://www.zerotier.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ZT_SQLITENETWORKCONTROLLER_HPP
|
|
||||||
#define ZT_SQLITENETWORKCONTROLLER_HPP
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <sqlite3.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "../node/Constants.hpp"
|
|
||||||
#include "../node/NetworkController.hpp"
|
|
||||||
#include "../node/Mutex.hpp"
|
|
||||||
#include "../osdep/Thread.hpp"
|
|
||||||
|
|
||||||
// Number of in-memory last log entries to maintain per user
|
|
||||||
#define ZT_SQLITENETWORKCONTROLLER_IN_MEMORY_LOG_SIZE 32
|
|
||||||
|
|
||||||
// How long do circuit tests last before they're forgotten?
|
|
||||||
#define ZT_SQLITENETWORKCONTROLLER_CIRCUIT_TEST_TIMEOUT 60000
|
|
||||||
|
|
||||||
namespace ZeroTier {
|
|
||||||
|
|
||||||
class Node;
|
|
||||||
|
|
||||||
class SqliteNetworkController : public NetworkController
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SqliteNetworkController(Node *node,const char *dbPath,const char *circuitTestPath);
|
|
||||||
virtual ~SqliteNetworkController();
|
|
||||||
|
|
||||||
virtual NetworkController::ResultCode doNetworkConfigRequest(
|
|
||||||
const InetAddress &fromAddr,
|
|
||||||
const Identity &signingId,
|
|
||||||
const Identity &identity,
|
|
||||||
uint64_t nwid,
|
|
||||||
const NetworkConfigRequestMetaData &metaData,
|
|
||||||
Buffer<8194> &netconf);
|
|
||||||
|
|
||||||
unsigned int handleControlPlaneHttpGET(
|
|
||||||
const std::vector<std::string> &path,
|
|
||||||
const std::map<std::string,std::string> &urlArgs,
|
|
||||||
const std::map<std::string,std::string> &headers,
|
|
||||||
const std::string &body,
|
|
||||||
std::string &responseBody,
|
|
||||||
std::string &responseContentType);
|
|
||||||
unsigned int handleControlPlaneHttpPOST(
|
|
||||||
const std::vector<std::string> &path,
|
|
||||||
const std::map<std::string,std::string> &urlArgs,
|
|
||||||
const std::map<std::string,std::string> &headers,
|
|
||||||
const std::string &body,
|
|
||||||
std::string &responseBody,
|
|
||||||
std::string &responseContentType);
|
|
||||||
unsigned int handleControlPlaneHttpDELETE(
|
|
||||||
const std::vector<std::string> &path,
|
|
||||||
const std::map<std::string,std::string> &urlArgs,
|
|
||||||
const std::map<std::string,std::string> &headers,
|
|
||||||
const std::string &body,
|
|
||||||
std::string &responseBody,
|
|
||||||
std::string &responseContentType);
|
|
||||||
|
|
||||||
// threadMain() for backup thread -- do not call directly
|
|
||||||
void threadMain()
|
|
||||||
throw();
|
|
||||||
|
|
||||||
private:
|
|
||||||
enum IpAssignmentType {
|
|
||||||
// IP assignment is a static IP address
|
|
||||||
ZT_IP_ASSIGNMENT_TYPE_ADDRESS = 0,
|
|
||||||
// IP assignment is a network -- a route via this interface, not an address
|
|
||||||
ZT_IP_ASSIGNMENT_TYPE_NETWORK = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned int _doCPGet(
|
|
||||||
const std::vector<std::string> &path,
|
|
||||||
const std::map<std::string,std::string> &urlArgs,
|
|
||||||
const std::map<std::string,std::string> &headers,
|
|
||||||
const std::string &body,
|
|
||||||
std::string &responseBody,
|
|
||||||
std::string &responseContentType);
|
|
||||||
NetworkController::ResultCode _doNetworkConfigRequest(
|
|
||||||
const InetAddress &fromAddr,
|
|
||||||
const Identity &signingId,
|
|
||||||
const Identity &identity,
|
|
||||||
uint64_t nwid,
|
|
||||||
const NetworkConfigRequestMetaData &metaData,
|
|
||||||
Buffer<8194> &netconf);
|
|
||||||
|
|
||||||
static void _circuitTestCallback(ZT_Node *node,ZT_CircuitTest *test,const ZT_CircuitTestReport *report);
|
|
||||||
|
|
||||||
Node *_node;
|
|
||||||
Thread _backupThread;
|
|
||||||
volatile bool _backupThreadRun;
|
|
||||||
std::string _dbPath;
|
|
||||||
std::string _circuitTestPath;
|
|
||||||
std::string _instanceId;
|
|
||||||
|
|
||||||
// Circuit tests outstanding
|
|
||||||
struct _CircuitTestEntry
|
|
||||||
{
|
|
||||||
ZT_CircuitTest *test;
|
|
||||||
std::string jsonResults;
|
|
||||||
};
|
|
||||||
std::map< uint64_t,_CircuitTestEntry > _circuitTests;
|
|
||||||
|
|
||||||
// Last request time by address, for rate limitation
|
|
||||||
std::map< std::pair<uint64_t,uint64_t>,uint64_t > _lastRequestTime;
|
|
||||||
|
|
||||||
sqlite3 *_db;
|
|
||||||
|
|
||||||
sqlite3_stmt *_sGetNetworkById;
|
|
||||||
sqlite3_stmt *_sGetMember;
|
|
||||||
sqlite3_stmt *_sCreateMember;
|
|
||||||
sqlite3_stmt *_sGetNodeIdentity;
|
|
||||||
sqlite3_stmt *_sCreateOrReplaceNode;
|
|
||||||
sqlite3_stmt *_sGetMaxNodeHistoryNetworkVisitCounter;
|
|
||||||
sqlite3_stmt *_sAddNodeHistoryEntry;
|
|
||||||
sqlite3_stmt *_sDeleteOldNodeHistoryEntries;
|
|
||||||
sqlite3_stmt *_sGetActiveNodesOnNetwork;
|
|
||||||
sqlite3_stmt *_sGetNodeHistory;
|
|
||||||
sqlite3_stmt *_sGetEtherTypesFromRuleTable;
|
|
||||||
sqlite3_stmt *_sGetActiveBridges;
|
|
||||||
sqlite3_stmt *_sGetIpAssignmentsForNode;
|
|
||||||
sqlite3_stmt *_sGetIpAssignmentPools;
|
|
||||||
sqlite3_stmt *_sGetLocalRoutes;
|
|
||||||
sqlite3_stmt *_sCheckIfIpIsAllocated;
|
|
||||||
sqlite3_stmt *_sAllocateIp;
|
|
||||||
sqlite3_stmt *_sDeleteIpAllocations;
|
|
||||||
sqlite3_stmt *_sDeleteLocalRoutes;
|
|
||||||
sqlite3_stmt *_sGetRelays;
|
|
||||||
sqlite3_stmt *_sListNetworks;
|
|
||||||
sqlite3_stmt *_sListNetworkMembers;
|
|
||||||
sqlite3_stmt *_sGetMember2;
|
|
||||||
sqlite3_stmt *_sGetIpAssignmentPools2;
|
|
||||||
sqlite3_stmt *_sListRules;
|
|
||||||
sqlite3_stmt *_sCreateRule;
|
|
||||||
sqlite3_stmt *_sCreateNetwork;
|
|
||||||
sqlite3_stmt *_sGetNetworkRevision;
|
|
||||||
sqlite3_stmt *_sSetNetworkRevision;
|
|
||||||
sqlite3_stmt *_sGetIpAssignmentsForNode2;
|
|
||||||
sqlite3_stmt *_sDeleteRelaysForNetwork;
|
|
||||||
sqlite3_stmt *_sCreateRelay;
|
|
||||||
sqlite3_stmt *_sDeleteIpAssignmentPoolsForNetwork;
|
|
||||||
sqlite3_stmt *_sDeleteRulesForNetwork;
|
|
||||||
sqlite3_stmt *_sCreateIpAssignmentPool;
|
|
||||||
sqlite3_stmt *_sUpdateMemberAuthorized;
|
|
||||||
sqlite3_stmt *_sUpdateMemberActiveBridge;
|
|
||||||
sqlite3_stmt *_sDeleteMember;
|
|
||||||
sqlite3_stmt *_sDeleteAllNetworkMembers;
|
|
||||||
sqlite3_stmt *_sDeleteNetwork;
|
|
||||||
sqlite3_stmt *_sGetGateways;
|
|
||||||
sqlite3_stmt *_sDeleteGateways;
|
|
||||||
sqlite3_stmt *_sCreateGateway;
|
|
||||||
sqlite3_stmt *_sIncrementMemberRevisionCounter;
|
|
||||||
sqlite3_stmt *_sGetConfig;
|
|
||||||
sqlite3_stmt *_sSetConfig;
|
|
||||||
|
|
||||||
Mutex _lock;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace ZeroTier
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
CREATE TABLE Config (
|
|
||||||
k varchar(16) PRIMARY KEY NOT NULL,
|
|
||||||
v varchar(1024) NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE Network (
|
|
||||||
id char(16) PRIMARY KEY NOT NULL,
|
|
||||||
name varchar(128) NOT NULL,
|
|
||||||
private integer NOT NULL DEFAULT(1),
|
|
||||||
enableBroadcast integer NOT NULL DEFAULT(1),
|
|
||||||
allowPassiveBridging integer NOT NULL DEFAULT(0),
|
|
||||||
v4AssignMode varchar(8) NOT NULL DEFAULT('none'),
|
|
||||||
v6AssignMode varchar(8) NOT NULL DEFAULT('none'),
|
|
||||||
multicastLimit integer NOT NULL DEFAULT(32),
|
|
||||||
creationTime integer NOT NULL DEFAULT(0),
|
|
||||||
revision integer NOT NULL DEFAULT(1),
|
|
||||||
memberRevisionCounter integer NOT NULL DEFAULT(1)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE AuthToken (
|
|
||||||
id integer PRIMARY KEY NOT NULL,
|
|
||||||
networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,
|
|
||||||
authMode integer NOT NULL DEFAULT(1),
|
|
||||||
useCount integer NOT NULL DEFAULT(0),
|
|
||||||
maxUses integer NOT NULL DEFAULT(0),
|
|
||||||
expiresAt integer NOT NULL DEFAULT(0),
|
|
||||||
token varchar(256) NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX AuthToken_networkId_token ON AuthToken(networkId,token);
|
|
||||||
|
|
||||||
CREATE TABLE Node (
|
|
||||||
id char(10) PRIMARY KEY NOT NULL,
|
|
||||||
identity varchar(4096) NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE NodeHistory (
|
|
||||||
nodeId char(10) NOT NULL REFERENCES Node(id) ON DELETE CASCADE,
|
|
||||||
networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,
|
|
||||||
networkVisitCounter INTEGER NOT NULL DEFAULT(0),
|
|
||||||
networkRequestAuthorized INTEGER NOT NULL DEFAULT(0),
|
|
||||||
requestTime INTEGER NOT NULL DEFAULT(0),
|
|
||||||
clientMajorVersion INTEGER NOT NULL DEFAULT(0),
|
|
||||||
clientMinorVersion INTEGER NOT NULL DEFAULT(0),
|
|
||||||
clientRevision INTEGER NOT NULL DEFAULT(0),
|
|
||||||
networkRequestMetaData VARCHAR(1024),
|
|
||||||
fromAddress VARCHAR(128)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX NodeHistory_nodeId ON NodeHistory (nodeId);
|
|
||||||
CREATE INDEX NodeHistory_networkId ON NodeHistory (networkId);
|
|
||||||
CREATE INDEX NodeHistory_requestTime ON NodeHistory (requestTime);
|
|
||||||
|
|
||||||
CREATE TABLE Gateway (
|
|
||||||
networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,
|
|
||||||
ip blob(16) NOT NULL,
|
|
||||||
ipVersion integer NOT NULL DEFAULT(4),
|
|
||||||
metric integer NOT NULL DEFAULT(0)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX Gateway_networkId_ip ON Gateway (networkId, ip);
|
|
||||||
|
|
||||||
CREATE TABLE IpAssignment (
|
|
||||||
networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,
|
|
||||||
nodeId char(10) REFERENCES Node(id) ON DELETE CASCADE,
|
|
||||||
type integer NOT NULL DEFAULT(0),
|
|
||||||
ip blob(16) NOT NULL,
|
|
||||||
ipNetmaskBits integer NOT NULL DEFAULT(0),
|
|
||||||
ipVersion integer NOT NULL DEFAULT(4)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX IpAssignment_networkId_ip ON IpAssignment (networkId, ip);
|
|
||||||
|
|
||||||
CREATE INDEX IpAssignment_networkId_nodeId ON IpAssignment (networkId, nodeId);
|
|
||||||
|
|
||||||
CREATE TABLE IpAssignmentPool (
|
|
||||||
networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,
|
|
||||||
ipRangeStart blob(16) NOT NULL,
|
|
||||||
ipRangeEnd blob(16) NOT NULL,
|
|
||||||
ipVersion integer NOT NULL DEFAULT(4)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX IpAssignmentPool_networkId_ipRangeStart ON IpAssignmentPool (networkId,ipRangeStart);
|
|
||||||
|
|
||||||
CREATE TABLE Member (
|
|
||||||
networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,
|
|
||||||
nodeId char(10) NOT NULL REFERENCES Node(id) ON DELETE CASCADE,
|
|
||||||
authorized integer NOT NULL DEFAULT(0),
|
|
||||||
activeBridge integer NOT NULL DEFAULT(0),
|
|
||||||
memberRevision integer NOT NULL DEFAULT(0),
|
|
||||||
PRIMARY KEY (networkId, nodeId)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX Member_networkId_activeBridge ON Member(networkId, activeBridge);
|
|
||||||
CREATE INDEX Member_networkId_memberRevision ON Member(networkId, memberRevision);
|
|
||||||
|
|
||||||
CREATE TABLE Relay (
|
|
||||||
networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,
|
|
||||||
address char(10) NOT NULL,
|
|
||||||
phyAddress varchar(64) NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX Relay_networkId_address ON Relay (networkId,address);
|
|
||||||
|
|
||||||
CREATE TABLE Rule (
|
|
||||||
networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,
|
|
||||||
ruleNo integer NOT NULL,
|
|
||||||
nodeId char(10) REFERENCES Node(id),
|
|
||||||
sourcePort char(10),
|
|
||||||
destPort char(10),
|
|
||||||
vlanId integer,
|
|
||||||
vlanPcp integer,
|
|
||||||
etherType integer,
|
|
||||||
macSource char(12),
|
|
||||||
macDest char(12),
|
|
||||||
ipSource varchar(64),
|
|
||||||
ipDest varchar(64),
|
|
||||||
ipTos integer,
|
|
||||||
ipProtocol integer,
|
|
||||||
ipSourcePort integer,
|
|
||||||
ipDestPort integer,
|
|
||||||
flags integer,
|
|
||||||
invFlags integer,
|
|
||||||
"action" varchar(4096) NOT NULL DEFAULT('accept')
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX Rule_networkId_ruleNo ON Rule (networkId, ruleNo);
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
#define ZT_NETCONF_SCHEMA_SQL \
|
|
||||||
"CREATE TABLE Config (\n"\
|
|
||||||
" k varchar(16) PRIMARY KEY NOT NULL,\n"\
|
|
||||||
" v varchar(1024) NOT NULL\n"\
|
|
||||||
");\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE TABLE Network (\n"\
|
|
||||||
" id char(16) PRIMARY KEY NOT NULL,\n"\
|
|
||||||
" name varchar(128) NOT NULL,\n"\
|
|
||||||
" private integer NOT NULL DEFAULT(1),\n"\
|
|
||||||
" enableBroadcast integer NOT NULL DEFAULT(1),\n"\
|
|
||||||
" allowPassiveBridging integer NOT NULL DEFAULT(0),\n"\
|
|
||||||
" v4AssignMode varchar(8) NOT NULL DEFAULT('none'),\n"\
|
|
||||||
" v6AssignMode varchar(8) NOT NULL DEFAULT('none'),\n"\
|
|
||||||
" multicastLimit integer NOT NULL DEFAULT(32),\n"\
|
|
||||||
" creationTime integer NOT NULL DEFAULT(0),\n"\
|
|
||||||
" revision integer NOT NULL DEFAULT(1),\n"\
|
|
||||||
" memberRevisionCounter integer NOT NULL DEFAULT(1)\n"\
|
|
||||||
");\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE TABLE AuthToken (\n"\
|
|
||||||
" id integer PRIMARY KEY NOT NULL,\n"\
|
|
||||||
" networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,\n"\
|
|
||||||
" authMode integer NOT NULL DEFAULT(1),\n"\
|
|
||||||
" useCount integer NOT NULL DEFAULT(0),\n"\
|
|
||||||
" maxUses integer NOT NULL DEFAULT(0),\n"\
|
|
||||||
" expiresAt integer NOT NULL DEFAULT(0),\n"\
|
|
||||||
" token varchar(256) NOT NULL\n"\
|
|
||||||
");\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE INDEX AuthToken_networkId_token ON AuthToken(networkId,token);\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE TABLE Node (\n"\
|
|
||||||
" id char(10) PRIMARY KEY NOT NULL,\n"\
|
|
||||||
" identity varchar(4096) NOT NULL\n"\
|
|
||||||
");\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE TABLE NodeHistory (\n"\
|
|
||||||
" nodeId char(10) NOT NULL REFERENCES Node(id) ON DELETE CASCADE,\n"\
|
|
||||||
" networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,\n"\
|
|
||||||
" networkVisitCounter INTEGER NOT NULL DEFAULT(0),\n"\
|
|
||||||
" networkRequestAuthorized INTEGER NOT NULL DEFAULT(0),\n"\
|
|
||||||
" requestTime INTEGER NOT NULL DEFAULT(0),\n"\
|
|
||||||
" clientMajorVersion INTEGER NOT NULL DEFAULT(0),\n"\
|
|
||||||
" clientMinorVersion INTEGER NOT NULL DEFAULT(0),\n"\
|
|
||||||
" clientRevision INTEGER NOT NULL DEFAULT(0),\n"\
|
|
||||||
" networkRequestMetaData VARCHAR(1024),\n"\
|
|
||||||
" fromAddress VARCHAR(128)\n"\
|
|
||||||
");\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE INDEX NodeHistory_nodeId ON NodeHistory (nodeId);\n"\
|
|
||||||
"CREATE INDEX NodeHistory_networkId ON NodeHistory (networkId);\n"\
|
|
||||||
"CREATE INDEX NodeHistory_requestTime ON NodeHistory (requestTime);\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE TABLE Gateway (\n"\
|
|
||||||
" networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,\n"\
|
|
||||||
" ip blob(16) NOT NULL,\n"\
|
|
||||||
" ipVersion integer NOT NULL DEFAULT(4),\n"\
|
|
||||||
" metric integer NOT NULL DEFAULT(0)\n"\
|
|
||||||
");\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE UNIQUE INDEX Gateway_networkId_ip ON Gateway (networkId, ip);\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE TABLE IpAssignment (\n"\
|
|
||||||
" networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,\n"\
|
|
||||||
" nodeId char(10) REFERENCES Node(id) ON DELETE CASCADE,\n"\
|
|
||||||
" type integer NOT NULL DEFAULT(0),\n"\
|
|
||||||
" ip blob(16) NOT NULL,\n"\
|
|
||||||
" ipNetmaskBits integer NOT NULL DEFAULT(0),\n"\
|
|
||||||
" ipVersion integer NOT NULL DEFAULT(4)\n"\
|
|
||||||
");\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE UNIQUE INDEX IpAssignment_networkId_ip ON IpAssignment (networkId, ip);\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE INDEX IpAssignment_networkId_nodeId ON IpAssignment (networkId, nodeId);\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE TABLE IpAssignmentPool (\n"\
|
|
||||||
" networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,\n"\
|
|
||||||
" ipRangeStart blob(16) NOT NULL,\n"\
|
|
||||||
" ipRangeEnd blob(16) NOT NULL,\n"\
|
|
||||||
" ipVersion integer NOT NULL DEFAULT(4)\n"\
|
|
||||||
");\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE UNIQUE INDEX IpAssignmentPool_networkId_ipRangeStart ON IpAssignmentPool (networkId,ipRangeStart);\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE TABLE Member (\n"\
|
|
||||||
" networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,\n"\
|
|
||||||
" nodeId char(10) NOT NULL REFERENCES Node(id) ON DELETE CASCADE,\n"\
|
|
||||||
" authorized integer NOT NULL DEFAULT(0),\n"\
|
|
||||||
" activeBridge integer NOT NULL DEFAULT(0),\n"\
|
|
||||||
" memberRevision integer NOT NULL DEFAULT(0),\n"\
|
|
||||||
" PRIMARY KEY (networkId, nodeId)\n"\
|
|
||||||
");\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE INDEX Member_networkId_activeBridge ON Member(networkId, activeBridge);\n"\
|
|
||||||
"CREATE INDEX Member_networkId_memberRevision ON Member(networkId, memberRevision);\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE TABLE Relay (\n"\
|
|
||||||
" networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,\n"\
|
|
||||||
" address char(10) NOT NULL,\n"\
|
|
||||||
" phyAddress varchar(64) NOT NULL\n"\
|
|
||||||
");\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE UNIQUE INDEX Relay_networkId_address ON Relay (networkId,address);\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE TABLE Rule (\n"\
|
|
||||||
" networkId char(16) NOT NULL REFERENCES Network(id) ON DELETE CASCADE,\n"\
|
|
||||||
" ruleNo integer NOT NULL,\n"\
|
|
||||||
" nodeId char(10) REFERENCES Node(id),\n"\
|
|
||||||
" sourcePort char(10),\n"\
|
|
||||||
" destPort char(10),\n"\
|
|
||||||
" vlanId integer,\n"\
|
|
||||||
" vlanPcp integer,\n"\
|
|
||||||
" etherType integer,\n"\
|
|
||||||
" macSource char(12),\n"\
|
|
||||||
" macDest char(12),\n"\
|
|
||||||
" ipSource varchar(64),\n"\
|
|
||||||
" ipDest varchar(64),\n"\
|
|
||||||
" ipTos integer,\n"\
|
|
||||||
" ipProtocol integer,\n"\
|
|
||||||
" ipSourcePort integer,\n"\
|
|
||||||
" ipDestPort integer,\n"\
|
|
||||||
" flags integer,\n"\
|
|
||||||
" invFlags integer,\n"\
|
|
||||||
" \"action\" varchar(4096) NOT NULL DEFAULT('accept')\n"\
|
|
||||||
");\n"\
|
|
||||||
"\n"\
|
|
||||||
"CREATE UNIQUE INDEX Rule_networkId_ruleNo ON Rule (networkId, ruleNo);\n"\
|
|
||||||
""
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Run this file to package the .sql file into a .c file whenever the SQL changes.
|
|
||||||
|
|
||||||
rm -f schema.sql.c
|
|
||||||
echo '#define ZT_NETCONF_SCHEMA_SQL \' >schema.sql.c
|
|
||||||
cat schema.sql | sed 's/"/\\"/g' | sed 's/^/"/' | sed 's/$/\\n"\\/' >>schema.sql.c
|
|
||||||
echo '""' >>schema.sql.c
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
# doc/module.mk
|
|
||||||
# Part of ZeroTier One, a software-defined network layer.
|
|
||||||
#
|
|
||||||
# Copyright © 2016 Ben Finney <ben+zerotier@benfinney.id.au>
|
|
||||||
# This is free software: you may copy, modify, and/or distribute this
|
|
||||||
# work under the terms of the GNU General Public License, version 3 or
|
|
||||||
# later as published by the Free Software Foundation.
|
|
||||||
# No warranty expressed or implied.
|
|
||||||
# See the file ‘LICENSE.txt’ for details.
|
|
||||||
|
|
||||||
# Makefile module for ZeroTier One documentation.
|
|
||||||
|
|
||||||
TEMPFILE_SUFFIX = .tmp
|
|
||||||
.INTERMEDIATE: ${DOCUMENTATION_DIR}/*${TEMPFILE_SUFFIX}
|
|
||||||
|
|
||||||
RST_SUFFIX = .txt
|
|
||||||
manpage_sections = 1 2 3 4 5 6 7 8
|
|
||||||
manpage_names += zerotier-one.8
|
|
||||||
manpage_names += zerotier-idtool.1
|
|
||||||
manpage_names += zerotier-cli.1
|
|
||||||
manpage_source_paths = $(addprefix ${DOC_DIR}/, \
|
|
||||||
$(addsuffix ${RST_SUFFIX},${manpage_names}))
|
|
||||||
manpage_paths = $(addprefix ${DOC_DIR}/,${manpage_names})
|
|
||||||
manpage_encoding_stub = ${DOC_DIR}/manpage_encoding_declaration.UTF-8
|
|
||||||
|
|
||||||
GENERATED_FILES += $(addprefix ${DOC_DIR}/,\
|
|
||||||
$(foreach section,${manpage_sections},*.${section}))
|
|
||||||
|
|
||||||
RST2MAN = rst2man
|
|
||||||
RST2MAN_OPTS =
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: doc
|
|
||||||
doc: manpages
|
|
||||||
|
|
||||||
.PHONY: manpages
|
|
||||||
manpages: ${manpage_paths}
|
|
||||||
|
|
||||||
%.1: %.1${RST_SUFFIX}
|
|
||||||
$(RST2MAN) "$<" > "$@"${TEMPFILE_SUFFIX}
|
|
||||||
cat ${manpage_encoding_stub} "$@"${TEMPFILE_SUFFIX} > "$@"
|
|
||||||
|
|
||||||
%.8: %.8${RST_SUFFIX}
|
|
||||||
$(RST2MAN) "$<" > "$@"${TEMPFILE_SUFFIX}
|
|
||||||
cat ${manpage_encoding_stub} "$@"${TEMPFILE_SUFFIX} > "$@"
|
|
||||||
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# coding: utf-8
|
|
||||||
# mode: makefile
|
|
||||||
# End:
|
|
||||||
# vim: fileencoding=utf-8 filetype=make :
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
============
|
|
||||||
zerotier-cli
|
|
||||||
============
|
|
||||||
|
|
||||||
--------------------------------------------------
|
|
||||||
management interface for ZeroTier One peer process
|
|
||||||
--------------------------------------------------
|
|
||||||
|
|
||||||
:Author: |author|
|
|
||||||
:Date: 2016-03-04
|
|
||||||
:Copyright:
|
|
||||||
Copyright © 2016 ZeroTier Inc.
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: ZeroTier
|
|
||||||
|
|
||||||
.. |command| replace:: **zerotier-cli**
|
|
||||||
.. |license| replace::
|
|
||||||
`GNU General Public License, version 3 or later
|
|
||||||
<https://www.gnu.org/licenses/#GPL>`__
|
|
||||||
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
========
|
|
||||||
|
|
||||||
| |command| [ **-j** ] [ **-D** `HOMEDIR` ] [ **-p** `PORT` ] [ **-t** `AUTH_TOKEN` ] \
|
|
||||||
`command` [ `COMMAND_ARG` ]
|
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
===========
|
|
||||||
|
|
||||||
|command| is a tool to manage the running **zerotier-one**\ (8)
|
|
||||||
process.
|
|
||||||
|
|
||||||
*ZeroTier* is a peer-to-peer virtual network. Its “virtual layer 1”
|
|
||||||
(VL1) is implemented in the communication between ZeroTier One peers.
|
|
||||||
This provides the OSI layer 1 functionality on which to build further
|
|
||||||
network services.
|
|
||||||
|
|
||||||
|
|
||||||
COMMANDS
|
|
||||||
========
|
|
||||||
|
|
||||||
|command| **info**
|
|
||||||
|
|
||||||
*FIXME*: display status info
|
|
||||||
|
|
||||||
|command| **listpeers**
|
|
||||||
|
|
||||||
*FIXME*: list all peers
|
|
||||||
|
|
||||||
|command| **listnetworks**
|
|
||||||
|
|
||||||
*FIXME*: list all networks
|
|
||||||
|
|
||||||
|command| **join** `NETWORK`
|
|
||||||
|
|
||||||
*FIXME*: join the network `NETWORK`
|
|
||||||
|
|
||||||
|command| **leave** `NETWORK`
|
|
||||||
|
|
||||||
*FIXME*: leave the network `NETWORK`
|
|
||||||
|
|
||||||
|
|
||||||
FILES
|
|
||||||
=====
|
|
||||||
|
|
||||||
The |command| process will discover the running **zerotier-one**\ (8)
|
|
||||||
process by examining the specified `HOMEDIR` directory (default:
|
|
||||||
``/var/lib/zerotier-one``).
|
|
||||||
|
|
||||||
|
|
||||||
SEE ALSO
|
|
||||||
========
|
|
||||||
|
|
||||||
* **zerotier-one**\ (8)
|
|
||||||
|
|
||||||
* ZeroTier One documentation:
|
|
||||||
|
|
||||||
* Product page `<https://www.zerotier.com/product-one.shtml>`__.
|
|
||||||
* Configuration guide `<https://www.zerotier.com/config.shtml>`__.
|
|
||||||
* Technical FAQ `<https://www.zerotier.com/tech_faq.shtml>`__.
|
|
||||||
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
=======
|
|
||||||
|
|
||||||
The |command| program is developed by ZeroTier Inc.
|
|
||||||
|
|
||||||
This manual page was written by |author|. This is free software: you
|
|
||||||
may copy, modify and/or distribute this work under the terms of the
|
|
||||||
|license| as published by the Free Software Foundation. No warranty
|
|
||||||
expressed or implied.
|
|
||||||
|
|
||||||
.. |author| replace:: |authorname| |authoremail|
|
|
||||||
.. |authorname| replace:: Ben Finney
|
|
||||||
.. |authoremail| replace:: <ben+zerotier@benfinney.id.au>
|
|
||||||
|
|
||||||
|
|
||||||
..
|
|
||||||
Local variables:
|
|
||||||
mode: rst
|
|
||||||
coding: utf-8
|
|
||||||
time-stamp-format: "%:y-%02m-%02d"
|
|
||||||
time-stamp-start: "^:Date:[ ]+"
|
|
||||||
time-stamp-end: "$"
|
|
||||||
time-stamp-line-limit: 20
|
|
||||||
End:
|
|
||||||
vim: filetype=rst fileencoding=utf-8 :
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
===============
|
|
||||||
zerotier-idtool
|
|
||||||
===============
|
|
||||||
|
|
||||||
----------------------------------------------
|
|
||||||
identity management tool for ZeroTier One peer
|
|
||||||
----------------------------------------------
|
|
||||||
|
|
||||||
:Author: |author|
|
|
||||||
:Date: 2016-03-04
|
|
||||||
:Copyright:
|
|
||||||
Copyright © 2016 ZeroTier Inc.
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: ZeroTier
|
|
||||||
|
|
||||||
.. |command| replace:: **zerotier-idtool**
|
|
||||||
.. |license| replace::
|
|
||||||
`GNU General Public License, version 3 or later
|
|
||||||
<https://www.gnu.org/licenses/#GPL>`__
|
|
||||||
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
========
|
|
||||||
|
|
||||||
| |command| **generate** [ `SECRET` ] [ `PUBLIC` ]
|
|
||||||
| |command| **validate** `SECRET`
|
|
||||||
| |command| **getpublic** `SECRET`
|
|
||||||
| |command| **sign** `SECRET`
|
|
||||||
| |command| **verify** `IDENTITY` `FILE` `SIGNATURE`
|
|
||||||
| |command| **mkcom** `SECRET` `ID`\ **,**\ `VALUE`\ **,**\ `MAX_DELTA` [ ... ] `IDENTITY`
|
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
===========
|
|
||||||
|
|
||||||
|command| is a tool to manage identities for the **zerotier-one**\ (8)
|
|
||||||
program.
|
|
||||||
|
|
||||||
*ZeroTier* is a peer-to-peer virtual network. Its “virtual layer 1”
|
|
||||||
(VL1) is implemented in the communication between ZeroTier One peers.
|
|
||||||
This provides the OSI layer 1 functionality on which to build further
|
|
||||||
network services.
|
|
||||||
|
|
||||||
|
|
||||||
COMMANDS
|
|
||||||
========
|
|
||||||
|
|
||||||
|command| **generate** [ `SECRET` ] [ `PUBLIC` ]
|
|
||||||
|
|
||||||
*FIXME*: generate an identity
|
|
||||||
|
|
||||||
|command| **validate** `SECRET`
|
|
||||||
|
|
||||||
*FIXME*: validate a secret identity
|
|
||||||
|
|
||||||
|command| **getpublic** `SECRET`
|
|
||||||
|
|
||||||
*FIXME*: get a public identity
|
|
||||||
|
|
||||||
|command| **sign** `SECRET`
|
|
||||||
|
|
||||||
*FIXME*: sign a secret identity
|
|
||||||
|
|
||||||
|command| **verify** `IDENTITY` `FILE` `SIGNATURE`
|
|
||||||
|
|
||||||
*FIXME*: verify a signature
|
|
||||||
|
|
||||||
|command| **mkcom** `SECRET` `ID`\ **,**\ `VALUE`\ **,**\ `MAX_DELTA` [ ... ] `IDENTITY`
|
|
||||||
|
|
||||||
*FIXME*: mkcom
|
|
||||||
|
|
||||||
|
|
||||||
FILES
|
|
||||||
=====
|
|
||||||
|
|
||||||
*FIXME*: how does the process know its home directory?
|
|
||||||
|
|
||||||
|
|
||||||
SEE ALSO
|
|
||||||
========
|
|
||||||
|
|
||||||
* **zerotier-one**\ (8)
|
|
||||||
|
|
||||||
* ZeroTier One documentation:
|
|
||||||
|
|
||||||
* Product page `<https://www.zerotier.com/product-one.shtml>`__.
|
|
||||||
* Configuration guide `<https://www.zerotier.com/config.shtml>`__.
|
|
||||||
* Technical FAQ `<https://www.zerotier.com/tech_faq.shtml>`__.
|
|
||||||
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
=======
|
|
||||||
|
|
||||||
The |command| program is developed by ZeroTier Inc.
|
|
||||||
|
|
||||||
This manual page was written by |author|. This is free software: you
|
|
||||||
may copy, modify and/or distribute this work under the terms of the
|
|
||||||
|license| as published by the Free Software Foundation. No warranty
|
|
||||||
expressed or implied.
|
|
||||||
|
|
||||||
.. |author| replace:: |authorname| |authoremail|
|
|
||||||
.. |authorname| replace:: Ben Finney
|
|
||||||
.. |authoremail| replace:: <ben+zerotier@benfinney.id.au>
|
|
||||||
|
|
||||||
|
|
||||||
..
|
|
||||||
Local variables:
|
|
||||||
mode: rst
|
|
||||||
coding: utf-8
|
|
||||||
time-stamp-format: "%:y-%02m-%02d"
|
|
||||||
time-stamp-start: "^:Date:[ ]+"
|
|
||||||
time-stamp-end: "$"
|
|
||||||
time-stamp-line-limit: 20
|
|
||||||
End:
|
|
||||||
vim: filetype=rst fileencoding=utf-8 :
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
============
|
|
||||||
zerotier-one
|
|
||||||
============
|
|
||||||
|
|
||||||
-------------------------------------------------
|
|
||||||
end-point peer for ZeroTier virtual network layer
|
|
||||||
-------------------------------------------------
|
|
||||||
|
|
||||||
:Author: |author|
|
|
||||||
:Date: 2016-03-04
|
|
||||||
:Copyright:
|
|
||||||
Copyright © 2016 ZeroTier Inc.
|
|
||||||
:Manual section: 8
|
|
||||||
:Manual group: ZeroTier
|
|
||||||
|
|
||||||
.. |command| replace:: **zerotier-one**
|
|
||||||
.. |license| replace::
|
|
||||||
`GNU General Public License, version 3 or later
|
|
||||||
<https://www.gnu.org/licenses/#GPL>`__
|
|
||||||
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
========
|
|
||||||
|
|
||||||
| |command| [ **-U** ] [ **-p** `PORT` ] [ **-d** ] [ `HOMEDIR` ]
|
|
||||||
| |command| **-i** [ `IDTOOL_ARG` ... ]
|
|
||||||
| |command| **-q** [ `QUERY_ARG` ... ]
|
|
||||||
| |command| **-h**
|
|
||||||
| |command| **-v**
|
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
===========
|
|
||||||
|
|
||||||
**ZeroTier One** is the end-point peer for the ZeroTier
|
|
||||||
software-defined network layer.
|
|
||||||
|
|
||||||
*ZeroTier* is a peer-to-peer virtual network. Its “virtual layer 1”
|
|
||||||
(VL1) is implemented in the communication between ZeroTier One peers.
|
|
||||||
This provides the OSI layer 1 functionality on which to build further
|
|
||||||
network services.
|
|
||||||
|
|
||||||
|
|
||||||
OPTIONS
|
|
||||||
=======
|
|
||||||
|
|
||||||
**-h**
|
|
||||||
Display concise help on command usage.
|
|
||||||
|
|
||||||
**-v**
|
|
||||||
Display program version.
|
|
||||||
|
|
||||||
**-U**
|
|
||||||
Run as unprivileged user (skip privilege check).
|
|
||||||
|
|
||||||
**-p** `PORT`
|
|
||||||
Communicate on network port `PORT` (either TCP or UDP).
|
|
||||||
|
|
||||||
**-d**
|
|
||||||
Become a conventional daemon process. Only available on Unix-like
|
|
||||||
operating systems.
|
|
||||||
|
|
||||||
**-i** [ `IDTOOL_ARG` ... ]
|
|
||||||
Generate and manage identities.
|
|
||||||
|
|
||||||
This is equivalent to running the **zerotier-idtool** command with
|
|
||||||
all the specified `IDTOOL_ARG` parameters.
|
|
||||||
|
|
||||||
**-q** [ `QUERY_ARG` ... ]
|
|
||||||
Query the running ZeroTier One process.
|
|
||||||
|
|
||||||
This is equivalent to running the **zerotier-cli** command with
|
|
||||||
all the specified `QUERY_ARG` parameters.
|
|
||||||
|
|
||||||
|
|
||||||
FILES
|
|
||||||
=====
|
|
||||||
|
|
||||||
The |command| process will store its state in files within the
|
|
||||||
specified `HOMEDIR` directory (default: ``/var/lib/zerotier-one``).
|
|
||||||
|
|
||||||
|
|
||||||
SEE ALSO
|
|
||||||
========
|
|
||||||
|
|
||||||
* **zerotier-idtool**\ (1), **zerotier-cli**\ (1)
|
|
||||||
|
|
||||||
* ZeroTier One documentation:
|
|
||||||
|
|
||||||
* Product page `<https://www.zerotier.com/product-one.shtml>`__.
|
|
||||||
* Configuration guide `<https://www.zerotier.com/config.shtml>`__.
|
|
||||||
* Technical FAQ `<https://www.zerotier.com/tech_faq.shtml>`__.
|
|
||||||
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
=======
|
|
||||||
|
|
||||||
The |command| program is developed by ZeroTier Inc.
|
|
||||||
|
|
||||||
This manual page was written by |author|. This is free software: you
|
|
||||||
may copy, modify and/or distribute this work under the terms of the
|
|
||||||
|license| as published by the Free Software Foundation. No warranty
|
|
||||||
expressed or implied.
|
|
||||||
|
|
||||||
.. |author| replace:: |authorname| |authoremail|
|
|
||||||
.. |authorname| replace:: Ben Finney
|
|
||||||
.. |authoremail| replace:: <ben+zerotier@benfinney.id.au>
|
|
||||||
|
|
||||||
|
|
||||||
..
|
|
||||||
Local variables:
|
|
||||||
mode: rst
|
|
||||||
coding: utf-8
|
|
||||||
time-stamp-format: "%:y-%02m-%02d"
|
|
||||||
time-stamp-start: "^:Date:[ ]+"
|
|
||||||
time-stamp-end: "$"
|
|
||||||
time-stamp-line-limit: 20
|
|
||||||
End:
|
|
||||||
vim: filetype=rst fileencoding=utf-8 :
|
|
||||||
@@ -1 +1,10 @@
|
|||||||
The ext/ folder contains third party code, drivers, installation support files, etc.
|
Miscellaneous Stuff
|
||||||
|
======
|
||||||
|
|
||||||
|
This subfolder contains:
|
||||||
|
|
||||||
|
* Bundled third party libraries that are compiled into the binary on platforms and Linux distributions where they are not available on the system.
|
||||||
|
|
||||||
|
* Pre-compiled binaries for some platforms, such as pre-built and signed drivers for Mac and Windows.
|
||||||
|
|
||||||
|
* Miscellaneous files used by installers and packages on various platform targets.
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
[Version]
|
|
||||||
Signature="$WINDOWS NT$"
|
|
||||||
Class=Net
|
|
||||||
ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318}
|
|
||||||
Provider=%Provider%
|
|
||||||
CatalogFile=zttap200.cat
|
|
||||||
DriverVer=01/23/2014,15.19.17.816
|
|
||||||
|
|
||||||
[Strings]
|
|
||||||
DeviceDescription = "ZeroTier One Virtual Network Port"
|
|
||||||
Provider = "ZeroTier Networks LLC"
|
|
||||||
|
|
||||||
; To build for x86, take NTamd64 off this and off the named section manually, build, then put it back!
|
|
||||||
[Manufacturer]
|
|
||||||
%Provider%=zttap200,NTamd64
|
|
||||||
|
|
||||||
[zttap200]
|
|
||||||
%DeviceDescription%=zttap200.ndi,zttap200
|
|
||||||
|
|
||||||
[ztTap200.NTamd64]
|
|
||||||
%DeviceDescription%=zttap200.ndi,zttap200
|
|
||||||
|
|
||||||
[zttap200.ndi]
|
|
||||||
CopyFiles = zttap200.driver,zttap200.files
|
|
||||||
AddReg = zttap200.reg
|
|
||||||
AddReg = zttap200.params.reg
|
|
||||||
Characteristics = 0x81
|
|
||||||
|
|
||||||
[zttap200.ndi.Services]
|
|
||||||
AddService = zttap200, 2, zttap200.service
|
|
||||||
|
|
||||||
[zttap200.reg]
|
|
||||||
HKR, Ndi, Service, 0, "zttap200"
|
|
||||||
HKR, Ndi\Interfaces, UpperRange, 0, "ndis5"
|
|
||||||
HKR, Ndi\Interfaces, LowerRange, 0, "ethernet"
|
|
||||||
HKR, , Manufacturer, 0, "%Provider%"
|
|
||||||
HKR, , ProductName, 0, "%DeviceDescription%"
|
|
||||||
|
|
||||||
[zttap200.params.reg]
|
|
||||||
HKR, Ndi\params\MTU, ParamDesc, 0, "MTU"
|
|
||||||
HKR, Ndi\params\MTU, Type, 0, "int"
|
|
||||||
HKR, Ndi\params\MTU, Default, 0, "2800"
|
|
||||||
HKR, Ndi\params\MTU, Optional, 0, "0"
|
|
||||||
HKR, Ndi\params\MTU, Min, 0, "100"
|
|
||||||
HKR, Ndi\params\MTU, Max, 0, "2800"
|
|
||||||
HKR, Ndi\params\MTU, Step, 0, "1"
|
|
||||||
HKR, Ndi\params\MediaStatus, ParamDesc, 0, "Media Status"
|
|
||||||
HKR, Ndi\params\MediaStatus, Type, 0, "enum"
|
|
||||||
HKR, Ndi\params\MediaStatus, Default, 0, "0"
|
|
||||||
HKR, Ndi\params\MediaStatus, Optional, 0, "0"
|
|
||||||
HKR, Ndi\params\MediaStatus\enum, "0", 0, "Application Controlled"
|
|
||||||
HKR, Ndi\params\MediaStatus\enum, "1", 0, "Always Connected"
|
|
||||||
HKR, Ndi\params\MAC, ParamDesc, 0, "MAC Address"
|
|
||||||
HKR, Ndi\params\MAC, Type, 0, "edit"
|
|
||||||
HKR, Ndi\params\MAC, Optional, 0, "1"
|
|
||||||
|
|
||||||
[zttap200.service]
|
|
||||||
DisplayName = %DeviceDescription%
|
|
||||||
ServiceType = 1
|
|
||||||
StartType = 3
|
|
||||||
ErrorControl = 1
|
|
||||||
LoadOrderGroup = NDIS
|
|
||||||
ServiceBinary = %12%\zttap200.sys
|
|
||||||
|
|
||||||
[SourceDisksNames]
|
|
||||||
1 = %DeviceDescription%, zttap200.sys
|
|
||||||
|
|
||||||
[SourceDisksFiles]
|
|
||||||
zttap200.sys = 1
|
|
||||||
|
|
||||||
[DestinationDirs]
|
|
||||||
zttap200.files = 11
|
|
||||||
zttap200.driver = 12
|
|
||||||
|
|
||||||
[zttap200.files]
|
|
||||||
;
|
|
||||||
|
|
||||||
[zttap200.driver]
|
|
||||||
zttap200.sys,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
[Version]
|
|
||||||
Signature="$WINDOWS NT$"
|
|
||||||
Class=Net
|
|
||||||
ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318}
|
|
||||||
Provider=%Provider%
|
|
||||||
CatalogFile=zttap200.cat
|
|
||||||
DriverVer=01/24/2014,17.25.51.226
|
|
||||||
|
|
||||||
[Strings]
|
|
||||||
DeviceDescription = "ZeroTier One Virtual Network Port"
|
|
||||||
Provider = "ZeroTier Networks LLC"
|
|
||||||
|
|
||||||
; To build for x86, take NTamd64 off this and off the named section manually, build, then put it back!
|
|
||||||
[Manufacturer]
|
|
||||||
%Provider%=zttap200
|
|
||||||
|
|
||||||
[zttap200]
|
|
||||||
%DeviceDescription%=zttap200.ndi,zttap200
|
|
||||||
|
|
||||||
[zttap200.ndi]
|
|
||||||
CopyFiles = zttap200.driver,zttap200.files
|
|
||||||
AddReg = zttap200.reg
|
|
||||||
AddReg = zttap200.params.reg
|
|
||||||
Characteristics = 0x81
|
|
||||||
|
|
||||||
[zttap200.ndi.Services]
|
|
||||||
AddService = zttap200, 2, zttap200.service
|
|
||||||
|
|
||||||
[zttap200.reg]
|
|
||||||
HKR, Ndi, Service, 0, "zttap200"
|
|
||||||
HKR, Ndi\Interfaces, UpperRange, 0, "ndis5"
|
|
||||||
HKR, Ndi\Interfaces, LowerRange, 0, "ethernet"
|
|
||||||
HKR, , Manufacturer, 0, "%Provider%"
|
|
||||||
HKR, , ProductName, 0, "%DeviceDescription%"
|
|
||||||
|
|
||||||
[zttap200.params.reg]
|
|
||||||
HKR, Ndi\params\MTU, ParamDesc, 0, "MTU"
|
|
||||||
HKR, Ndi\params\MTU, Type, 0, "int"
|
|
||||||
HKR, Ndi\params\MTU, Default, 0, "2800"
|
|
||||||
HKR, Ndi\params\MTU, Optional, 0, "0"
|
|
||||||
HKR, Ndi\params\MTU, Min, 0, "100"
|
|
||||||
HKR, Ndi\params\MTU, Max, 0, "2800"
|
|
||||||
HKR, Ndi\params\MTU, Step, 0, "1"
|
|
||||||
HKR, Ndi\params\MediaStatus, ParamDesc, 0, "Media Status"
|
|
||||||
HKR, Ndi\params\MediaStatus, Type, 0, "enum"
|
|
||||||
HKR, Ndi\params\MediaStatus, Default, 0, "0"
|
|
||||||
HKR, Ndi\params\MediaStatus, Optional, 0, "0"
|
|
||||||
HKR, Ndi\params\MediaStatus\enum, "0", 0, "Application Controlled"
|
|
||||||
HKR, Ndi\params\MediaStatus\enum, "1", 0, "Always Connected"
|
|
||||||
HKR, Ndi\params\MAC, ParamDesc, 0, "MAC Address"
|
|
||||||
HKR, Ndi\params\MAC, Type, 0, "edit"
|
|
||||||
HKR, Ndi\params\MAC, Optional, 0, "1"
|
|
||||||
|
|
||||||
[zttap200.service]
|
|
||||||
DisplayName = %DeviceDescription%
|
|
||||||
ServiceType = 1
|
|
||||||
StartType = 3
|
|
||||||
ErrorControl = 1
|
|
||||||
LoadOrderGroup = NDIS
|
|
||||||
ServiceBinary = %12%\zttap200.sys
|
|
||||||
|
|
||||||
[SourceDisksNames]
|
|
||||||
1 = %DeviceDescription%, zttap200.sys
|
|
||||||
|
|
||||||
[SourceDisksFiles]
|
|
||||||
zttap200.sys = 1
|
|
||||||
|
|
||||||
[DestinationDirs]
|
|
||||||
zttap200.files = 11
|
|
||||||
zttap200.driver = 12
|
|
||||||
|
|
||||||
[zttap200.files]
|
|
||||||
;
|
|
||||||
|
|
||||||
[zttap200.driver]
|
|
||||||
zttap200.sys,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
;
|
|
||||||
; ZeroTier One Virtual Network Port NDIS6 Driver
|
|
||||||
;
|
|
||||||
; Based on the OpenVPN tap-windows6 driver version 9.21.1 git
|
|
||||||
; commit 48f027cfca52b16b5fd23d82e6016ed8a91fc4d3.
|
|
||||||
; See: https://github.com/OpenVPN/tap-windows6
|
|
||||||
;
|
|
||||||
; Modified by ZeroTier, Inc. - https://www.zerotier.com/
|
|
||||||
;
|
|
||||||
; (1) Comment out 'tun' functionality and related features such as DHCP
|
|
||||||
; emulation, since we don't use any of that. Just want straight 'tap'.
|
|
||||||
; (2) Added custom IOCTL to enumerate L2 multicast memberships.
|
|
||||||
; (3) Increase maximum number of multicast memberships to 128.
|
|
||||||
; (4) Set default and max device MTU to 2800.
|
|
||||||
; (5) Rename/rebrand driver as ZeroTier network port driver.
|
|
||||||
;
|
|
||||||
; Original copyright below. Modifications released under GPLv2 as well.
|
|
||||||
;
|
|
||||||
; ****************************************************************************
|
|
||||||
; * Copyright (C) 2002-2014 OpenVPN Technologies, Inc. *
|
|
||||||
; * This program is free software; you can redistribute it and/or modify *
|
|
||||||
; * it under the terms of the GNU General Public License version 2 *
|
|
||||||
; * as published by the Free Software Foundation. *
|
|
||||||
; ****************************************************************************
|
|
||||||
;
|
|
||||||
|
|
||||||
[Version]
|
|
||||||
Signature = "$Windows NT$"
|
|
||||||
CatalogFile = zttap300.cat
|
|
||||||
ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318}
|
|
||||||
Provider = %Provider%
|
|
||||||
Class = Net
|
|
||||||
DriverVer=08/13/2015,6.2.9200.20557
|
|
||||||
|
|
||||||
[Strings]
|
|
||||||
DeviceDescription = "ZeroTier One Virtual Port"
|
|
||||||
Provider = "ZeroTier Networks LLC" ; We're ZeroTier, Inc. now but kernel mode certs are $300+ so fuqdat.
|
|
||||||
|
|
||||||
; To build for x86, take NTamd64 off this and off the named section manually, build, then put it back!
|
|
||||||
[Manufacturer]
|
|
||||||
%Provider%=zttap300,NTamd64
|
|
||||||
|
|
||||||
[zttap300]
|
|
||||||
%DeviceDescription% = zttap300.ndi, root\zttap300 ; Root enumerated
|
|
||||||
%DeviceDescription% = zttap300.ndi, zttap300 ; Legacy
|
|
||||||
|
|
||||||
[zttap300.NTamd64]
|
|
||||||
%DeviceDescription% = zttap300.ndi, root\zttap300 ; Root enumerated
|
|
||||||
%DeviceDescription% = zttap300.ndi, zttap300 ; Legacy
|
|
||||||
|
|
||||||
;----------------- Characteristics ------------
|
|
||||||
; NCF_PHYSICAL = 0x04
|
|
||||||
; NCF_VIRTUAL = 0x01
|
|
||||||
; NCF_SOFTWARE_ENUMERATED = 0x02
|
|
||||||
; NCF_HIDDEN = 0x08
|
|
||||||
; NCF_NO_SERVICE = 0x10
|
|
||||||
; NCF_HAS_UI = 0x80
|
|
||||||
;----------------- Characteristics ------------
|
|
||||||
[zttap300.ndi]
|
|
||||||
CopyFiles = zttap300.driver, zttap300.files
|
|
||||||
AddReg = zttap300.reg
|
|
||||||
AddReg = zttap300.params.reg
|
|
||||||
Characteristics = 0x81
|
|
||||||
*IfType = 0x6 ; IF_TYPE_ETHERNET_CSMACD
|
|
||||||
*MediaType = 0x0 ; NdisMedium802_3
|
|
||||||
*PhysicalMediaType = 14 ; NdisPhysicalMedium802_3
|
|
||||||
|
|
||||||
[zttap300.ndi.Services]
|
|
||||||
AddService = zttap300, 2, zttap300.service
|
|
||||||
|
|
||||||
[zttap300.reg]
|
|
||||||
HKR, Ndi, Service, 0, "zttap300"
|
|
||||||
HKR, Ndi\Interfaces, UpperRange, 0, "ndis5" ; yes, 'ndis5' is correct... yup, Windows.
|
|
||||||
HKR, Ndi\Interfaces, LowerRange, 0, "ethernet"
|
|
||||||
HKR, , Manufacturer, 0, "%Provider%"
|
|
||||||
HKR, , ProductName, 0, "%DeviceDescription%"
|
|
||||||
|
|
||||||
[zttap300.params.reg]
|
|
||||||
HKR, Ndi\params\MTU, ParamDesc, 0, "MTU"
|
|
||||||
HKR, Ndi\params\MTU, Type, 0, "int"
|
|
||||||
HKR, Ndi\params\MTU, Default, 0, "2800"
|
|
||||||
HKR, Ndi\params\MTU, Optional, 0, "0"
|
|
||||||
HKR, Ndi\params\MTU, Min, 0, "100"
|
|
||||||
HKR, Ndi\params\MTU, Max, 0, "2800"
|
|
||||||
HKR, Ndi\params\MTU, Step, 0, "1"
|
|
||||||
HKR, Ndi\params\MediaStatus, ParamDesc, 0, "Media Status"
|
|
||||||
HKR, Ndi\params\MediaStatus, Type, 0, "enum"
|
|
||||||
HKR, Ndi\params\MediaStatus, Default, 0, "0"
|
|
||||||
HKR, Ndi\params\MediaStatus, Optional, 0, "0"
|
|
||||||
HKR, Ndi\params\MediaStatus\enum, "0", 0, "Application Controlled"
|
|
||||||
HKR, Ndi\params\MediaStatus\enum, "1", 0, "Always Connected"
|
|
||||||
HKR, Ndi\params\MAC, ParamDesc, 0, "MAC Address"
|
|
||||||
HKR, Ndi\params\MAC, Type, 0, "edit"
|
|
||||||
HKR, Ndi\params\MAC, Optional, 0, "1"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin, ParamDesc, 0, "Non-Admin Access"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin, Type, 0, "enum"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin, Default, 0, "0"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin, Optional, 0, "0"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin\enum, "0", 0, "Not Allowed"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin\enum, "1", 0, "Allowed"
|
|
||||||
|
|
||||||
;---------- Service Type -------------
|
|
||||||
; SERVICE_KERNEL_DRIVER = 0x01
|
|
||||||
; SERVICE_WIN32_OWN_PROCESS = 0x10
|
|
||||||
;---------- Service Type -------------
|
|
||||||
|
|
||||||
;---------- Start Mode ---------------
|
|
||||||
; SERVICE_BOOT_START = 0x0
|
|
||||||
; SERVICE_SYSTEM_START = 0x1
|
|
||||||
; SERVICE_AUTO_START = 0x2
|
|
||||||
; SERVICE_DEMAND_START = 0x3
|
|
||||||
; SERVICE_DISABLED = 0x4
|
|
||||||
;---------- Start Mode ---------------
|
|
||||||
|
|
||||||
[zttap300.service]
|
|
||||||
DisplayName = %DeviceDescription%
|
|
||||||
ServiceType = 1
|
|
||||||
StartType = 3
|
|
||||||
ErrorControl = 1
|
|
||||||
LoadOrderGroup = NDIS
|
|
||||||
ServiceBinary = %12%\zttap300.sys
|
|
||||||
|
|
||||||
;----------------- Copy Flags ------------
|
|
||||||
; COPYFLG_NOSKIP = 0x02
|
|
||||||
; COPYFLG_NOVERSIONCHECK = 0x04
|
|
||||||
;----------------- Copy Flags ------------
|
|
||||||
|
|
||||||
[SourceDisksNames]
|
|
||||||
1 = %DeviceDescription%, zttap300.sys
|
|
||||||
|
|
||||||
[SourceDisksFiles]
|
|
||||||
zttap300.sys = 1
|
|
||||||
|
|
||||||
[DestinationDirs]
|
|
||||||
zttap300.files = 11
|
|
||||||
zttap300.driver = 12
|
|
||||||
|
|
||||||
[zttap300.files]
|
|
||||||
;
|
|
||||||
|
|
||||||
[zttap300.driver]
|
|
||||||
zttap300.sys,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
|
|
||||||
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
;
|
|
||||||
; ZeroTier One Virtual Network Port NDIS6 Driver
|
|
||||||
;
|
|
||||||
; Based on the OpenVPN tap-windows6 driver version 9.21.1 git
|
|
||||||
; commit 48f027cfca52b16b5fd23d82e6016ed8a91fc4d3.
|
|
||||||
; See: https://github.com/OpenVPN/tap-windows6
|
|
||||||
;
|
|
||||||
; Modified by ZeroTier, Inc. - https://www.zerotier.com/
|
|
||||||
;
|
|
||||||
; (1) Comment out 'tun' functionality and related features such as DHCP
|
|
||||||
; emulation, since we don't use any of that. Just want straight 'tap'.
|
|
||||||
; (2) Added custom IOCTL to enumerate L2 multicast memberships.
|
|
||||||
; (3) Increase maximum number of multicast memberships to 128.
|
|
||||||
; (4) Set default and max device MTU to 2800.
|
|
||||||
; (5) Rename/rebrand driver as ZeroTier network port driver.
|
|
||||||
;
|
|
||||||
; Original copyright below. Modifications released under GPLv2 as well.
|
|
||||||
;
|
|
||||||
; ****************************************************************************
|
|
||||||
; * Copyright (C) 2002-2014 OpenVPN Technologies, Inc. *
|
|
||||||
; * This program is free software; you can redistribute it and/or modify *
|
|
||||||
; * it under the terms of the GNU General Public License version 2 *
|
|
||||||
; * as published by the Free Software Foundation. *
|
|
||||||
; ****************************************************************************
|
|
||||||
;
|
|
||||||
|
|
||||||
[Version]
|
|
||||||
Signature = "$Windows NT$"
|
|
||||||
CatalogFile = zttap300.cat
|
|
||||||
ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318}
|
|
||||||
Provider = %Provider%
|
|
||||||
Class = Net
|
|
||||||
DriverVer=08/13/2015,6.2.9200.20557
|
|
||||||
|
|
||||||
[Strings]
|
|
||||||
DeviceDescription = "ZeroTier One Virtual Port"
|
|
||||||
Provider = "ZeroTier Networks LLC" ; We're ZeroTier, Inc. now but kernel mode certs are $300+ so fuqdat.
|
|
||||||
|
|
||||||
; To build for x86, take NTamd64 off this and off the named section manually, build, then put it back!
|
|
||||||
[Manufacturer]
|
|
||||||
%Provider%=zttap300,NTamd64
|
|
||||||
|
|
||||||
[zttap300]
|
|
||||||
%DeviceDescription% = zttap300.ndi, root\zttap300 ; Root enumerated
|
|
||||||
%DeviceDescription% = zttap300.ndi, zttap300 ; Legacy
|
|
||||||
|
|
||||||
[zttap300.NTamd64]
|
|
||||||
%DeviceDescription% = zttap300.ndi, root\zttap300 ; Root enumerated
|
|
||||||
%DeviceDescription% = zttap300.ndi, zttap300 ; Legacy
|
|
||||||
|
|
||||||
;----------------- Characteristics ------------
|
|
||||||
; NCF_PHYSICAL = 0x04
|
|
||||||
; NCF_VIRTUAL = 0x01
|
|
||||||
; NCF_SOFTWARE_ENUMERATED = 0x02
|
|
||||||
; NCF_HIDDEN = 0x08
|
|
||||||
; NCF_NO_SERVICE = 0x10
|
|
||||||
; NCF_HAS_UI = 0x80
|
|
||||||
;----------------- Characteristics ------------
|
|
||||||
[zttap300.ndi]
|
|
||||||
CopyFiles = zttap300.driver, zttap300.files
|
|
||||||
AddReg = zttap300.reg
|
|
||||||
AddReg = zttap300.params.reg
|
|
||||||
Characteristics = 0x81
|
|
||||||
*IfType = 0x6 ; IF_TYPE_ETHERNET_CSMACD
|
|
||||||
*MediaType = 0x0 ; NdisMedium802_3
|
|
||||||
*PhysicalMediaType = 14 ; NdisPhysicalMedium802_3
|
|
||||||
|
|
||||||
[zttap300.ndi.Services]
|
|
||||||
AddService = zttap300, 2, zttap300.service
|
|
||||||
|
|
||||||
[zttap300.reg]
|
|
||||||
HKR, Ndi, Service, 0, "zttap300"
|
|
||||||
HKR, Ndi\Interfaces, UpperRange, 0, "ndis5" ; yes, 'ndis5' is correct... yup, Windows.
|
|
||||||
HKR, Ndi\Interfaces, LowerRange, 0, "ethernet"
|
|
||||||
HKR, , Manufacturer, 0, "%Provider%"
|
|
||||||
HKR, , ProductName, 0, "%DeviceDescription%"
|
|
||||||
|
|
||||||
[zttap300.params.reg]
|
|
||||||
HKR, Ndi\params\MTU, ParamDesc, 0, "MTU"
|
|
||||||
HKR, Ndi\params\MTU, Type, 0, "int"
|
|
||||||
HKR, Ndi\params\MTU, Default, 0, "2800"
|
|
||||||
HKR, Ndi\params\MTU, Optional, 0, "0"
|
|
||||||
HKR, Ndi\params\MTU, Min, 0, "100"
|
|
||||||
HKR, Ndi\params\MTU, Max, 0, "2800"
|
|
||||||
HKR, Ndi\params\MTU, Step, 0, "1"
|
|
||||||
HKR, Ndi\params\MediaStatus, ParamDesc, 0, "Media Status"
|
|
||||||
HKR, Ndi\params\MediaStatus, Type, 0, "enum"
|
|
||||||
HKR, Ndi\params\MediaStatus, Default, 0, "0"
|
|
||||||
HKR, Ndi\params\MediaStatus, Optional, 0, "0"
|
|
||||||
HKR, Ndi\params\MediaStatus\enum, "0", 0, "Application Controlled"
|
|
||||||
HKR, Ndi\params\MediaStatus\enum, "1", 0, "Always Connected"
|
|
||||||
HKR, Ndi\params\MAC, ParamDesc, 0, "MAC Address"
|
|
||||||
HKR, Ndi\params\MAC, Type, 0, "edit"
|
|
||||||
HKR, Ndi\params\MAC, Optional, 0, "1"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin, ParamDesc, 0, "Non-Admin Access"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin, Type, 0, "enum"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin, Default, 0, "0"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin, Optional, 0, "0"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin\enum, "0", 0, "Not Allowed"
|
|
||||||
HKR, Ndi\params\AllowNonAdmin\enum, "1", 0, "Allowed"
|
|
||||||
|
|
||||||
;---------- Service Type -------------
|
|
||||||
; SERVICE_KERNEL_DRIVER = 0x01
|
|
||||||
; SERVICE_WIN32_OWN_PROCESS = 0x10
|
|
||||||
;---------- Service Type -------------
|
|
||||||
|
|
||||||
;---------- Start Mode ---------------
|
|
||||||
; SERVICE_BOOT_START = 0x0
|
|
||||||
; SERVICE_SYSTEM_START = 0x1
|
|
||||||
; SERVICE_AUTO_START = 0x2
|
|
||||||
; SERVICE_DEMAND_START = 0x3
|
|
||||||
; SERVICE_DISABLED = 0x4
|
|
||||||
;---------- Start Mode ---------------
|
|
||||||
|
|
||||||
[zttap300.service]
|
|
||||||
DisplayName = %DeviceDescription%
|
|
||||||
ServiceType = 1
|
|
||||||
StartType = 3
|
|
||||||
ErrorControl = 1
|
|
||||||
LoadOrderGroup = NDIS
|
|
||||||
ServiceBinary = %12%\zttap300.sys
|
|
||||||
|
|
||||||
;----------------- Copy Flags ------------
|
|
||||||
; COPYFLG_NOSKIP = 0x02
|
|
||||||
; COPYFLG_NOVERSIONCHECK = 0x04
|
|
||||||
;----------------- Copy Flags ------------
|
|
||||||
|
|
||||||
[SourceDisksNames]
|
|
||||||
1 = %DeviceDescription%, zttap300.sys
|
|
||||||
|
|
||||||
[SourceDisksFiles]
|
|
||||||
zttap300.sys = 1
|
|
||||||
|
|
||||||
[DestinationDirs]
|
|
||||||
zttap300.files = 11
|
|
||||||
zttap300.driver = 12
|
|
||||||
|
|
||||||
[zttap300.files]
|
|
||||||
;
|
|
||||||
|
|
||||||
[zttap300.driver]
|
|
||||||
zttap300.sys,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK
|
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
You are reading this file because you want to build a new copy of the LwIP library for
|
|
||||||
use in ZeroTier.
|
|
||||||
|
|
||||||
Subdirectories:
|
|
||||||
|
|
||||||
ports/ -- contains ports for various architectures (for our purposes, unix)
|
|
||||||
|
|
||||||
In order for the Network Containers feature to work in ZeroTier, a copy of the LwIP libary
|
|
||||||
is needed since we dynamically load it into memory. You can build a new copy of the libary
|
|
||||||
by going to /contrib/ports/unix/proj/lib and running make.
|
|
||||||
|
|
||||||
This will generate: liblwip.so
|
|
||||||
|
|
||||||
You can enable LwIP debug traces by adding the flag -DLWIP_DEBUG
|
|
||||||
See additional debug info here: http://lwip.wikia.com/wiki/Debugging_lwIP
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
# are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer.
|
|
||||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
# 3. The name of the author may not be used to endorse or promote products
|
|
||||||
# derived from this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|
||||||
# SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
|
||||||
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
|
||||||
# OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
# This file is part of the lwIP TCP/IP stack.
|
|
||||||
#
|
|
||||||
# Author: Adam Dunkels <adam@sics.se>
|
|
||||||
#
|
|
||||||
|
|
||||||
CONTRIBDIR=../../../..
|
|
||||||
LWIPARCH=$(CONTRIBDIR)/ports/unix
|
|
||||||
|
|
||||||
#Set this to where you have the lwip core module checked out from CVS
|
|
||||||
#default assumes it's a dir named lwip at the same level as the contrib module
|
|
||||||
LWIPDIR=$(CONTRIBDIR)/../lwip/src
|
|
||||||
|
|
||||||
|
|
||||||
CCDEP=gcc
|
|
||||||
CC=gcc
|
|
||||||
CFLAGS=-g -Wall -DIPv4 -fPIC
|
|
||||||
|
|
||||||
CFLAGS:=$(CFLAGS) \
|
|
||||||
-I$(LWIPDIR)/include -I$(LWIPARCH)/include -I$(LWIPDIR)/include/ipv4 \
|
|
||||||
-I$(LWIPDIR) -I.
|
|
||||||
|
|
||||||
|
|
||||||
# COREFILES, CORE4FILES: The minimum set of files needed for lwIP.
|
|
||||||
COREFILES=$(LWIPDIR)/core/mem.c $(LWIPDIR)/core/memp.c $(LWIPDIR)/core/netif.c \
|
|
||||||
$(LWIPDIR)/core/pbuf.c $(LWIPDIR)/core/raw.c $(LWIPDIR)/core/stats.c \
|
|
||||||
$(LWIPDIR)/core/sys.c $(LWIPDIR)/core/tcp.c $(LWIPDIR)/core/tcp_in.c \
|
|
||||||
$(LWIPDIR)/core/tcp_out.c $(LWIPDIR)/core/udp.c $(LWIPDIR)/core/dhcp.c \
|
|
||||||
$(LWIPDIR)/core/init.c $(LWIPDIR)/core/timers.c $(LWIPDIR)/core/def.c
|
|
||||||
CORE4FILES=$(wildcard $(LWIPDIR)/core/ipv4/*.c) $(LWIPDIR)/core/ipv4/inet.c \
|
|
||||||
$(LWIPDIR)/core/ipv4/inet_chksum.c
|
|
||||||
|
|
||||||
# SNMPFILES: Extra SNMPv1 agent
|
|
||||||
SNMPFILES=$(LWIPDIR)/core/snmp/asn1_dec.c $(LWIPDIR)/core/snmp/asn1_enc.c \
|
|
||||||
$(LWIPDIR)/core/snmp/mib2.c $(LWIPDIR)/core/snmp/mib_structs.c \
|
|
||||||
$(LWIPDIR)/core/snmp/msg_in.c $(LWIPDIR)/core/snmp/msg_out.c
|
|
||||||
|
|
||||||
# APIFILES: The files which implement the sequential and socket APIs.
|
|
||||||
APIFILES=$(LWIPDIR)/api/api_lib.c $(LWIPDIR)/api/api_msg.c $(LWIPDIR)/api/tcpip.c \
|
|
||||||
$(LWIPDIR)/api/err.c $(LWIPDIR)/api/sockets.c $(LWIPDIR)/api/netbuf.c $(LWIPDIR)/api/netdb.c
|
|
||||||
|
|
||||||
# NETIFFILES: Files implementing various generic network interface functions.'
|
|
||||||
NETIFFILES=$(LWIPDIR)/netif/etharp.c $(LWIPDIR)/netif/slipif.c
|
|
||||||
|
|
||||||
# NETIFFILES: Add PPP netif
|
|
||||||
NETIFFILES+=$(LWIPDIR)/netif/ppp/auth.c $(LWIPDIR)/netif/ppp/chap.c \
|
|
||||||
$(LWIPDIR)/netif/ppp/chpms.c $(LWIPDIR)/netif/ppp/fsm.c \
|
|
||||||
$(LWIPDIR)/netif/ppp/ipcp.c $(LWIPDIR)/netif/ppp/lcp.c \
|
|
||||||
$(LWIPDIR)/netif/ppp/magic.c $(LWIPDIR)/netif/ppp/md5.c \
|
|
||||||
$(LWIPDIR)/netif/ppp/pap.c $(LWIPDIR)/netif/ppp/ppp.c \
|
|
||||||
$(LWIPDIR)/netif/ppp/randm.c $(LWIPDIR)/netif/ppp/vj.c
|
|
||||||
|
|
||||||
# ARCHFILES: Architecture specific files.
|
|
||||||
ARCHFILES=$(wildcard $(LWIPARCH)/*.c $(LWIPARCH)tapif.c $(LWIPARCH)/netif/list.c $(LWIPARCH)/netif/tcpdump.c)
|
|
||||||
|
|
||||||
|
|
||||||
# LWIPFILES: All the above.
|
|
||||||
LWIPFILES=$(COREFILES) $(CORE4FILES) $(SNMPFILES) $(APIFILES) $(NETIFFILES) $(ARCHFILES)
|
|
||||||
LWIPFILESW=$(wildcard $(LWIPFILES))
|
|
||||||
LWIPOBJS=$(notdir $(LWIPFILESW:.c=.o))
|
|
||||||
|
|
||||||
LWIPLIB=liblwip.so
|
|
||||||
|
|
||||||
%.o:
|
|
||||||
$(CC) $(CFLAGS) -c $(<:.o=.c)
|
|
||||||
|
|
||||||
all: $(LWIPLIB)
|
|
||||||
.PHONY: all
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o $(LWIPLIB) *.s .depend* *.core core
|
|
||||||
|
|
||||||
depend dep: .depend
|
|
||||||
|
|
||||||
include .depend
|
|
||||||
|
|
||||||
$(LWIPLIB): $(LWIPOBJS) unixlib.o
|
|
||||||
$(CC) -g -nostartfiles -shared -o $@ $^
|
|
||||||
|
|
||||||
.depend: unixlib.c $(LWIPFILES)
|
|
||||||
$(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .depend
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
This directory contains an example of how to compile lwIP as a self
|
|
||||||
initialising shared library on Linux.
|
|
||||||
|
|
||||||
Some brief instructions:
|
|
||||||
|
|
||||||
* Compile the code:
|
|
||||||
|
|
||||||
> make clean all
|
|
||||||
|
|
||||||
This should produce liblwip4unixlib.so. This is the shared library.
|
|
||||||
|
|
||||||
* Link an application against the shared library
|
|
||||||
|
|
||||||
If you're using gcc you can do this by including -llwip4unixlib in
|
|
||||||
your link command.
|
|
||||||
|
|
||||||
* Run your application
|
|
||||||
|
|
||||||
Ensure that LD_LIBRARY_PATH includes the directory that contains
|
|
||||||
liblwip4unixlib.so (ie. this directory)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
If you are unsure about shared libraries and libraries on linux in
|
|
||||||
general, you might find this HOWTO useful:
|
|
||||||
|
|
||||||
<http://www.tldp.org/HOWTO/Program-Library-HOWTO/>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Kieran Mansley, October 2002.
|
|
||||||
@@ -1,468 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file
|
|
||||||
*
|
|
||||||
* lwIP Options Configuration
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|
||||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
|
||||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
|
||||||
* OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIPOPTS_H__
|
|
||||||
#define __LWIPOPTS_H__
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Include user defined options first. Anything not defined in these files
|
|
||||||
* will be set to standard values. Override anything you dont like!
|
|
||||||
*/
|
|
||||||
#include "lwipopts.h"
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
|
|
||||||
|
|
||||||
//#define LWIP_DEBUG 0
|
|
||||||
//#define TCP_DEBUG LWIP_DBG_OFF
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
#define LWIP_MALLOC_MEMPOOL 1
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
#define LWIP_CHECKSUM_ON_COPY 1
|
|
||||||
|
|
||||||
#define TCP_OVERSIZE TCP_MSS
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef TCP_SND_QUEUELEN
|
|
||||||
#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//#define TCP_WND
|
|
||||||
|
|
||||||
|
|
||||||
//#define PBUF_POOL_BUFSIZE 2048
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
---------------------------------- Timers --------------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* these are originally defined in tcp_impl.h */
|
|
||||||
#ifndef TCP_TMR_INTERVAL
|
|
||||||
/* The TCP timer interval in milliseconds. */
|
|
||||||
#define TCP_TMR_INTERVAL 25
|
|
||||||
#endif /* TCP_TMR_INTERVAL */
|
|
||||||
|
|
||||||
#ifndef TCP_FAST_INTERVAL
|
|
||||||
/* the fine grained timeout in milliseconds */
|
|
||||||
#define TCP_FAST_INTERVAL TCP_TMR_INTERVAL
|
|
||||||
#endif /* TCP_FAST_INTERVAL */
|
|
||||||
|
|
||||||
#ifndef TCP_SLOW_INTERVALs
|
|
||||||
/* the coarse grained timeout in milliseconds */
|
|
||||||
#define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL)
|
|
||||||
#endif /* TCP_SLOW_INTERVAL */
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
--------------------------- Platform specific locking -------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
|
|
||||||
* critical regions during buffer allocation, deallocation and memory
|
|
||||||
* allocation and deallocation.
|
|
||||||
*/
|
|
||||||
#define SYS_LIGHTWEIGHT_PROT 0
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NO_SYS==1: Provides VERY minimal functionality. Otherwise,
|
|
||||||
* use lwIP facilities.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* set to 1 so we have no thread behaviour */
|
|
||||||
#define NO_SYS 1
|
|
||||||
|
|
||||||
/* set to 1 so we can use our own timers */
|
|
||||||
#define NO_SYS_NO_TIMERS 1
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
-------------------------------- Memory options --------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
#define LWIP_CHKSUM_ALGORITHM 2
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEM_ALIGNMENT: should be set to the alignment of the CPU
|
|
||||||
* 4 byte alignment -> #define MEM_ALIGNMENT 4
|
|
||||||
* 2 byte alignment -> #define MEM_ALIGNMENT 2
|
|
||||||
*/
|
|
||||||
#define MEM_ALIGNMENT 1
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEM_SIZE: the size of the heap memory. If the application will send
|
|
||||||
* a lot of data that needs to be copied, this should be set high.
|
|
||||||
*/
|
|
||||||
#define MEM_SIZE 1024 * 1024 * 64
|
|
||||||
#define TCP_SND_BUF 1024 * 63
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
-------------------------- Internal Memory Pool Sizes --------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF).
|
|
||||||
* If the application sends a lot of data out of ROM (or other static memory),
|
|
||||||
* this should be set high.
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_PBUF 256
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_RAW_PCB: Number of raw connection PCBs
|
|
||||||
* (requires the LWIP_RAW option)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_RAW_PCB 32
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
|
|
||||||
* per active UDP "connection".
|
|
||||||
* (requires the LWIP_UDP option)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_UDP_PCB 4
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections.
|
|
||||||
* (requires the LWIP_TCP option)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_TCP_PCB 128
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections.
|
|
||||||
* (requires the LWIP_TCP option)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_TCP_PCB_LISTEN 128
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments.
|
|
||||||
* (requires the LWIP_TCP option)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_TCP_SEG TCP_SND_QUEUELEN
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_REASSDATA: the number of simultaneously IP packets queued for
|
|
||||||
* reassembly (whole packets, not fragments!)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_REASSDATA 1
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing
|
|
||||||
* packets (pbufs) that are waiting for an ARP request (to resolve
|
|
||||||
* their destination address) to finish.
|
|
||||||
* (requires the ARP_QUEUEING option)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_ARP_QUEUE 2
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts.
|
|
||||||
* (requires NO_SYS==0)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_SYS_TIMEOUT 3
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_NETBUF: the number of struct netbufs.
|
|
||||||
* (only needed if you use the sequential API, like api_lib.c)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_NETBUF 2
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_NETCONN: the number of struct netconns.
|
|
||||||
* (only needed if you use the sequential API, like api_lib.c)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_NETCONN 4
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used
|
|
||||||
* for callback/timeout API communication.
|
|
||||||
* (only needed if you use tcpip.c)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_TCPIP_MSG_API 8
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used
|
|
||||||
* for incoming packets.
|
|
||||||
* (only needed if you use tcpip.c)
|
|
||||||
*/
|
|
||||||
#define MEMP_NUM_TCPIP_MSG_INPKT 8
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PBUF_POOL_SIZE: the number of buffers in the pbuf pool.
|
|
||||||
*/
|
|
||||||
#define PBUF_POOL_SIZE 128 /* was 32 */
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
----------------------------------- ARP options --------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_ARP==1: Enable ARP functionality.
|
|
||||||
*/
|
|
||||||
#define LWIP_ARP 1
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
------------------------------------ IP options---------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IP_FORWARD==1: Enables the ability to forward IP packets across network
|
|
||||||
* interfaces. If you are going to run lwIP on a device with only one network
|
|
||||||
* interface, define this to 0.
|
|
||||||
*/
|
|
||||||
#define IP_FORWARD 0
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IP_OPTIONS: Defines the behavior for IP options.
|
|
||||||
* IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped.
|
|
||||||
* IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed).
|
|
||||||
*/
|
|
||||||
#define IP_OPTIONS_ALLOWED 1
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that
|
|
||||||
* this option does not affect outgoing packet sizes, which can be controlled
|
|
||||||
* via IP_FRAG.
|
|
||||||
*/
|
|
||||||
#define IP_REASSEMBLY 1
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note
|
|
||||||
* that this option does not affect incoming packet sizes, which can be
|
|
||||||
* controlled via IP_REASSEMBLY.
|
|
||||||
*/
|
|
||||||
#define IP_FRAG 1
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally)
|
|
||||||
* a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived
|
|
||||||
* in this time, the whole packet is discarded.
|
|
||||||
*/
|
|
||||||
#define IP_REASS_MAXAGE 3
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled.
|
|
||||||
* Since the received pbufs are enqueued, be sure to configure
|
|
||||||
* PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive
|
|
||||||
* packets even if the maximum amount of fragments is enqueued for reassembly!
|
|
||||||
*/
|
|
||||||
#define IP_REASS_MAX_PBUFS 4
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP
|
|
||||||
* fragmentation. Otherwise pbufs are allocated and reference the original
|
|
||||||
* packet data to be fragmented.
|
|
||||||
*/
|
|
||||||
#define IP_FRAG_USES_STATIC_BUF 0
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers.
|
|
||||||
*/
|
|
||||||
#define IP_DEFAULT_TTL 255
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
------------------------------- ICMP Options -----------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_ICMP==1: Enable ICMP module inside the IP stack.
|
|
||||||
* Be careful, disable that make your product non-compliant to RFC1122
|
|
||||||
*/
|
|
||||||
#define LWIP_ICMP 1
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
------------------------------- RAW Options ------------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_RAW==1: Enable application layer to hook into the IP layer itself.
|
|
||||||
*/
|
|
||||||
#define LWIP_RAW 1
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
------------------------------- DHCP Options -----------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_DHCP==1: Enable DHCP module.
|
|
||||||
*/
|
|
||||||
#define LWIP_DHCP 0
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
------------------------------ AUTOIP Options ----------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_AUTOIP==1: Enable AUTOIP module.
|
|
||||||
*/
|
|
||||||
#define LWIP_AUTOIP 0
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
------------------------------- SNMP Options -----------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP
|
|
||||||
* transport.
|
|
||||||
*/
|
|
||||||
#define LWIP_SNMP 0
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
------------------------------- IGMP Options -----------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_IGMP==1: Turn on IGMP module.
|
|
||||||
*/
|
|
||||||
#define LWIP_IGMP 0
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
-------------------------------- DNS Options -----------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS
|
|
||||||
* transport.
|
|
||||||
*/
|
|
||||||
#define LWIP_DNS 0
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
-------------------------------- UDP Options -----------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_UDP==1: Turn on UDP.
|
|
||||||
*/
|
|
||||||
#define LWIP_UDP 1
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
-------------------------------- TCP Options -----------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_TCP==1: Turn on TCP.
|
|
||||||
*/
|
|
||||||
#define LWIP_TCP 1
|
|
||||||
|
|
||||||
#define LWIP_LISTEN_BACKLOG 0
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
-------------------------------- Pbuf Options ----------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PBUF_LINK_HLEN: the number of bytes that should be allocated for a
|
|
||||||
* link level header. The default is 14, the standard value for
|
|
||||||
* Ethernet.
|
|
||||||
*/
|
|
||||||
#define PBUF_LINK_HLEN 16
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is
|
|
||||||
* designed to accomodate single full size TCP frame in one pbuf, including
|
|
||||||
* TCP_MSS, IP header, and link header.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN)
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
--------------------------------- LOOPIF Options -------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c
|
|
||||||
*/
|
|
||||||
#define LWIP_HAVE_LOOPIF 0
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
---------------------------- Sequential Layer Options --------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)
|
|
||||||
*/
|
|
||||||
#define LWIP_NETCONN 0
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
--------------------------------- Socket Options -------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)
|
|
||||||
*/
|
|
||||||
#define LWIP_SOCKET 0
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
------------------------------ Statistics Options ------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LWIP_STATS==1: Enable statistics collection in lwip_stats.
|
|
||||||
*/
|
|
||||||
#define LWIP_STATS 1
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
--------------------------------- PPP Options ----------------------------------
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PPP_SUPPORT==1: Enable PPP.
|
|
||||||
*/
|
|
||||||
#define PPP_SUPPORT 0
|
|
||||||
|
|
||||||
|
|
||||||
/* Misc */
|
|
||||||
|
|
||||||
#endif /* __LWIPOPTS_H__ */
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|
||||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
|
||||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
|
||||||
* OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* Author: Kieran Mansley <kjm25@cam.ac.uk>
|
|
||||||
*
|
|
||||||
* $Id: unixlib.c,v 1.10 2010/02/17 16:52:30 goldsimon Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/* unixlib.c
|
|
||||||
*
|
|
||||||
* The initialisation functions for a shared library
|
|
||||||
*
|
|
||||||
* You may need to configure this file to your own needs - it is only an example
|
|
||||||
* of how lwIP can be used as a self initialising shared library.
|
|
||||||
*
|
|
||||||
* In particular, you should change the gateway, ipaddr, and netmask to be the values
|
|
||||||
* you would like the stack to use.
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include "lwip/init.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/memp.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/tcp.h"
|
|
||||||
#include "lwip/tcpip.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
#include "lwip/sockets.h"
|
|
||||||
|
|
||||||
#include "netif/tapif.h"
|
|
||||||
|
|
||||||
struct netif netif;
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
|
||||||
tcpip_init_done(void *arg)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void _init(void){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void _fini(void){
|
|
||||||
}
|
|
||||||
@@ -61,3 +61,8 @@ Marc O'Morain <github.com@marcomorain.com>
|
|||||||
Jeff Pinner <jpinner@twitter.com>
|
Jeff Pinner <jpinner@twitter.com>
|
||||||
Timothy J Fontaine <tjfontaine@gmail.com>
|
Timothy J Fontaine <tjfontaine@gmail.com>
|
||||||
Akagi201 <akagi201@gmail.com>
|
Akagi201 <akagi201@gmail.com>
|
||||||
|
Romain Giraud <giraud.romain@gmail.com>
|
||||||
|
Jay Satiro <raysatiro@yahoo.com>
|
||||||
|
Arne Steen <Arne.Steen@gmx.de>
|
||||||
|
Kjell Schubert <kjell.schubert@gmail.com>
|
||||||
|
Olivier Mengué <dolmen@cpan.org>
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ do { \
|
|||||||
FOR##_mark = NULL; \
|
FOR##_mark = NULL; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* Run the data callback FOR and consume the current byte */
|
/* Run the data callback FOR and consume the current byte */
|
||||||
#define CALLBACK_DATA(FOR) \
|
#define CALLBACK_DATA(FOR) \
|
||||||
CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)
|
CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)
|
||||||
@@ -440,7 +440,7 @@ enum http_host_state
|
|||||||
* character or %x80-FF
|
* character or %x80-FF
|
||||||
**/
|
**/
|
||||||
#define IS_HEADER_CHAR(ch) \
|
#define IS_HEADER_CHAR(ch) \
|
||||||
(ch == CR || ch == LF || ch == 9 || (ch > 31 && ch != 127))
|
(ch == CR || ch == LF || ch == 9 || ((unsigned char)ch > 31 && ch != 127))
|
||||||
|
|
||||||
#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
|
#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
|
||||||
|
|
||||||
@@ -1007,89 +1007,40 @@ reexecute:
|
|||||||
UPDATE_STATE(s_req_spaces_before_url);
|
UPDATE_STATE(s_req_spaces_before_url);
|
||||||
} else if (ch == matcher[parser->index]) {
|
} else if (ch == matcher[parser->index]) {
|
||||||
; /* nada */
|
; /* nada */
|
||||||
} else if (parser->method == HTTP_CONNECT) {
|
} else if (IS_ALPHA(ch)) {
|
||||||
if (parser->index == 1 && ch == 'H') {
|
|
||||||
parser->method = HTTP_CHECKOUT;
|
switch (parser->method << 16 | parser->index << 8 | ch) {
|
||||||
} else if (parser->index == 2 && ch == 'P') {
|
#define XX(meth, pos, ch, new_meth) \
|
||||||
parser->method = HTTP_COPY;
|
case (HTTP_##meth << 16 | pos << 8 | ch): \
|
||||||
} else {
|
parser->method = HTTP_##new_meth; break;
|
||||||
SET_ERRNO(HPE_INVALID_METHOD);
|
|
||||||
goto error;
|
XX(POST, 1, 'U', PUT)
|
||||||
}
|
XX(POST, 1, 'A', PATCH)
|
||||||
} else if (parser->method == HTTP_MKCOL) {
|
XX(CONNECT, 1, 'H', CHECKOUT)
|
||||||
if (parser->index == 1 && ch == 'O') {
|
XX(CONNECT, 2, 'P', COPY)
|
||||||
parser->method = HTTP_MOVE;
|
XX(MKCOL, 1, 'O', MOVE)
|
||||||
} else if (parser->index == 1 && ch == 'E') {
|
XX(MKCOL, 1, 'E', MERGE)
|
||||||
parser->method = HTTP_MERGE;
|
XX(MKCOL, 2, 'A', MKACTIVITY)
|
||||||
} else if (parser->index == 1 && ch == '-') {
|
XX(MKCOL, 3, 'A', MKCALENDAR)
|
||||||
parser->method = HTTP_MSEARCH;
|
XX(SUBSCRIBE, 1, 'E', SEARCH)
|
||||||
} else if (parser->index == 2 && ch == 'A') {
|
XX(REPORT, 2, 'B', REBIND)
|
||||||
parser->method = HTTP_MKACTIVITY;
|
XX(POST, 1, 'R', PROPFIND)
|
||||||
} else if (parser->index == 3 && ch == 'A') {
|
XX(PROPFIND, 4, 'P', PROPPATCH)
|
||||||
parser->method = HTTP_MKCALENDAR;
|
XX(PUT, 2, 'R', PURGE)
|
||||||
} else {
|
XX(LOCK, 1, 'I', LINK)
|
||||||
SET_ERRNO(HPE_INVALID_METHOD);
|
XX(UNLOCK, 2, 'S', UNSUBSCRIBE)
|
||||||
goto error;
|
XX(UNLOCK, 2, 'B', UNBIND)
|
||||||
}
|
XX(UNLOCK, 3, 'I', UNLINK)
|
||||||
} else if (parser->method == HTTP_SUBSCRIBE) {
|
#undef XX
|
||||||
if (parser->index == 1 && ch == 'E') {
|
|
||||||
parser->method = HTTP_SEARCH;
|
default:
|
||||||
} else {
|
|
||||||
SET_ERRNO(HPE_INVALID_METHOD);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
} else if (parser->method == HTTP_REPORT) {
|
|
||||||
if (parser->index == 2 && ch == 'B') {
|
|
||||||
parser->method = HTTP_REBIND;
|
|
||||||
} else {
|
|
||||||
SET_ERRNO(HPE_INVALID_METHOD);
|
SET_ERRNO(HPE_INVALID_METHOD);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
|
||||||
} else if (parser->index == 1) {
|
|
||||||
if (parser->method == HTTP_POST) {
|
|
||||||
if (ch == 'R') {
|
|
||||||
parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */
|
|
||||||
} else if (ch == 'U') {
|
|
||||||
parser->method = HTTP_PUT; /* or HTTP_PURGE */
|
|
||||||
} else if (ch == 'A') {
|
|
||||||
parser->method = HTTP_PATCH;
|
|
||||||
} else {
|
|
||||||
SET_ERRNO(HPE_INVALID_METHOD);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
} else if (parser->method == HTTP_LOCK) {
|
|
||||||
if (ch == 'I') {
|
|
||||||
parser->method = HTTP_LINK;
|
|
||||||
} else {
|
|
||||||
SET_ERRNO(HPE_INVALID_METHOD);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (parser->index == 2) {
|
} else if (ch == '-' &&
|
||||||
if (parser->method == HTTP_PUT) {
|
parser->index == 1 &&
|
||||||
if (ch == 'R') {
|
parser->method == HTTP_MKCOL) {
|
||||||
parser->method = HTTP_PURGE;
|
parser->method = HTTP_MSEARCH;
|
||||||
} else {
|
|
||||||
SET_ERRNO(HPE_INVALID_METHOD);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
} else if (parser->method == HTTP_UNLOCK) {
|
|
||||||
if (ch == 'S') {
|
|
||||||
parser->method = HTTP_UNSUBSCRIBE;
|
|
||||||
} else if(ch == 'B') {
|
|
||||||
parser->method = HTTP_UNBIND;
|
|
||||||
} else {
|
|
||||||
SET_ERRNO(HPE_INVALID_METHOD);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
SET_ERRNO(HPE_INVALID_METHOD);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
} else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') {
|
|
||||||
parser->method = HTTP_PROPPATCH;
|
|
||||||
} else if (parser->index == 3 && parser->method == HTTP_UNLOCK && ch == 'I') {
|
|
||||||
parser->method = HTTP_UNLINK;
|
|
||||||
} else {
|
} else {
|
||||||
SET_ERRNO(HPE_INVALID_METHOD);
|
SET_ERRNO(HPE_INVALID_METHOD);
|
||||||
goto error;
|
goto error;
|
||||||
@@ -1861,6 +1812,9 @@ reexecute:
|
|||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
parser->upgrade = 1;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
parser->flags |= F_SKIPBODY;
|
parser->flags |= F_SKIPBODY;
|
||||||
break;
|
break;
|
||||||
@@ -2299,12 +2253,13 @@ http_parse_host_char(enum http_host_state s, const char ch) {
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
|
http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
|
||||||
//assert(u->field_set & (1 << UF_HOST));
|
|
||||||
enum http_host_state s;
|
enum http_host_state s;
|
||||||
|
|
||||||
const char *p;
|
const char *p;
|
||||||
size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len;
|
size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len;
|
||||||
|
|
||||||
|
assert(u->field_set & (1 << UF_HOST));
|
||||||
|
|
||||||
u->field_data[UF_HOST].len = 0;
|
u->field_data[UF_HOST].len = 0;
|
||||||
|
|
||||||
s = found_at ? s_http_userinfo_start : s_http_host_start;
|
s = found_at ? s_http_userinfo_start : s_http_host_start;
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ extern "C" {
|
|||||||
|
|
||||||
/* Also update SONAME in the Makefile whenever you change these. */
|
/* Also update SONAME in the Makefile whenever you change these. */
|
||||||
#define HTTP_PARSER_VERSION_MAJOR 2
|
#define HTTP_PARSER_VERSION_MAJOR 2
|
||||||
#define HTTP_PARSER_VERSION_MINOR 6
|
#define HTTP_PARSER_VERSION_MINOR 7
|
||||||
#define HTTP_PARSER_VERSION_PATCH 1
|
#define HTTP_PARSER_VERSION_PATCH 0
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#if defined(_WIN32) && !defined(__MINGW32__) && \
|
#if defined(_WIN32) && !defined(__MINGW32__) && \
|
||||||
@@ -77,6 +77,11 @@ typedef struct http_parser_settings http_parser_settings;
|
|||||||
* HEAD request which may contain 'Content-Length' or 'Transfer-Encoding:
|
* HEAD request which may contain 'Content-Length' or 'Transfer-Encoding:
|
||||||
* chunked' headers that indicate the presence of a body.
|
* chunked' headers that indicate the presence of a body.
|
||||||
*
|
*
|
||||||
|
* Returning `2` from on_headers_complete will tell parser that it should not
|
||||||
|
* expect neither a body nor any futher responses on this connection. This is
|
||||||
|
* useful for handling responses to a CONNECT request which may not contain
|
||||||
|
* `Upgrade` or `Connection: upgrade` headers.
|
||||||
|
*
|
||||||
* http_data_cb does not return data chunks. It will be called arbitrarily
|
* http_data_cb does not return data chunks. It will be called arbitrarily
|
||||||
* many times for each string. E.G. you might get 10 callbacks for "on_url"
|
* many times for each string. E.G. you might get 10 callbacks for "on_url"
|
||||||
* each providing just a few characters more data.
|
* each providing just a few characters more data.
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
Package: zerotier-one
|
|
||||||
Architecture: __ARCH__
|
|
||||||
Maintainer: ZeroTier, Inc. <contact@zerotier.com>
|
|
||||||
Priority: optional
|
|
||||||
Version: __VERSION__
|
|
||||||
Installed-Size: 1024
|
|
||||||
Homepage: https://github.com/zerotier/ZeroTierOne
|
|
||||||
Description: ZeroTier One network virtualization service
|
|
||||||
ZeroTier One is a fast, secure, and easy to use peer to peer network
|
|
||||||
virtualization engine that provides global-scale software defined
|
|
||||||
networking to any device or application. Visit https://www.zerotier.com/
|
|
||||||
for more information.
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
This folder contains two spec files which enable building of various RPM packages for ZeroTier.
|
|
||||||
|
|
||||||
#zerotier-one.spec.in
|
|
||||||
This file contains the information to build an RPM from the bash based binary installer of ZeroTier. The resulting RPM cannot be recompiled to different architectures.
|
|
||||||
|
|
||||||
#zerotier.spec
|
|
||||||
This spec file is a “standard” RPM spec file. It fits to the common rpmbuild process, SRPM and differnt architectures are supported too. The spec file can be used to build two packages: the standard zerotier and the zerotier-controller. It supports some of the build options exposed in the original Linux makefile:
|
|
||||||
|
|
||||||
> `rpmbuild -ba zerotier.spec` #builds the standard zerotier package, this is what you need in most of the cases
|
|
||||||
|
|
||||||
> `rpmbuild -ba zerotier.spec --with controller` #builds the zerotier-controller package
|
|
||||||
|
|
||||||
> `rpmbuild -ba zerotier.spec --with debug` #builds the zerotier package with debug enable<>d
|
|
||||||
|
|
||||||
> `rpmbuild -ba zerotier.spec --with miniupnpc` #builds the zerotier package with miniupnpc enabled
|
|
||||||
|
|
||||||
> `rpmbuild -ba zerotier.spec --with cluster` #builds the zerotier package with cluster enabled
|
|
||||||
|
|
||||||
|
|
||||||
####Build environment preparation
|
|
||||||
As zerotier is not distributed in tar.gz format at the moment, the %prep section of the spec file takes care about the prepartion of an rpmbuild compatible tar.gz.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
Name: zerotier-one
|
|
||||||
Summary: ZeroTier One network virtualization service
|
|
||||||
Version: __VERSION__
|
|
||||||
Release: 1%{?dist}
|
|
||||||
License: GPLv3
|
|
||||||
URL: https://www.zerotier.com/
|
|
||||||
|
|
||||||
%description
|
|
||||||
ZeroTier One creates virtual Ethernet networks that work anywhere and everywhere.
|
|
||||||
Visit https://www.zerotier.com/ for more information.
|
|
||||||
|
|
||||||
%prep
|
|
||||||
mkdir -p $RPM_BUILD_ROOT/var/lib/zerotier-one/updates.d
|
|
||||||
cp -f $OLDPWD/__INSTALLER__ $RPM_BUILD_ROOT/var/lib/zerotier-one/updates.d
|
|
||||||
|
|
||||||
%pre
|
|
||||||
mkdir -p /var/lib/zerotier-one/updates.d
|
|
||||||
|
|
||||||
%files
|
|
||||||
/var/lib/zerotier-one/updates.d/__INSTALLER__
|
|
||||||
|
|
||||||
%post
|
|
||||||
chmod 0755 /var/lib/zerotier-one/updates.d/__INSTALLER__
|
|
||||||
/var/lib/zerotier-one/updates.d/__INSTALLER__ >>/dev/null 2>&1
|
|
||||||
|
|
||||||
%preun
|
|
||||||
if [ "$1" -lt 1 ]; then
|
|
||||||
/var/lib/zerotier-one/uninstall.sh >>/dev/null 2>&1
|
|
||||||
fi
|
|
||||||
|
|
||||||
%clean
|
|
||||||
cp -f %{_rpmdir}/%{_arch}/%{name}-%{version}-%{release}.%{_arch}.rpm $OLDPWD
|
|
||||||
rm -f %{_rpmdir}/%{_arch}/%{name}-%{version}-%{release}.%{_arch}.rpm
|
|
||||||
rm -rf $RPM_BUILD_ROOT
|
|
||||||
@@ -1,194 +0,0 @@
|
|||||||
# add --with controller option to build controller (builds zerotier-controller package)
|
|
||||||
%bcond_with controller
|
|
||||||
# add --with miniupnpc option to enable the miniupnpc option during build
|
|
||||||
%bcond_with miniupnpc
|
|
||||||
# add --with cluster option to enable the cluster option during build
|
|
||||||
%bcond_with cluster
|
|
||||||
# add --with debug option to enable the debug option during build
|
|
||||||
%bcond_with debug
|
|
||||||
%if %{with controller}
|
|
||||||
Name:zerotier-controller
|
|
||||||
Conflicts:zerotier
|
|
||||||
%else
|
|
||||||
Name:zerotier
|
|
||||||
Conflicts:zerotier-controller
|
|
||||||
%endif
|
|
||||||
Version: 1.1.4
|
|
||||||
Release: 1
|
|
||||||
Summary: Network Virtualization Everywhere https://www.zerotier.com/
|
|
||||||
Group: network
|
|
||||||
License: GPLv3
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-root
|
|
||||||
Provides: zerotier-one
|
|
||||||
Source0: http:///download/%{name}-%{version}.tar.gz
|
|
||||||
BuildRequires: gcc-c++
|
|
||||||
BuildRequires: make
|
|
||||||
BuildRequires: gcc
|
|
||||||
%if %{with server}
|
|
||||||
BuildRequires: sqlite-devel
|
|
||||||
BuildRequires: wget
|
|
||||||
BuildRequires: unzip
|
|
||||||
Requires: sqlite
|
|
||||||
%endif
|
|
||||||
%description
|
|
||||||
ZeroTier One creates virtual Ethernet networks that work anywhere and everywhere.
|
|
||||||
Visit https://www.zerotier.com/ for more information.
|
|
||||||
|
|
||||||
%prep
|
|
||||||
cd `mktemp -d`
|
|
||||||
wget -O master.zip https://github.com/zerotier/ZeroTierOne/archive/master.zip
|
|
||||||
unzip master.zip
|
|
||||||
mv ZeroTierOne-master zerotier-1.1.4
|
|
||||||
ln -s zerotier-1.1.4 zerotier-controller-1.1.4
|
|
||||||
tar zcvf zerotier-1.1.4.tar.gz zerotier-1.1.4 zerotier-controller-1.1.4
|
|
||||||
ln -s zerotier-1.1.4.tar.gz zerotier-controller-1.1.4.tar.gz
|
|
||||||
mv zero*.tar.gz ~/rpmbuild/SOURCES
|
|
||||||
cd -
|
|
||||||
%setup -q
|
|
||||||
|
|
||||||
%build
|
|
||||||
%if %{with miniupnpc}
|
|
||||||
ZT_USE_MINIUPNPC=1; export ZT_USE_MINIUPNPC;
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%if %{with controller}
|
|
||||||
ZT_ENABLE_NETWORK_CONTROLLER=1; export ZT_ENABLE_NETWORK_CONTROLLER;
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%if %{with cluster}
|
|
||||||
export ZT_ENABLE_CLUSTER=1
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%if %{with debug}
|
|
||||||
export ZT_DEBUG=1
|
|
||||||
%endif
|
|
||||||
|
|
||||||
make
|
|
||||||
|
|
||||||
%install
|
|
||||||
|
|
||||||
|
|
||||||
rm -rf $RPM_BUILD_ROOT
|
|
||||||
rm -f $RPM_BUILD_ROOT%{_prefix}/bin/zerotier-idtool $RPM_BUILD_ROOT%{_prefix}/bin/zerotier-idtool
|
|
||||||
echo 'Install...'
|
|
||||||
mkdir -p $RPM_BUILD_ROOT%{_vardir}/lib/zerotier-one/initfiles/{init.d,systemd}
|
|
||||||
install -m 0755 -D zerotier-one -t $RPM_BUILD_ROOT%{_vardir}/lib/zerotier-one/
|
|
||||||
install -m 0755 -D ext/installfiles/linux/init.d/* -t $RPM_BUILD_ROOT%{_vardir}/lib/zerotier-one/initfiles/init.d/
|
|
||||||
install -m 0755 -D ext/installfiles/linux/systemd/* -t $RPM_BUILD_ROOT%{_vardir}/lib/zerotier-one/initfiles/systemd/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%posttrans
|
|
||||||
echo -n 'Getting version of new install... '
|
|
||||||
newVersion=`/var/lib/zerotier-one/zerotier-one -v`
|
|
||||||
echo $newVersion
|
|
||||||
|
|
||||||
echo 'Creating symlinks...'
|
|
||||||
|
|
||||||
rm -f /usr/bin/zerotier-cli /usr/bin/zerotier-idtool
|
|
||||||
ln -sf /var/lib/zerotier-one/zerotier-one /usr/bin/zerotier-cli
|
|
||||||
ln -sf /var/lib/zerotier-one/zerotier-one /usr/bin/zerotier-idtool
|
|
||||||
echo 'Installing zerotier-one service...'
|
|
||||||
|
|
||||||
SYSTEMDUNITDIR=
|
|
||||||
if [ -e /bin/systemctl -o -e /usr/bin/systemctl -o -e /usr/local/bin/systemctl -o -e /sbin/systemctl -o -e /usr/sbin/systemctl ]; then
|
|
||||||
# Second check: test if systemd appears to actually be running. Apparently Ubuntu
|
|
||||||
# thought it was a good idea to ship with systemd installed but not used. Issue #133
|
|
||||||
if [ -d /var/run/systemd/system -o -d /run/systemd/system ]; then
|
|
||||||
if [ -e /usr/bin/pkg-config ]; then
|
|
||||||
SYSTEMDUNITDIR=`/usr/bin/pkg-config systemd --variable=systemdsystemunitdir`
|
|
||||||
fi
|
|
||||||
if [ -z "$SYSTEMDUNITDIR" -o ! -d "$SYSTEMDUNITDIR" ]; then
|
|
||||||
if [ -d /usr/lib/systemd/system ]; then
|
|
||||||
SYSTEMDUNITDIR=/usr/lib/systemd/system
|
|
||||||
fi
|
|
||||||
if [ -d /etc/systemd/system ]; then
|
|
||||||
SYSTEMDUNITDIR=/etc/systemd/system
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$SYSTEMDUNITDIR" -a -d "$SYSTEMDUNITDIR" ]; then
|
|
||||||
# SYSTEMD
|
|
||||||
|
|
||||||
# If this was updated or upgraded from an init.d based system, clean up the old
|
|
||||||
# init.d stuff before installing directly via systemd.
|
|
||||||
if [ -f /etc/init.d/zerotier-one ]; then
|
|
||||||
if [ -e /sbin/chkconfig -o -e /usr/sbin/chkconfig -o -e /bin/chkconfig -o -e /usr/bin/chkconfig ]; then
|
|
||||||
chkconfig zerotier-one off
|
|
||||||
fi
|
|
||||||
rm -f /etc/init.d/zerotier-one
|
|
||||||
fi
|
|
||||||
|
|
||||||
cp -f /var/lib/zerotier-one/initfiles/systemd/zerotier-one.service "$SYSTEMDUNITDIR/zerotier-one.service"
|
|
||||||
chown 0 "$SYSTEMDUNITDIR/zerotier-one.service"
|
|
||||||
chgrp 0 "$SYSTEMDUNITDIR/zerotier-one.service"
|
|
||||||
chmod 0755 "$SYSTEMDUNITDIR/zerotier-one.service"
|
|
||||||
|
|
||||||
systemctl enable zerotier-one.service
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo 'Done! Installed and service configured to start at system boot.'
|
|
||||||
echo
|
|
||||||
echo "To start now or restart the service if it's already running:"
|
|
||||||
echo ' sudo systemctl restart zerotier-one.service'
|
|
||||||
else
|
|
||||||
# SYSV INIT -- also covers upstart which supports SysVinit backward compatibility
|
|
||||||
|
|
||||||
cp -f /var/lib/zerotier-one/initfiles/init.d/zerotier-one /etc/init.d/zerotier-one
|
|
||||||
chmod 0755 /etc/init.d/zerotier-one
|
|
||||||
|
|
||||||
if [ -f /sbin/chkconfig -o -f /usr/sbin/chkconfig -o -f /usr/bin/chkconfig -o -f /bin/chkconfig ]; then
|
|
||||||
chkconfig zerotier-one on
|
|
||||||
else
|
|
||||||
# Yes Virginia, some systems lack chkconfig.
|
|
||||||
if [ -d /etc/rc0.d ]; then
|
|
||||||
rm -f /etc/rc0.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc0.d/K89zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc1.d ]; then
|
|
||||||
rm -f /etc/rc1.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc1.d/K89zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc2.d ]; then
|
|
||||||
rm -f /etc/rc2.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc2.d/S11zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc3.d ]; then
|
|
||||||
rm -f /etc/rc3.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc3.d/S11zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc4.d ]; then
|
|
||||||
rm -f /etc/rc4.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc4.d/S11zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc5.d ]; then
|
|
||||||
rm -f /etc/rc5.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc5.d/S11zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc6.d ]; then
|
|
||||||
rm -f /etc/rc6.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc6.d/K89zerotier-one
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
echo
|
|
||||||
echo 'Done! Installed and service configured to start at system boot.'
|
|
||||||
echo
|
|
||||||
echo "To start now or restart the service if it's already running:"
|
|
||||||
echo ' sudo service zerotier-one restart'
|
|
||||||
fi
|
|
||||||
%preun
|
|
||||||
/sbin/chkconfig --del zerotier-one
|
|
||||||
rm -f /usr/bin/zerotier-cli /usr/bin/zerotier-idtool
|
|
||||||
|
|
||||||
%clean
|
|
||||||
rm -rf $RPM_BUILD_ROOT
|
|
||||||
%files
|
|
||||||
%{_vardir}/lib/zerotier-one/zerotier-one
|
|
||||||
%{_vardir}/lib/zerotier-one/initfiles/systemd/zerotier-one.service
|
|
||||||
%{_vardir}/lib/zerotier-one/initfiles/init.d/zerotier-one
|
|
||||||
|
|
||||||
%changelog
|
|
||||||
* Fri Feb 26 2016 Kristof Imre Szabo <kristof.szabo@lxsystems.de> 1.1.4-1
|
|
||||||
- initial package
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# This script builds the installer for *nix systems. Windows must do everything
|
|
||||||
# completely differently, as usual.
|
|
||||||
|
|
||||||
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
|
|
||||||
|
|
||||||
if [ ! -f zerotier-one ]; then
|
|
||||||
echo "Could not find 'zerotier-one' binary, please build before running this script."
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
machine=`uname -m`
|
|
||||||
system=`uname -s`
|
|
||||||
|
|
||||||
vmajor=`cat version.h | grep -F ZEROTIER_ONE_VERSION_MAJOR | cut -d ' ' -f 3`
|
|
||||||
vminor=`cat version.h | grep -F ZEROTIER_ONE_VERSION_MINOR | cut -d ' ' -f 3`
|
|
||||||
revision=`cat version.h | grep -F ZEROTIER_ONE_VERSION_REVISION | cut -d ' ' -f 3`
|
|
||||||
|
|
||||||
if [ -z "$vmajor" -o -z "$vminor" -o -z "$revision" ]; then
|
|
||||||
echo "Unable to extract version info from version.h, aborting installer build."
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -rf build-installer
|
|
||||||
mkdir build-installer
|
|
||||||
|
|
||||||
case "$system" in
|
|
||||||
|
|
||||||
Linux)
|
|
||||||
# Canonicalize $machine for some architectures... we use x86
|
|
||||||
# and x64 for Intel stuff. ARM and others should be fine if
|
|
||||||
# we ever ship officially for those.
|
|
||||||
debian_arch=$machine
|
|
||||||
case "$machine" in
|
|
||||||
i386|i486|i586|i686)
|
|
||||||
machine="x86"
|
|
||||||
debian_arch="i386"
|
|
||||||
;;
|
|
||||||
x86_64|amd64|x64)
|
|
||||||
machine="x64"
|
|
||||||
debian_arch="amd64"
|
|
||||||
;;
|
|
||||||
armv6l|arm|armhf|arm7l|armv7l)
|
|
||||||
machine="armv6l"
|
|
||||||
debian_arch="armhf"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "Assembling Linux installer for $machine and version $vmajor.$vminor.$revision"
|
|
||||||
|
|
||||||
mkdir -p 'build-installer/var/lib/zerotier-one/ui'
|
|
||||||
cp -fp 'ext/installfiles/linux/uninstall.sh' 'build-installer/var/lib/zerotier-one'
|
|
||||||
cp -fp 'zerotier-one' 'build-installer/var/lib/zerotier-one'
|
|
||||||
for f in ui/*.html ui/*.js ui/*.css ui/*.jsx ; do
|
|
||||||
cp -fp "$f" 'build-installer/var/lib/zerotier-one/ui'
|
|
||||||
done
|
|
||||||
mkdir -p 'build-installer/tmp'
|
|
||||||
cp -fp 'ext/installfiles/linux/init.d/zerotier-one' 'build-installer/tmp/init.d_zerotier-one'
|
|
||||||
cp -fp 'ext/installfiles/linux/systemd/zerotier-one.service' 'build-installer/tmp/systemd_zerotier-one.service'
|
|
||||||
|
|
||||||
targ="ZeroTierOneInstaller-linux-${machine}-${vmajor}_${vminor}_${revision}"
|
|
||||||
# Use gzip in Linux since some minimal Linux systems do not have bunzip2
|
|
||||||
rm -f build-installer-tmp.tar.gz
|
|
||||||
cd build-installer
|
|
||||||
tar -cf - * | gzip -9 >../build-installer-tmp.tar.gz
|
|
||||||
cd ..
|
|
||||||
rm -f $targ
|
|
||||||
cat ext/installfiles/linux/install.tmpl.sh build-installer-tmp.tar.gz >$targ
|
|
||||||
chmod 0755 $targ
|
|
||||||
rm -f build-installer-tmp.tar.gz
|
|
||||||
ls -l $targ
|
|
||||||
|
|
||||||
if [ -f /usr/bin/dpkg-deb -a "$UID" -eq 0 ]; then
|
|
||||||
echo
|
|
||||||
echo Found dpkg-deb and you are root, trying to build Debian package.
|
|
||||||
|
|
||||||
rm -rf build-installer-deb
|
|
||||||
|
|
||||||
debbase="build-installer-deb/zerotier-one_${vmajor}.${vminor}.${revision}_$debian_arch"
|
|
||||||
debfolder="${debbase}/DEBIAN"
|
|
||||||
mkdir -p $debfolder
|
|
||||||
|
|
||||||
cat 'ext/installfiles/linux/DEBIAN/control.in' | sed "s/__VERSION__/${vmajor}.${vminor}.${revision}/" | sed "s/__ARCH__/${debian_arch}/" >$debfolder/control
|
|
||||||
cat $debfolder/control
|
|
||||||
cp -f 'ext/installfiles/linux/DEBIAN/conffiles' "${debfolder}/conffiles"
|
|
||||||
|
|
||||||
mkdir -p "${debbase}/var/lib/zerotier-one/updates.d"
|
|
||||||
cp -f $targ "${debbase}/var/lib/zerotier-one/updates.d"
|
|
||||||
|
|
||||||
rm -f "${debfolder}/postinst" "${debfolder}/prerm"
|
|
||||||
|
|
||||||
echo '#!/bin/bash' >${debfolder}/postinst
|
|
||||||
echo "/var/lib/zerotier-one/updates.d/${targ} >>/dev/null 2>&1" >>${debfolder}/postinst
|
|
||||||
echo "/bin/rm -f /var/lib/zerotier-one/updates.d/*" >>${debfolder}/postinst
|
|
||||||
chmod a+x ${debfolder}/postinst
|
|
||||||
|
|
||||||
echo '#!/bin/bash' >${debfolder}/prerm
|
|
||||||
echo 'export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin' >>${debfolder}/prerm
|
|
||||||
echo 'if [ "$1" != "upgrade" ]; then' >>${debfolder}/prerm
|
|
||||||
echo ' /var/lib/zerotier-one/uninstall.sh >>/dev/null 2>&1' >>${debfolder}/prerm
|
|
||||||
echo 'fi' >>${debfolder}/prerm
|
|
||||||
chmod a+x ${debfolder}/prerm
|
|
||||||
|
|
||||||
dpkg-deb --build $debbase
|
|
||||||
|
|
||||||
mv -f build-installer-deb/*.deb .
|
|
||||||
rm -rf build-installer-deb
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f /usr/bin/rpmbuild ]; then
|
|
||||||
echo
|
|
||||||
echo Found rpmbuild, trying to build RedHat/CentOS package.
|
|
||||||
|
|
||||||
rm -f /tmp/zerotier-one.spec
|
|
||||||
curr_dir=`pwd`
|
|
||||||
cat ext/installfiles/linux/RPM/zerotier-one.spec.in | sed "s/__VERSION__/${vmajor}.${vminor}.${revision}/g" | sed "s/__INSTALLER__/${targ}/g" >/tmp/zerotier-one.spec
|
|
||||||
|
|
||||||
rpmbuild -ba /tmp/zerotier-one.spec
|
|
||||||
|
|
||||||
rm -f /tmp/zerotier-one.spec
|
|
||||||
fi
|
|
||||||
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Unsupported platform: $system"
|
|
||||||
exit 2
|
|
||||||
|
|
||||||
esac
|
|
||||||
|
|
||||||
rm -rf build-installer
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,182 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
|
|
||||||
shopt -s expand_aliases
|
|
||||||
|
|
||||||
dryRun=0
|
|
||||||
|
|
||||||
echo "*** ZeroTier One install/update ***"
|
|
||||||
echo
|
|
||||||
|
|
||||||
if [ "$UID" -ne 0 ]; then
|
|
||||||
echo "Not running as root so doing dry run (no modifications to system)..."
|
|
||||||
dryRun=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $dryRun -gt 0 ]; then
|
|
||||||
alias ln="echo '>> ln'"
|
|
||||||
alias rm="echo '>> rm'"
|
|
||||||
alias mv="echo '>> mv'"
|
|
||||||
alias cp="echo '>> cp'"
|
|
||||||
alias chown="echo '>> chown'"
|
|
||||||
alias chgrp="echo '>> chgrp'"
|
|
||||||
alias chmod="echo '>> chmod'"
|
|
||||||
alias chkconfig="echo '>> chkconfig'"
|
|
||||||
alias zerotier-cli="echo '>> zerotier-cli'"
|
|
||||||
alias service="echo '>> service'"
|
|
||||||
alias systemctl="echo '>> systemctl'"
|
|
||||||
fi
|
|
||||||
|
|
||||||
scriptPath="`dirname "$0"`/`basename "$0"`"
|
|
||||||
if [ ! -r "$scriptPath" ]; then
|
|
||||||
scriptPath="$0"
|
|
||||||
if [ ! -r "$scriptPath" ]; then
|
|
||||||
echo "Installer cannot determine its own path; $scriptPath is not readable."
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for systemd vs. old school SysV init
|
|
||||||
SYSTEMDUNITDIR=
|
|
||||||
if [ -e /bin/systemctl -o -e /usr/bin/systemctl -o -e /usr/local/bin/systemctl -o -e /sbin/systemctl -o -e /usr/sbin/systemctl ]; then
|
|
||||||
# Second check: test if systemd appears to actually be running. Apparently Ubuntu
|
|
||||||
# thought it was a good idea to ship with systemd installed but not used. Issue #133
|
|
||||||
if [ -d /var/run/systemd/system -o -d /run/systemd/system ]; then
|
|
||||||
if [ -e /usr/bin/pkg-config ]; then
|
|
||||||
SYSTEMDUNITDIR=`/usr/bin/pkg-config systemd --variable=systemdsystemunitdir`
|
|
||||||
fi
|
|
||||||
if [ -z "$SYSTEMDUNITDIR" -o ! -d "$SYSTEMDUNITDIR" ]; then
|
|
||||||
if [ -d /usr/lib/systemd/system ]; then
|
|
||||||
SYSTEMDUNITDIR=/usr/lib/systemd/system
|
|
||||||
fi
|
|
||||||
if [ -d /etc/systemd/system ]; then
|
|
||||||
SYSTEMDUNITDIR=/etc/systemd/system
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Find the end of this script, which is where we have appended binary data.
|
|
||||||
endMarkerIndex=`grep -a -b -E '^################' "$scriptPath" | head -c 16 | cut -d : -f 1`
|
|
||||||
if [ "$endMarkerIndex" -le 100 ]; then
|
|
||||||
echo 'Internal error: unable to find end of script / start of binary data marker.'
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
blobStart=`expr $endMarkerIndex + 17`
|
|
||||||
if [ "$blobStart" -le "$endMarkerIndex" ]; then
|
|
||||||
echo 'Internal error: unable to find end of script / start of binary data marker.'
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -n 'Getting version of existing install... '
|
|
||||||
origVersion=NONE
|
|
||||||
if [ -x /var/lib/zerotier-one/zerotier-one ]; then
|
|
||||||
origVersion=`/var/lib/zerotier-one/zerotier-one -v`
|
|
||||||
fi
|
|
||||||
echo $origVersion
|
|
||||||
|
|
||||||
echo 'Extracting files...'
|
|
||||||
if [ $dryRun -gt 0 ]; then
|
|
||||||
echo ">> tail -c +$blobStart \"$scriptPath\" | gunzip -c | tar -xvop -C / -f -"
|
|
||||||
tail -c +$blobStart "$scriptPath" | gunzip -c | tar -t -f - | sed 's/^/>> /'
|
|
||||||
else
|
|
||||||
tail -c +$blobStart "$scriptPath" | gunzip -c | tar -xvop --no-overwrite-dir -C / -f -
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $dryRun -eq 0 -a ! -x "/var/lib/zerotier-one/zerotier-one" ]; then
|
|
||||||
echo 'Archive extraction failed, cannot find zerotier-one binary in "/var/lib/zerotier-one".'
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -n 'Getting version of new install... '
|
|
||||||
newVersion=`/var/lib/zerotier-one/zerotier-one -v`
|
|
||||||
echo $newVersion
|
|
||||||
|
|
||||||
echo 'Creating symlinks...'
|
|
||||||
|
|
||||||
rm -f /usr/bin/zerotier-cli /usr/bin/zerotier-idtool
|
|
||||||
ln -sf /var/lib/zerotier-one/zerotier-one /usr/bin/zerotier-cli
|
|
||||||
ln -sf /var/lib/zerotier-one/zerotier-one /usr/bin/zerotier-idtool
|
|
||||||
|
|
||||||
echo 'Installing zerotier-one service...'
|
|
||||||
|
|
||||||
if [ -n "$SYSTEMDUNITDIR" -a -d "$SYSTEMDUNITDIR" ]; then
|
|
||||||
# SYSTEMD
|
|
||||||
|
|
||||||
# If this was updated or upgraded from an init.d based system, clean up the old
|
|
||||||
# init.d stuff before installing directly via systemd.
|
|
||||||
if [ -f /etc/init.d/zerotier-one ]; then
|
|
||||||
if [ -e /sbin/chkconfig -o -e /usr/sbin/chkconfig -o -e /bin/chkconfig -o -e /usr/bin/chkconfig ]; then
|
|
||||||
chkconfig zerotier-one off
|
|
||||||
fi
|
|
||||||
rm -f /etc/init.d/zerotier-one
|
|
||||||
fi
|
|
||||||
|
|
||||||
cp -f /tmp/systemd_zerotier-one.service "$SYSTEMDUNITDIR/zerotier-one.service"
|
|
||||||
chown 0 "$SYSTEMDUNITDIR/zerotier-one.service"
|
|
||||||
chgrp 0 "$SYSTEMDUNITDIR/zerotier-one.service"
|
|
||||||
chmod 0644 "$SYSTEMDUNITDIR/zerotier-one.service"
|
|
||||||
rm -f /tmp/systemd_zerotier-one.service /tmp/init.d_zerotier-one
|
|
||||||
|
|
||||||
systemctl enable zerotier-one.service
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo 'Done! Installed and service configured to start at system boot.'
|
|
||||||
echo
|
|
||||||
echo "To start now or restart the service if it's already running:"
|
|
||||||
echo ' sudo systemctl restart zerotier-one.service'
|
|
||||||
else
|
|
||||||
# SYSV INIT -- also covers upstart which supports SysVinit backward compatibility
|
|
||||||
|
|
||||||
cp -f /tmp/init.d_zerotier-one /etc/init.d/zerotier-one
|
|
||||||
chmod 0755 /etc/init.d/zerotier-one
|
|
||||||
rm -f /tmp/systemd_zerotier-one.service /tmp/init.d_zerotier-one
|
|
||||||
|
|
||||||
if [ -f /sbin/chkconfig -o -f /usr/sbin/chkconfig -o -f /usr/bin/chkconfig -o -f /bin/chkconfig ]; then
|
|
||||||
chkconfig zerotier-one on
|
|
||||||
else
|
|
||||||
# Yes Virginia, some systems lack chkconfig.
|
|
||||||
if [ -d /etc/rc0.d ]; then
|
|
||||||
rm -f /etc/rc0.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc0.d/K89zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc1.d ]; then
|
|
||||||
rm -f /etc/rc1.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc1.d/K89zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc2.d ]; then
|
|
||||||
rm -f /etc/rc2.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc2.d/S11zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc3.d ]; then
|
|
||||||
rm -f /etc/rc3.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc3.d/S11zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc4.d ]; then
|
|
||||||
rm -f /etc/rc4.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc4.d/S11zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc5.d ]; then
|
|
||||||
rm -f /etc/rc5.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc5.d/S11zerotier-one
|
|
||||||
fi
|
|
||||||
if [ -d /etc/rc6.d ]; then
|
|
||||||
rm -f /etc/rc6.d/???zerotier-one
|
|
||||||
ln -sf /etc/init.d/zerotier-one /etc/rc6.d/K89zerotier-one
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo 'Done! Installed and service configured to start at system boot.'
|
|
||||||
echo
|
|
||||||
echo "To start now or restart the service if it's already running:"
|
|
||||||
echo ' sudo service zerotier-one restart'
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Do not remove the last line or add a carriage return to it! The installer
|
|
||||||
# looks for an unterminated line beginning with 16 #'s in itself to find
|
|
||||||
# the binary blob data, which is appended after it.
|
|
||||||
|
|
||||||
################
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=ZeroTier One
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
ExecStart=/var/lib/zerotier-one/zerotier-one
|
|
||||||
Restart=always
|
|
||||||
KillMode=process
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
|
|
||||||
|
|
||||||
if [ "$UID" -ne 0 ]; then
|
|
||||||
echo "Must be run as root; try: sudo $0"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Detect systemd vs. regular init
|
|
||||||
SYSTEMDUNITDIR=
|
|
||||||
if [ -e /bin/systemctl -o -e /usr/bin/systemctl -o -e /usr/local/bin/systemctl -o -e /sbin/systemctl -o -e /usr/sbin/systemctl ]; then
|
|
||||||
if [ -e /usr/bin/pkg-config ]; then
|
|
||||||
SYSTEMDUNITDIR=`/usr/bin/pkg-config systemd --variable=systemdsystemunitdir`
|
|
||||||
fi
|
|
||||||
if [ -z "$SYSTEMDUNITDIR" -o ! -d "$SYSTEMDUNITDIR" ]; then
|
|
||||||
if [ -d /usr/lib/systemd/system ]; then
|
|
||||||
SYSTEMDUNITDIR=/usr/lib/systemd/system
|
|
||||||
fi
|
|
||||||
if [ -d /etc/systemd/system ]; then
|
|
||||||
SYSTEMDUNITDIR=/etc/systemd/system
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Killing any running zerotier-one service..."
|
|
||||||
if [ -n "$SYSTEMDUNITDIR" -a -d "$SYSTEMDUNITDIR" ]; then
|
|
||||||
systemctl stop zerotier-one.service
|
|
||||||
systemctl disable zerotier-one.service
|
|
||||||
else
|
|
||||||
if [ -f /sbin/service -o -f /usr/sbin/service -o -f /bin/service -o -f /usr/bin/service ]; then
|
|
||||||
service zerotier-one stop
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
if [ -f /var/lib/zerotier-one/zerotier-one.pid ]; then
|
|
||||||
kill -TERM `cat /var/lib/zerotier-one/zerotier-one.pid`
|
|
||||||
sleep 1
|
|
||||||
fi
|
|
||||||
if [ -f /var/lib/zerotier-one/zerotier-one.pid ]; then
|
|
||||||
kill -KILL `cat /var/lib/zerotier-one/zerotier-one.pid`
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f /etc/init.d/zerotier-one ]; then
|
|
||||||
echo "Removing SysV init items..."
|
|
||||||
if [ -f /sbin/chkconfig -o -f /usr/sbin/chkconfig -o -f /bin/chkconfig -o -f /usr/bin/chkconfig ]; then
|
|
||||||
chkconfig zerotier-one off
|
|
||||||
fi
|
|
||||||
rm -f /etc/init.d/zerotier-one
|
|
||||||
find /etc/rc*.d -type f -name '???zerotier-one' -print0 | xargs -0 rm -f
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$SYSTEMDUNITDIR" -a -d "$SYSTEMDUNITDIR" -a -f "$SYSTEMDUNITDIR/zerotier-one.service" ]; then
|
|
||||||
echo "Removing systemd service..."
|
|
||||||
rm -f "$SYSTEMDUNITDIR/zerotier-one.service"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Erasing binary and support files..."
|
|
||||||
if [ -d /var/lib/zerotier-one ]; then
|
|
||||||
cd /var/lib/zerotier-one
|
|
||||||
rm -rf zerotier-one *.persist identity.public *.log *.pid *.sh updates.d networks.d iddb.d root-topology ui
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Erasing anything installed into system bin directories..."
|
|
||||||
rm -f /usr/local/bin/zerotier-cli /usr/bin/zerotier-cli /usr/local/bin/zerotier-idtool /usr/bin/zerotier-idtool
|
|
||||||
|
|
||||||
echo "Done."
|
|
||||||
echo
|
|
||||||
echo "Your ZeroTier One identity is still preserved in /var/lib/zerotier-one"
|
|
||||||
echo "as identity.secret and can be manually deleted if you wish. Save it if"
|
|
||||||
echo "you wish to re-use the address of this node, as it cannot be regenerated."
|
|
||||||
|
|
||||||
echo
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,984 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>PROJECT</key>
|
|
||||||
<dict>
|
|
||||||
<key>PACKAGE_FILES</key>
|
|
||||||
<dict>
|
|
||||||
<key>DEFAULT_INSTALL_LOCATION</key>
|
|
||||||
<string>/</string>
|
|
||||||
<key>HIERARCHY</key>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Utilities</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../mac-ui-macgap1-wrapper/bin/ZeroTier One.app</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Applications</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>509</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>get-proxy-settings.sh</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>launch.sh</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../bin/tap-mac/tap.kext</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../../ui/index.html</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>420</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../../ui/main.js</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>420</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../../ui/react.min.js</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>420</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../../ui/simpleajax.min.js</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>420</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../../ui/zerotier.css</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>420</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../../ui/ztui.min.js</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>420</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>ui</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>uninstall.sh</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../../zerotier-one</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>One</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>ZeroTier</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Application Support</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Automator</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Documentation</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Filesystems</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Frameworks</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Input Methods</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Internet Plug-Ins</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>LaunchAgents</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>com.zerotier.one.plist</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>420</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>LaunchDaemons</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>PreferencePanes</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Preferences</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Printers</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>PrivilegedHelperTools</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>QuickLook</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>QuickTime</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Screen Savers</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Scripts</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Services</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Widgets</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Library</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Extensions</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Library</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>System</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Shared</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>1023</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Users</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>/</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<key>PAYLOAD_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>VERSION</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
</dict>
|
|
||||||
<key>PACKAGE_SCRIPTS</key>
|
|
||||||
<dict>
|
|
||||||
<key>POSTINSTALL_PATH</key>
|
|
||||||
<dict>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>postinst.sh</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
<key>PREINSTALL_PATH</key>
|
|
||||||
<dict>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>preinst.sh</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
<key>RESOURCES</key>
|
|
||||||
<array/>
|
|
||||||
</dict>
|
|
||||||
<key>PACKAGE_SETTINGS</key>
|
|
||||||
<dict>
|
|
||||||
<key>AUTHENTICATION</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>CONCLUSION_ACTION</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>IDENTIFIER</key>
|
|
||||||
<string>com.zerotier.pkg.ZeroTierOne</string>
|
|
||||||
<key>OVERWRITE_PERMISSIONS</key>
|
|
||||||
<false/>
|
|
||||||
<key>VERSION</key>
|
|
||||||
<string>1.0.3</string>
|
|
||||||
</dict>
|
|
||||||
<key>PROJECT_COMMENTS</key>
|
|
||||||
<dict>
|
|
||||||
<key>NOTES</key>
|
|
||||||
<data>
|
|
||||||
PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1M
|
|
||||||
IDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQv
|
|
||||||
c3RyaWN0LmR0ZCI+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1l
|
|
||||||
cXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7
|
|
||||||
IGNoYXJzZXQ9VVRGLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJDb250
|
|
||||||
ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp
|
|
||||||
dGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u
|
|
||||||
dGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD
|
|
||||||
b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjEzNDcuNTciPgo8c3R5bGUg
|
|
||||||
dHlwZT0idGV4dC9jc3MiPgpwLnAxIHttYXJnaW46IDAuMHB4IDAu
|
|
||||||
MHB4IDAuMHB4IDAuMHB4OyBmb250OiAxMi4wcHggSGVsdmV0aWNh
|
|
||||||
OyBjb2xvcjogIzAwMDAwMDsgLXdlYmtpdC10ZXh0LXN0cm9rZTog
|
|
||||||
IzAwMDAwMH0Kc3Bhbi5zMSB7Zm9udC1rZXJuaW5nOiBub25lfQo8
|
|
||||||
L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8cCBjbGFzcz0icDEiPjxz
|
|
||||||
cGFuIGNsYXNzPSJzMSI+WmVyb1RpZXIgT25lIC0gTmV0d29yayBW
|
|
||||||
aXJ0dWFsaXphdGlvbiBFdmVyeXdoZXJlPC9zcGFuPjwvcD4KPHAg
|
|
||||||
Y2xhc3M9InAxIj48c3BhbiBjbGFzcz0iczEiPihjKTIwMTEtMjAx
|
|
||||||
NSBaZXJvVGllciwgSW5jLjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJw
|
|
||||||
MSI+PHNwYW4gY2xhc3M9InMxIj5jb250YWN0QHplcm90aWVyLmNv
|
|
||||||
bTwvc3Bhbj48L3A+CjxwIGNsYXNzPSJwMSI+PHNwYW4gY2xhc3M9
|
|
||||||
InMxIj48YnI+Cjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJwMSI+PHNw
|
|
||||||
YW4gY2xhc3M9InMxIj5UbyB1bmluc3RhbGwgbWFudWFsbHksIHR5
|
|
||||||
cGUgdGhlIGZvbGxvd2luZyBpbiBhIHRlcm1pbmFsIHdpbmRvdzo8
|
|
||||||
L3NwYW4+PC9wPgo8cCBjbGFzcz0icDEiPjxzcGFuIGNsYXNzPSJz
|
|
||||||
MSI+PGJyPgo8L3NwYW4+PC9wPgo8cCBjbGFzcz0icDEiPjxzcGFu
|
|
||||||
IGNsYXNzPSJzMSI+c3VkbyAiL0xpYnJhcnkvQXBwbGljYXRpb24g
|
|
||||||
U3VwcG9ydC9aZXJvVGllci9PbmUvdW5pbnN0YWxsLnNoIjwvc3Bh
|
|
||||||
bj48L3A+CjwvYm9keT4KPC9odG1sPgo=
|
|
||||||
</data>
|
|
||||||
</dict>
|
|
||||||
<key>PROJECT_SETTINGS</key>
|
|
||||||
<dict>
|
|
||||||
<key>BUILD_PATH</key>
|
|
||||||
<dict>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../..</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
<key>EXCLUDED_FILES</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>PATTERNS_ARRAY</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.DS_Store</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>PROTECTED</key>
|
|
||||||
<true/>
|
|
||||||
<key>PROXY_NAME</key>
|
|
||||||
<string>Remove .DS_Store files</string>
|
|
||||||
<key>PROXY_TOOLTIP</key>
|
|
||||||
<string>Remove ".DS_Store" files created by the Finder.</string>
|
|
||||||
<key>STATE</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>PATTERNS_ARRAY</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.pbdevelopment</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>PROTECTED</key>
|
|
||||||
<true/>
|
|
||||||
<key>PROXY_NAME</key>
|
|
||||||
<string>Remove .pbdevelopment files</string>
|
|
||||||
<key>PROXY_TOOLTIP</key>
|
|
||||||
<string>Remove ".pbdevelopment" files created by ProjectBuilder or Xcode.</string>
|
|
||||||
<key>STATE</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>PATTERNS_ARRAY</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>CVS</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.cvsignore</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.cvspass</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.svn</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.git</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.gitignore</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>PROTECTED</key>
|
|
||||||
<true/>
|
|
||||||
<key>PROXY_NAME</key>
|
|
||||||
<string>Remove SCM metadata</string>
|
|
||||||
<key>PROXY_TOOLTIP</key>
|
|
||||||
<string>Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems.</string>
|
|
||||||
<key>STATE</key>
|
|
||||||
<false/>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>PATTERNS_ARRAY</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>classes.nib</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>designable.db</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>info.nib</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>PROTECTED</key>
|
|
||||||
<true/>
|
|
||||||
<key>PROXY_NAME</key>
|
|
||||||
<string>Optimize nib files</string>
|
|
||||||
<key>PROXY_TOOLTIP</key>
|
|
||||||
<string>Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles.</string>
|
|
||||||
<key>STATE</key>
|
|
||||||
<false/>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>PATTERNS_ARRAY</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>Resources Disabled</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>PROTECTED</key>
|
|
||||||
<true/>
|
|
||||||
<key>PROXY_NAME</key>
|
|
||||||
<string>Remove Resources Disabled folders</string>
|
|
||||||
<key>PROXY_TOOLTIP</key>
|
|
||||||
<string>Remove "Resources Disabled" folders.</string>
|
|
||||||
<key>STATE</key>
|
|
||||||
<false/>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>SEPARATOR</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>NAME</key>
|
|
||||||
<string>ZeroTier One</string>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>VERSION</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>Label</key>
|
|
||||||
<string>com.zerotier.one</string>
|
|
||||||
<key>UserName</key>
|
|
||||||
<string>root</string>
|
|
||||||
<key>ProgramArguments</key>
|
|
||||||
<array>
|
|
||||||
<string>/Library/Application Support/ZeroTier/One/launch.sh</string>
|
|
||||||
</array>
|
|
||||||
<key>WorkingDirectory</key>
|
|
||||||
<string>/Library/Application Support/ZeroTier/One</string>
|
|
||||||
<key>StandardOutPath</key>
|
|
||||||
<string>/dev/null</string>
|
|
||||||
<key>StandardErrorPath</key>
|
|
||||||
<string>/dev/null</string>
|
|
||||||
<key>KeepAlive</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Outputs host and port for system HTTP proxy or zeroes if none or not
|
|
||||||
# configured.
|
|
||||||
|
|
||||||
export PATH=/bin:/usr/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin
|
|
||||||
|
|
||||||
enabled=`system_profiler SPNetworkDataType|grep "HTTP Proxy Enabled"|awk {'sub(/^.*:[ \t]*/, "", $0); print $0;'} 2>/dev/null`
|
|
||||||
port=`system_profiler SPNetworkDataType|grep "HTTP Proxy Port"|awk {'sub(/^.*:[ \t]*/, "", $0); print $0;'} 2>/dev/null`
|
|
||||||
serv=`system_profiler SPNetworkDataType|grep "HTTP Proxy Server"|awk {'sub(/^.*:[ \t]*/, "", $0); print $0;'} 2>/dev/null`
|
|
||||||
|
|
||||||
if [ "$enabled" = "Yes" ]; then
|
|
||||||
if [ "$serv" ]; then
|
|
||||||
if [ ! "$port" ]; then
|
|
||||||
port=80
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo $serv $port
|
|
||||||
else
|
|
||||||
echo 0.0.0.0 0
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo 0.0.0.0 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
zthome="/Library/Application Support/ZeroTier/One"
|
|
||||||
export PATH="$zthome:/bin:/usr/bin:/sbin:/usr/sbin"
|
|
||||||
|
|
||||||
# Launch ZeroTier One (not as daemon... launchd monitors it)
|
|
||||||
exec zerotier-one
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
|
|
||||||
|
|
||||||
OSX_RELEASE=`sw_vers -productVersion | cut -d . -f 1,2`
|
|
||||||
|
|
||||||
launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist >>/dev/null 2>&1
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
cd "/Library/Application Support/ZeroTier/One"
|
|
||||||
|
|
||||||
if [ "$OSX_RELEASE" = "10.7" ]; then
|
|
||||||
# OSX 10.7 cannot use the new tap driver since the new way of kext signing
|
|
||||||
# is not backward compatible. Pull the old one for 10.7 users and replace.
|
|
||||||
# We use https to fetch and check hash as an extra added measure.
|
|
||||||
rm -f tap.kext.10_7.tar.gz
|
|
||||||
curl -s https://download.zerotier.com/tap.kext.10_7.tar.gz >tap.kext.10_7.tar.gz
|
|
||||||
if [ -s tap.kext.10_7.tar.gz -a "`shasum -a 256 tap.kext.10_7.tar.gz | cut -d ' ' -f 1`" = "e133d4832cef571621d3618f417381b44f51a76ed625089fb4e545e65d3ef2a9" ]; then
|
|
||||||
rm -rf tap.kext
|
|
||||||
tar -xzf tap.kext.10_7.tar.gz
|
|
||||||
fi
|
|
||||||
rm -f tap.kext.10_7.tar.gz
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -rf node.log node.log.old root-topology shutdownIfUnreadable autoupdate.log updates.d
|
|
||||||
chown -R 0 tap.kext
|
|
||||||
chgrp -R 0 tap.kext
|
|
||||||
if [ ! -f authtoken.secret ]; then
|
|
||||||
head -c 4096 /dev/urandom | md5 | head -c 24 >authtoken.secret
|
|
||||||
chown 0 authtoken.secret
|
|
||||||
chgrp 0 authtoken.secret
|
|
||||||
chmod 0600 authtoken.secret
|
|
||||||
fi
|
|
||||||
rm -f zerotier-cli zerotier-idtool
|
|
||||||
ln -sf zerotier-one zerotier-cli
|
|
||||||
ln -sf zerotier-one zerotier-idtool
|
|
||||||
|
|
||||||
mkdir -p /usr/local/bin
|
|
||||||
cd /usr/local/bin
|
|
||||||
rm -f zerotier-cli zerotier-idtool
|
|
||||||
ln -sf "/Library/Application Support/ZeroTier/One/zerotier-one" zerotier-cli
|
|
||||||
ln -sf "/Library/Application Support/ZeroTier/One/zerotier-one" zerotier-idtool
|
|
||||||
|
|
||||||
launchctl load /Library/LaunchDaemons/com.zerotier.one.plist >>/dev/null 2>&1
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
|
|
||||||
|
|
||||||
if [ -f /Library/LaunchDaemons/com.zerotier.one.plist ]; then
|
|
||||||
launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist >>/dev/null 2>&1
|
|
||||||
fi
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
if [ -d "/Library/Application Support/ZeroTier/One" ]; then
|
|
||||||
cd "/Library/Application Support/ZeroTier/One"
|
|
||||||
if [ -f "zerotier-one.pid" ]; then
|
|
||||||
ztpid=`cat zerotier-one.pid`
|
|
||||||
if [ "$ztpid" -gt "0" ]; then
|
|
||||||
kill `cat zerotier-one.pid`
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
cd "/Applications"
|
|
||||||
rm -rf "ZeroTier One.app"
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
|
|
||||||
|
|
||||||
if [ "$UID" -ne 0 ]; then
|
|
||||||
echo "Must be run as root; try: sudo $0"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f '/Library/LaunchDaemons/com.zerotier.one.plist' ]; then
|
|
||||||
echo 'ZeroTier One does not seem to be installed.'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd /
|
|
||||||
|
|
||||||
echo 'Stopping any running ZeroTier One service...'
|
|
||||||
launchctl unload '/Library/LaunchDaemons/com.zerotier.one.plist' >>/dev/null 2>&1
|
|
||||||
sleep 1
|
|
||||||
killall -TERM zerotier-one >>/dev/null 2>&1
|
|
||||||
sleep 1
|
|
||||||
killall -KILL zerotier-one >>/dev/null 2>&1
|
|
||||||
|
|
||||||
echo "Making sure kext is unloaded..."
|
|
||||||
kextunload '/Library/Application Support/ZeroTier/One/tap.kext' >>/dev/null 2>&1
|
|
||||||
|
|
||||||
echo "Removing ZeroTier One files..."
|
|
||||||
|
|
||||||
rm -rf '/Applications/ZeroTier One.app'
|
|
||||||
rm -f '/usr/bin/zerotier-one' '/usr/bin/zerotier-idtool' '/usr/bin/zerotier-cli' '/Library/LaunchDaemons/com.zerotier.one.plist'
|
|
||||||
mkdir -p /tmp/ZeroTierOne_uninstall_tmp
|
|
||||||
cp "/Library/Application Support/ZeroTier/One/*.secret" /tmp/ZeroTierOne_uninstall_tmp
|
|
||||||
rm -rf '/Library/Application Support/ZeroTier/One'
|
|
||||||
mkdir -p '/Library/Application Support/ZeroTier/One'
|
|
||||||
cp "/tmp/ZeroTierOne_uninstall_tmp/*.secret" '/Library/Application Support/ZeroTier/One'
|
|
||||||
chmod 0600 "/Library/Application Support/ZeroTier/One/*.secret"
|
|
||||||
rm -rf /tmp/ZeroTierOne_uninstall_tmp
|
|
||||||
|
|
||||||
echo 'Uninstall complete.'
|
|
||||||
echo
|
|
||||||
echo 'Your identity and secret authentication token have been preserved in:'
|
|
||||||
echo ' /Library/Application Support/ZeroTier/One'
|
|
||||||
echo
|
|
||||||
echo 'You can delete this folder and its contents if you do not intend to re-use'
|
|
||||||
echo 'them.'
|
|
||||||
echo
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,156 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<DOCUMENT Type="Advanced Installer" CreateVersion="12.0" version="12.3.1" Modules="enterprise" RootPath="." Language="en" Id="{4070644B-EC9F-4962-B14A-770B9E309DC3}">
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.ProjectOptionsComponent">
|
|
||||||
<ROW Name="HiddenItems" Value="UpdaterComponent;SerValComponent;AutorunComponent;MultipleInstancesComponent;MsiJavaComponent;MsiRegsComponent;MsiExtComponent;MsiAssemblyComponent;MsiServInstComponent;AnalyticsComponent;ActSyncAppComponent;MsiMergeModsComponent;MsiThemeComponent;BackgroundImagesComponent;DictionaryComponent;MsiEnvComponent;ScheduledTasksComponent;CPLAppletComponent;GameUxComponent;FirewallExceptionComponent;UserAccountsComponent;MsiClassComponent;WebApplicationsComponent;MsiOdbcDataSrcComponent;SqlConnectionComponent;SharePointSlnComponent;SilverlightSlnComponent;MsiAppSearchComponent"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
|
|
||||||
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
|
|
||||||
<ROW Property="ALLUSERS" Value="1"/>
|
|
||||||
<ROW Property="ARPCOMMENTS" Value="This installer database contains the logic and data required to install [|ProductName]." ValueLocId="*"/>
|
|
||||||
<ROW Property="ARPNOMODIFY" MultiBuildValue="DefaultBuild:1"/>
|
|
||||||
<ROW Property="ARPNOREPAIR" Value="1"/>
|
|
||||||
<ROW Property="ARPPRODUCTICON" Value="ZeroTierIcon.exe" Type="8"/>
|
|
||||||
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
|
|
||||||
<ROW Property="ARPURLINFOABOUT" Value="https://www.zerotier.com/"/>
|
|
||||||
<ROW Property="LIMITUI" MultiBuildValue="DefaultBuild:1"/>
|
|
||||||
<ROW Property="MSIFASTINSTALL" MultiBuildValue="DefaultBuild:2"/>
|
|
||||||
<ROW Property="Manufacturer" Value="ZeroTier"/>
|
|
||||||
<ROW Property="ProductCode" Value="1033:{D7093B7A-71BA-484B-A27C-59ACDAD2206F} " Type="16"/>
|
|
||||||
<ROW Property="ProductLanguage" Value="1033"/>
|
|
||||||
<ROW Property="ProductName" Value="ZeroTier One Virtual Network Port"/>
|
|
||||||
<ROW Property="ProductVersion" Value="1.0.0" Type="32"/>
|
|
||||||
<ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND"/>
|
|
||||||
<ROW Property="UpgradeCode" Value="{88AA80DE-14CA-4443-B024-6EC13F3EDDAD}"/>
|
|
||||||
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT" MultiBuildValue="DefaultBuild:Windows 2000, Windows 2000 Service Pack 1, Windows 2000 Service Pack 2, Windows 2000 Service Pack 3, Windows 2000 Service Pack 4, Windows XP x86, Windows XP x86 Service Pack 1, Windows XP x86 Service Pack 2, Windows XP x86 Service Pack 3, Windows Server 2003 x86, Windows Server 2003 x86 Service Pack 1, Windows Server 2003 x86 Service Pack 2" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT40Display" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT64" MultiBuildValue="DefaultBuild:Windows XP x64, Windows XP x64 Service Pack 1, Windows XP x64 Service Pack 2, Windows Server 2003 x64, Windows Server 2003 x64 Service Pack 1, Windows Server 2003 x64 Service Pack 2" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT64Display" MultiBuildValue="DefaultBuild:Windows XP x64, Windows Server 2003 x64" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNTDisplay" MultiBuildValue="DefaultBuild:Windows 2000, Windows XP x86, Windows Server 2003 x86" ValueLocId="-"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
|
|
||||||
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
|
|
||||||
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
|
|
||||||
<ROW Directory="zttap300_Dir" Directory_Parent="APPDIR" DefaultDir="zttap300"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
|
|
||||||
<ROW Component="ProductInformation" ComponentId="{FFBF63D7-E03E-4ACA-966A-824C3DF6DEED}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
|
|
||||||
<ROW Component="zttap300.inf_2" ComponentId="{CB0C4519-617F-4DB5-9BF5-C6CFC6573F9C}" Directory_="zttap300_Dir" Attributes="256" Condition="VersionNT64" KeyPath="zttap300.inf"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
|
|
||||||
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0" Components="ProductInformation"/>
|
|
||||||
<ROW Feature="zttap300" Feature_Parent="MainFeature" Title="zttap300" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0" Components="zttap300.inf_2"/>
|
|
||||||
<ATTRIBUTE name="CurrentFeature" value="MainFeature"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFilesComponent">
|
|
||||||
<ROW File="zttap300.cat" Component_="zttap300.inf_2" FileName="zttap300.cat" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x64\zttap300.cat" SelfReg="false"/>
|
|
||||||
<ROW File="zttap300.inf" Component_="zttap300.inf_2" FileName="zttap300.inf" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x64\zttap300.inf" SelfReg="false" NextFile="zttap300.sys"/>
|
|
||||||
<ROW File="zttap300.sys" Component_="zttap300.inf_2" FileName="zttap300.sys" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x64\zttap300.sys" SelfReg="false" NextFile="zttap300.cat"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
|
|
||||||
<ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="1" PackageFolder="..\..\.." PackageFileName="ZeroTierOne_NDIS6_x64" Languages="en" InstallationType="4" UseLargeSchema="true" MsiPackageType="x64"/>
|
|
||||||
<ATTRIBUTE name="CurrentBuild" value="DefaultBuild"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
|
|
||||||
<ROW Path="<AI_DICTS>ui.ail"/>
|
|
||||||
<ROW Path="<AI_DICTS>ui_en.ail"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.DigCertStoreComponent">
|
|
||||||
<ROW TimeStampUrl="http://timestamp.verisign.com/scripts/timstamp.dll" SignerDescription="[|ProductName]" SignOptions="7" SignTool="0" Thumbprint="2ad023dc7aa92bf4265b33852a2ed2406d2bee86 Subject: ZeroTier Networks LLC Issuer: DigiCert High Assurance Code Signing CA-1 Valid from 04/24/2015 to 04/01/2016"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
|
|
||||||
<ROW Fragment="CommonUI.aip" Path="<AI_FRAGS>CommonUI.aip"/>
|
|
||||||
<ROW Fragment="FolderDlg.aip" Path="<AI_THEMES>classic\fragments\FolderDlg.aip"/>
|
|
||||||
<ROW Fragment="MaintenanceTypeDlg.aip" Path="<AI_THEMES>classic\fragments\MaintenanceTypeDlg.aip"/>
|
|
||||||
<ROW Fragment="MaintenanceWelcomeDlg.aip" Path="<AI_THEMES>classic\fragments\MaintenanceWelcomeDlg.aip"/>
|
|
||||||
<ROW Fragment="SequenceDialogs.aip" Path="<AI_THEMES>classic\fragments\SequenceDialogs.aip"/>
|
|
||||||
<ROW Fragment="Sequences.aip" Path="<AI_FRAGS>Sequences.aip"/>
|
|
||||||
<ROW Fragment="StaticUIStrings.aip" Path="<AI_FRAGS>StaticUIStrings.aip"/>
|
|
||||||
<ROW Fragment="UI.aip" Path="<AI_THEMES>classic\fragments\UI.aip"/>
|
|
||||||
<ROW Fragment="Validation.aip" Path="<AI_FRAGS>Validation.aip"/>
|
|
||||||
<ROW Fragment="VerifyRemoveDlg.aip" Path="<AI_THEMES>classic\fragments\VerifyRemoveDlg.aip"/>
|
|
||||||
<ROW Fragment="VerifyRepairDlg.aip" Path="<AI_THEMES>classic\fragments\VerifyRepairDlg.aip"/>
|
|
||||||
<ROW Fragment="WelcomeDlg.aip" Path="<AI_THEMES>classic\fragments\WelcomeDlg.aip"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
|
|
||||||
<ROW Name="aicustact.dll" SourcePath="<AI_CUSTACTS>aicustact.dll"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiConditionComponent">
|
|
||||||
<ROW Feature_="zttap300" Level="0" Condition="((VersionNT < 500) OR (NOT VersionNT))"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="1"/>
|
|
||||||
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL" Ordering="201"/>
|
|
||||||
<ROW Dialog_="FolderDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="1"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="197"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="201"/>
|
|
||||||
<ROW Dialog_="MaintenanceWelcomeDlg" Control_="Next" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="99"/>
|
|
||||||
<ROW Dialog_="CustomizeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_MAINT" Ordering="101"/>
|
|
||||||
<ROW Dialog_="CustomizeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_MAINT" Ordering="198"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="202"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="ChangeButton" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="501"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceWelcomeDlg" Condition="AI_MAINT" Ordering="1"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="RemoveButton" Event="NewDialog" Argument="VerifyRemoveDlg" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="601"/>
|
|
||||||
<ROW Dialog_="VerifyRemoveDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="1"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="RepairButton" Event="NewDialog" Argument="VerifyRepairDlg" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="601"/>
|
|
||||||
<ROW Dialog_="VerifyRepairDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="1"/>
|
|
||||||
<ROW Dialog_="VerifyRepairDlg" Control_="Repair" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="399" Options="1"/>
|
|
||||||
<ROW Dialog_="VerifyRemoveDlg" Control_="Remove" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="299" Options="1"/>
|
|
||||||
<ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="201"/>
|
|
||||||
<ROW Dialog_="ResumeDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_RESUME" Ordering="299"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_PATCH" Ordering="199"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="203"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
|
|
||||||
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
|
|
||||||
<ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/>
|
|
||||||
<ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
|
|
||||||
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
|
|
||||||
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
|
|
||||||
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
|
|
||||||
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]" MultiBuildTarget="DefaultBuild:[ProgramFiles64Folder][Manufacturer]\[ProductName]"/>
|
|
||||||
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]"/>
|
|
||||||
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiDriverPackagesComponent">
|
|
||||||
<ROW InfFileName="zttap300.inf" Flags="6"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiIconsComponent">
|
|
||||||
<ROW Name="ZeroTierIcon.exe" SourcePath="..\..\..\artwork\ZeroTierIcon.ico" Index="0"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
|
|
||||||
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel <> 5)" Sequence="210"/>
|
|
||||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
|
||||||
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1501"/>
|
|
||||||
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE="No" AND (Not Installed)" Sequence="1399"/>
|
|
||||||
<ROW Action="AI_ResolveKnownFolders" Sequence="51"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
|
|
||||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
|
||||||
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
|
|
||||||
<ROW Action="AI_DpiContentScale" Sequence="51"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
|
|
||||||
<ROW Condition="( Version9X OR ( NOT VersionNT64 ) OR ( VersionNT64 AND ((VersionNT64 <> 502) OR (((VersionNT64 = 502) AND (ServicePackLevel >= 1)) OR (MsiNTProductType <> 1))) AND ((VersionNT64 <> 502) OR (((VersionNT64 = 502) AND (ServicePackLevel <> 1)) OR (MsiNTProductType <> 1))) AND ((VersionNT64 <> 502) OR (((VersionNT64 = 502) AND (ServicePackLevel <> 2)) OR (MsiNTProductType <> 1))) AND ((VersionNT64 <> 502) OR ((VersionNT64 = 502) AND ((MsiNTProductType = 1) OR (ServicePackLevel >= 1)))) AND ((VersionNT64 <> 502) OR ((VersionNT64 = 502) AND ((MsiNTProductType = 1) OR (ServicePackLevel <> 1)))) AND ((VersionNT64 <> 502) OR ((VersionNT64 = 502) AND ((MsiNTProductType = 1) OR (ServicePackLevel <> 2)))) ) )" Description="[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNT64Display]" DescriptionLocId="AI.LaunchCondition.NoSpecificNT64" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="( Version9X OR VersionNT64 OR ( VersionNT AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel >= 1))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 1))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 2))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 3))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 4))) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel >= 1))) OR VersionNT64) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel <> 1))) OR VersionNT64) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel <> 2))) OR VersionNT64) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel <> 3))) OR VersionNT64) AND (((VersionNT <> 502) OR ((VersionNT = 502) AND (ServicePackLevel >= 1))) OR VersionNT64) AND (((VersionNT <> 502) OR ((VersionNT = 502) AND (ServicePackLevel <> 1))) OR VersionNT64) AND (((VersionNT <> 502) OR ((VersionNT = 502) AND (ServicePackLevel <> 2))) OR VersionNT64) ) )" Description="[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNTDisplay]" DescriptionLocId="AI.LaunchCondition.NoSpecificNT" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="(VersionNT <> 400)" Description="[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNT40Display]" DescriptionLocId="AI.LaunchCondition.NoNT40" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="Privileged" Description="[ProductName] requires administrative privileges to install." DescriptionLocId="AI.LaunchCondition.Privileged" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]" DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent">
|
|
||||||
<ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="ProductInformation"/>
|
|
||||||
<ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="ProductInformation"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
|
|
||||||
<ATTRIBUTE name="UsedTheme" value="classic"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiUpgradeComponent">
|
|
||||||
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="0.0.1" VersionMax="[|ProductVersion]" Attributes="257" ActionProperty="OLDPRODUCTS"/>
|
|
||||||
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="[|ProductVersion]" Attributes="2" ActionProperty="AI_NEWERPRODUCTFOUND"/>
|
|
||||||
</COMPONENT>
|
|
||||||
</DOCUMENT>
|
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<DOCUMENT Type="Advanced Installer" CreateVersion="12.0" version="12.3.1" Modules="enterprise" RootPath="." Language="en" Id="{4070644B-EC9F-4962-B14A-770B9E309DC3}">
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.ProjectOptionsComponent">
|
|
||||||
<ROW Name="HiddenItems" Value="UpdaterComponent;SerValComponent;AutorunComponent;MultipleInstancesComponent;MsiJavaComponent;MsiRegsComponent;MsiExtComponent;MsiAssemblyComponent;MsiServInstComponent;AnalyticsComponent;ActSyncAppComponent;MsiMergeModsComponent;MsiThemeComponent;BackgroundImagesComponent;DictionaryComponent;MsiEnvComponent;ScheduledTasksComponent;CPLAppletComponent;GameUxComponent;FirewallExceptionComponent;UserAccountsComponent;MsiClassComponent;WebApplicationsComponent;MsiOdbcDataSrcComponent;SqlConnectionComponent;SharePointSlnComponent;SilverlightSlnComponent;MsiAppSearchComponent"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
|
|
||||||
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
|
|
||||||
<ROW Property="ALLUSERS" Value="1"/>
|
|
||||||
<ROW Property="ARPCOMMENTS" Value="This installer database contains the logic and data required to install [|ProductName]." ValueLocId="*"/>
|
|
||||||
<ROW Property="ARPNOMODIFY" MultiBuildValue="DefaultBuild:1"/>
|
|
||||||
<ROW Property="ARPNOREPAIR" Value="1"/>
|
|
||||||
<ROW Property="ARPPRODUCTICON" Value="ZeroTierIcon.exe" Type="8"/>
|
|
||||||
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
|
|
||||||
<ROW Property="ARPURLINFOABOUT" Value="https://www.zerotier.com/"/>
|
|
||||||
<ROW Property="AiFeatIcozttap300" Value="ZeroTierIcon.exe" Type="8"/>
|
|
||||||
<ROW Property="LIMITUI" MultiBuildValue="DefaultBuild:1"/>
|
|
||||||
<ROW Property="MSIFASTINSTALL" MultiBuildValue="DefaultBuild:2"/>
|
|
||||||
<ROW Property="Manufacturer" Value="ZeroTier"/>
|
|
||||||
<ROW Property="ProductCode" Value="1033:{6223AB10-D6CD-4580-B357-91CCD7F355D2} " Type="16"/>
|
|
||||||
<ROW Property="ProductLanguage" Value="1033"/>
|
|
||||||
<ROW Property="ProductName" Value="ZeroTier One Virtual Network Port"/>
|
|
||||||
<ROW Property="ProductVersion" Value="1.0.0" Type="32"/>
|
|
||||||
<ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND"/>
|
|
||||||
<ROW Property="UpgradeCode" Value="{88AA80DE-14CA-4443-B024-6EC13F3EDDAD}"/>
|
|
||||||
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT" MultiBuildValue="DefaultBuild:Windows 2000, Windows 2000 Service Pack 1, Windows 2000 Service Pack 2, Windows 2000 Service Pack 3, Windows 2000 Service Pack 4, Windows XP x86, Windows XP x86 Service Pack 1, Windows XP x86 Service Pack 2, Windows XP x86 Service Pack 3, Windows Server 2003 x86, Windows Server 2003 x86 Service Pack 1, Windows Server 2003 x86 Service Pack 2" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT40Display" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT64" MultiBuildValue="DefaultBuild:Windows XP x64, Windows XP x64 Service Pack 1, Windows XP x64 Service Pack 2, Windows Server 2003 x64, Windows Server 2003 x64 Service Pack 1, Windows Server 2003 x64 Service Pack 2" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT64Display" MultiBuildValue="DefaultBuild:Windows XP x64, Windows Server 2003 x64" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNTDisplay" MultiBuildValue="DefaultBuild:Windows 2000, Windows XP x86, Windows Server 2003 x86" ValueLocId="-"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
|
|
||||||
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
|
|
||||||
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
|
|
||||||
<ROW Directory="zttap300_Dir" Directory_Parent="APPDIR" DefaultDir="zttap300"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
|
|
||||||
<ROW Component="ProductInformation" ComponentId="{FFBF63D7-E03E-4ACA-966A-824C3DF6DEED}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
|
|
||||||
<ROW Component="zttap300.inf_1" ComponentId="{07119034-A51F-4871-B503-09D1340FF248}" Directory_="zttap300_Dir" Attributes="0" Condition="(VersionNT >= 500) AND NOT VersionNT64" KeyPath="zttap300.inf"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
|
|
||||||
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0" Components="ProductInformation"/>
|
|
||||||
<ROW Feature="zttap300" Feature_Parent="MainFeature" Title="zttap300" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0" Components="zttap300.inf_1"/>
|
|
||||||
<ATTRIBUTE name="CurrentFeature" value="MainFeature"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFilesComponent">
|
|
||||||
<ROW File="zttap300.cat" Component_="zttap300.inf_1" FileName="zttap300.cat" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x86\zttap300.cat" SelfReg="false"/>
|
|
||||||
<ROW File="zttap300.inf" Component_="zttap300.inf_1" FileName="zttap300.inf" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x86\zttap300.inf" SelfReg="false" NextFile="zttap300.sys"/>
|
|
||||||
<ROW File="zttap300.sys" Component_="zttap300.inf_1" FileName="zttap300.sys" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x86\zttap300.sys" SelfReg="false" NextFile="zttap300.cat"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
|
|
||||||
<ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="1" PackageFolder="..\..\.." PackageFileName="ZeroTierOne_NDIS6_x86" Languages="en" InstallationType="4" UseLargeSchema="true"/>
|
|
||||||
<ATTRIBUTE name="CurrentBuild" value="DefaultBuild"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
|
|
||||||
<ROW Path="<AI_DICTS>ui.ail"/>
|
|
||||||
<ROW Path="<AI_DICTS>ui_en.ail"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.DigCertStoreComponent">
|
|
||||||
<ROW TimeStampUrl="http://timestamp.verisign.com/scripts/timstamp.dll" SignerDescription="[|ProductName]" SignOptions="7" SignTool="0" Thumbprint="2ad023dc7aa92bf4265b33852a2ed2406d2bee86 Subject: ZeroTier Networks LLC Issuer: DigiCert High Assurance Code Signing CA-1 Valid from 04/24/2015 to 04/01/2016"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
|
|
||||||
<ROW Fragment="CommonUI.aip" Path="<AI_FRAGS>CommonUI.aip"/>
|
|
||||||
<ROW Fragment="FolderDlg.aip" Path="<AI_THEMES>classic\fragments\FolderDlg.aip"/>
|
|
||||||
<ROW Fragment="MaintenanceTypeDlg.aip" Path="<AI_THEMES>classic\fragments\MaintenanceTypeDlg.aip"/>
|
|
||||||
<ROW Fragment="MaintenanceWelcomeDlg.aip" Path="<AI_THEMES>classic\fragments\MaintenanceWelcomeDlg.aip"/>
|
|
||||||
<ROW Fragment="SequenceDialogs.aip" Path="<AI_THEMES>classic\fragments\SequenceDialogs.aip"/>
|
|
||||||
<ROW Fragment="Sequences.aip" Path="<AI_FRAGS>Sequences.aip"/>
|
|
||||||
<ROW Fragment="StaticUIStrings.aip" Path="<AI_FRAGS>StaticUIStrings.aip"/>
|
|
||||||
<ROW Fragment="UI.aip" Path="<AI_THEMES>classic\fragments\UI.aip"/>
|
|
||||||
<ROW Fragment="Validation.aip" Path="<AI_FRAGS>Validation.aip"/>
|
|
||||||
<ROW Fragment="VerifyRemoveDlg.aip" Path="<AI_THEMES>classic\fragments\VerifyRemoveDlg.aip"/>
|
|
||||||
<ROW Fragment="VerifyRepairDlg.aip" Path="<AI_THEMES>classic\fragments\VerifyRepairDlg.aip"/>
|
|
||||||
<ROW Fragment="WelcomeDlg.aip" Path="<AI_THEMES>classic\fragments\WelcomeDlg.aip"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
|
|
||||||
<ROW Name="aicustact.dll" SourcePath="<AI_CUSTACTS>aicustact.dll"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiConditionComponent">
|
|
||||||
<ROW Feature_="zttap300" Level="0" Condition="((VersionNT < 500) OR (NOT VersionNT))"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="1"/>
|
|
||||||
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL" Ordering="201"/>
|
|
||||||
<ROW Dialog_="FolderDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="1"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="197"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="201"/>
|
|
||||||
<ROW Dialog_="MaintenanceWelcomeDlg" Control_="Next" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="99"/>
|
|
||||||
<ROW Dialog_="CustomizeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_MAINT" Ordering="101"/>
|
|
||||||
<ROW Dialog_="CustomizeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_MAINT" Ordering="198"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="202"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="ChangeButton" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="501"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceWelcomeDlg" Condition="AI_MAINT" Ordering="1"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="RemoveButton" Event="NewDialog" Argument="VerifyRemoveDlg" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="601"/>
|
|
||||||
<ROW Dialog_="VerifyRemoveDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="1"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="RepairButton" Event="NewDialog" Argument="VerifyRepairDlg" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="601"/>
|
|
||||||
<ROW Dialog_="VerifyRepairDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="1"/>
|
|
||||||
<ROW Dialog_="VerifyRepairDlg" Control_="Repair" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="399" Options="1"/>
|
|
||||||
<ROW Dialog_="VerifyRemoveDlg" Control_="Remove" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="299" Options="1"/>
|
|
||||||
<ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="201"/>
|
|
||||||
<ROW Dialog_="ResumeDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_RESUME" Ordering="299"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_PATCH" Ordering="199"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="203"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
|
|
||||||
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
|
|
||||||
<ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/>
|
|
||||||
<ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
|
|
||||||
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
|
|
||||||
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
|
|
||||||
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
|
|
||||||
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]"/>
|
|
||||||
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]"/>
|
|
||||||
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiDriverPackagesComponent">
|
|
||||||
<ROW InfFileName="zttap300.inf" Flags="6"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiIconsComponent">
|
|
||||||
<ROW Name="ZeroTierIcon.exe" SourcePath="..\..\..\artwork\ZeroTierIcon.ico" Index="0"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
|
|
||||||
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel <> 5)" Sequence="210"/>
|
|
||||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
|
||||||
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1501"/>
|
|
||||||
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE="No" AND (Not Installed)" Sequence="1399"/>
|
|
||||||
<ROW Action="AI_ResolveKnownFolders" Sequence="51"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
|
|
||||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
|
||||||
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
|
|
||||||
<ROW Action="AI_DpiContentScale" Sequence="51"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
|
|
||||||
<ROW Condition="( Version9X OR ( NOT VersionNT64 ) OR ( VersionNT64 AND ((VersionNT64 <> 502) OR (((VersionNT64 = 502) AND (ServicePackLevel >= 1)) OR (MsiNTProductType <> 1))) AND ((VersionNT64 <> 502) OR (((VersionNT64 = 502) AND (ServicePackLevel <> 1)) OR (MsiNTProductType <> 1))) AND ((VersionNT64 <> 502) OR (((VersionNT64 = 502) AND (ServicePackLevel <> 2)) OR (MsiNTProductType <> 1))) AND ((VersionNT64 <> 502) OR ((VersionNT64 = 502) AND ((MsiNTProductType = 1) OR (ServicePackLevel >= 1)))) AND ((VersionNT64 <> 502) OR ((VersionNT64 = 502) AND ((MsiNTProductType = 1) OR (ServicePackLevel <> 1)))) AND ((VersionNT64 <> 502) OR ((VersionNT64 = 502) AND ((MsiNTProductType = 1) OR (ServicePackLevel <> 2)))) ) )" Description="[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNT64Display]" DescriptionLocId="AI.LaunchCondition.NoSpecificNT64" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="( Version9X OR VersionNT64 OR ( VersionNT AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel >= 1))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 1))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 2))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 3))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 4))) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel >= 1))) OR VersionNT64) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel <> 1))) OR VersionNT64) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel <> 2))) OR VersionNT64) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel <> 3))) OR VersionNT64) AND (((VersionNT <> 502) OR ((VersionNT = 502) AND (ServicePackLevel >= 1))) OR VersionNT64) AND (((VersionNT <> 502) OR ((VersionNT = 502) AND (ServicePackLevel <> 1))) OR VersionNT64) AND (((VersionNT <> 502) OR ((VersionNT = 502) AND (ServicePackLevel <> 2))) OR VersionNT64) ) )" Description="[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNTDisplay]" DescriptionLocId="AI.LaunchCondition.NoSpecificNT" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="(VersionNT <> 400)" Description="[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNT40Display]" DescriptionLocId="AI.LaunchCondition.NoNT40" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="Privileged" Description="[ProductName] requires administrative privileges to install." DescriptionLocId="AI.LaunchCondition.Privileged" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]" DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent">
|
|
||||||
<ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="ProductInformation"/>
|
|
||||||
<ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="ProductInformation"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
|
|
||||||
<ATTRIBUTE name="UsedTheme" value="classic"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiUpgradeComponent">
|
|
||||||
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="0.0.1" VersionMax="[|ProductVersion]" Attributes="257" ActionProperty="OLDPRODUCTS"/>
|
|
||||||
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="[|ProductVersion]" Attributes="2" ActionProperty="AI_NEWERPRODUCTFOUND"/>
|
|
||||||
</COMPONENT>
|
|
||||||
</DOCUMENT>
|
|
||||||
@@ -1,368 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<DOCUMENT Type="Advanced Installer" CreateVersion="10.9" version="12.5.1" Modules="enterprise" RootPath="." Language="en" Id="{DC564647-6BF0-4550-87F4-89C938D0159C}">
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.ProjectOptionsComponent">
|
|
||||||
<ROW Name="HiddenItems" Value="UpdaterComponent;SerValComponent;AutorunComponent;MultipleInstancesComponent;MsiJavaComponent;MsiRegsComponent;MsiExtComponent;MsiAssemblyComponent;MsiDriverPackagesComponent;AnalyticsComponent;ActSyncAppComponent;MsiMergeModsComponent;MsiThemeComponent;BackgroundImagesComponent;DictionaryComponent;MsiEnvComponent;ScheduledTasksComponent;CPLAppletComponent;GameUxComponent;UserAccountsComponent;MsiClassComponent;WebApplicationsComponent;MsiOdbcDataSrcComponent;SqlConnectionComponent;SharePointSlnComponent;SilverlightSlnComponent;MsiAppSearchComponent"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
|
|
||||||
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
|
|
||||||
<ROW Property="AI_EMBD_MSI_EXTR_PATH" Value="[TempFolder]" ValueLocId="-"/>
|
|
||||||
<ROW Property="AI_EXTERNALUIUNINSTALLERNAME" MultiBuildValue="DefaultBuild:aiui"/>
|
|
||||||
<ROW Property="AI_PREDEF_LCONDS_PROPS" Value="AI_DETECTED_DOTNET_VERSION"/>
|
|
||||||
<ROW Property="AI_PRODUCTNAME_ARP" Value="ZeroTier One"/>
|
|
||||||
<ROW Property="AI_REQUIRED_DOTNET_DISPLAY" MultiBuildValue="DefaultBuild:4.5" ValueLocId="-"/>
|
|
||||||
<ROW Property="AI_REQUIRED_DOTNET_VERSION" MultiBuildValue="DefaultBuild:4.5" ValueLocId="-"/>
|
|
||||||
<ROW Property="AI_UNINSTALLER" Value="msiexec.exe"/>
|
|
||||||
<ROW Property="ALLUSERS" Value="1"/>
|
|
||||||
<ROW Property="ARPCOMMENTS" Value="This installer database contains the logic and data required to install [|ProductName]."/>
|
|
||||||
<ROW Property="ARPCONTACT" Value="contact@zerotier.com"/>
|
|
||||||
<ROW Property="ARPHELPLINK" Value="https://www.zerotier.com/"/>
|
|
||||||
<ROW Property="ARPNOMODIFY" MultiBuildValue="DefaultBuild:1"/>
|
|
||||||
<ROW Property="ARPNOREPAIR" Value="1"/>
|
|
||||||
<ROW Property="ARPPRODUCTICON" Value="ZeroTierIcon.exe" Type="8"/>
|
|
||||||
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
|
|
||||||
<ROW Property="ARPURLINFOABOUT" Value="https://www.zerotier.com/"/>
|
|
||||||
<ROW Property="ARPURLUPDATEINFO" Value="https://www.zerotier.com/"/>
|
|
||||||
<ROW Property="AiFeatIcoZeroTierOne" Value="ZeroTierIcon.exe" Type="8"/>
|
|
||||||
<ROW Property="CTRLS" Value="2"/>
|
|
||||||
<ROW Property="MSIFASTINSTALL" MultiBuildValue="DefaultBuild:2"/>
|
|
||||||
<ROW Property="Manufacturer" Value="ZeroTier, Inc."/>
|
|
||||||
<ROW Property="ProductCode" Value="1033:{A6D97FB1-02FA-4042-A0EE-A080D53CDBBF} " Type="16"/>
|
|
||||||
<ROW Property="ProductLanguage" Value="1033"/>
|
|
||||||
<ROW Property="ProductName" Value="ZeroTier One"/>
|
|
||||||
<ROW Property="ProductVersion" Value="1.1.5" Type="32"/>
|
|
||||||
<ROW Property="REBOOT" MultiBuildValue="DefaultBuild:ReallySuppress"/>
|
|
||||||
<ROW Property="RUNAPPLICATION" Value="1" Type="4"/>
|
|
||||||
<ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND"/>
|
|
||||||
<ROW Property="UpgradeCode" Value="{B0E2A5F3-88B6-4E77-B922-CB4739B4C4C8}"/>
|
|
||||||
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT" MultiBuildValue="DefaultBuild:Windows 2000, Windows 2000 Service Pack 1, Windows 2000 Service Pack 2, Windows 2000 Service Pack 3, Windows 2000 Service Pack 4, Windows XP x86, Windows XP x86 Service Pack 1, Windows XP x86 Service Pack 2, Windows XP x86 Service Pack 3, Windows Server 2003 x86, Windows Server 2003 x86 Service Pack 1, Windows Server 2003 x86 Service Pack 2" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT40Display" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT64" MultiBuildValue="DefaultBuild:Windows XP x64, Windows XP x64 Service Pack 1, Windows XP x64 Service Pack 2, Windows Server 2003 x64, Windows Server 2003 x64 Service Pack 1, Windows Server 2003 x64 Service Pack 2" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNT64Display" MultiBuildValue="DefaultBuild:Windows XP x64, Windows Server 2003 x64" ValueLocId="-"/>
|
|
||||||
<ROW Property="WindowsTypeNTDisplay" MultiBuildValue="DefaultBuild:Windows 2000, Windows XP x86, Windows Server 2003 x86" ValueLocId="-"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
|
|
||||||
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1" DirectoryOptions="2"/>
|
|
||||||
<ROW Directory="CommonAppDataFolder" Directory_Parent="TARGETDIR" DefaultDir="COMMON~1|CommonAppDataFolder" IsPseudoRoot="1"/>
|
|
||||||
<ROW Directory="One_Dir" Directory_Parent="ZeroTier_Dir" DefaultDir="One"/>
|
|
||||||
<ROW Directory="ProgramFilesFolder" Directory_Parent="TARGETDIR" DefaultDir="PROGRA~1|ProgramFilesFolder" IsPseudoRoot="1"/>
|
|
||||||
<ROW Directory="ProgramMenuFolder" Directory_Parent="TARGETDIR" DefaultDir="PROGRA~2|ProgramMenuFolder" IsPseudoRoot="1"/>
|
|
||||||
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
|
|
||||||
<ROW Directory="ZeroTier_Dir" Directory_Parent="CommonAppDataFolder" DefaultDir="ZeroTier"/>
|
|
||||||
<ROW Directory="networks.d_Dir" Directory_Parent="One_Dir" DefaultDir="networks.d"/>
|
|
||||||
<ROW Directory="regid.201001.com.zerotier_Dir" Directory_Parent="CommonAppDataFolder" DefaultDir="REGID2~1.ZER|regid.2010-01.com.zerotier"/>
|
|
||||||
<ROW Directory="tapwindows_Dir" Directory_Parent="One_Dir" DefaultDir="TAP-WI~1|tap-windows"/>
|
|
||||||
<ROW Directory="ui_Dir" Directory_Parent="One_Dir" DefaultDir="ui" DirectoryOptions="3"/>
|
|
||||||
<ROW Directory="x64_Dir" Directory_Parent="tapwindows_Dir" DefaultDir="x64"/>
|
|
||||||
<ROW Directory="x86_Dir" Directory_Parent="tapwindows_Dir" DefaultDir="x86"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
|
|
||||||
<ROW Component="AI_CustomARPName" ComponentId="{738BDE1C-E12F-4DFB-B279-9038EECEFF45}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
|
|
||||||
<ROW Component="AI_DisableModify" ComponentId="{020DCABD-5D56-49B9-AF48-F07F0B55E590}" Directory_="APPDIR" Attributes="4" KeyPath="NoModify" Options="1"/>
|
|
||||||
<ROW Component="Newtonsoft.Json.dll" ComponentId="{0B2F229D-5425-42FB-9E28-F6D25AB2B4B5}" Directory_="APPDIR" Attributes="0" KeyPath="Newtonsoft.Json.dll"/>
|
|
||||||
<ROW Component="ProductInformation" ComponentId="{DB078D04-EA8E-4A7C-9001-89BAD932F9D9}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
|
|
||||||
<ROW Component="ZeroTierOne.exe" ComponentId="{18B51525-77BF-4FD9-9C18-A10D4CFC25BA}" Directory_="APPDIR" Attributes="0" KeyPath="ZeroTierOne.exe"/>
|
|
||||||
<ROW Component="index.html" ComponentId="{24AB46DC-56EA-4F3C-A8B7-95957509CDD1}" Directory_="ui_Dir" Attributes="0" KeyPath="index.html" Type="0"/>
|
|
||||||
<ROW Component="networks.d" ComponentId="{EF54D0DF-889F-41DC-AF5C-4E7F96AB1C8B}" Directory_="networks.d_Dir" Attributes="0"/>
|
|
||||||
<ROW Component="regid.201001.com.zerotier" ComponentId="{A39C80FC-6A8F-454F-9052-10DAC3C3B139}" Directory_="regid.201001.com.zerotier_Dir" Attributes="0"/>
|
|
||||||
<ROW Component="zerotierone_x64.exe" ComponentId="{DFCFB72D-B055-4E60-B6D8-81FF585C2183}" Directory_="One_Dir" Attributes="256" Condition="VersionNT64" KeyPath="zerotierone_x64.exe"/>
|
|
||||||
<ROW Component="zerotierone_x86.exe" ComponentId="{5D2F3366-4FE1-40A4-A81A-66C49FA11F1C}" Directory_="One_Dir" Attributes="0" Condition="NOT VersionNT64" KeyPath="zerotierone_x86.exe"/>
|
|
||||||
<ROW Component="zttap300.cat" ComponentId="{123CD683-FD99-4F0F-8F9B-0222DF409B09}" Directory_="x64_Dir" Attributes="256" Condition="VersionNT64" KeyPath="zttap300.cat_2" Type="0"/>
|
|
||||||
<ROW Component="zttap300.cat_1" ComponentId="{9F913E48-095B-4EA3-98DA-EDAB1593F3E3}" Directory_="x86_Dir" Attributes="0" Condition="NOT VersionNT64" KeyPath="zttap300.cat_3" Type="0"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
|
|
||||||
<ROW Feature="ZeroTierOne" Title="MainFeature" Description="ZeroTier One" Display="1" Level="1" Directory_="APPDIR" Attributes="0" Components="AI_CustomARPName AI_DisableModify Newtonsoft.Json.dll ProductInformation ZeroTierOne.exe index.html networks.d regid.201001.com.zerotier zerotierone_x64.exe zerotierone_x86.exe zttap300.cat zttap300.cat_1"/>
|
|
||||||
<ATTRIBUTE name="CurrentFeature" value="ZeroTierOne"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFilesComponent">
|
|
||||||
<ROW File="Newtonsoft.Json.dll" Component_="Newtonsoft.Json.dll" FileName="NEWTON~1.DLL|Newtonsoft.Json.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\..\..\windows\WinUI\bin\Release\Newtonsoft.Json.dll" SelfReg="false" DigSign="true"/>
|
|
||||||
<ROW File="ZeroTierOne.exe" Component_="ZeroTierOne.exe" FileName="ZEROTI~1.EXE|ZeroTier One.exe" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\..\..\windows\WinUI\bin\Release\ZeroTier One.exe" SelfReg="false" NextFile="zttap300.cat_2" DigSign="true"/>
|
|
||||||
<ROW File="index.html" Component_="index.html" FileName="INDEX~1.HTM|index.html" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\..\..\ui\index.html" SelfReg="false" NextFile="main.js"/>
|
|
||||||
<ROW File="main.js" Component_="index.html" FileName="main.js" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\..\..\ui\main.js" SelfReg="false" NextFile="react.min.js"/>
|
|
||||||
<ROW File="react.min.js" Component_="index.html" FileName="REACTM~1.JS|react.min.js" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\..\..\ui\react.min.js" SelfReg="false" NextFile="simpleajax.min.js"/>
|
|
||||||
<ROW File="simpleajax.min.js" Component_="index.html" FileName="SIMPLE~1.JS|simpleajax.min.js" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\..\..\ui\simpleajax.min.js" SelfReg="false" NextFile="zerotier.css"/>
|
|
||||||
<ROW File="zerotier.css" Component_="index.html" FileName="zerotier.css" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\..\..\ui\zerotier.css" SelfReg="false" NextFile="ztui.min.js"/>
|
|
||||||
<ROW File="zerotierone_x64.exe" Component_="zerotierone_x64.exe" FileName="ZEROTI~2.EXE|zerotier-one_x64.exe" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\..\..\windows\Build\x64\Release\zerotier-one_x64.exe" SelfReg="false" NextFile="ZeroTierOne.exe" DigSign="true"/>
|
|
||||||
<ROW File="zerotierone_x86.exe" Component_="zerotierone_x86.exe" FileName="ZEROTI~1.EXE|zerotier-one_x86.exe" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\..\..\windows\Build\Win32\Release\zerotier-one_x86.exe" SelfReg="false" NextFile="zerotierone_x64.exe" DigSign="true"/>
|
|
||||||
<ROW File="zttap300.cat_2" Component_="zttap300.cat" FileName="zttap300.cat" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x64\zttap300.cat" SelfReg="false" NextFile="zttap300.sys_2"/>
|
|
||||||
<ROW File="zttap300.cat_3" Component_="zttap300.cat_1" FileName="zttap300.cat" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x86\zttap300.cat" SelfReg="false" NextFile="zttap300.sys_3"/>
|
|
||||||
<ROW File="zttap300.inf" Component_="zttap300.cat" FileName="zttap300.inf" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x64\zttap300.inf" SelfReg="false" NextFile="zttap300.cat_3"/>
|
|
||||||
<ROW File="zttap300.inf_1" Component_="zttap300.cat_1" FileName="zttap300.inf" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x86\zttap300.inf" SelfReg="false" NextFile="index.html"/>
|
|
||||||
<ROW File="zttap300.sys_2" Component_="zttap300.cat" FileName="zttap300.sys" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x64\zttap300.sys" SelfReg="false" NextFile="zttap300.inf"/>
|
|
||||||
<ROW File="zttap300.sys_3" Component_="zttap300.cat_1" FileName="zttap300.sys" Attributes="0" SourcePath="..\..\bin\tap-windows-ndis6\x86\zttap300.sys" SelfReg="false" NextFile="zttap300.inf_1"/>
|
|
||||||
<ROW File="ztui.min.js" Component_="index.html" FileName="ZTUIMI~1.JS|ztui.min.js" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\..\..\ui\ztui.min.js" SelfReg="false" NextFile="Newtonsoft.Json.dll"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
|
|
||||||
<ROW BuildKey="DefaultBuild" BuildName="MSI" BuildOrder="1" BuildType="1" PackageFolder="..\..\.." PackageFileName="ZeroTier One" Languages="en" InstallationType="4" ExtUI="true" UseLargeSchema="true"/>
|
|
||||||
<ATTRIBUTE name="CurrentBuild" value="DefaultBuild"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.CacheComponent">
|
|
||||||
<ATTRIBUTE name="Enable" value="false"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.ChainedPackageComponent">
|
|
||||||
<ROW ChainedPackage="ZeroTierOne_NDIS6_x64.msi" Order="1" Options="108" InstallCondition="(VersionNT64)" RemoveCondition="((REMOVE="ALL") AND (NOT UPGRADINGPRODUCTCODE) AND (VersionNT64))"/>
|
|
||||||
<ROW ChainedPackage="ZeroTierOne_NDIS6_x86.msi" Order="2" Options="108" InstallCondition="(NOT VersionNT64)" RemoveCondition="((REMOVE="ALL") AND (NOT UPGRADINGPRODUCTCODE) AND (NOT VersionNT64))"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.ChainedPackageFileComponent">
|
|
||||||
<ROW FileId="ZeroTierOne_NDIS6_x64.msi" ChainedPackage="ZeroTierOne_NDIS6_x64.msi" Options="1" TargetPath="ZeroTierOne_NDIS6_x64.msi" Content="..\..\bin\tap-windows-ndis6\x64\ZeroTierOne_NDIS6_x64.msi"/>
|
|
||||||
<ROW FileId="ZeroTierOne_NDIS6_x86.msi" ChainedPackage="ZeroTierOne_NDIS6_x86.msi" Options="1" TargetPath="ZeroTierOne_NDIS6_x86.msi" Content="..\..\bin\tap-windows-ndis6\x86\ZeroTierOne_NDIS6_x86.msi"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
|
|
||||||
<ROW Path="<AI_DICTS>ui.ail"/>
|
|
||||||
<ROW Path="<AI_DICTS>ui_en.ail"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.DigCertStoreComponent">
|
|
||||||
<ROW TimeStampUrl="http://timestamp.verisign.com/scripts/timstamp.dll" SignerDescription="ZeroTier One" DescriptionUrl="https://www.zerotier.com/" SignOptions="7" SignTool="0" Thumbprint="2ad023dc7aa92bf4265b33852a2ed2406d2bee86 Subject: ZeroTier Networks LLC Issuer: DigiCert High Assurance Code Signing CA-1 Valid from 04/24/2015 to 04/01/2016"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.FirewallExceptionComponent">
|
|
||||||
<ROW FirewallException="ZeroTierOneUDP9993" DisplayName="ZeroTier One UDP/9993" GroupName="ZeroTierOne" Enabled="1" Scope="*" Condition="1" Profiles="7" Port="9993" Protocol="UDP"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
|
|
||||||
<ROW Fragment="CommonUI.aip" Path="<AI_FRAGS>CommonUI.aip"/>
|
|
||||||
<ROW Fragment="MaintenanceTypeDlg.aip" Path="<AI_THEMES>classic\fragments\MaintenanceTypeDlg.aip"/>
|
|
||||||
<ROW Fragment="MaintenanceWelcomeDlg.aip" Path="<AI_THEMES>classic\fragments\MaintenanceWelcomeDlg.aip"/>
|
|
||||||
<ROW Fragment="SequenceDialogs.aip" Path="<AI_THEMES>classic\fragments\SequenceDialogs.aip"/>
|
|
||||||
<ROW Fragment="Sequences.aip" Path="<AI_FRAGS>Sequences.aip"/>
|
|
||||||
<ROW Fragment="StaticUIStrings.aip" Path="<AI_FRAGS>StaticUIStrings.aip"/>
|
|
||||||
<ROW Fragment="UI.aip" Path="<AI_THEMES>classic\fragments\UI.aip"/>
|
|
||||||
<ROW Fragment="Validation.aip" Path="<AI_FRAGS>Validation.aip"/>
|
|
||||||
<ROW Fragment="VerifyRemoveDlg.aip" Path="<AI_THEMES>classic\fragments\VerifyRemoveDlg.aip"/>
|
|
||||||
<ROW Fragment="VerifyRepairDlg.aip" Path="<AI_THEMES>classic\fragments\VerifyRepairDlg.aip"/>
|
|
||||||
<ROW Fragment="WelcomeDlg.aip" Path="<AI_THEMES>classic\fragments\WelcomeDlg.aip"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiActionTextComponent">
|
|
||||||
<ROW Action="AI_FwConfig" Description="Executing Windows Firewall configurations" Template="Configuring Windows Firewall rule: "[1]"" DescriptionLocId="ActionText.Description.AI_FwConfig" TemplateLocId="ActionText.Template.AI_FwConfig"/>
|
|
||||||
<ROW Action="AI_FwInstall" Description="Generating actions to configure Windows Firewall" DescriptionLocId="ActionText.Description.AI_FwInstall"/>
|
|
||||||
<ROW Action="AI_FwRemove" Description="Executing Windows Firewall configurations" Template="Configuring Windows Firewall rule: "[1]"" DescriptionLocId="ActionText.Description.AI_FwRemove" TemplateLocId="ActionText.Template.AI_FwRemove"/>
|
|
||||||
<ROW Action="AI_FwRollback" Description="Rolling back Windows Firewall configurations." Template="Rolling back Windows Firewall configurations." DescriptionLocId="ActionText.Description.AI_FwRollback" TemplateLocId="ActionText.Template.AI_FwRollback"/>
|
|
||||||
<ROW Action="AI_FwUninstall" Description="Generating actions to configure Windows Firewall" DescriptionLocId="ActionText.Description.AI_FwUninstall"/>
|
|
||||||
<ROW Action="AI_XmlCommit" Description="Committing XML file configurations." Template="Committing XML file configurations." DescriptionLocId="ActionText.Description.AI_XmlCommit" TemplateLocId="ActionText.Template.AI_XmlCommit"/>
|
|
||||||
<ROW Action="AI_XmlConfig" Description="Executing XML file configurations" Template="Configuring XML file: "[1]"" DescriptionLocId="ActionText.Description.AI_XmlConfig" TemplateLocId="ActionText.Template.AI_XmlConfig"/>
|
|
||||||
<ROW Action="AI_XmlInstall" Description="Generating actions to configure XML files" DescriptionLocId="ActionText.Description.AI_XmlInstall"/>
|
|
||||||
<ROW Action="AI_XmlRemove" Description="Executing XML file configurations" Template="Configuring XML file: "[1]"" DescriptionLocId="ActionText.Description.AI_XmlRemove" TemplateLocId="ActionText.Template.AI_XmlRemove"/>
|
|
||||||
<ROW Action="AI_XmlRollback" Description="Rolling back XML file configurations." Template="Rolling back XML file configurations." DescriptionLocId="ActionText.Description.AI_XmlRollback" TemplateLocId="ActionText.Template.AI_XmlRollback"/>
|
|
||||||
<ROW Action="AI_XmlUninstall" Description="Generating actions to configure XML files" DescriptionLocId="ActionText.Description.AI_XmlUninstall"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
|
|
||||||
<ROW Name="ExternalUICleaner.dll" SourcePath="<AI_CUSTACTS>ExternalUICleaner.dll"/>
|
|
||||||
<ROW Name="NetFirewall.dll" SourcePath="<AI_CUSTACTS>NetFirewall.dll"/>
|
|
||||||
<ROW Name="ShortcutFlags.dll" SourcePath="<AI_CUSTACTS>ShortcutFlags.dll"/>
|
|
||||||
<ROW Name="SoftwareDetector.dll" SourcePath="<AI_CUSTACTS>SoftwareDetector.dll"/>
|
|
||||||
<ROW Name="aicustact.dll" SourcePath="<AI_CUSTACTS>aicustact.dll"/>
|
|
||||||
<ROW Name="chainersupport.dll" SourcePath="<AI_CUSTACTS>chainersupport.dll"/>
|
|
||||||
<ROW Name="msichainer.exe" SourcePath="<AI_CUSTACTS>msichainer.exe"/>
|
|
||||||
<ROW Name="xmlCfg.dll" SourcePath="<AI_CUSTACTS>xmlCfg.dll"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlComponent">
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control="WelcomeDlgDialogInitializer" Type="DialogInitializer" X="0" Y="0" Width="0" Height="0" Attributes="0" Order="-1" TextLocId="-" HelpLocId="-" ExtDataLocId="-"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="1"/>
|
|
||||||
<ROW Dialog_="MaintenanceWelcomeDlg" Control_="Next" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="99"/>
|
|
||||||
<ROW Dialog_="CustomizeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_MAINT" Ordering="101"/>
|
|
||||||
<ROW Dialog_="CustomizeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_MAINT" Ordering="198"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="202"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="ChangeButton" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="501"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceWelcomeDlg" Condition="AI_MAINT" Ordering="1"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="RemoveButton" Event="NewDialog" Argument="VerifyRemoveDlg" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="601"/>
|
|
||||||
<ROW Dialog_="VerifyRemoveDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="1"/>
|
|
||||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="RepairButton" Event="NewDialog" Argument="VerifyRepairDlg" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="601"/>
|
|
||||||
<ROW Dialog_="VerifyRepairDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="1"/>
|
|
||||||
<ROW Dialog_="VerifyRepairDlg" Control_="Repair" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="399" Options="1"/>
|
|
||||||
<ROW Dialog_="VerifyRemoveDlg" Control_="Remove" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="299" Options="1"/>
|
|
||||||
<ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="201"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_PATCH" Ordering="199"/>
|
|
||||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="203"/>
|
|
||||||
<ROW Dialog_="ResumeDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_RESUME" Ordering="299"/>
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="SpawnDialog" Argument="OutOfRbDiskDlg" Condition="AI_INSTALL AND OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)" Ordering="2" Options="2"/>
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="EnableRollback" Argument="False" Condition="AI_INSTALL AND OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"" Ordering="3" Options="2"/>
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="SpawnDialog" Argument="OutOfDiskDlg" Condition="AI_INSTALL AND ( (OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F") )" Ordering="4" Options="2"/>
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="WelcomeDlgDialogInitializer" Event="[AI_ButtonText_Next_Orig]" Argument="[ButtonText_Next]" Condition="AI_INSTALL" Ordering="0" Options="2"/>
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="WelcomeDlgDialogInitializer" Event="[ButtonText_Next]" Argument="[[AI_CommitButton]]" Condition="AI_INSTALL" Ordering="1" Options="2"/>
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="WelcomeDlgDialogInitializer" Event="[AI_Text_Next_Orig]" Argument="[Text_Next]" Condition="AI_INSTALL" Ordering="2" Options="2"/>
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="WelcomeDlgDialogInitializer" Event="[Text_Next]" Argument="[Text_Install]" Condition="AI_INSTALL" Ordering="3" Options="2"/>
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="Back" Event="[ButtonText_Next]" Argument="[AI_ButtonText_Next_Orig]" Condition="AI_INSTALL" Ordering="0" Options="2"/>
|
|
||||||
<ROW Dialog_="WelcomeDlg" Control_="Back" Event="[Text_Next]" Argument="[AI_Text_Next_Orig]" Condition="AI_INSTALL" Ordering="1" Options="2"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
|
|
||||||
<ROW Directory_="networks.d_Dir" Component_="networks.d" ManualDelete="false"/>
|
|
||||||
<ROW Directory_="regid.201001.com.zerotier_Dir" Component_="regid.201001.com.zerotier" ManualDelete="false"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
|
|
||||||
<ROW Action="AI_ApplyShortcutFlags" Type="3073" Source="ShortcutFlags.dll" Target="UpdateShortcutFlags" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/>
|
|
||||||
<ROW Action="AI_CommitChainers" Type="11841" Source="chainersupport.dll" Target="CommitChainedPackages" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_DATA_SETTER" Type="51" Source="CustomActionData" Target="[~]"/>
|
|
||||||
<ROW Action="AI_DATA_SETTER_1" Type="51" Source="CustomActionData" Target="[~]"/>
|
|
||||||
<ROW Action="AI_DATA_SETTER_2" Type="51" Source="CustomActionData" Target="[~]"/>
|
|
||||||
<ROW Action="AI_DATA_SETTER_3" Type="51" Source="CustomActionData" Target="[~]"/>
|
|
||||||
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
|
|
||||||
<ROW Action="AI_DetectSoftware" Type="257" Source="SoftwareDetector.dll" Target="OnDetectSoftware"/>
|
|
||||||
<ROW Action="AI_DoRemoveExternalUIStub" Type="3585" Source="ExternalUICleaner.dll" Target="DoRemoveExternalUIStub" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/>
|
|
||||||
<ROW Action="AI_FwConfig" Type="11265" Source="NetFirewall.dll" Target="OnFwConfig" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_FwInstall" Type="1" Source="NetFirewall.dll" Target="OnFwInstall" AdditionalSeq="AI_DATA_SETTER_2"/>
|
|
||||||
<ROW Action="AI_FwRemove" Type="11265" Source="NetFirewall.dll" Target="OnFwRemove" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_FwRollback" Type="11521" Source="NetFirewall.dll" Target="OnFwRollback" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_FwUninstall" Type="1" Source="NetFirewall.dll" Target="OnFwUninstall" AdditionalSeq="AI_DATA_SETTER_3"/>
|
|
||||||
<ROW Action="AI_GetArpIconPath" Type="1" Source="aicustact.dll" Target="GetArpIconPath"/>
|
|
||||||
<ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_LaunchApp" Type="1" Source="aicustact.dll" Target="[#ZeroTierOne.exe]"/>
|
|
||||||
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
|
|
||||||
<ROW Action="AI_PrepareChainers" Type="1" Source="chainersupport.dll" Target="PrepareChainedPackages"/>
|
|
||||||
<ROW Action="AI_PrepareShortcutFlags" Type="1" Source="ShortcutFlags.dll" Target="PrepareActionData"/>
|
|
||||||
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
|
|
||||||
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
|
|
||||||
<ROW Action="AI_RemoveExternalUIStub" Type="1" Source="ExternalUICleaner.dll" Target="RemoveExternalUIStub"/>
|
|
||||||
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
|
|
||||||
<ROW Action="AI_RollbackChainers" Type="11585" Source="chainersupport.dll" Target="RollbackChainedPackages" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
|
|
||||||
<ROW Action="AI_XmlCommit" Type="11777" Source="xmlCfg.dll" Target="OnXmlCommit" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_XmlConfig" Type="11265" Source="xmlCfg.dll" Target="OnXmlConfig" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_XmlInstall" Type="1" Source="xmlCfg.dll" Target="OnXmlInstall" AdditionalSeq="AI_DATA_SETTER"/>
|
|
||||||
<ROW Action="AI_XmlRemove" Type="11265" Source="xmlCfg.dll" Target="OnXmlRemove" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_XmlRollback" Type="11521" Source="xmlCfg.dll" Target="OnXmlRollback" WithoutSeq="true"/>
|
|
||||||
<ROW Action="AI_XmlUninstall" Type="1" Source="xmlCfg.dll" Target="OnXmlUninstall" AdditionalSeq="AI_DATA_SETTER_1"/>
|
|
||||||
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]" MultiBuildTarget="DefaultBuild:[ProgramFilesFolder]ZeroTier\One"/>
|
|
||||||
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]" MultiBuildTarget="DefaultBuild:[ProgramMenuFolder]"/>
|
|
||||||
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
|
|
||||||
<ROW Action="TapDeviceRemove32" Type="3154" Source="zerotierone_x86.exe" Target="-D"/>
|
|
||||||
<ROW Action="TapDeviceRemove64" Type="3154" Source="zerotierone_x64.exe" Target="-D"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiEmbeddedChainerComponent">
|
|
||||||
<ROW MsiEmbeddedChainer="msichainer.exe" Condition="VersionMsi >= "4.05"" CommandLine="[AI_CHAINER_CMD_LINE]" Source="msichainer.exe" Type="2"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiIconsComponent">
|
|
||||||
<ROW Name="ZeroTierIcon.exe" SourcePath="..\..\..\artwork\ZeroTierIcon.ico" Index="0"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
|
|
||||||
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel <> 5)" Sequence="210"/>
|
|
||||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
|
||||||
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1502"/>
|
|
||||||
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE="No" AND (Not Installed)" Sequence="1399"/>
|
|
||||||
<ROW Action="AI_ResolveKnownFolders" Sequence="51"/>
|
|
||||||
<ROW Action="AI_PrepareShortcutFlags" Condition="(VersionNT > 501) AND ((NOT Installed) OR (Installed AND (REMOVE<>"ALL") AND (AI_INSTALL_MODE<>"Remove")))" Sequence="4501"/>
|
|
||||||
<ROW Action="AI_XmlInstall" Condition="(REMOVE <> "ALL")" Sequence="5102"/>
|
|
||||||
<ROW Action="AI_DATA_SETTER" Condition="(REMOVE <> "ALL")" Sequence="5101"/>
|
|
||||||
<ROW Action="AI_XmlUninstall" Condition="(REMOVE)" Sequence="3102"/>
|
|
||||||
<ROW Action="AI_DATA_SETTER_1" Condition="(REMOVE)" Sequence="3101"/>
|
|
||||||
<ROW Action="InstallFinalize" Sequence="6597" SeqType="0" MsiKey="InstallFinalize"/>
|
|
||||||
<ROW Action="AI_RemoveExternalUIStub" Condition="(REMOVE="ALL") AND ((VersionNT > 500) OR((VersionNT = 500) AND (ServicePackLevel >= 4)))" Sequence="1501"/>
|
|
||||||
<ROW Action="AI_GetArpIconPath" Sequence="1401"/>
|
|
||||||
<ROW Action="TapDeviceRemove32" Condition="( Installed AND ( REMOVE = "ALL" OR AI_INSTALL_MODE = "Remove" ) AND NOT UPGRADINGPRODUCTCODE ) AND ( NOT VersionNT64 )" Sequence="1601"/>
|
|
||||||
<ROW Action="TapDeviceRemove64" Condition="( Installed AND ( REMOVE = "ALL" OR AI_INSTALL_MODE = "Remove" ) AND NOT UPGRADINGPRODUCTCODE ) AND ( VersionNT64 )" Sequence="1602"/>
|
|
||||||
<ROW Action="AI_PrepareChainers" Condition="VersionMsi >= "4.05"" Sequence="5851"/>
|
|
||||||
<ROW Action="AI_FwInstall" Condition="(VersionNT >= 501) AND (REMOVE <> "ALL")" Sequence="5802"/>
|
|
||||||
<ROW Action="AI_DATA_SETTER_2" Condition="(VersionNT >= 501) AND (REMOVE <> "ALL")" Sequence="5801"/>
|
|
||||||
<ROW Action="AI_FwUninstall" Condition="(VersionNT >= 501) AND (REMOVE="ALL")" Sequence="1702"/>
|
|
||||||
<ROW Action="AI_DATA_SETTER_3" Condition="(VersionNT >= 501) AND (REMOVE="ALL")" Sequence="1701"/>
|
|
||||||
<ROW Action="AI_DetectSoftware" Sequence="101"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
|
|
||||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
|
||||||
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
|
|
||||||
<ROW Action="AI_DpiContentScale" Sequence="51"/>
|
|
||||||
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
|
|
||||||
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="102"/>
|
|
||||||
<ROW Action="ExecuteAction" Sequence="1299" SeqType="0" MsiKey="ExecuteAction"/>
|
|
||||||
<ROW Action="AI_DetectSoftware" Sequence="101"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
|
|
||||||
<ROW Condition="( Version9X OR ( NOT VersionNT64 ) OR ( VersionNT64 AND ((VersionNT64 <> 502) OR (((VersionNT64 = 502) AND (ServicePackLevel >= 1)) OR (MsiNTProductType <> 1))) AND ((VersionNT64 <> 502) OR (((VersionNT64 = 502) AND (ServicePackLevel <> 1)) OR (MsiNTProductType <> 1))) AND ((VersionNT64 <> 502) OR (((VersionNT64 = 502) AND (ServicePackLevel <> 2)) OR (MsiNTProductType <> 1))) AND ((VersionNT64 <> 502) OR ((VersionNT64 = 502) AND ((MsiNTProductType = 1) OR (ServicePackLevel >= 1)))) AND ((VersionNT64 <> 502) OR ((VersionNT64 = 502) AND ((MsiNTProductType = 1) OR (ServicePackLevel <> 1)))) AND ((VersionNT64 <> 502) OR ((VersionNT64 = 502) AND ((MsiNTProductType = 1) OR (ServicePackLevel <> 2)))) ) )" Description="[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNT64Display]" DescriptionLocId="AI.LaunchCondition.NoSpecificNT64" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="( Version9X OR VersionNT64 OR ( VersionNT AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel >= 1))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 1))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 2))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 3))) AND ((VersionNT <> 500) OR ((VersionNT = 500) AND (ServicePackLevel <> 4))) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel >= 1))) OR VersionNT64) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel <> 1))) OR VersionNT64) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel <> 2))) OR VersionNT64) AND (((VersionNT <> 501) OR ((VersionNT = 501) AND (ServicePackLevel <> 3))) OR VersionNT64) AND (((VersionNT <> 502) OR ((VersionNT = 502) AND (ServicePackLevel >= 1))) OR VersionNT64) AND (((VersionNT <> 502) OR ((VersionNT = 502) AND (ServicePackLevel <> 1))) OR VersionNT64) AND (((VersionNT <> 502) OR ((VersionNT = 502) AND (ServicePackLevel <> 2))) OR VersionNT64) ) )" Description="[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNTDisplay]" DescriptionLocId="AI.LaunchCondition.NoSpecificNT" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="(VersionNT <> 400)" Description="[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNT40Display]" DescriptionLocId="AI.LaunchCondition.NoNT40" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="AI_DETECTED_DOTNET_VERSION >= AI_REQUIRED_DOTNET_VERSION" Description="[ProductName] cannot be installed on systems with .NET Framework version lower than [AI_REQUIRED_DOTNET_DISPLAY]." DescriptionLocId="AI.LaunchCondition.DotNET" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="Privileged" Description="[ProductName] requires administrative privileges to install." DescriptionLocId="AI.LaunchCondition.Privileged" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
<ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]" DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent">
|
|
||||||
<ROW Registry="Comments" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Comments" Value="[ARPCOMMENTS]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="Contact" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Contact" Value="[ARPCONTACT]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="DisplayIcon" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayIcon" Value="[ARP_ICON_PATH]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="DisplayName" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayName" Value="[AI_PRODUCTNAME_ARP]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="DisplayVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayVersion" Value="[ProductVersion]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="HelpLink" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpLink" Value="[ARPHELPLINK]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="HelpTelephone" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpTelephone" Value="[ARPHELPTELEPHONE]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="InstallLocation" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="InstallLocation" Value="[APPDIR]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="ModifyPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="ModifyPath" Value="[AI_UNINSTALLER] /I [ProductCode]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="NoModify" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoModify" Value="#1" Component_="AI_DisableModify"/>
|
|
||||||
<ROW Registry="NoRepair" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoRepair" Value="#1" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="ProductInformation"/>
|
|
||||||
<ROW Registry="Publisher" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Publisher" Value="[Manufacturer]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="URLInfoAbout" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLInfoAbout" Value="[ARPURLINFOABOUT]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="URLUpdateInfo" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLUpdateInfo" Value="[ARPURLUPDATEINFO]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="UninstallPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallPath" Value="[AI_UNINSTALLER] /x [ProductCode]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="UninstallString" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallString" Value="[AI_UNINSTALLER] /x [ProductCode]" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="ProductInformation"/>
|
|
||||||
<ROW Registry="VersionMajor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMajor" Value="#0" Component_="AI_CustomARPName"/>
|
|
||||||
<ROW Registry="VersionMinor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMinor" Value="#7" Component_="AI_CustomARPName"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiRemoveFileComponent">
|
|
||||||
<ROW FileKey="devcon.log" Component_="ProductInformation" FileName="devcon.log" DirProperty="One_Dir" InstallMode="3"/>
|
|
||||||
<ROW FileKey="devcon_x64.exe" Component_="ProductInformation" FileName="devcon_x64.exe" DirProperty="One_Dir" InstallMode="3"/>
|
|
||||||
<ROW FileKey="devcon_x86.exe" Component_="ProductInformation" FileName="devcon_x86.exe" DirProperty="One_Dir" InstallMode="3"/>
|
|
||||||
<ROW FileKey="node.log" Component_="ProductInformation" FileName="node.log" DirProperty="One_Dir" InstallMode="3"/>
|
|
||||||
<ROW FileKey="node.log.old" Component_="ProductInformation" FileName="node.log.old" DirProperty="One_Dir" InstallMode="3"/>
|
|
||||||
<ROW FileKey="roottopology" Component_="ProductInformation" FileName="root-topology" DirProperty="One_Dir" InstallMode="3"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiServCtrlComponent">
|
|
||||||
<ROW ServiceControl="zerotierone_x64.exe" Name="ZeroTierOneService" Event="163" Wait="1" Component_="zerotierone_x64.exe"/>
|
|
||||||
<ROW ServiceControl="zerotierone_x86.exe" Name="ZeroTierOneService" Event="163" Wait="1" Component_="zerotierone_x86.exe"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiServInstComponent">
|
|
||||||
<ROW ServiceInstall="zerotierone_x64.exe" Name="ZeroTierOneService" DisplayName="ZeroTier One" ServiceType="16" StartType="2" ErrorControl="32769" Component_="zerotierone_x64.exe" Description="Ethernet Virtualization Service"/>
|
|
||||||
<ROW ServiceInstall="zerotierone_x86.exe" Name="ZeroTierOneService" DisplayName="ZeroTier One" ServiceType="16" StartType="2" ErrorControl="32769" Component_="zerotierone_x86.exe" Description="Ethernet Virtualization Service"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiShortsComponent">
|
|
||||||
<ROW Shortcut="ZeroTierOne" Directory_="ProgramMenuFolder" Name="ZEROTI~1|ZeroTier One" Component_="ZeroTierOne.exe" Target="[#ZeroTierOne.exe]" Description="Ethernet Virtualization Control Panel" Hotkey="0" Icon_="ZeroTierIcon.exe" IconIndex="0" ShowCmd="1" WkDir="APPDIR" CustomFlags="1"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
|
|
||||||
<ATTRIBUTE name="UsedTheme" value="classic"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiUpgradeComponent">
|
|
||||||
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="0.0.1" VersionMax="[|ProductVersion]" Attributes="257" ActionProperty="OLDPRODUCTS"/>
|
|
||||||
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="[|ProductVersion]" Attributes="2" ActionProperty="AI_NEWERPRODUCTFOUND"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.SoftwareIdentificationComponent">
|
|
||||||
<ATTRIBUTE name="LocalFile" value="regid.199509.com.example_ProductName.swidtag"/>
|
|
||||||
<ATTRIBUTE name="SystemFile" value="regid.199509.com.example_ProductName.swidtag_1"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.XmlAttributeComponent">
|
|
||||||
<ROW XmlAttribute="xmlnsds" XmlElement="swidsoftware_identification_tag" Name="xmlns:ds" Flags="14" Order="0" Value="http://www.w3.org/2000/09/xmldsig#"/>
|
|
||||||
<ROW XmlAttribute="xmlnsswid" XmlElement="swidsoftware_identification_tag" Name="xmlns:swid" Flags="14" Order="1" Value="http://standards.iso.org/iso/19770/-2/2008/schema.xsd"/>
|
|
||||||
<ROW XmlAttribute="xmlnsxsi" XmlElement="swidsoftware_identification_tag" Name="xmlns:xsi" Flags="14" Order="2" Value="http://www.w3.org/2001/XMLSchema-instance"/>
|
|
||||||
<ROW XmlAttribute="xsischemaLocation" XmlElement="swidsoftware_identification_tag" Name="xsi:schemaLocation" Flags="14" Order="3" Value="http://standards.iso.org/iso/19770/-2/2008/schema.xsd software_identification_tag.xsd"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.XmlElementComponent">
|
|
||||||
<ROW XmlElement="swidbuild" ParentElement="swidnumeric" Name="swid:build" Condition="1" Order="2" Flags="14" Text="5"/>
|
|
||||||
<ROW XmlElement="swidentitlement_required_indicator" ParentElement="swidsoftware_identification_tag" Name="swid:entitlement_required_indicator" Condition="1" Order="0" Flags="14" Text="false"/>
|
|
||||||
<ROW XmlElement="swidmajor" ParentElement="swidnumeric" Name="swid:major" Condition="1" Order="0" Flags="14" Text="1"/>
|
|
||||||
<ROW XmlElement="swidminor" ParentElement="swidnumeric" Name="swid:minor" Condition="1" Order="1" Flags="14" Text="1"/>
|
|
||||||
<ROW XmlElement="swidname" ParentElement="swidproduct_version" Name="swid:name" Condition="1" Order="0" Flags="14" Text="[ProductVersion]"/>
|
|
||||||
<ROW XmlElement="swidname_1" ParentElement="swidsoftware_creator" Name="swid:name" Condition="1" Order="0" Flags="14" Text="ZeroTier, Inc."/>
|
|
||||||
<ROW XmlElement="swidname_2" ParentElement="swidsoftware_licensor" Name="swid:name" Condition="1" Order="0" Flags="14" Text="ZeroTier, Inc."/>
|
|
||||||
<ROW XmlElement="swidname_3" ParentElement="swidtag_creator" Name="swid:name" Condition="1" Order="0" Flags="14" Text="ZeroTier, Inc."/>
|
|
||||||
<ROW XmlElement="swidnumeric" ParentElement="swidproduct_version" Name="swid:numeric" Condition="1" Order="1" Flags="14"/>
|
|
||||||
<ROW XmlElement="swidproduct_title" ParentElement="swidsoftware_identification_tag" Name="swid:product_title" Condition="1" Order="1" Flags="14" Text="[ProductName]"/>
|
|
||||||
<ROW XmlElement="swidproduct_version" ParentElement="swidsoftware_identification_tag" Name="swid:product_version" Condition="1" Order="2" Flags="14"/>
|
|
||||||
<ROW XmlElement="swidregid" ParentElement="swidsoftware_creator" Name="swid:regid" Condition="1" Order="1" Flags="14" Text="regid.2010-01.com.zerotier"/>
|
|
||||||
<ROW XmlElement="swidregid_1" ParentElement="swidsoftware_licensor" Name="swid:regid" Condition="1" Order="1" Flags="14" Text="regid.2010-01.com.zerotier"/>
|
|
||||||
<ROW XmlElement="swidregid_2" ParentElement="swidtag_creator" Name="swid:regid" Condition="1" Order="1" Flags="14" Text="regid.2010-01.com.zerotier"/>
|
|
||||||
<ROW XmlElement="swidreview" ParentElement="swidnumeric" Name="swid:review" Condition="1" Order="3" Flags="14" Text="0"/>
|
|
||||||
<ROW XmlElement="swidsoftware_creator" ParentElement="swidsoftware_identification_tag" Name="swid:software_creator" Condition="1" Order="3" Flags="14"/>
|
|
||||||
<ROW XmlElement="swidsoftware_id" ParentElement="swidsoftware_identification_tag" Name="swid:software_id" Condition="1" Order="5" Flags="14"/>
|
|
||||||
<ROW XmlElement="swidsoftware_identification_tag" Name="swid:software_identification_tag" Condition="1" Order="0" Flags="14"/>
|
|
||||||
<ROW XmlElement="swidsoftware_licensor" ParentElement="swidsoftware_identification_tag" Name="swid:software_licensor" Condition="1" Order="4" Flags="14"/>
|
|
||||||
<ROW XmlElement="swidtag_creator" ParentElement="swidsoftware_identification_tag" Name="swid:tag_creator" Condition="1" Order="6" Flags="14"/>
|
|
||||||
<ROW XmlElement="swidtag_creator_regid" ParentElement="swidsoftware_id" Name="swid:tag_creator_regid" Condition="1" Order="1" Flags="14" Text="regid.2010-01.com.zerotier"/>
|
|
||||||
<ROW XmlElement="swidunique_id" ParentElement="swidsoftware_id" Name="swid:unique_id" Condition="1" Order="0" Flags="14" Text="ZeroTierOne"/>
|
|
||||||
</COMPONENT>
|
|
||||||
<COMPONENT cid="caphyon.advinst.msicomp.XmlFileComponent">
|
|
||||||
<ROW XmlFile="regid.199509.com.example_ProductName.swidtag" FileName="REGID2~1.SWI|regid.2010-01.com.zerotier_ZeroTierOne.swidtag" DirProperty="APPDIR" Component="ProductInformation" RootElement="swidsoftware_identification_tag" Flags="25" Version="1.0" Encoding="UTF-8" IndentUnits="2"/>
|
|
||||||
<ROW XmlFile="regid.199509.com.example_ProductName.swidtag_1" FileName="REGID2~1.SWI|regid.2010-01.com.zerotier_ZeroTierOne.swidtag" DirProperty="regid.201001.com.zerotier_Dir" Component="ProductInformation" RootElement="swidsoftware_identification_tag" Flags="25" Version="1.0" Encoding="UTF-8" IndentUnits="2"/>
|
|
||||||
</COMPONENT>
|
|
||||||
</DOCUMENT>
|
|
||||||
@@ -53,6 +53,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#undef USE_PROC_NET_ROUTE
|
#undef USE_PROC_NET_ROUTE
|
||||||
#define USE_SOCKET_ROUTE
|
#define USE_SOCKET_ROUTE
|
||||||
#undef USE_SYSCTL_NET_ROUTE
|
#undef USE_SYSCTL_NET_ROUTE
|
||||||
|
#include <sys/sysctl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
@@ -96,7 +97,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#ifdef USE_SYSCTL_NET_ROUTE
|
#ifdef USE_SYSCTL_NET_ROUTE
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/sysctl.h>
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <net/route.h>
|
#include <net/route.h>
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|
||||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
|
||||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
|
||||||
* OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
src/ - The source code for the lwIP TCP/IP stack.
|
|
||||||
doc/ - The documentation for lwIP.
|
|
||||||
|
|
||||||
See also the FILES file in each subdirectory.
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
INTRODUCTION
|
|
||||||
|
|
||||||
lwIP is a small independent implementation of the TCP/IP protocol
|
|
||||||
suite that has been developed by Adam Dunkels at the Computer and
|
|
||||||
Networks Architectures (CNA) lab at the Swedish Institute of Computer
|
|
||||||
Science (SICS).
|
|
||||||
|
|
||||||
The focus of the lwIP TCP/IP implementation is to reduce the RAM usage
|
|
||||||
while still having a full scale TCP. This making lwIP suitable for use
|
|
||||||
in embedded systems with tens of kilobytes of free RAM and room for
|
|
||||||
around 40 kilobytes of code ROM.
|
|
||||||
|
|
||||||
FEATURES
|
|
||||||
|
|
||||||
* IP (Internet Protocol) including packet forwarding over multiple network
|
|
||||||
interfaces
|
|
||||||
* ICMP (Internet Control Message Protocol) for network maintenance and debugging
|
|
||||||
* IGMP (Internet Group Management Protocol) for multicast traffic management
|
|
||||||
* UDP (User Datagram Protocol) including experimental UDP-lite extensions
|
|
||||||
* TCP (Transmission Control Protocol) with congestion control, RTT estimation
|
|
||||||
and fast recovery/fast retransmit
|
|
||||||
* Specialized raw/native API for enhanced performance
|
|
||||||
* Optional Berkeley-like socket API
|
|
||||||
* DNS (Domain names resolver)
|
|
||||||
* SNMP (Simple Network Management Protocol)
|
|
||||||
* DHCP (Dynamic Host Configuration Protocol)
|
|
||||||
* AUTOIP (for IPv4, conform with RFC 3927)
|
|
||||||
* PPP (Point-to-Point Protocol)
|
|
||||||
* ARP (Address Resolution Protocol) for Ethernet
|
|
||||||
|
|
||||||
LICENSE
|
|
||||||
|
|
||||||
lwIP is freely available under a BSD license.
|
|
||||||
|
|
||||||
DEVELOPMENT
|
|
||||||
|
|
||||||
lwIP has grown into an excellent TCP/IP stack for embedded devices,
|
|
||||||
and developers using the stack often submit bug fixes, improvements,
|
|
||||||
and additions to the stack to further increase its usefulness.
|
|
||||||
|
|
||||||
Development of lwIP is hosted on Savannah, a central point for
|
|
||||||
software development, maintenance and distribution. Everyone can
|
|
||||||
help improve lwIP by use of Savannah's interface, CVS and the
|
|
||||||
mailing list. A core team of developers will commit changes to the
|
|
||||||
CVS source tree.
|
|
||||||
|
|
||||||
The lwIP TCP/IP stack is maintained in the 'lwip' CVS module and
|
|
||||||
contributions (such as platform ports) are in the 'contrib' module.
|
|
||||||
|
|
||||||
See doc/savannah.txt for details on CVS server access for users and
|
|
||||||
developers.
|
|
||||||
|
|
||||||
Last night's CVS tar ball can be downloaded from:
|
|
||||||
http://savannah.gnu.org/cvs.backups/lwip.tar.gz [CHANGED - NEEDS FIXING]
|
|
||||||
|
|
||||||
The current CVS trees are web-browsable:
|
|
||||||
http://savannah.nongnu.org/cgi-bin/viewcvs/lwip/lwip/
|
|
||||||
http://savannah.nongnu.org/cgi-bin/viewcvs/lwip/contrib/
|
|
||||||
|
|
||||||
Submit patches and bugs via the lwIP project page:
|
|
||||||
http://savannah.nongnu.org/projects/lwip/
|
|
||||||
|
|
||||||
|
|
||||||
DOCUMENTATION
|
|
||||||
|
|
||||||
The original out-dated homepage of lwIP and Adam Dunkels' papers on
|
|
||||||
lwIP are at the official lwIP home page:
|
|
||||||
http://www.sics.se/~adam/lwip/
|
|
||||||
|
|
||||||
Self documentation of the source code is regularly extracted from the
|
|
||||||
current CVS sources and is available from this web page:
|
|
||||||
http://www.nongnu.org/lwip/
|
|
||||||
|
|
||||||
There is now a constantly growin wiki about lwIP at
|
|
||||||
http://lwip.wikia.com/wiki/LwIP_Wiki
|
|
||||||
|
|
||||||
Also, there are mailing lists you can subscribe at
|
|
||||||
http://savannah.nongnu.org/mail/?group=lwip
|
|
||||||
plus searchable archives:
|
|
||||||
http://lists.nongnu.org/archive/html/lwip-users/
|
|
||||||
http://lists.nongnu.org/archive/html/lwip-devel/
|
|
||||||
|
|
||||||
Reading Adam's papers, the files in docs/, browsing the source code
|
|
||||||
documentation and browsing the mailing list archives is a good way to
|
|
||||||
become familiar with the design of lwIP.
|
|
||||||
|
|
||||||
Adam Dunkels <adam@sics.se>
|
|
||||||
Leon Woestenberg <leon.woestenberg@gmx.net>
|
|
||||||
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
This file lists major changes between release versions that require
|
|
||||||
ports or applications to be changed. Use it to update a port or an
|
|
||||||
application written for an older version of lwIP to correctly work
|
|
||||||
with newer versions.
|
|
||||||
|
|
||||||
|
|
||||||
(CVS HEAD)
|
|
||||||
|
|
||||||
* [Enter new changes just after this line - do not remove this line]
|
|
||||||
|
|
||||||
++ Application changes:
|
|
||||||
|
|
||||||
* Replaced struct ip_addr by typedef ip_addr_t (struct ip_addr is kept for
|
|
||||||
compatibility to old applications, but will be removed in the future).
|
|
||||||
|
|
||||||
* Renamed mem_realloc() to mem_trim() to prevent confusion with realloc()
|
|
||||||
|
|
||||||
+++ Raw API:
|
|
||||||
* Changed the semantics of tcp_close() (since it was rather a
|
|
||||||
shutdown before): Now the application does *NOT* get any calls to the recv
|
|
||||||
callback (aside from NULL/closed) after calling tcp_close()
|
|
||||||
|
|
||||||
* When calling tcp_abort() from a raw API TCP callback function,
|
|
||||||
make sure you return ERR_ABRT to prevent accessing unallocated memory.
|
|
||||||
(ERR_ABRT now means the applicaiton has called tcp_abort!)
|
|
||||||
|
|
||||||
+++ Netconn API:
|
|
||||||
* Changed netconn_receive() and netconn_accept() to return
|
|
||||||
err_t, not a pointer to new data/netconn.
|
|
||||||
|
|
||||||
+++ Socket API:
|
|
||||||
* LWIP_SO_RCVTIMEO: when accept() or recv() time out, they
|
|
||||||
now set errno to EWOULDBLOCK/EAGAIN, not ETIMEDOUT.
|
|
||||||
|
|
||||||
* Added a minimal version of posix fctl() to have a
|
|
||||||
standardised way to set O_NONBLOCK for nonblocking sockets.
|
|
||||||
|
|
||||||
+++ all APIs:
|
|
||||||
* correctly implemented SO(F)_REUSEADDR
|
|
||||||
|
|
||||||
++ Port changes
|
|
||||||
|
|
||||||
+++ new files:
|
|
||||||
|
|
||||||
* Added 4 new files: def.c, timers.c, timers.h, tcp_impl.h:
|
|
||||||
|
|
||||||
* Moved stack-internal parts of tcp.h to tcp_impl.h, tcp.h now only contains
|
|
||||||
the actual application programmer's API
|
|
||||||
|
|
||||||
* Separated timer implementation from sys.h/.c, moved to timers.h/.c;
|
|
||||||
Added timer implementation for NO_SYS==1, set NO_SYS_NO_TIMERS==1 if you
|
|
||||||
still want to use your own timer implementation for NO_SYS==0 (as before).
|
|
||||||
|
|
||||||
+++ sys layer:
|
|
||||||
|
|
||||||
* Converted mbox- and semaphore-functions to take pointers to sys_mbox_t/
|
|
||||||
sys_sem_t;
|
|
||||||
|
|
||||||
* Converted sys_mbox_new/sys_sem_new to take pointers and return err_t;
|
|
||||||
|
|
||||||
* Added Mutex concept in sys_arch (define LWIP_COMPAT_MUTEX to let sys.h use
|
|
||||||
binary semaphores instead of mutexes - as before)
|
|
||||||
|
|
||||||
+++ new options:
|
|
||||||
|
|
||||||
* Don't waste memory when chaining segments, added option TCP_OVERSIZE to
|
|
||||||
prevent creating many small pbufs when calling tcp_write with many small
|
|
||||||
blocks of data. Instead, pbufs are allocated larger than needed and the
|
|
||||||
space is used for later calls to tcp_write.
|
|
||||||
|
|
||||||
* Added LWIP_NETIF_TX_SINGLE_PBUF to always copy to try to create single pbufs
|
|
||||||
in tcp_write/udp_send.
|
|
||||||
|
|
||||||
* Added an additional option LWIP_ETHERNET to support ethernet without ARP
|
|
||||||
(necessary for pure PPPoE)
|
|
||||||
|
|
||||||
* Add MEMP_SEPARATE_POOLS to place memory pools in separate arrays. This may
|
|
||||||
be used to place these pools into user-defined memory by using external
|
|
||||||
declaration.
|
|
||||||
|
|
||||||
* Added TCP_SNDQUEUELOWAT corresponding to TCP_SNDLOWAT
|
|
||||||
|
|
||||||
+++ new pools:
|
|
||||||
|
|
||||||
* Netdb uses a memp pool for allocating memory when getaddrinfo() is called,
|
|
||||||
so MEMP_NUM_NETDB has to be set accordingly.
|
|
||||||
|
|
||||||
* DNS_LOCAL_HOSTLIST_IS_DYNAMIC uses a memp pool instead of the heap, so
|
|
||||||
MEMP_NUM_LOCALHOSTLIST has to be set accordingly.
|
|
||||||
|
|
||||||
* Snmp-agent uses a memp pools instead of the heap, so MEMP_NUM_SNMP_* have
|
|
||||||
to be set accordingly.
|
|
||||||
|
|
||||||
* PPPoE uses a MEMP pool instead of the heap, so MEMP_NUM_PPPOE_INTERFACES
|
|
||||||
has to be set accordingly
|
|
||||||
|
|
||||||
* Integrated loopif into netif.c - loopif does not have to be created by the
|
|
||||||
port any more, just define LWIP_HAVE_LOOPIF to 1.
|
|
||||||
|
|
||||||
* Added define LWIP_RAND() for lwip-wide randomization (needs to be defined
|
|
||||||
in cc.h, e.g. used by igmp)
|
|
||||||
|
|
||||||
* Added printf-formatter X8_F to printf u8_t as hex
|
|
||||||
|
|
||||||
* The heap now may be moved to user-defined memory by defining
|
|
||||||
LWIP_RAM_HEAP_POINTER as a void pointer to that memory's address
|
|
||||||
|
|
||||||
* added autoip_set_struct() and dhcp_set_struct() to let autoip and dhcp work
|
|
||||||
with user-allocated structs instead of calling mem_malloc
|
|
||||||
|
|
||||||
* Added const char* name to mem- and memp-stats for easier debugging.
|
|
||||||
|
|
||||||
* Calculate the TCP/UDP checksum while copying to only fetch data once:
|
|
||||||
Define LWIP_CHKSUM_COPY to a memcpy-like function that returns the checksum
|
|
||||||
|
|
||||||
* Added SO_REUSE_RXTOALL to pass received UDP broadcast/multicast packets to
|
|
||||||
more than one pcb.
|
|
||||||
|
|
||||||
* Changed the semantics of ARP_QUEUEING==0: ARP_QUEUEING now cannot be turned
|
|
||||||
off any more, if this is set to 0, only one packet (the most recent one) is
|
|
||||||
queued (like demanded by RFC 1122).
|
|
||||||
|
|
||||||
|
|
||||||
++ Major bugfixes/improvements
|
|
||||||
|
|
||||||
* Implemented tcp_shutdown() to only shut down one end of a connection
|
|
||||||
* Implemented shutdown() at socket- and netconn-level
|
|
||||||
* Added errorset support to select() + improved select speed overhead
|
|
||||||
* Merged pppd to v2.3.11 (including some backported bugfixes from 2.4.x)
|
|
||||||
* Added timer implementation for NO_SYS==1 (may be disabled with NO_SYS_NO_TIMERS==1
|
|
||||||
* Use macros defined in ip_addr.h to work with IP addresses
|
|
||||||
* Implemented many nonblocking socket/netconn functions
|
|
||||||
* Fixed ARP input processing: only add a new entry if a request was directed as us
|
|
||||||
* mem_realloc() to mem_trim() to prevent confusion with realloc()
|
|
||||||
* Some improvements for AutoIP (don't route/forward link-local addresses, don't break
|
|
||||||
existing connections when assigning a routable address)
|
|
||||||
* Correctly handle remote side overrunning our rcv_wnd in ooseq case
|
|
||||||
* Removed packing from ip_addr_t, the packed version is now only used in protocol headers
|
|
||||||
* Corrected PBUF_POOL_BUFSIZE for ports where ETH_PAD_SIZE > 0
|
|
||||||
* Added support for static ARP table entries
|
|
||||||
|
|
||||||
(STABLE-1.3.2)
|
|
||||||
|
|
||||||
* initial version of this file
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
api/ - The code for the high-level wrapper API. Not needed if
|
|
||||||
you use the lowel-level call-back/raw API.
|
|
||||||
|
|
||||||
core/ - The core of the TPC/IP stack; protocol implementations,
|
|
||||||
memory and buffer management, and the low-level raw API.
|
|
||||||
|
|
||||||
include/ - lwIP include files.
|
|
||||||
|
|
||||||
netif/ - Generic network interface device drivers are kept here,
|
|
||||||
as well as the ARP module.
|
|
||||||
|
|
||||||
For more information on the various subdirectories, check the FILES
|
|
||||||
file in each directory.
|
|
||||||
@@ -1,780 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file
|
|
||||||
* Sequential API External module
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|
||||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
|
||||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
|
||||||
* OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* This is the part of the API that is linked with
|
|
||||||
the application */
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/api.h"
|
|
||||||
#include "lwip/tcpip.h"
|
|
||||||
#include "lwip/memp.h"
|
|
||||||
|
|
||||||
#include "lwip/ip.h"
|
|
||||||
#include "lwip/raw.h"
|
|
||||||
#include "lwip/udp.h"
|
|
||||||
#include "lwip/tcp.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new netconn (of a specific type) that has a callback function.
|
|
||||||
* The corresponding pcb is also created.
|
|
||||||
*
|
|
||||||
* @param t the type of 'connection' to create (@see enum netconn_type)
|
|
||||||
* @param proto the IP protocol for RAW IP pcbs
|
|
||||||
* @param callback a function to call on status changes (RX available, TX'ed)
|
|
||||||
* @return a newly allocated struct netconn or
|
|
||||||
* NULL on memory error
|
|
||||||
*/
|
|
||||||
struct netconn*
|
|
||||||
netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback)
|
|
||||||
{
|
|
||||||
struct netconn *conn;
|
|
||||||
struct api_msg msg;
|
|
||||||
|
|
||||||
conn = netconn_alloc(t, callback);
|
|
||||||
if (conn != NULL) {
|
|
||||||
msg.function = do_newconn;
|
|
||||||
msg.msg.msg.n.proto = proto;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
if (TCPIP_APIMSG(&msg) != ERR_OK) {
|
|
||||||
LWIP_ASSERT("freeing conn without freeing pcb", conn->pcb.tcp == NULL);
|
|
||||||
LWIP_ASSERT("conn has no op_completed", sys_sem_valid(&conn->op_completed));
|
|
||||||
LWIP_ASSERT("conn has no recvmbox", sys_mbox_valid(&conn->recvmbox));
|
|
||||||
#if LWIP_TCP
|
|
||||||
LWIP_ASSERT("conn->acceptmbox shouldn't exist", !sys_mbox_valid(&conn->acceptmbox));
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
sys_sem_free(&conn->op_completed);
|
|
||||||
sys_mbox_free(&conn->recvmbox);
|
|
||||||
memp_free(MEMP_NETCONN, conn);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close a netconn 'connection' and free its resources.
|
|
||||||
* UDP and RAW connection are completely closed, TCP pcbs might still be in a waitstate
|
|
||||||
* after this returns.
|
|
||||||
*
|
|
||||||
* @param conn the netconn to delete
|
|
||||||
* @return ERR_OK if the connection was deleted
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_delete(struct netconn *conn)
|
|
||||||
{
|
|
||||||
struct api_msg msg;
|
|
||||||
|
|
||||||
/* No ASSERT here because possible to get a (conn == NULL) if we got an accept error */
|
|
||||||
if (conn == NULL) {
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.function = do_delconn;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
tcpip_apimsg(&msg);
|
|
||||||
|
|
||||||
netconn_free(conn);
|
|
||||||
|
|
||||||
/* don't care for return value of do_delconn since it only calls void functions */
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the local or remote IP address and port of a netconn.
|
|
||||||
* For RAW netconns, this returns the protocol instead of a port!
|
|
||||||
*
|
|
||||||
* @param conn the netconn to query
|
|
||||||
* @param addr a pointer to which to save the IP address
|
|
||||||
* @param port a pointer to which to save the port (or protocol for RAW)
|
|
||||||
* @param local 1 to get the local IP address, 0 to get the remote one
|
|
||||||
* @return ERR_CONN for invalid connections
|
|
||||||
* ERR_OK if the information was retrieved
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local)
|
|
||||||
{
|
|
||||||
struct api_msg msg;
|
|
||||||
err_t err;
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_getaddr: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
LWIP_ERROR("netconn_getaddr: invalid addr", (addr != NULL), return ERR_ARG;);
|
|
||||||
LWIP_ERROR("netconn_getaddr: invalid port", (port != NULL), return ERR_ARG;);
|
|
||||||
|
|
||||||
msg.function = do_getaddr;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
msg.msg.msg.ad.ipaddr = addr;
|
|
||||||
msg.msg.msg.ad.port = port;
|
|
||||||
msg.msg.msg.ad.local = local;
|
|
||||||
err = TCPIP_APIMSG(&msg);
|
|
||||||
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, err);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bind a netconn to a specific local IP address and port.
|
|
||||||
* Binding one netconn twice might not always be checked correctly!
|
|
||||||
*
|
|
||||||
* @param conn the netconn to bind
|
|
||||||
* @param addr the local IP address to bind the netconn to (use IP_ADDR_ANY
|
|
||||||
* to bind to all addresses)
|
|
||||||
* @param port the local port to bind the netconn to (not used for RAW)
|
|
||||||
* @return ERR_OK if bound, any other err_t on failure
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_bind(struct netconn *conn, ip_addr_t *addr, u16_t port)
|
|
||||||
{
|
|
||||||
struct api_msg msg;
|
|
||||||
err_t err;
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_bind: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
|
|
||||||
msg.function = do_bind;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
msg.msg.msg.bc.ipaddr = addr;
|
|
||||||
msg.msg.msg.bc.port = port;
|
|
||||||
err = TCPIP_APIMSG(&msg);
|
|
||||||
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, err);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Connect a netconn to a specific remote IP address and port.
|
|
||||||
*
|
|
||||||
* @param conn the netconn to connect
|
|
||||||
* @param addr the remote IP address to connect to
|
|
||||||
* @param port the remote port to connect to (no used for RAW)
|
|
||||||
* @return ERR_OK if connected, return value of tcp_/udp_/raw_connect otherwise
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_connect(struct netconn *conn, ip_addr_t *addr, u16_t port)
|
|
||||||
{
|
|
||||||
struct api_msg msg;
|
|
||||||
err_t err;
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_connect: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
|
|
||||||
msg.function = do_connect;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
msg.msg.msg.bc.ipaddr = addr;
|
|
||||||
msg.msg.msg.bc.port = port;
|
|
||||||
/* This is the only function which need to not block tcpip_thread */
|
|
||||||
err = tcpip_apimsg(&msg);
|
|
||||||
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, err);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disconnect a netconn from its current peer (only valid for UDP netconns).
|
|
||||||
*
|
|
||||||
* @param conn the netconn to disconnect
|
|
||||||
* @return TODO: return value is not set here...
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_disconnect(struct netconn *conn)
|
|
||||||
{
|
|
||||||
struct api_msg msg;
|
|
||||||
err_t err;
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_disconnect: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
|
|
||||||
msg.function = do_disconnect;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
err = TCPIP_APIMSG(&msg);
|
|
||||||
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, err);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set a TCP netconn into listen mode
|
|
||||||
*
|
|
||||||
* @param conn the tcp netconn to set to listen mode
|
|
||||||
* @param backlog the listen backlog, only used if TCP_LISTEN_BACKLOG==1
|
|
||||||
* @return ERR_OK if the netconn was set to listen (UDP and RAW netconns
|
|
||||||
* don't return any error (yet?))
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_listen_with_backlog(struct netconn *conn, u8_t backlog)
|
|
||||||
{
|
|
||||||
#if LWIP_TCP
|
|
||||||
struct api_msg msg;
|
|
||||||
err_t err;
|
|
||||||
|
|
||||||
/* This does no harm. If TCP_LISTEN_BACKLOG is off, backlog is unused. */
|
|
||||||
LWIP_UNUSED_ARG(backlog);
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_listen: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
|
|
||||||
msg.function = do_listen;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
#if TCP_LISTEN_BACKLOG
|
|
||||||
msg.msg.msg.lb.backlog = backlog;
|
|
||||||
#endif /* TCP_LISTEN_BACKLOG */
|
|
||||||
err = TCPIP_APIMSG(&msg);
|
|
||||||
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, err);
|
|
||||||
return err;
|
|
||||||
#else /* LWIP_TCP */
|
|
||||||
LWIP_UNUSED_ARG(conn);
|
|
||||||
LWIP_UNUSED_ARG(backlog);
|
|
||||||
return ERR_ARG;
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Accept a new connection on a TCP listening netconn.
|
|
||||||
*
|
|
||||||
* @param conn the TCP listen netconn
|
|
||||||
* @param new_conn pointer where the new connection is stored
|
|
||||||
* @return ERR_OK if a new connection has been received or an error
|
|
||||||
* code otherwise
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_accept(struct netconn *conn, struct netconn **new_conn)
|
|
||||||
{
|
|
||||||
#if LWIP_TCP
|
|
||||||
struct netconn *newconn;
|
|
||||||
err_t err;
|
|
||||||
#if TCP_LISTEN_BACKLOG
|
|
||||||
struct api_msg msg;
|
|
||||||
#endif /* TCP_LISTEN_BACKLOG */
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_accept: invalid pointer", (new_conn != NULL), return ERR_ARG;);
|
|
||||||
*new_conn = NULL;
|
|
||||||
LWIP_ERROR("netconn_accept: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
LWIP_ERROR("netconn_accept: invalid acceptmbox", sys_mbox_valid(&conn->acceptmbox), return ERR_ARG;);
|
|
||||||
|
|
||||||
err = conn->last_err;
|
|
||||||
if (ERR_IS_FATAL(err)) {
|
|
||||||
/* don't recv on fatal errors: this might block the application task
|
|
||||||
waiting on acceptmbox forever! */
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if LWIP_SO_RCVTIMEO
|
|
||||||
if (sys_arch_mbox_fetch(&conn->acceptmbox, (void **)&newconn, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, ERR_TIMEOUT);
|
|
||||||
return ERR_TIMEOUT;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
sys_arch_mbox_fetch(&conn->acceptmbox, (void **)&newconn, 0);
|
|
||||||
#endif /* LWIP_SO_RCVTIMEO*/
|
|
||||||
/* Register event with callback */
|
|
||||||
API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
|
|
||||||
|
|
||||||
if (newconn == NULL) {
|
|
||||||
/* connection has been aborted */
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, ERR_ABRT);
|
|
||||||
return ERR_ABRT;
|
|
||||||
}
|
|
||||||
#if TCP_LISTEN_BACKLOG
|
|
||||||
/* Let the stack know that we have accepted the connection. */
|
|
||||||
msg.function = do_recv;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
/* don't care for the return value of do_recv */
|
|
||||||
TCPIP_APIMSG(&msg);
|
|
||||||
#endif /* TCP_LISTEN_BACKLOG */
|
|
||||||
|
|
||||||
*new_conn = newconn;
|
|
||||||
/* don't set conn->last_err: it's only ERR_OK, anyway */
|
|
||||||
return ERR_OK;
|
|
||||||
#else /* LWIP_TCP */
|
|
||||||
LWIP_UNUSED_ARG(conn);
|
|
||||||
LWIP_UNUSED_ARG(new_conn);
|
|
||||||
return ERR_ARG;
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Receive data: actual implementation that doesn't care whether pbuf or netbuf
|
|
||||||
* is received
|
|
||||||
*
|
|
||||||
* @param conn the netconn from which to receive data
|
|
||||||
* @param new_buf pointer where a new pbuf/netbuf is stored when received data
|
|
||||||
* @return ERR_OK if data has been received, an error code otherwise (timeout,
|
|
||||||
* memory error or another error)
|
|
||||||
*/
|
|
||||||
static err_t
|
|
||||||
netconn_recv_data(struct netconn *conn, void **new_buf)
|
|
||||||
{
|
|
||||||
void *buf = NULL;
|
|
||||||
u16_t len;
|
|
||||||
err_t err;
|
|
||||||
#if LWIP_TCP
|
|
||||||
struct api_msg msg;
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_recv: invalid pointer", (new_buf != NULL), return ERR_ARG;);
|
|
||||||
*new_buf = NULL;
|
|
||||||
LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
LWIP_ERROR("netconn_accept: invalid recvmbox", sys_mbox_valid(&conn->recvmbox), return ERR_CONN;);
|
|
||||||
|
|
||||||
err = conn->last_err;
|
|
||||||
if (ERR_IS_FATAL(err)) {
|
|
||||||
/* don't recv on fatal errors: this might block the application task
|
|
||||||
waiting on recvmbox forever! */
|
|
||||||
/* @todo: this does not allow us to fetch data that has been put into recvmbox
|
|
||||||
before the fatal error occurred - is that a problem? */
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if LWIP_SO_RCVTIMEO
|
|
||||||
if (sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, ERR_TIMEOUT);
|
|
||||||
return ERR_TIMEOUT;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0);
|
|
||||||
#endif /* LWIP_SO_RCVTIMEO*/
|
|
||||||
|
|
||||||
#if LWIP_TCP
|
|
||||||
#if (LWIP_UDP || LWIP_RAW)
|
|
||||||
if (conn->type == NETCONN_TCP)
|
|
||||||
#endif /* (LWIP_UDP || LWIP_RAW) */
|
|
||||||
{
|
|
||||||
if (!netconn_get_noautorecved(conn) || (buf == NULL)) {
|
|
||||||
/* Let the stack know that we have taken the data. */
|
|
||||||
/* TODO: Speedup: Don't block and wait for the answer here
|
|
||||||
(to prevent multiple thread-switches). */
|
|
||||||
msg.function = do_recv;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
if (buf != NULL) {
|
|
||||||
msg.msg.msg.r.len = ((struct pbuf *)buf)->tot_len;
|
|
||||||
} else {
|
|
||||||
msg.msg.msg.r.len = 1;
|
|
||||||
}
|
|
||||||
/* don't care for the return value of do_recv */
|
|
||||||
TCPIP_APIMSG(&msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we are closed, we indicate that we no longer wish to use the socket */
|
|
||||||
if (buf == NULL) {
|
|
||||||
API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
|
|
||||||
/* Avoid to lose any previous error code */
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, ERR_CLSD);
|
|
||||||
return ERR_CLSD;
|
|
||||||
}
|
|
||||||
len = ((struct pbuf *)buf)->tot_len;
|
|
||||||
}
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
#if LWIP_TCP && (LWIP_UDP || LWIP_RAW)
|
|
||||||
else
|
|
||||||
#endif /* LWIP_TCP && (LWIP_UDP || LWIP_RAW) */
|
|
||||||
#if (LWIP_UDP || LWIP_RAW)
|
|
||||||
{
|
|
||||||
LWIP_ASSERT("buf != NULL", buf != NULL);
|
|
||||||
len = netbuf_len((struct netbuf *)buf);
|
|
||||||
}
|
|
||||||
#endif /* (LWIP_UDP || LWIP_RAW) */
|
|
||||||
|
|
||||||
#if LWIP_SO_RCVBUF
|
|
||||||
SYS_ARCH_DEC(conn->recv_avail, len);
|
|
||||||
#endif /* LWIP_SO_RCVBUF */
|
|
||||||
/* Register event with callback */
|
|
||||||
API_EVENT(conn, NETCONN_EVT_RCVMINUS, len);
|
|
||||||
|
|
||||||
LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_recv_data: received %p, len=%"U16_F"\n", buf, len));
|
|
||||||
|
|
||||||
*new_buf = buf;
|
|
||||||
/* don't set conn->last_err: it's only ERR_OK, anyway */
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Receive data (in form of a pbuf) from a TCP netconn
|
|
||||||
*
|
|
||||||
* @param conn the netconn from which to receive data
|
|
||||||
* @param new_buf pointer where a new pbuf is stored when received data
|
|
||||||
* @return ERR_OK if data has been received, an error code otherwise (timeout,
|
|
||||||
* memory error or another error)
|
|
||||||
* ERR_ARG if conn is not a TCP netconn
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf)
|
|
||||||
{
|
|
||||||
LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL) &&
|
|
||||||
netconn_type(conn) == NETCONN_TCP, return ERR_ARG;);
|
|
||||||
|
|
||||||
return netconn_recv_data(conn, (void **)new_buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Receive data (in form of a netbuf containing a packet buffer) from a netconn
|
|
||||||
*
|
|
||||||
* @param conn the netconn from which to receive data
|
|
||||||
* @param new_buf pointer where a new netbuf is stored when received data
|
|
||||||
* @return ERR_OK if data has been received, an error code otherwise (timeout,
|
|
||||||
* memory error or another error)
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_recv(struct netconn *conn, struct netbuf **new_buf)
|
|
||||||
{
|
|
||||||
#if LWIP_TCP
|
|
||||||
struct netbuf *buf = NULL;
|
|
||||||
err_t err;
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_recv: invalid pointer", (new_buf != NULL), return ERR_ARG;);
|
|
||||||
*new_buf = NULL;
|
|
||||||
LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
LWIP_ERROR("netconn_accept: invalid recvmbox", sys_mbox_valid(&conn->recvmbox), return ERR_CONN;);
|
|
||||||
|
|
||||||
#if LWIP_TCP
|
|
||||||
#if (LWIP_UDP || LWIP_RAW)
|
|
||||||
if (conn->type == NETCONN_TCP)
|
|
||||||
#endif /* (LWIP_UDP || LWIP_RAW) */
|
|
||||||
{
|
|
||||||
struct pbuf *p = NULL;
|
|
||||||
/* This is not a listening netconn, since recvmbox is set */
|
|
||||||
|
|
||||||
buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);
|
|
||||||
if (buf == NULL) {
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, ERR_MEM);
|
|
||||||
return ERR_MEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = netconn_recv_data(conn, (void **)&p);
|
|
||||||
if (err != ERR_OK) {
|
|
||||||
memp_free(MEMP_NETBUF, buf);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
LWIP_ASSERT("p != NULL", p != NULL);
|
|
||||||
|
|
||||||
buf->p = p;
|
|
||||||
buf->ptr = p;
|
|
||||||
buf->port = 0;
|
|
||||||
ip_addr_set_any(&buf->addr);
|
|
||||||
*new_buf = buf;
|
|
||||||
/* don't set conn->last_err: it's only ERR_OK, anyway */
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
#if LWIP_TCP && (LWIP_UDP || LWIP_RAW)
|
|
||||||
else
|
|
||||||
#endif /* LWIP_TCP && (LWIP_UDP || LWIP_RAW) */
|
|
||||||
{
|
|
||||||
#if (LWIP_UDP || LWIP_RAW)
|
|
||||||
return netconn_recv_data(conn, (void **)new_buf);
|
|
||||||
#endif /* (LWIP_UDP || LWIP_RAW) */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TCP: update the receive window: by calling this, the application
|
|
||||||
* tells the stack that it has processed data and is able to accept
|
|
||||||
* new data.
|
|
||||||
* ATTENTION: use with care, this is mainly used for sockets!
|
|
||||||
* Can only be used when calling netconn_set_noautorecved(conn, 1) before.
|
|
||||||
*
|
|
||||||
* @param conn the netconn for which to update the receive window
|
|
||||||
* @param length amount of data processed (ATTENTION: this must be accurate!)
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
netconn_recved(struct netconn *conn, u32_t length)
|
|
||||||
{
|
|
||||||
#if LWIP_TCP
|
|
||||||
if ((conn != NULL) && (conn->type == NETCONN_TCP) &&
|
|
||||||
(netconn_get_noautorecved(conn))) {
|
|
||||||
struct api_msg msg;
|
|
||||||
/* Let the stack know that we have taken the data. */
|
|
||||||
/* TODO: Speedup: Don't block and wait for the answer here
|
|
||||||
(to prevent multiple thread-switches). */
|
|
||||||
msg.function = do_recv;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
msg.msg.msg.r.len = length;
|
|
||||||
/* don't care for the return value of do_recv */
|
|
||||||
TCPIP_APIMSG(&msg);
|
|
||||||
}
|
|
||||||
#else /* LWIP_TCP */
|
|
||||||
LWIP_UNUSED_ARG(conn);
|
|
||||||
LWIP_UNUSED_ARG(length);
|
|
||||||
#endif /* LWIP_TCP */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send data (in form of a netbuf) to a specific remote IP address and port.
|
|
||||||
* Only to be used for UDP and RAW netconns (not TCP).
|
|
||||||
*
|
|
||||||
* @param conn the netconn over which to send data
|
|
||||||
* @param buf a netbuf containing the data to send
|
|
||||||
* @param addr the remote IP address to which to send the data
|
|
||||||
* @param port the remote port to which to send the data
|
|
||||||
* @return ERR_OK if data was sent, any other err_t on error
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_sendto(struct netconn *conn, struct netbuf *buf, ip_addr_t *addr, u16_t port)
|
|
||||||
{
|
|
||||||
if (buf != NULL) {
|
|
||||||
ip_addr_set(&buf->addr, addr);
|
|
||||||
buf->port = port;
|
|
||||||
return netconn_send(conn, buf);
|
|
||||||
}
|
|
||||||
return ERR_VAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send data over a UDP or RAW netconn (that is already connected).
|
|
||||||
*
|
|
||||||
* @param conn the UDP or RAW netconn over which to send data
|
|
||||||
* @param buf a netbuf containing the data to send
|
|
||||||
* @return ERR_OK if data was sent, any other err_t on error
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_send(struct netconn *conn, struct netbuf *buf)
|
|
||||||
{
|
|
||||||
struct api_msg msg;
|
|
||||||
err_t err;
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_send: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
|
|
||||||
LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_send: sending %"U16_F" bytes\n", buf->p->tot_len));
|
|
||||||
msg.function = do_send;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
msg.msg.msg.b = buf;
|
|
||||||
err = TCPIP_APIMSG(&msg);
|
|
||||||
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, err);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send data over a TCP netconn.
|
|
||||||
*
|
|
||||||
* @param conn the TCP netconn over which to send data
|
|
||||||
* @param dataptr pointer to the application buffer that contains the data to send
|
|
||||||
* @param size size of the application data to send
|
|
||||||
* @param apiflags combination of following flags :
|
|
||||||
* - NETCONN_COPY: data will be copied into memory belonging to the stack
|
|
||||||
* - NETCONN_MORE: for TCP connection, PSH flag will be set on last segment sent
|
|
||||||
* - NETCONN_DONTBLOCK: only write the data if all dat can be written at once
|
|
||||||
* @param bytes_written pointer to a location that receives the number of written bytes
|
|
||||||
* @return ERR_OK if data was sent, any other err_t on error
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size,
|
|
||||||
u8_t apiflags, size_t *bytes_written)
|
|
||||||
{
|
|
||||||
struct api_msg msg;
|
|
||||||
err_t err;
|
|
||||||
u8_t dontblock;
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_write: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
LWIP_ERROR("netconn_write: invalid conn->type", (conn->type == NETCONN_TCP), return ERR_VAL;);
|
|
||||||
if (size == 0) {
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK);
|
|
||||||
if (dontblock && !bytes_written) {
|
|
||||||
/* This implies netconn_write() cannot be used for non-blocking send, since
|
|
||||||
it has no way to return the number of bytes written. */
|
|
||||||
return ERR_VAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* non-blocking write sends as much */
|
|
||||||
msg.function = do_write;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
msg.msg.msg.w.dataptr = dataptr;
|
|
||||||
msg.msg.msg.w.apiflags = apiflags;
|
|
||||||
msg.msg.msg.w.len = size;
|
|
||||||
#if LWIP_SO_SNDTIMEO
|
|
||||||
if (conn->send_timeout != 0) {
|
|
||||||
/* get the time we started, which is later compared to
|
|
||||||
sys_now() + conn->send_timeout */
|
|
||||||
msg.msg.msg.w.time_started = sys_now();
|
|
||||||
} else {
|
|
||||||
msg.msg.msg.w.time_started = 0;
|
|
||||||
}
|
|
||||||
#endif /* LWIP_SO_SNDTIMEO */
|
|
||||||
|
|
||||||
/* For locking the core: this _can_ be delayed on low memory/low send buffer,
|
|
||||||
but if it is, this is done inside api_msg.c:do_write(), so we can use the
|
|
||||||
non-blocking version here. */
|
|
||||||
err = TCPIP_APIMSG(&msg);
|
|
||||||
if ((err == ERR_OK) && (bytes_written != NULL)) {
|
|
||||||
if (dontblock
|
|
||||||
#if LWIP_SO_SNDTIMEO
|
|
||||||
|| (conn->send_timeout != 0)
|
|
||||||
#endif /* LWIP_SO_SNDTIMEO */
|
|
||||||
) {
|
|
||||||
/* nonblocking write: maybe the data has been sent partly */
|
|
||||||
*bytes_written = msg.msg.msg.w.len;
|
|
||||||
} else {
|
|
||||||
/* blocking call succeeded: all data has been sent if it */
|
|
||||||
*bytes_written = size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, err);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close ot shutdown a TCP netconn (doesn't delete it).
|
|
||||||
*
|
|
||||||
* @param conn the TCP netconn to close or shutdown
|
|
||||||
* @param how fully close or only shutdown one side?
|
|
||||||
* @return ERR_OK if the netconn was closed, any other err_t on error
|
|
||||||
*/
|
|
||||||
static err_t
|
|
||||||
netconn_close_shutdown(struct netconn *conn, u8_t how)
|
|
||||||
{
|
|
||||||
struct api_msg msg;
|
|
||||||
err_t err;
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_close: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
|
|
||||||
msg.function = do_close;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
/* shutting down both ends is the same as closing */
|
|
||||||
msg.msg.msg.sd.shut = how;
|
|
||||||
/* because of the LWIP_TCPIP_CORE_LOCKING implementation of do_close,
|
|
||||||
don't use TCPIP_APIMSG here */
|
|
||||||
err = tcpip_apimsg(&msg);
|
|
||||||
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, err);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close a TCP netconn (doesn't delete it).
|
|
||||||
*
|
|
||||||
* @param conn the TCP netconn to close
|
|
||||||
* @return ERR_OK if the netconn was closed, any other err_t on error
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_close(struct netconn *conn)
|
|
||||||
{
|
|
||||||
/* shutting down both ends is the same as closing */
|
|
||||||
return netconn_close_shutdown(conn, NETCONN_SHUT_RDWR);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shut down one or both sides of a TCP netconn (doesn't delete it).
|
|
||||||
*
|
|
||||||
* @param conn the TCP netconn to shut down
|
|
||||||
* @return ERR_OK if the netconn was closed, any other err_t on error
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx)
|
|
||||||
{
|
|
||||||
return netconn_close_shutdown(conn, (shut_rx ? NETCONN_SHUT_RD : 0) | (shut_tx ? NETCONN_SHUT_WR : 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
#if LWIP_IGMP
|
|
||||||
/**
|
|
||||||
* Join multicast groups for UDP netconns.
|
|
||||||
*
|
|
||||||
* @param conn the UDP netconn for which to change multicast addresses
|
|
||||||
* @param multiaddr IP address of the multicast group to join or leave
|
|
||||||
* @param netif_addr the IP address of the network interface on which to send
|
|
||||||
* the igmp message
|
|
||||||
* @param join_or_leave flag whether to send a join- or leave-message
|
|
||||||
* @return ERR_OK if the action was taken, any err_t on error
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_join_leave_group(struct netconn *conn,
|
|
||||||
ip_addr_t *multiaddr,
|
|
||||||
ip_addr_t *netif_addr,
|
|
||||||
enum netconn_igmp join_or_leave)
|
|
||||||
{
|
|
||||||
struct api_msg msg;
|
|
||||||
err_t err;
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_join_leave_group: invalid conn", (conn != NULL), return ERR_ARG;);
|
|
||||||
|
|
||||||
msg.function = do_join_leave_group;
|
|
||||||
msg.msg.conn = conn;
|
|
||||||
msg.msg.msg.jl.multiaddr = multiaddr;
|
|
||||||
msg.msg.msg.jl.netif_addr = netif_addr;
|
|
||||||
msg.msg.msg.jl.join_or_leave = join_or_leave;
|
|
||||||
err = TCPIP_APIMSG(&msg);
|
|
||||||
|
|
||||||
NETCONN_SET_SAFE_ERR(conn, err);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
#endif /* LWIP_IGMP */
|
|
||||||
|
|
||||||
#if LWIP_DNS
|
|
||||||
/**
|
|
||||||
* Execute a DNS query, only one IP address is returned
|
|
||||||
*
|
|
||||||
* @param name a string representation of the DNS host name to query
|
|
||||||
* @param addr a preallocated ip_addr_t where to store the resolved IP address
|
|
||||||
* @return ERR_OK: resolving succeeded
|
|
||||||
* ERR_MEM: memory error, try again later
|
|
||||||
* ERR_ARG: dns client not initialized or invalid hostname
|
|
||||||
* ERR_VAL: dns server response was invalid
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netconn_gethostbyname(const char *name, ip_addr_t *addr)
|
|
||||||
{
|
|
||||||
struct dns_api_msg msg;
|
|
||||||
err_t err;
|
|
||||||
sys_sem_t sem;
|
|
||||||
|
|
||||||
LWIP_ERROR("netconn_gethostbyname: invalid name", (name != NULL), return ERR_ARG;);
|
|
||||||
LWIP_ERROR("netconn_gethostbyname: invalid addr", (addr != NULL), return ERR_ARG;);
|
|
||||||
|
|
||||||
err = sys_sem_new(&sem, 0);
|
|
||||||
if (err != ERR_OK) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.name = name;
|
|
||||||
msg.addr = addr;
|
|
||||||
msg.err = &err;
|
|
||||||
msg.sem = &sem;
|
|
||||||
|
|
||||||
tcpip_callback(do_gethostbyname, &msg);
|
|
||||||
sys_sem_wait(&sem);
|
|
||||||
sys_sem_free(&sem);
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
#endif /* LWIP_DNS*/
|
|
||||||
|
|
||||||
#endif /* LWIP_NETCONN */
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file
|
|
||||||
* Error Management module
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|
||||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
|
||||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
|
||||||
* OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/err.h"
|
|
||||||
|
|
||||||
#ifdef LWIP_DEBUG
|
|
||||||
|
|
||||||
static const char *err_strerr[] = {
|
|
||||||
"Ok.", /* ERR_OK 0 */
|
|
||||||
"Out of memory error.", /* ERR_MEM -1 */
|
|
||||||
"Buffer error.", /* ERR_BUF -2 */
|
|
||||||
"Timeout.", /* ERR_TIMEOUT -3 */
|
|
||||||
"Routing problem.", /* ERR_RTE -4 */
|
|
||||||
"Operation in progress.", /* ERR_INPROGRESS -5 */
|
|
||||||
"Illegal value.", /* ERR_VAL -6 */
|
|
||||||
"Operation would block.", /* ERR_WOULDBLOCK -7 */
|
|
||||||
"Address in use.", /* ERR_USE -8 */
|
|
||||||
"Already connected.", /* ERR_ISCONN -9 */
|
|
||||||
"Connection aborted.", /* ERR_ABRT -10 */
|
|
||||||
"Connection reset.", /* ERR_RST -11 */
|
|
||||||
"Connection closed.", /* ERR_CLSD -12 */
|
|
||||||
"Not connected.", /* ERR_CONN -13 */
|
|
||||||
"Illegal argument.", /* ERR_ARG -14 */
|
|
||||||
"Low-level netif error.", /* ERR_IF -15 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert an lwip internal error to a string representation.
|
|
||||||
*
|
|
||||||
* @param err an lwip internal err_t
|
|
||||||
* @return a string representation for err
|
|
||||||
*/
|
|
||||||
const char *
|
|
||||||
lwip_strerr(err_t err)
|
|
||||||
{
|
|
||||||
return err_strerr[-err];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* LWIP_DEBUG */
|
|
||||||
@@ -1,245 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file
|
|
||||||
* Network buffer management
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|
||||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
|
||||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
|
||||||
* OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */
|
|
||||||
|
|
||||||
#include "lwip/netbuf.h"
|
|
||||||
#include "lwip/memp.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create (allocate) and initialize a new netbuf.
|
|
||||||
* The netbuf doesn't yet contain a packet buffer!
|
|
||||||
*
|
|
||||||
* @return a pointer to a new netbuf
|
|
||||||
* NULL on lack of memory
|
|
||||||
*/
|
|
||||||
struct
|
|
||||||
netbuf *netbuf_new(void)
|
|
||||||
{
|
|
||||||
struct netbuf *buf;
|
|
||||||
|
|
||||||
buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);
|
|
||||||
if (buf != NULL) {
|
|
||||||
buf->p = NULL;
|
|
||||||
buf->ptr = NULL;
|
|
||||||
ip_addr_set_any(&buf->addr);
|
|
||||||
buf->port = 0;
|
|
||||||
#if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY
|
|
||||||
#if LWIP_CHECKSUM_ON_COPY
|
|
||||||
buf->flags = 0;
|
|
||||||
#endif /* LWIP_CHECKSUM_ON_COPY */
|
|
||||||
buf->toport_chksum = 0;
|
|
||||||
#if LWIP_NETBUF_RECVINFO
|
|
||||||
ip_addr_set_any(&buf->toaddr);
|
|
||||||
#endif /* LWIP_NETBUF_RECVINFO */
|
|
||||||
#endif /* LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY */
|
|
||||||
return buf;
|
|
||||||
} else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deallocate a netbuf allocated by netbuf_new().
|
|
||||||
*
|
|
||||||
* @param buf pointer to a netbuf allocated by netbuf_new()
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
netbuf_delete(struct netbuf *buf)
|
|
||||||
{
|
|
||||||
if (buf != NULL) {
|
|
||||||
if (buf->p != NULL) {
|
|
||||||
pbuf_free(buf->p);
|
|
||||||
buf->p = buf->ptr = NULL;
|
|
||||||
}
|
|
||||||
memp_free(MEMP_NETBUF, buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocate memory for a packet buffer for a given netbuf.
|
|
||||||
*
|
|
||||||
* @param buf the netbuf for which to allocate a packet buffer
|
|
||||||
* @param size the size of the packet buffer to allocate
|
|
||||||
* @return pointer to the allocated memory
|
|
||||||
* NULL if no memory could be allocated
|
|
||||||
*/
|
|
||||||
void *
|
|
||||||
netbuf_alloc(struct netbuf *buf, u16_t size)
|
|
||||||
{
|
|
||||||
LWIP_ERROR("netbuf_alloc: invalid buf", (buf != NULL), return NULL;);
|
|
||||||
|
|
||||||
/* Deallocate any previously allocated memory. */
|
|
||||||
if (buf->p != NULL) {
|
|
||||||
pbuf_free(buf->p);
|
|
||||||
}
|
|
||||||
buf->p = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM);
|
|
||||||
if (buf->p == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
LWIP_ASSERT("check that first pbuf can hold size",
|
|
||||||
(buf->p->len >= size));
|
|
||||||
buf->ptr = buf->p;
|
|
||||||
return buf->p->payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Free the packet buffer included in a netbuf
|
|
||||||
*
|
|
||||||
* @param buf pointer to the netbuf which contains the packet buffer to free
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
netbuf_free(struct netbuf *buf)
|
|
||||||
{
|
|
||||||
LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return;);
|
|
||||||
if (buf->p != NULL) {
|
|
||||||
pbuf_free(buf->p);
|
|
||||||
}
|
|
||||||
buf->p = buf->ptr = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Let a netbuf reference existing (non-volatile) data.
|
|
||||||
*
|
|
||||||
* @param buf netbuf which should reference the data
|
|
||||||
* @param dataptr pointer to the data to reference
|
|
||||||
* @param size size of the data
|
|
||||||
* @return ERR_OK if data is referenced
|
|
||||||
* ERR_MEM if data couldn't be referenced due to lack of memory
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size)
|
|
||||||
{
|
|
||||||
LWIP_ERROR("netbuf_ref: invalid buf", (buf != NULL), return ERR_ARG;);
|
|
||||||
if (buf->p != NULL) {
|
|
||||||
pbuf_free(buf->p);
|
|
||||||
}
|
|
||||||
buf->p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF);
|
|
||||||
if (buf->p == NULL) {
|
|
||||||
buf->ptr = NULL;
|
|
||||||
return ERR_MEM;
|
|
||||||
}
|
|
||||||
buf->p->payload = (void*)dataptr;
|
|
||||||
buf->p->len = buf->p->tot_len = size;
|
|
||||||
buf->ptr = buf->p;
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Chain one netbuf to another (@see pbuf_chain)
|
|
||||||
*
|
|
||||||
* @param head the first netbuf
|
|
||||||
* @param tail netbuf to chain after head, freed by this function, may not be reference after returning
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
netbuf_chain(struct netbuf *head, struct netbuf *tail)
|
|
||||||
{
|
|
||||||
LWIP_ERROR("netbuf_ref: invalid head", (head != NULL), return;);
|
|
||||||
LWIP_ERROR("netbuf_chain: invalid tail", (tail != NULL), return;);
|
|
||||||
pbuf_cat(head->p, tail->p);
|
|
||||||
head->ptr = head->p;
|
|
||||||
memp_free(MEMP_NETBUF, tail);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the data pointer and length of the data inside a netbuf.
|
|
||||||
*
|
|
||||||
* @param buf netbuf to get the data from
|
|
||||||
* @param dataptr pointer to a void pointer where to store the data pointer
|
|
||||||
* @param len pointer to an u16_t where the length of the data is stored
|
|
||||||
* @return ERR_OK if the information was retreived,
|
|
||||||
* ERR_BUF on error.
|
|
||||||
*/
|
|
||||||
err_t
|
|
||||||
netbuf_data(struct netbuf *buf, void **dataptr, u16_t *len)
|
|
||||||
{
|
|
||||||
LWIP_ERROR("netbuf_data: invalid buf", (buf != NULL), return ERR_ARG;);
|
|
||||||
LWIP_ERROR("netbuf_data: invalid dataptr", (dataptr != NULL), return ERR_ARG;);
|
|
||||||
LWIP_ERROR("netbuf_data: invalid len", (len != NULL), return ERR_ARG;);
|
|
||||||
|
|
||||||
if (buf->ptr == NULL) {
|
|
||||||
return ERR_BUF;
|
|
||||||
}
|
|
||||||
*dataptr = buf->ptr->payload;
|
|
||||||
*len = buf->ptr->len;
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Move the current data pointer of a packet buffer contained in a netbuf
|
|
||||||
* to the next part.
|
|
||||||
* The packet buffer itself is not modified.
|
|
||||||
*
|
|
||||||
* @param buf the netbuf to modify
|
|
||||||
* @return -1 if there is no next part
|
|
||||||
* 1 if moved to the next part but now there is no next part
|
|
||||||
* 0 if moved to the next part and there are still more parts
|
|
||||||
*/
|
|
||||||
s8_t
|
|
||||||
netbuf_next(struct netbuf *buf)
|
|
||||||
{
|
|
||||||
LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return -1;);
|
|
||||||
if (buf->ptr->next == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
buf->ptr = buf->ptr->next;
|
|
||||||
if (buf->ptr->next == NULL) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Move the current data pointer of a packet buffer contained in a netbuf
|
|
||||||
* to the beginning of the packet.
|
|
||||||
* The packet buffer itself is not modified.
|
|
||||||
*
|
|
||||||
* @param buf the netbuf to modify
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
netbuf_first(struct netbuf *buf)
|
|
||||||
{
|
|
||||||
LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return;);
|
|
||||||
buf->ptr = buf->p;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* LWIP_NETCONN */
|
|
||||||
@@ -1,353 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file
|
|
||||||
* API functions for name resolving
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|
||||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
|
||||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
|
||||||
* OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Simon Goldschmidt
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/netdb.h"
|
|
||||||
|
|
||||||
#if LWIP_DNS && LWIP_SOCKET
|
|
||||||
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/memp.h"
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
#include "lwip/api.h"
|
|
||||||
#include "lwip/dns.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/** helper struct for gethostbyname_r to access the char* buffer */
|
|
||||||
struct gethostbyname_r_helper {
|
|
||||||
ip_addr_t *addr_list[2];
|
|
||||||
ip_addr_t addr;
|
|
||||||
char *aliases;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** h_errno is exported in netdb.h for access by applications. */
|
|
||||||
#if LWIP_DNS_API_DECLARE_H_ERRNO
|
|
||||||
int h_errno;
|
|
||||||
#endif /* LWIP_DNS_API_DECLARE_H_ERRNO */
|
|
||||||
|
|
||||||
/** define "hostent" variables storage: 0 if we use a static (but unprotected)
|
|
||||||
* set of variables for lwip_gethostbyname, 1 if we use a local storage */
|
|
||||||
#ifndef LWIP_DNS_API_HOSTENT_STORAGE
|
|
||||||
#define LWIP_DNS_API_HOSTENT_STORAGE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** define "hostent" variables storage */
|
|
||||||
#if LWIP_DNS_API_HOSTENT_STORAGE
|
|
||||||
#define HOSTENT_STORAGE
|
|
||||||
#else
|
|
||||||
#define HOSTENT_STORAGE static
|
|
||||||
#endif /* LWIP_DNS_API_STATIC_HOSTENT */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an entry containing addresses of address family AF_INET
|
|
||||||
* for the host with name name.
|
|
||||||
* Due to dns_gethostbyname limitations, only one address is returned.
|
|
||||||
*
|
|
||||||
* @param name the hostname to resolve
|
|
||||||
* @return an entry containing addresses of address family AF_INET
|
|
||||||
* for the host with name name
|
|
||||||
*/
|
|
||||||
struct hostent*
|
|
||||||
lwip_gethostbyname(const char *name)
|
|
||||||
{
|
|
||||||
err_t err;
|
|
||||||
ip_addr_t addr;
|
|
||||||
|
|
||||||
/* buffer variables for lwip_gethostbyname() */
|
|
||||||
HOSTENT_STORAGE struct hostent s_hostent;
|
|
||||||
HOSTENT_STORAGE char *s_aliases;
|
|
||||||
HOSTENT_STORAGE ip_addr_t s_hostent_addr;
|
|
||||||
HOSTENT_STORAGE ip_addr_t *s_phostent_addr[2];
|
|
||||||
|
|
||||||
/* query host IP address */
|
|
||||||
err = netconn_gethostbyname(name, &addr);
|
|
||||||
if (err != ERR_OK) {
|
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("lwip_gethostbyname(%s) failed, err=%d\n", name, err));
|
|
||||||
h_errno = HOST_NOT_FOUND;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fill hostent */
|
|
||||||
s_hostent_addr = addr;
|
|
||||||
s_phostent_addr[0] = &s_hostent_addr;
|
|
||||||
s_phostent_addr[1] = NULL;
|
|
||||||
s_hostent.h_name = (char*)name;
|
|
||||||
s_hostent.h_aliases = &s_aliases;
|
|
||||||
s_hostent.h_addrtype = AF_INET;
|
|
||||||
s_hostent.h_length = sizeof(ip_addr_t);
|
|
||||||
s_hostent.h_addr_list = (char**)&s_phostent_addr;
|
|
||||||
|
|
||||||
#if DNS_DEBUG
|
|
||||||
/* dump hostent */
|
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_name == %s\n", s_hostent.h_name));
|
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases == %p\n", s_hostent.h_aliases));
|
|
||||||
if (s_hostent.h_aliases != NULL) {
|
|
||||||
u8_t idx;
|
|
||||||
for ( idx=0; s_hostent.h_aliases[idx]; idx++) {
|
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases[%i]-> == %p\n", idx, s_hostent.h_aliases[idx]));
|
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases[%i]-> == %s\n", idx, s_hostent.h_aliases[idx]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addrtype == %d\n", s_hostent.h_addrtype));
|
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_length == %d\n", s_hostent.h_length));
|
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list == %p\n", s_hostent.h_addr_list));
|
|
||||||
if (s_hostent.h_addr_list != NULL) {
|
|
||||||
u8_t idx;
|
|
||||||
for ( idx=0; s_hostent.h_addr_list[idx]; idx++) {
|
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i] == %p\n", idx, s_hostent.h_addr_list[idx]));
|
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i]-> == %s\n", idx, ip_ntoa((ip_addr_t*)s_hostent.h_addr_list[idx])));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* DNS_DEBUG */
|
|
||||||
|
|
||||||
#if LWIP_DNS_API_HOSTENT_STORAGE
|
|
||||||
/* this function should return the "per-thread" hostent after copy from s_hostent */
|
|
||||||
return sys_thread_hostent(&s_hostent);
|
|
||||||
#else
|
|
||||||
return &s_hostent;
|
|
||||||
#endif /* LWIP_DNS_API_HOSTENT_STORAGE */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Thread-safe variant of lwip_gethostbyname: instead of using a static
|
|
||||||
* buffer, this function takes buffer and errno pointers as arguments
|
|
||||||
* and uses these for the result.
|
|
||||||
*
|
|
||||||
* @param name the hostname to resolve
|
|
||||||
* @param ret pre-allocated struct where to store the result
|
|
||||||
* @param buf pre-allocated buffer where to store additional data
|
|
||||||
* @param buflen the size of buf
|
|
||||||
* @param result pointer to a hostent pointer that is set to ret on success
|
|
||||||
* and set to zero on error
|
|
||||||
* @param h_errnop pointer to an int where to store errors (instead of modifying
|
|
||||||
* the global h_errno)
|
|
||||||
* @return 0 on success, non-zero on error, additional error information
|
|
||||||
* is stored in *h_errnop instead of h_errno to be thread-safe
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf,
|
|
||||||
size_t buflen, struct hostent **result, int *h_errnop)
|
|
||||||
{
|
|
||||||
err_t err;
|
|
||||||
struct gethostbyname_r_helper *h;
|
|
||||||
char *hostname;
|
|
||||||
size_t namelen;
|
|
||||||
int lh_errno;
|
|
||||||
|
|
||||||
if (h_errnop == NULL) {
|
|
||||||
/* ensure h_errnop is never NULL */
|
|
||||||
h_errnop = &lh_errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result == NULL) {
|
|
||||||
/* not all arguments given */
|
|
||||||
*h_errnop = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* first thing to do: set *result to nothing */
|
|
||||||
*result = NULL;
|
|
||||||
if ((name == NULL) || (ret == NULL) || (buf == NULL)) {
|
|
||||||
/* not all arguments given */
|
|
||||||
*h_errnop = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
namelen = strlen(name);
|
|
||||||
if (buflen < (sizeof(struct gethostbyname_r_helper) + namelen + 1 + (MEM_ALIGNMENT - 1))) {
|
|
||||||
/* buf can't hold the data needed + a copy of name */
|
|
||||||
*h_errnop = ERANGE;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
h = (struct gethostbyname_r_helper*)LWIP_MEM_ALIGN(buf);
|
|
||||||
hostname = ((char*)h) + sizeof(struct gethostbyname_r_helper);
|
|
||||||
|
|
||||||
/* query host IP address */
|
|
||||||
err = netconn_gethostbyname(name, &h->addr);
|
|
||||||
if (err != ERR_OK) {
|
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("lwip_gethostbyname(%s) failed, err=%d\n", name, err));
|
|
||||||
*h_errnop = HOST_NOT_FOUND;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* copy the hostname into buf */
|
|
||||||
MEMCPY(hostname, name, namelen);
|
|
||||||
hostname[namelen] = 0;
|
|
||||||
|
|
||||||
/* fill hostent */
|
|
||||||
h->addr_list[0] = &h->addr;
|
|
||||||
h->addr_list[1] = NULL;
|
|
||||||
h->aliases = NULL;
|
|
||||||
ret->h_name = hostname;
|
|
||||||
ret->h_aliases = &h->aliases;
|
|
||||||
ret->h_addrtype = AF_INET;
|
|
||||||
ret->h_length = sizeof(ip_addr_t);
|
|
||||||
ret->h_addr_list = (char**)&h->addr_list;
|
|
||||||
|
|
||||||
/* set result != NULL */
|
|
||||||
*result = ret;
|
|
||||||
|
|
||||||
/* return success */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Frees one or more addrinfo structures returned by getaddrinfo(), along with
|
|
||||||
* any additional storage associated with those structures. If the ai_next field
|
|
||||||
* of the structure is not null, the entire list of structures is freed.
|
|
||||||
*
|
|
||||||
* @param ai struct addrinfo to free
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
lwip_freeaddrinfo(struct addrinfo *ai)
|
|
||||||
{
|
|
||||||
struct addrinfo *next;
|
|
||||||
|
|
||||||
while (ai != NULL) {
|
|
||||||
next = ai->ai_next;
|
|
||||||
memp_free(MEMP_NETDB, ai);
|
|
||||||
ai = next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Translates the name of a service location (for example, a host name) and/or
|
|
||||||
* a service name and returns a set of socket addresses and associated
|
|
||||||
* information to be used in creating a socket with which to address the
|
|
||||||
* specified service.
|
|
||||||
* Memory for the result is allocated internally and must be freed by calling
|
|
||||||
* lwip_freeaddrinfo()!
|
|
||||||
*
|
|
||||||
* Due to a limitation in dns_gethostbyname, only the first address of a
|
|
||||||
* host is returned.
|
|
||||||
* Also, service names are not supported (only port numbers)!
|
|
||||||
*
|
|
||||||
* @param nodename descriptive name or address string of the host
|
|
||||||
* (may be NULL -> local address)
|
|
||||||
* @param servname port number as string of NULL
|
|
||||||
* @param hints structure containing input values that set socktype and protocol
|
|
||||||
* @param res pointer to a pointer where to store the result (set to NULL on failure)
|
|
||||||
* @return 0 on success, non-zero on failure
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
lwip_getaddrinfo(const char *nodename, const char *servname,
|
|
||||||
const struct addrinfo *hints, struct addrinfo **res)
|
|
||||||
{
|
|
||||||
err_t err;
|
|
||||||
ip_addr_t addr;
|
|
||||||
struct addrinfo *ai;
|
|
||||||
struct sockaddr_in *sa = NULL;
|
|
||||||
int port_nr = 0;
|
|
||||||
size_t total_size;
|
|
||||||
size_t namelen = 0;
|
|
||||||
|
|
||||||
if (res == NULL) {
|
|
||||||
return EAI_FAIL;
|
|
||||||
}
|
|
||||||
*res = NULL;
|
|
||||||
if ((nodename == NULL) && (servname == NULL)) {
|
|
||||||
return EAI_NONAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (servname != NULL) {
|
|
||||||
/* service name specified: convert to port number
|
|
||||||
* @todo?: currently, only ASCII integers (port numbers) are supported! */
|
|
||||||
port_nr = atoi(servname);
|
|
||||||
if ((port_nr <= 0) || (port_nr > 0xffff)) {
|
|
||||||
return EAI_SERVICE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nodename != NULL) {
|
|
||||||
/* service location specified, try to resolve */
|
|
||||||
err = netconn_gethostbyname(nodename, &addr);
|
|
||||||
if (err != ERR_OK) {
|
|
||||||
return EAI_FAIL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* service location specified, use loopback address */
|
|
||||||
ip_addr_set_loopback(&addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
total_size = sizeof(struct addrinfo) + sizeof(struct sockaddr_in);
|
|
||||||
if (nodename != NULL) {
|
|
||||||
namelen = strlen(nodename);
|
|
||||||
LWIP_ASSERT("namelen is too long", (namelen + 1) <= (mem_size_t)-1);
|
|
||||||
total_size += namelen + 1;
|
|
||||||
}
|
|
||||||
/* If this fails, please report to lwip-devel! :-) */
|
|
||||||
LWIP_ASSERT("total_size <= NETDB_ELEM_SIZE: please report this!",
|
|
||||||
total_size <= NETDB_ELEM_SIZE);
|
|
||||||
ai = (struct addrinfo *)memp_malloc(MEMP_NETDB);
|
|
||||||
if (ai == NULL) {
|
|
||||||
goto memerr;
|
|
||||||
}
|
|
||||||
memset(ai, 0, total_size);
|
|
||||||
sa = (struct sockaddr_in*)((u8_t*)ai + sizeof(struct addrinfo));
|
|
||||||
/* set up sockaddr */
|
|
||||||
inet_addr_from_ipaddr(&sa->sin_addr, &addr);
|
|
||||||
sa->sin_family = AF_INET;
|
|
||||||
sa->sin_len = sizeof(struct sockaddr_in);
|
|
||||||
sa->sin_port = htons((u16_t)port_nr);
|
|
||||||
|
|
||||||
/* set up addrinfo */
|
|
||||||
ai->ai_family = AF_INET;
|
|
||||||
if (hints != NULL) {
|
|
||||||
/* copy socktype & protocol from hints if specified */
|
|
||||||
ai->ai_socktype = hints->ai_socktype;
|
|
||||||
ai->ai_protocol = hints->ai_protocol;
|
|
||||||
}
|
|
||||||
if (nodename != NULL) {
|
|
||||||
/* copy nodename to canonname if specified */
|
|
||||||
ai->ai_canonname = ((char*)ai + sizeof(struct addrinfo) + sizeof(struct sockaddr_in));
|
|
||||||
MEMCPY(ai->ai_canonname, nodename, namelen);
|
|
||||||
ai->ai_canonname[namelen] = 0;
|
|
||||||
}
|
|
||||||
ai->ai_addrlen = sizeof(struct sockaddr_in);
|
|
||||||
ai->ai_addr = (struct sockaddr*)sa;
|
|
||||||
|
|
||||||
*res = ai;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
memerr:
|
|
||||||
if (ai != NULL) {
|
|
||||||
memp_free(MEMP_NETDB, ai);
|
|
||||||
}
|
|
||||||
return EAI_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* LWIP_DNS && LWIP_SOCKET */
|
|
||||||