mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2024-11-22 17:39:53 +03:00
Numerous fixes. First working version.
This commit is contained in:
parent
f2fee4d32c
commit
a2a6502ab9
@ -1350,9 +1350,8 @@ void IPCProcessL3EventsEx(IPC *ipc, UINT64 now)
|
|||||||
if (Cmp(dest_mac, ipc->MacAddress, 6) == 0 || IsMacBroadcast(dest_mac) || IsMacMulticast(dest_mac))
|
if (Cmp(dest_mac, ipc->MacAddress, 6) == 0 || IsMacBroadcast(dest_mac) || IsMacMulticast(dest_mac))
|
||||||
{
|
{
|
||||||
// If the source MAC address is itselves or invalid address, ignore the packet
|
// If the source MAC address is itselves or invalid address, ignore the packet
|
||||||
if (Cmp(src_mac, ipc->MacAddress, 6) != 0 && !IsMacUnicast(src_mac))
|
if (Cmp(src_mac, ipc->MacAddress, 6) != 0 && IsMacUnicast(src_mac))
|
||||||
{
|
{
|
||||||
Debug("Received packed for L3 parsing\n");
|
|
||||||
if (protocol == MAC_PROTO_ARPV4)
|
if (protocol == MAC_PROTO_ARPV4)
|
||||||
{
|
{
|
||||||
// ARP receiving process
|
// ARP receiving process
|
||||||
@ -1360,7 +1359,6 @@ void IPCProcessL3EventsEx(IPC *ipc, UINT64 now)
|
|||||||
}
|
}
|
||||||
else if (protocol == MAC_PROTO_IPV4)
|
else if (protocol == MAC_PROTO_IPV4)
|
||||||
{
|
{
|
||||||
Debug("MAC_PROTO_IPV4\n");
|
|
||||||
// IPv4 receiving process
|
// IPv4 receiving process
|
||||||
if (b->Size >= (14 + 20))
|
if (b->Size >= (14 + 20))
|
||||||
{
|
{
|
||||||
@ -1456,9 +1454,9 @@ void IPCProcessL3EventsEx(IPC *ipc, UINT64 now)
|
|||||||
{
|
{
|
||||||
IP ip_src, ip_dst;
|
IP ip_src, ip_dst;
|
||||||
bool ndtProcessed = false;
|
bool ndtProcessed = false;
|
||||||
UINT size = p->L3.IPv6Header->PayloadLength + sizeof(IPV6_HEADER);
|
UINT size = b->Size - 14;
|
||||||
|
|
||||||
UCHAR *data = Clone(p->L3.IPv6Header, size);
|
UCHAR *data = Clone(b->Buf + 14, size);
|
||||||
|
|
||||||
IPv6AddrToIP(&ip_src, &p->IPv6HeaderPacketInfo.IPv6Header->SrcAddress);
|
IPv6AddrToIP(&ip_src, &p->IPv6HeaderPacketInfo.IPv6Header->SrcAddress);
|
||||||
IPv6AddrToIP(&ip_dst, &p->IPv6HeaderPacketInfo.IPv6Header->DestAddress);
|
IPv6AddrToIP(&ip_dst, &p->IPv6HeaderPacketInfo.IPv6Header->DestAddress);
|
||||||
@ -2177,7 +2175,7 @@ bool IPCIPv6CheckExistingLinkLocal(IPC *ipc, UINT64 eui)
|
|||||||
ZeroIP6(&i.Ip);
|
ZeroIP6(&i.Ip);
|
||||||
i.Ip.ipv6_addr[0] = 0xFE;
|
i.Ip.ipv6_addr[0] = 0xFE;
|
||||||
i.Ip.ipv6_addr[1] = 0x80;
|
i.Ip.ipv6_addr[1] = 0x80;
|
||||||
WRITE_UINT64(&i.Ip.ipv6_addr[8], &eui);
|
Copy(&i.Ip.ipv6_addr[8], &eui, sizeof(UINT64));
|
||||||
|
|
||||||
h = Search(ipc->Cedar->HubList, &t);
|
h = Search(ipc->Cedar->HubList, &t);
|
||||||
|
|
||||||
@ -2274,24 +2272,25 @@ UINT64 IPCIPv6GetServerEui(IPC *ipc)
|
|||||||
// Generate link local from client's EUI
|
// Generate link local from client's EUI
|
||||||
linkLocal.Value[0] = 0xFE;
|
linkLocal.Value[0] = 0xFE;
|
||||||
linkLocal.Value[1] = 0x80;
|
linkLocal.Value[1] = 0x80;
|
||||||
WRITE_UINT64(&linkLocal.Value[8], &ipc->IPv6ClientEUI);
|
Copy(&linkLocal.Value[8], &ipc->IPv6ClientEUI, sizeof(UINT64));
|
||||||
|
|
||||||
GetAllRouterMulticastAddress6(&destIP);
|
GetAllRouterMulticastAddress6(&destIP);
|
||||||
|
|
||||||
// Generate the MAC address from the multicast address
|
// Generate the MAC address from the multicast address
|
||||||
destMacAddress[0] = 0x33;
|
destMacAddress[0] = 0x33;
|
||||||
destMacAddress[1] = 0x33;
|
destMacAddress[1] = 0x33;
|
||||||
WRITE_UINT(&destMacAddress[2], &destIP.ipv6_addr[12]);
|
Copy(&destMacAddress[2], &destIP.ipv6_addr[12], sizeof(UINT));
|
||||||
|
|
||||||
IPToIPv6Addr(&senderV6, &senderIP);
|
IPToIPv6Addr(&senderV6, &senderIP);
|
||||||
IPToIPv6Addr(&destV6, &destIP);
|
IPToIPv6Addr(&destV6, &destIP);
|
||||||
|
|
||||||
packet = BuildICMPv6RouterSoliciation(&senderV6, &destV6, ipc->MacAddress, 0);
|
packet = BuildICMPv6RouterSoliciation(&senderV6, &destV6, ipc->MacAddress, 0);
|
||||||
|
|
||||||
|
UINT64 giveup_time = Tick64() + (UINT64)(IPC_IPV6_RA_MAX_RETRIES * IPC_IPV6_RA_INTERVAL);
|
||||||
|
|
||||||
while (LIST_NUM(ipc->IPv6RouterAdvs) == 0)
|
while (LIST_NUM(ipc->IPv6RouterAdvs) == 0)
|
||||||
{
|
{
|
||||||
UINT64 giveup_time = Tick64() + (UINT64)(IPC_IPV6_RA_MAX_RETRIES * IPC_IPV6_RA_INTERVAL);
|
UINT64 timeout_retry = Tick64() + (UINT64)IPC_IPV6_RA_INTERVAL;
|
||||||
UINT64 timeout_retry = Tick() + (UINT64)IPC_IPV6_RA_INTERVAL;
|
|
||||||
IPCIPv6SendWithDestMacAddr(ipc, packet->Buf, packet->Size, destMacAddress);
|
IPCIPv6SendWithDestMacAddr(ipc, packet->Buf, packet->Size, destMacAddress);
|
||||||
|
|
||||||
AddInterrupt(ipc->Interrupt, timeout_retry);
|
AddInterrupt(ipc->Interrupt, timeout_retry);
|
||||||
@ -2311,7 +2310,17 @@ UINT64 IPCIPv6GetServerEui(IPC *ipc)
|
|||||||
if (LIST_NUM(ipc->IPv6RouterAdvs) > 0)
|
if (LIST_NUM(ipc->IPv6RouterAdvs) > 0)
|
||||||
{
|
{
|
||||||
IPC_IPV6_ROUTER_ADVERTISEMENT *ra = LIST_DATA(ipc->IPv6RouterAdvs, 0);
|
IPC_IPV6_ROUTER_ADVERTISEMENT *ra = LIST_DATA(ipc->IPv6RouterAdvs, 0);
|
||||||
ipc->IPv6ServerEUI = READ_UINT64(&ra->RouterAddress.ipv6_addr[8]);
|
Copy(&ipc->IPv6ServerEUI, &ra->RouterAddress.ipv6_addr[8], sizeof(UINT64));
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it is still not defined, let's just generate something random
|
||||||
|
while (ipc->IPv6ServerEUI == 0)
|
||||||
|
{
|
||||||
|
ipc->IPv6ServerEUI = Rand64();
|
||||||
|
if (ipc->IPv6ClientEUI == ipc->IPv6ServerEUI)
|
||||||
|
{
|
||||||
|
ipc->IPv6ServerEUI = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ipc->IPv6ServerEUI;
|
return ipc->IPv6ServerEUI;
|
||||||
@ -2454,15 +2463,39 @@ void IPCIPv6SendUnicast(IPC *ipc, void *data, UINT size, IP *next_ip)
|
|||||||
ndtMatch = IPCNewARP(next_ip, NULL);
|
ndtMatch = IPCNewARP(next_ip, NULL);
|
||||||
Add(ipc->IPv6NeighborTable, ndtMatch);
|
Add(ipc->IPv6NeighborTable, ndtMatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ndtMatch->Resolved != true && LIST_NUM(ipc->IPv6RouterAdvs) > 0)
|
||||||
|
{
|
||||||
|
// First try to look up in router advertisements
|
||||||
|
UINT i;
|
||||||
|
for (i = 0; i < LIST_NUM(ipc->IPv6RouterAdvs); i++)
|
||||||
|
{
|
||||||
|
IPC_IPV6_ROUTER_ADVERTISEMENT *ra = LIST_DATA(ipc->IPv6RouterAdvs, i);
|
||||||
|
if (CmpIpAddr(next_ip, &ra->RouterAddress) == 0)
|
||||||
|
{
|
||||||
|
Copy(ndtMatch->MacAddress, IsMacUnicast(ra->RouterLinkLayerAddress) ? ra->RouterLinkLayerAddress : ra->RouterMacAddress, 6);
|
||||||
|
ndtMatch->Resolved = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ndtMatch->Resolved != true)
|
if (ndtMatch->Resolved != true)
|
||||||
{
|
{
|
||||||
/// TODO: check if we need to manage NDT manually from here or the client will
|
// We need to send the Neighbor Solicitation and save the packet for sending later
|
||||||
/// TODO: send Neighbor Solicitations by itself and we just proxy them
|
// Generate the MAC address from the multicast address
|
||||||
|
UCHAR destMacAddress[6];
|
||||||
|
BUF *neighborSolicit = BuildICMPv6NeighborSoliciation(&header->SrcAddress, &header->DestAddress, ipc->MacAddress, 0);
|
||||||
|
destMacAddress[0] = 0x33;
|
||||||
|
destMacAddress[1] = 0x33;
|
||||||
|
Copy(&destMacAddress[2], &next_ip->ipv6_addr[12], sizeof(UINT));
|
||||||
|
IPCIPv6SendWithDestMacAddr(ipc, neighborSolicit->Buf, neighborSolicit->Size, destMacAddress);
|
||||||
|
|
||||||
CHAR tmp[MAX_SIZE];
|
CHAR tmp[MAX_SIZE];
|
||||||
BLOCK *blk = NewBlock(data, size, 0);
|
UCHAR *copy = Clone(data, size);
|
||||||
|
BLOCK *blk = NewBlock(copy, size, 0);
|
||||||
InsertQueue(ndtMatch->PacketQueue, blk);
|
InsertQueue(ndtMatch->PacketQueue, blk);
|
||||||
IPToStr6(tmp, MAX_SIZE, next_ip);
|
IPToStr6(tmp, MAX_SIZE, next_ip);
|
||||||
Debug("We can't send the packet because we don't have IP %s in NDT! Need to send Neighbor Solicitation first... Saving for later send.\n", tmp);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,8 @@
|
|||||||
// IPv6 constants
|
// IPv6 constants
|
||||||
#define IPC_IPV6_NDT_LIFETIME (30 * 1000) // as per REACHABLE_TIME constant of RFC4861
|
#define IPC_IPV6_NDT_LIFETIME (30 * 1000) // as per REACHABLE_TIME constant of RFC4861
|
||||||
#define IPC_IPV6_NDT_GIVEUPTIME (3 * 1000) // as per MAX_MULTICAST_SOLICIT * RETRANS_TIMER constants of RFC4861
|
#define IPC_IPV6_NDT_GIVEUPTIME (3 * 1000) // as per MAX_MULTICAST_SOLICIT * RETRANS_TIMER constants of RFC4861
|
||||||
#define IPC_IPV6_RA_INTERVAL (4 * 1000) // as per RTR_SOLICITATION_INTERVAL constant of RFC4861
|
#define IPC_IPV6_RA_INTERVAL (2 * 1000) // Windows gets stuck if it is bigger
|
||||||
#define IPC_IPV6_RA_MAX_RETRIES 3 // as per MAX_RTR_SOLICITATIONS constant of RFC4861
|
#define IPC_IPV6_RA_MAX_RETRIES 2 // Windows seems to be stuck when it doesn't receive an answer in due time
|
||||||
|
|
||||||
// Protocol status
|
// Protocol status
|
||||||
#define IPC_PROTO_STATUS_CLOSED 0x0
|
#define IPC_PROTO_STATUS_CLOSED 0x0
|
||||||
|
Loading…
Reference in New Issue
Block a user