|
@@ -646,21 +646,20 @@ void WindowsEthernetTap::threadMain()
|
|
|
*
|
|
|
* Yes, you read that right.
|
|
|
*
|
|
|
- * But these networks don't usually have default routes, so what
|
|
|
- * do we do? Answer: add a fake one that's never used and goes
|
|
|
- * nowhere. But it's got to resolve to an ARP address. So why
|
|
|
- * don't we just make up one of those too?!? Shove it in there
|
|
|
- * as a permanent statuc ARP entry and now Windows will think it
|
|
|
- * has a real live default route at our bogus IP.
|
|
|
+ * The default route workaround is also known, but for this to
|
|
|
+ * work there must be a known default IP that resolves to a known
|
|
|
+ * ARP address. This works for an OpenVPN tunnel, but not here
|
|
|
+ * because this isn't a tunnel. It's a mesh. There is no "other
|
|
|
+ * end," or any other known always on IP.
|
|
|
+ *
|
|
|
+ * So let's make a fake one and shove it in there along with its
|
|
|
+ * fake static ARP entry. Also makes it instant-on and static.
|
|
|
*
|
|
|
* We'll have to see what DHCP does with this. In the future we
|
|
|
* probably will not want to do this on DHCP-enabled networks, so
|
|
|
* when we enable DHCP we will go in and yank this wacko hacko from
|
|
|
* the routing table before doing so.
|
|
|
*
|
|
|
- * But yes, this works, and it makes our networks look and behave
|
|
|
- * the way they should.
|
|
|
- *
|
|
|
* Like Jesse Pinkman would say: "YEEEEAAH BITCH!" */
|
|
|
for(int i=0;i<8;++i) { // also wait up to 8s for this, though if we got the NLM part we're probably okay
|
|
|
MIB_IPFORWARD_ROW2 nr;
|
|
@@ -669,7 +668,7 @@ void WindowsEthernetTap::threadMain()
|
|
|
nr.InterfaceLuid.Value = _deviceLuid.Value;
|
|
|
nr.DestinationPrefix.Prefix.si_family = AF_INET; // rest is left as 0.0.0.0/0
|
|
|
nr.NextHop.si_family = AF_INET;
|
|
|
- nr.NextHop.Ipv4.sin_addr.s_addr = 0x01010101; // 1.1.1.1
|
|
|
+ nr.NextHop.Ipv4.sin_addr.s_addr = htonl(0x19fffffe); // 25.255.255.254 -- unrouted IPv4 block
|
|
|
nr.Metric = 9999; // do not use as real default route
|
|
|
nr.Protocol = MIB_IPPROTO_NETMGMT;
|
|
|
DWORD result = CreateIpForwardEntry2(&nr);
|
|
@@ -677,7 +676,7 @@ void WindowsEthernetTap::threadMain()
|
|
|
MIB_IPNET_ROW2 ipnr;
|
|
|
memset(&ipnr,0,sizeof(ipnr));
|
|
|
ipnr.Address.si_family = AF_INET;
|
|
|
- ipnr.Address.Ipv4.sin_addr.s_addr = 0x01010101;
|
|
|
+ ipnr.Address.Ipv4.sin_addr.s_addr = nr.NextHop.Ipv4.sin_addr.s_addr;
|
|
|
ipnr.InterfaceLuid.Value = _deviceLuid.Value;
|
|
|
ipnr.PhysicalAddress[0] = _mac[0] ^ 0x10; // just make something up that's consistent and not part of this net
|
|
|
ipnr.PhysicalAddress[1] = 0x00;
|