1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2024-11-22 17:39:53 +03:00

Fixing most errors, the link on Windows is working and is stable

This commit is contained in:
Evengard 2020-05-12 03:30:59 +03:00
parent a2a6502ab9
commit 2cfe031398
6 changed files with 384 additions and 247 deletions

View File

@ -1428,7 +1428,7 @@ void IPCProcessL3EventsEx(IPC *ipc, UINT64 now)
} }
} }
FreePacket(pkt); FreePacketWithData(pkt);
} }
IPCAssociateOnArpTable(ipc, &ip_src, src_mac); IPCAssociateOnArpTable(ipc, &ip_src, src_mac);
@ -1438,6 +1438,10 @@ void IPCProcessL3EventsEx(IPC *ipc, UINT64 now)
// Place in the reception queue // Place in the reception queue
InsertQueue(ipc->IPv4ReceivedQueue, NewBlock(data, size, 0)); InsertQueue(ipc->IPv4ReceivedQueue, NewBlock(data, size, 0));
} }
else
{
Free(data); // We need to free the packet if we don't save it
}
} }
else else
@ -1470,9 +1474,9 @@ void IPCProcessL3EventsEx(IPC *ipc, UINT64 now)
{ {
case ICMPV6_TYPE_ROUTER_ADVERTISEMENT: case ICMPV6_TYPE_ROUTER_ADVERTISEMENT:
// We save the router advertisement data for later use // We save the router advertisement data for later use
IPCIPv6AddRouterPrefix(ipc, &p->ICMPv6HeaderPacketInfo.OptionList, src_mac, &ip_src); IPCIPv6AddRouterPrefixes(ipc, &p->ICMPv6HeaderPacketInfo.OptionList, src_mac, &ip_src);
IPCIPv6AssociateOnNDTEx(ipc, &ip_src, src_mac, true); IPCIPv6AssociateOnNDTEx(ipc, &ip_src, src_mac, true);
IPCIPv6AssociateOnNDTEx(ipc, &ip_src, &p->ICMPv6HeaderPacketInfo.OptionList.SourceLinkLayer->Address, true); IPCIPv6AssociateOnNDTEx(ipc, &ip_src, p->ICMPv6HeaderPacketInfo.OptionList.SourceLinkLayer->Address, true);
break; break;
case ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT: case ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT:
// We save the neighbor advertisements into NDT // We save the neighbor advertisements into NDT
@ -1495,6 +1499,10 @@ void IPCProcessL3EventsEx(IPC *ipc, UINT64 now)
{ {
InsertQueue(ipc->IPv6ReceivedQueue, NewBlock(data, size, 0)); InsertQueue(ipc->IPv6ReceivedQueue, NewBlock(data, size, 0));
} }
else
{
Free(data); // We need to free the packet if we don't save it
}
FreePacket(p); FreePacket(p);
} }
@ -2192,30 +2200,40 @@ bool IPCIPv6CheckExistingLinkLocal(IPC *ipc, UINT64 eui)
} }
// RA // RA
void IPCIPv6AddRouterPrefix(IPC *ipc, ICMPV6_OPTION_LIST *recvPrefix, UCHAR *macAddress, IP *ip) void IPCIPv6AddRouterPrefixes(IPC *ipc, ICMPV6_OPTION_LIST *recvPrefix, UCHAR *macAddress, IP *ip)
{ {
UINT i; UINT i, j;
bool foundPrefix = false; for (i = 0; i < ICMPV6_OPTION_PREFIXES_MAX_COUNT; i++)
for (i = 0; i < LIST_NUM(ipc->IPv6RouterAdvs); i++)
{ {
IPC_IPV6_ROUTER_ADVERTISEMENT *existingRA = LIST_DATA(ipc->IPv6RouterAdvs, i); if (recvPrefix->Prefix[i] != NULL)
if (Cmp(&recvPrefix->Prefix->Prefix, &existingRA->RoutedPrefix.ipv6_addr, sizeof(IPV6_ADDR)) == 0) {
bool foundPrefix = false;
for (j = 0; j < LIST_NUM(ipc->IPv6RouterAdvs); j++)
{
IPC_IPV6_ROUTER_ADVERTISEMENT *existingRA = LIST_DATA(ipc->IPv6RouterAdvs, j);
if (Cmp(&recvPrefix->Prefix[i]->Prefix, &existingRA->RoutedPrefix.ipv6_addr, sizeof(IPV6_ADDR)) == 0)
{
foundPrefix = true;
break;
}
}
if (!foundPrefix)
{
IPC_IPV6_ROUTER_ADVERTISEMENT *newRA = Malloc(sizeof(IPC_IPV6_ROUTER_ADVERTISEMENT));
IPv6AddrToIP(&newRA->RoutedPrefix, &recvPrefix->Prefix[i]->Prefix);
IntToSubnetMask6(&newRA->RoutedMask, recvPrefix->Prefix[i]->SubnetLength);
CopyIP(&newRA->RouterAddress, ip);
Copy(newRA->RouterMacAddress, macAddress, 6);
Copy(newRA->RouterLinkLayerAddress, recvPrefix->SourceLinkLayer->Address, 6);
Add(ipc->IPv6RouterAdvs, newRA);
}
}
else
{ {
foundPrefix = true;
break; break;
} }
} }
if (!foundPrefix)
{
IPC_IPV6_ROUTER_ADVERTISEMENT *newRA = Malloc(sizeof(IPC_IPV6_ROUTER_ADVERTISEMENT));
IPv6AddrToIP(&newRA->RoutedPrefix, &recvPrefix->Prefix->Prefix);
IntToSubnetMask6(&newRA->RoutedMask, recvPrefix->Prefix->SubnetLength);
CopyIP(&newRA->RouterAddress, ip);
Copy(newRA->RouterMacAddress, macAddress, 6);
Copy(newRA->RouterLinkLayerAddress, recvPrefix->SourceLinkLayer->Address, 6);
Add(ipc->IPv6RouterAdvs, newRA);
}
} }
bool IPCIPv6CheckUnicastFromRouterPrefix(IPC *ipc, IP *ip, IPC_IPV6_ROUTER_ADVERTISEMENT *matchedRA) bool IPCIPv6CheckUnicastFromRouterPrefix(IPC *ipc, IP *ip, IPC_IPV6_ROUTER_ADVERTISEMENT *matchedRA)
@ -2287,11 +2305,16 @@ UINT64 IPCIPv6GetServerEui(IPC *ipc)
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); UINT64 giveup_time = Tick64() + (UINT64)(IPC_IPV6_RA_MAX_RETRIES * IPC_IPV6_RA_INTERVAL);
UINT64 timeout_retry = 0;
while (LIST_NUM(ipc->IPv6RouterAdvs) == 0) while (LIST_NUM(ipc->IPv6RouterAdvs) == 0)
{ {
UINT64 timeout_retry = Tick64() + (UINT64)IPC_IPV6_RA_INTERVAL; UINT64 now = Tick64();
IPCIPv6SendWithDestMacAddr(ipc, packet->Buf, packet->Size, destMacAddress); if (now >= timeout_retry)
{
timeout_retry = now + (UINT64)IPC_IPV6_RA_INTERVAL;
IPCIPv6SendWithDestMacAddr(ipc, packet->Buf, packet->Size, destMacAddress);
}
AddInterrupt(ipc->Interrupt, timeout_retry); AddInterrupt(ipc->Interrupt, timeout_retry);
@ -2304,6 +2327,8 @@ UINT64 IPCIPv6GetServerEui(IPC *ipc)
// The processing should populate the received RAs by itself // The processing should populate the received RAs by itself
IPCProcessL3Events(ipc); IPCProcessL3Events(ipc);
} }
FreeBuf(packet);
} }
// Populating the IPv6 Server EUI for IPV6CP // Populating the IPv6 Server EUI for IPV6CP
@ -2379,6 +2404,10 @@ void IPCIPv6Send(IPC *ipc, void *data, UINT size)
void IPCIPv6SendWithDestMacAddr(IPC *ipc, void *data, UINT size, UCHAR *dest_mac_addr) void IPCIPv6SendWithDestMacAddr(IPC *ipc, void *data, UINT size, UCHAR *dest_mac_addr)
{ {
UCHAR tmp[1514]; UCHAR tmp[1514];
IPV6_HEADER *header = data;
// Validate arguments // Validate arguments
if (ipc == NULL || data == NULL || size < 40 || size > 1500 || dest_mac_addr == NULL) if (ipc == NULL || data == NULL || size < 40 || size > 1500 || dest_mac_addr == NULL)
{ {
@ -2397,6 +2426,60 @@ void IPCIPv6SendWithDestMacAddr(IPC *ipc, void *data, UINT size, UCHAR *dest_mac
// Data // Data
Copy(tmp + 14, data, size); Copy(tmp + 14, data, size);
// Parse the packet for ND ICMPv6 fixup
if (header->NextHeader == IP_PROTO_ICMPV6)
{
PKT *p = ParsePacketUpToICMPv6(tmp, size + 14);
if (p != NULL)
{
ICMPV6_OPTION_LINK_LAYER linkLayer;
BUF *buf;
BUF *optBuf;
BUF *packet;
// We need to rebuild the packet to
switch (p->ICMPv6HeaderPacketInfo.Type)
{
case ICMPV6_TYPE_NEIGHBOR_SOLICIATION:
if (p->ICMPv6HeaderPacketInfo.OptionList.SourceLinkLayer == NULL)
{
p->ICMPv6HeaderPacketInfo.OptionList.SourceLinkLayer = &linkLayer;
}
Copy(p->ICMPv6HeaderPacketInfo.OptionList.SourceLinkLayer->Address, ipc->MacAddress, 6);
case ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT:
if (p->ICMPv6HeaderPacketInfo.OptionList.TargetLinkLayer == NULL)
{
p->ICMPv6HeaderPacketInfo.OptionList.TargetLinkLayer = &linkLayer;
}
Copy(p->ICMPv6HeaderPacketInfo.OptionList.TargetLinkLayer->Address, ipc->MacAddress, 6);
}
switch (p->ICMPv6HeaderPacketInfo.Type)
{
case ICMPV6_TYPE_NEIGHBOR_SOLICIATION:
case ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT:
optBuf = BuildICMPv6Options(&p->ICMPv6HeaderPacketInfo.OptionList);
buf = NewBuf();
WriteBuf(buf, p->ICMPv6HeaderPacketInfo.Headers.HeaderPointer,
p->ICMPv6HeaderPacketInfo.Type == ICMPV6_TYPE_NEIGHBOR_SOLICIATION ? sizeof(ICMPV6_NEIGHBOR_SOLICIATION_HEADER) : sizeof(ICMPV6_NEIGHBOR_ADVERTISEMENT_HEADER));
WriteBufBuf(buf, optBuf);
packet = BuildICMPv6(&p->IPv6HeaderPacketInfo.IPv6Header->SrcAddress,
&p->IPv6HeaderPacketInfo.IPv6Header->DestAddress,
p->IPv6HeaderPacketInfo.IPv6Header->HopLimit,
p->ICMPv6HeaderPacketInfo.Type,
p->ICMPv6HeaderPacketInfo.Code,
buf->Buf,
buf->Size,
0);
Copy(tmp + 14, packet->Buf, packet->Size);
size = packet->Size;
FreeBuf(optBuf);
FreeBuf(buf);
FreeBuf(packet);
break;
}
}
FreePacket(p);
}
// Send // Send
IPCSendL2(ipc, tmp, size + 14); IPCSendL2(ipc, tmp, size + 14);
} }
@ -2484,13 +2567,24 @@ void IPCIPv6SendUnicast(IPC *ipc, void *data, UINT size, IP *next_ip)
{ {
// We need to send the Neighbor Solicitation and save the packet for sending later // We need to send the Neighbor Solicitation and save the packet for sending later
// Generate the MAC address from the multicast address // Generate the MAC address from the multicast address
BUF *neighborSolicit;
UCHAR destMacAddress[6]; UCHAR destMacAddress[6];
BUF *neighborSolicit = BuildICMPv6NeighborSoliciation(&header->SrcAddress, &header->DestAddress, ipc->MacAddress, 0); IPV6_ADDR solicitAddress;
Zero(&solicitAddress, sizeof(IPV6_ADDR));
Copy(&solicitAddress.Value[13], &header->DestAddress.Value[13], 3);
solicitAddress.Value[0] = 0xFF;
solicitAddress.Value[1] = 0x02;
solicitAddress.Value[11] = 0x01;
solicitAddress.Value[12] = 0xFF;
neighborSolicit = BuildICMPv6NeighborSoliciation(&header->SrcAddress, &solicitAddress, ipc->MacAddress, 0);
destMacAddress[0] = 0x33; destMacAddress[0] = 0x33;
destMacAddress[1] = 0x33; destMacAddress[1] = 0x33;
Copy(&destMacAddress[2], &next_ip->ipv6_addr[12], sizeof(UINT)); Copy(&destMacAddress[2], &solicitAddress.Value[12], sizeof(UINT));
IPCIPv6SendWithDestMacAddr(ipc, neighborSolicit->Buf, neighborSolicit->Size, destMacAddress); IPCIPv6SendWithDestMacAddr(ipc, neighborSolicit->Buf, neighborSolicit->Size, destMacAddress);
FreeBuf(neighborSolicit);
CHAR tmp[MAX_SIZE]; CHAR tmp[MAX_SIZE];
UCHAR *copy = Clone(data, size); UCHAR *copy = Clone(data, size);
BLOCK *blk = NewBlock(copy, size, 0); BLOCK *blk = NewBlock(copy, size, 0);

View File

@ -227,7 +227,7 @@ void IPCIPv6FlushNDT(IPC *ipc);
void IPCIPv6FlushNDTEx(IPC *ipc, UINT64 now); void IPCIPv6FlushNDTEx(IPC *ipc, UINT64 now);
bool IPCIPv6CheckExistingLinkLocal(IPC *ipc, UINT64 eui); bool IPCIPv6CheckExistingLinkLocal(IPC *ipc, UINT64 eui);
// RA // RA
void IPCIPv6AddRouterPrefix(IPC *ipc, ICMPV6_OPTION_LIST *recvPrefix, UCHAR *macAddress, IP *ip); void IPCIPv6AddRouterPrefixes(IPC *ipc, ICMPV6_OPTION_LIST *recvPrefix, UCHAR *macAddress, IP *ip);
bool IPCIPv6CheckUnicastFromRouterPrefix(IPC *ipc, IP *ip, IPC_IPV6_ROUTER_ADVERTISEMENT *matchedRA); bool IPCIPv6CheckUnicastFromRouterPrefix(IPC *ipc, IP *ip, IPC_IPV6_ROUTER_ADVERTISEMENT *matchedRA);
UINT64 IPCIPv6GetServerEui(IPC *ipc); UINT64 IPCIPv6GetServerEui(IPC *ipc);
// Data flow // Data flow

View File

@ -175,7 +175,7 @@ void FreeEraseFileList(LIST *o)
return; return;
} }
for (i = 0;i < LIST_NUM(o);i++) for (i = 0; i < LIST_NUM(o); i++)
{ {
ERASE_FILE *f = LIST_DATA(o, i); ERASE_FILE *f = LIST_DATA(o, i);
Free(f->FullPath); Free(f->FullPath);
@ -200,7 +200,7 @@ void EnumEraseFile(LIST *o, char *dirname)
// Enumeration // Enumeration
dir = EnumDir(dirname); dir = EnumDir(dirname);
for (i = 0;i < dir->NumFiles;i++) for (i = 0; i < dir->NumFiles; i++)
{ {
DIRENT *e = dir->File[i]; DIRENT *e = dir->File[i];
Format(tmp, sizeof(tmp), "%s/%s", dirname, e->FileName); Format(tmp, sizeof(tmp), "%s/%s", dirname, e->FileName);
@ -245,7 +245,7 @@ LIST *GenerateEraseFileList(ERASER *e)
o = NewListFast(CompareEraseFile); o = NewListFast(CompareEraseFile);
// Scan for each directory // Scan for each directory
for (i = 0;i < sizeof(delete_targets) / sizeof(delete_targets[0]);i++) for (i = 0; i < sizeof(delete_targets) / sizeof(delete_targets[0]); i++)
{ {
char dirname[MAX_PATH]; char dirname[MAX_PATH];
Format(dirname, sizeof(dirname), "%s/%s", e->DirName, delete_targets[i]); Format(dirname, sizeof(dirname), "%s/%s", e->DirName, delete_targets[i]);
@ -285,7 +285,7 @@ void EraserMain(ERASER *e)
o = GenerateEraseFileList(e); o = GenerateEraseFileList(e);
// Try to delete one by one in order from oldest file // Try to delete one by one in order from oldest file
for (i = 0;i < LIST_NUM(o);i++) for (i = 0; i < LIST_NUM(o); i++)
{ {
ERASE_FILE *f = LIST_DATA(o, i); ERASE_FILE *f = LIST_DATA(o, i);
@ -626,7 +626,7 @@ void EtherIPLog(ETHERIP_SERVER *s, char *name, ...)
IPToStr(client_ip, sizeof(client_ip), &s->ClientIP); IPToStr(client_ip, sizeof(client_ip), &s->ClientIP);
UniFormat(prefix, sizeof(prefix), _UU("LE_PREFIX"), s->Id, UniFormat(prefix, sizeof(prefix), _UU("LE_PREFIX"), s->Id,
server_ip, s->ServerPort, client_ip, s->ClientPort); server_ip, s->ServerPort, client_ip, s->ClientPort);
va_start(args, name); va_start(args, name);
UniFormatArgs(buf2, sizeof(buf2), _UU(name), args); UniFormatArgs(buf2, sizeof(buf2), _UU(name), args);
@ -671,17 +671,17 @@ void IPsecLog(IKE_SERVER *ike, IKE_CLIENT *c, IKE_SA *ike_sa, IPSECSA *ipsec_sa,
if (ipsec_sa != NULL) if (ipsec_sa != NULL)
{ {
UniFormat(prefix, sizeof(prefix), _UU("LI_PREFIX_IPSEC"), UniFormat(prefix, sizeof(prefix), _UU("LI_PREFIX_IPSEC"),
ipsec_sa->Id, c->Id, client_ip, c->ClientPort, server_ip, c->ServerPort); ipsec_sa->Id, c->Id, client_ip, c->ClientPort, server_ip, c->ServerPort);
} }
else if (ike_sa != NULL) else if (ike_sa != NULL)
{ {
UniFormat(prefix, sizeof(prefix), _UU("LI_PREFIX_IKE"), UniFormat(prefix, sizeof(prefix), _UU("LI_PREFIX_IKE"),
ike_sa->Id, c->Id, client_ip, c->ClientPort, server_ip, c->ServerPort); ike_sa->Id, c->Id, client_ip, c->ClientPort, server_ip, c->ServerPort);
} }
else else
{ {
UniFormat(prefix, sizeof(prefix), _UU("LI_PREFIX_CLIENT"), UniFormat(prefix, sizeof(prefix), _UU("LI_PREFIX_CLIENT"),
c->Id, client_ip, c->ClientPort, server_ip, c->ServerPort); c->Id, client_ip, c->ClientPort, server_ip, c->ServerPort);
} }
} }
@ -755,7 +755,7 @@ void WriteHubLog(HUB *h, wchar_t *str)
} }
if (syslog_status == SYSLOG_SERVER_AND_HUB_SECURITY_LOG if (syslog_status == SYSLOG_SERVER_AND_HUB_SECURITY_LOG
|| syslog_status == SYSLOG_SERVER_AND_HUB_ALL_LOG) || syslog_status == SYSLOG_SERVER_AND_HUB_ALL_LOG)
{ {
SiWriteSysLog(s, "SECURITY_LOG", h->Name, str); SiWriteSysLog(s, "SECURITY_LOG", h->Name, str);
} }
@ -833,7 +833,7 @@ bool PacketLog(HUB *hub, SESSION *src_session, SESSION *dest_session, PKT *packe
} }
if (memcmp(hub->HubMacAddr, packet->MacAddressSrc, 6) == 0 || if (memcmp(hub->HubMacAddr, packet->MacAddressSrc, 6) == 0 ||
memcmp(hub->HubMacAddr, packet->MacAddressDest, 6) == 0) memcmp(hub->HubMacAddr, packet->MacAddressDest, 6) == 0)
{ {
return true; return true;
} }
@ -1027,8 +1027,8 @@ UINT CalcPacketLoggingLevelEx(HUB_LOG *g, PKT *packet)
ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP]); ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP]);
if (packet->L4.TCPHeader->Flag & TCP_SYN || if (packet->L4.TCPHeader->Flag & TCP_SYN ||
packet->L4.TCPHeader->Flag & TCP_RST || packet->L4.TCPHeader->Flag & TCP_RST ||
packet->L4.TCPHeader->Flag & TCP_FIN) packet->L4.TCPHeader->Flag & TCP_FIN)
{ {
// TCP SYN LOG // TCP SYN LOG
ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]); ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]);
@ -1057,10 +1057,10 @@ UINT CalcPacketLoggingLevelEx(HUB_LOG *g, PKT *packet)
ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]); ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]);
break; break;
case L7_DNS: case L7_DNS:
// DNS request // DNS request
ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]); ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]);
break; break;
} }
break; break;
@ -1084,8 +1084,8 @@ UINT CalcPacketLoggingLevelEx(HUB_LOG *g, PKT *packet)
ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP]); ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP]);
if (packet->L4.TCPHeader->Flag & TCP_SYN || if (packet->L4.TCPHeader->Flag & TCP_SYN ||
packet->L4.TCPHeader->Flag & TCP_RST || packet->L4.TCPHeader->Flag & TCP_RST ||
packet->L4.TCPHeader->Flag & TCP_FIN) packet->L4.TCPHeader->Flag & TCP_FIN)
{ {
// TCP SYN LOG // TCP SYN LOG
ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]); ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]);
@ -1109,10 +1109,10 @@ UINT CalcPacketLoggingLevelEx(HUB_LOG *g, PKT *packet)
ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]); ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]);
break; break;
case L7_DNS: case L7_DNS:
// DNS request // DNS request
ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]); ret = MAX(ret, g->PacketLogConfig[PACKET_LOG_TCP_CONN]);
break; break;
} }
break; break;
@ -1167,12 +1167,12 @@ char *BuildHttpLogStr(HTTPLOG *h)
if (h->Port == 80) if (h->Port == 80)
{ {
Format(url, sizeof(url), "http://%s%s", Format(url, sizeof(url), "http://%s%s",
h->Hostname, h->Path); h->Hostname, h->Path);
} }
else else
{ {
Format(url, sizeof(url), "http://%s:%u%s", Format(url, sizeof(url), "http://%s:%u%s",
h->Hostname, h->Port, h->Path); h->Hostname, h->Port, h->Path);
} }
} }
else else
@ -1180,12 +1180,12 @@ char *BuildHttpLogStr(HTTPLOG *h)
if (h->Port == 443) if (h->Port == 443)
{ {
Format(url, sizeof(url), "https://%s/", Format(url, sizeof(url), "https://%s/",
h->Hostname); h->Hostname);
} }
else else
{ {
Format(url, sizeof(url), "https://%s:%u/", Format(url, sizeof(url), "https://%s:%u/",
h->Hostname, h->Port); h->Hostname, h->Port);
} }
} }
} }
@ -1251,7 +1251,7 @@ void MakeSafeLogStr(char *str)
} }
if (str[0] == 'h' && str[1] == 't' && str[2] == 't' && str[3] == 'p' && if (str[0] == 'h' && str[1] == 't' && str[2] == 't' && str[3] == 'p' &&
((str[4] == 's' && str[5] == ':') || (str[4] == ':'))) ((str[4] == 's' && str[5] == ':') || (str[4] == ':')))
{ {
is_http = true; is_http = true;
} }
@ -1259,7 +1259,7 @@ void MakeSafeLogStr(char *str)
EnPrintableAsciiStr(str, '?'); EnPrintableAsciiStr(str, '?');
len = StrLen(str); len = StrLen(str);
for (i = 0;i < len;i++) for (i = 0; i < len; i++)
{ {
if (str[i] == ',') if (str[i] == ',')
{ {
@ -1284,6 +1284,7 @@ char *PacketLogParseProc(RECORD *rec)
TOKEN_LIST *t; TOKEN_LIST *t;
char tmp[MAX_SIZE]; char tmp[MAX_SIZE];
bool tcp_conn; bool tcp_conn;
UINT i;
// Validate arguments // Validate arguments
if (rec == NULL) if (rec == NULL)
{ {
@ -1340,9 +1341,9 @@ char *PacketLogParseProc(RECORD *rec)
// ARP request packet // ARP request packet
t->Token[7] = CopyStr("Request"); t->Token[7] = CopyStr("Request");
if (Endian16(p->L3.ARPv4Header->HardwareType) == ARP_HARDWARE_TYPE_ETHERNET && if (Endian16(p->L3.ARPv4Header->HardwareType) == ARP_HARDWARE_TYPE_ETHERNET &&
p->L3.ARPv4Header->HardwareSize == 6 && p->L3.ARPv4Header->HardwareSize == 6 &&
Endian16(p->L3.ARPv4Header->ProtocolType) == MAC_PROTO_IPV4 && Endian16(p->L3.ARPv4Header->ProtocolType) == MAC_PROTO_IPV4 &&
p->L3.ARPv4Header->ProtocolSize == 4) p->L3.ARPv4Header->ProtocolSize == 4)
{ {
char src_mac[16]; char src_mac[16];
char src_ip[16]; char src_ip[16];
@ -1355,7 +1356,7 @@ char *PacketLogParseProc(RECORD *rec)
IPToStr(src_ip, sizeof(src_ip), &src_ip_st); IPToStr(src_ip, sizeof(src_ip), &src_ip_st);
IPToStr(dst_ip, sizeof(dst_ip), &dst_ip_st); IPToStr(dst_ip, sizeof(dst_ip), &dst_ip_st);
snprintf(tmp, sizeof(tmp), "Who has %s? Please Tell %s(%s)", snprintf(tmp, sizeof(tmp), "Who has %s? Please Tell %s(%s)",
dst_ip, src_mac, src_ip); dst_ip, src_mac, src_ip);
t->Token[14] = CopyStr(tmp); t->Token[14] = CopyStr(tmp);
} }
break; break;
@ -1364,9 +1365,9 @@ char *PacketLogParseProc(RECORD *rec)
// ARP response packet // ARP response packet
t->Token[7] = CopyStr("Response"); t->Token[7] = CopyStr("Response");
if (Endian16(p->L3.ARPv4Header->HardwareType) == ARP_HARDWARE_TYPE_ETHERNET && if (Endian16(p->L3.ARPv4Header->HardwareType) == ARP_HARDWARE_TYPE_ETHERNET &&
p->L3.ARPv4Header->HardwareSize == 6 && p->L3.ARPv4Header->HardwareSize == 6 &&
Endian16(p->L3.ARPv4Header->ProtocolType) == MAC_PROTO_IPV4 && Endian16(p->L3.ARPv4Header->ProtocolType) == MAC_PROTO_IPV4 &&
p->L3.ARPv4Header->ProtocolSize == 4) p->L3.ARPv4Header->ProtocolSize == 4)
{ {
char src_mac[16]; char src_mac[16];
char src_ip[16]; char src_ip[16];
@ -1379,7 +1380,7 @@ char *PacketLogParseProc(RECORD *rec)
IPToStr(src_ip, sizeof(src_ip), &src_ip_st); IPToStr(src_ip, sizeof(src_ip), &src_ip_st);
IPToStr(dst_ip, sizeof(dst_ip), &dst_ip_st); IPToStr(dst_ip, sizeof(dst_ip), &dst_ip_st);
snprintf(tmp, sizeof(tmp), "%s has %s", snprintf(tmp, sizeof(tmp), "%s has %s",
src_mac, src_ip); src_mac, src_ip);
t->Token[14] = CopyStr(tmp); t->Token[14] = CopyStr(tmp);
} }
break; break;
@ -1483,9 +1484,9 @@ char *PacketLogParseProc(RECORD *rec)
IPToStr32(ip4, sizeof(ip4), p->L7.DHCPv4Header->RelayIP); IPToStr32(ip4, sizeof(ip4), p->L7.DHCPv4Header->RelayIP);
snprintf(tmp, sizeof(tmp), snprintf(tmp, sizeof(tmp),
"TransactionId=%u ClientIP=%s YourIP=%s ServerIP=%s RelayIP=%s", "TransactionId=%u ClientIP=%s YourIP=%s ServerIP=%s RelayIP=%s",
Endian32(p->L7.DHCPv4Header->TransactionId), Endian32(p->L7.DHCPv4Header->TransactionId),
ip1, ip2, ip3, ip4); ip1, ip2, ip3, ip4);
t->Token[14] = CopyStr(tmp); t->Token[14] = CopyStr(tmp);
} }
@ -1514,26 +1515,26 @@ char *PacketLogParseProc(RECORD *rec)
{ {
Format(tmp, sizeof(tmp), "InitiatorCookie=%I64u ResponderCookie=%I64u " Format(tmp, sizeof(tmp), "InitiatorCookie=%I64u ResponderCookie=%I64u "
"Version=0x%x ExchangeType=0x%x Flag=0x%x MessageId=%u MessageSize=%u", "Version=0x%x ExchangeType=0x%x Flag=0x%x MessageId=%u MessageSize=%u",
Endian64(p->L7.IkeHeader->InitiatorCookie), Endian64(p->L7.IkeHeader->InitiatorCookie),
Endian64(p->L7.IkeHeader->ResponderCookie), Endian64(p->L7.IkeHeader->ResponderCookie),
p->L7.IkeHeader->Version, p->L7.IkeHeader->Version,
p->L7.IkeHeader->ExchangeType, p->L7.IkeHeader->ExchangeType,
p->L7.IkeHeader->Flag, p->L7.IkeHeader->Flag,
Endian32(p->L7.IkeHeader->MessageId), Endian32(p->L7.IkeHeader->MessageId),
Endian32(p->L7.IkeHeader->MessageSize)); Endian32(p->L7.IkeHeader->MessageSize));
t->Token[14] = CopyStr(tmp); t->Token[14] = CopyStr(tmp);
} }
} }
break; break;
case L7_DNS: case L7_DNS:
// DNS query // DNS query
t->Token[6] = CopyStr("DNSv4"); t->Token[6] = CopyStr("DNSv4");
t->Token[7] = CopyStr("DNS_Query"); t->Token[7] = CopyStr("DNS_Query");
t->Token[14] = CopyStr(p->DnsQueryHost); t->Token[14] = CopyStr(p->DnsQueryHost);
break; break;
default: default:
// Unknown Packet // Unknown Packet
@ -1570,145 +1571,152 @@ char *PacketLogParseProc(RECORD *rec)
switch (p->TypeL4) switch (p->TypeL4)
{ {
case L4_ICMPV6: case L4_ICMPV6:
{
char info[MAX_SIZE];
ICMPV6_HEADER_INFO *icmp = &p->ICMPv6HeaderPacketInfo;
ICMPV6_OPTION_LIST *ol = &icmp->OptionList;
Zero(info, sizeof(info));
// ICMPv6 packet
t->Token[6] = CopyStr("ICMPv6");
switch (icmp->Type)
{ {
char info[MAX_SIZE]; case ICMPV6_TYPE_ECHO_REQUEST:
ICMPV6_HEADER_INFO *icmp = &p->ICMPv6HeaderPacketInfo; // Echo request
ICMPV6_OPTION_LIST *ol = &icmp->OptionList; t->Token[7] = CopyStr("Echo Request");
snprintf(tmp, sizeof(tmp), "EchoDataSize=%u ", icmp->EchoDataSize);
StrCat(info, sizeof(info), tmp);
break;
Zero(info, sizeof(info)); case ICMPV6_TYPE_ECHO_RESPONSE:
// Echo response
t->Token[7] = CopyStr("Echo Reply");
snprintf(tmp, sizeof(tmp), "EchoDataSize=%u ", icmp->EchoDataSize);
StrCat(info, sizeof(info), tmp);
break;
// ICMPv6 packet case ICMPV6_TYPE_ROUTER_SOLICIATION:
t->Token[6] = CopyStr("ICMPv6"); {
ICMPV6_ROUTER_SOLICIATION_HEADER *h = icmp->Headers.RouterSoliciationHeader;
// Router Solicitation
t->Token[7] = CopyStr("Router Soliciation");
switch (icmp->Type) if (h != NULL)
{ {
case ICMPV6_TYPE_ECHO_REQUEST: // No additional information
// Echo request
t->Token[7] = CopyStr("Echo Request");
snprintf(tmp, sizeof(tmp), "EchoDataSize=%u ", icmp->EchoDataSize);
StrCat(info, sizeof(info), tmp);
break;
case ICMPV6_TYPE_ECHO_RESPONSE:
// Echo response
t->Token[7] = CopyStr("Echo Reply");
snprintf(tmp, sizeof(tmp), "EchoDataSize=%u ", icmp->EchoDataSize);
StrCat(info, sizeof(info), tmp);
break;
case ICMPV6_TYPE_ROUTER_SOLICIATION:
{
ICMPV6_ROUTER_SOLICIATION_HEADER *h = icmp->Headers.RouterSoliciationHeader;
// Router Solicitation
t->Token[7] = CopyStr("Router Soliciation");
if (h != NULL)
{
// No additional information
}
}
break;
case ICMPV6_TYPE_ROUTER_ADVERTISEMENT:
{
ICMPV6_ROUTER_ADVERTISEMENT_HEADER *h = icmp->Headers.RouterAdvertisementHeader;
// Router Advertisement
t->Token[7] = CopyStr("Router Advertisement");
if (h != NULL)
{
snprintf(tmp, sizeof(tmp), "CurHopLimit=%u "
"Flags=0x%02X Lifetime=%u ",
h->CurHopLimit, h->Flags, Endian16(h->Lifetime));
StrCat(info, sizeof(info), tmp);
}
}
break;
case ICMPV6_TYPE_NEIGHBOR_SOLICIATION:
{
ICMPV6_NEIGHBOR_SOLICIATION_HEADER *h = icmp->Headers.NeighborSoliciationHeader;
// Neighbor Solicitation
t->Token[7] = CopyStr("Neighbor Soliciation");
if (h != NULL)
{
char tmp2[MAX_SIZE];
IP6AddrToStr(tmp2, sizeof(tmp2), &h->TargetAddress);
snprintf(tmp, sizeof(tmp), "TargetAddress=%s ",
tmp2);
StrCat(info, sizeof(info), tmp);
}
}
break;
case ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT:
{
ICMPV6_NEIGHBOR_ADVERTISEMENT_HEADER *h = icmp->Headers.NeighborAdvertisementHeader;
// Neighbor Advertisement
t->Token[7] = CopyStr("Neighbor Advertisement");
if (h != NULL)
{
char tmp2[MAX_SIZE];
IP6AddrToStr(tmp2, sizeof(tmp2), &h->TargetAddress);
snprintf(tmp, sizeof(tmp), "TargetAddress=%s Flags=0x%02X ",
tmp2, h->Flags);
StrCat(info, sizeof(info), tmp);
}
}
break;
default:
{
snprintf(tmp, sizeof(tmp), "Type=%u", icmp->Type);
t->Token[7] = CopyStr(tmp);
}
break;
}
// Option data
if (ol->SourceLinkLayer != NULL)
{
char tmp2[MAX_SIZE];
BinToStr(tmp2, sizeof(tmp2), ol->SourceLinkLayer->Address, 6);
snprintf(tmp, sizeof(tmp), "SourceLinkLayer=%s ", tmp2);
StrCat(info, sizeof(info), tmp);
}
if (ol->TargetLinkLayer != NULL)
{
char tmp2[MAX_SIZE];
BinToStr(tmp2, sizeof(tmp2), ol->TargetLinkLayer->Address, 6);
snprintf(tmp, sizeof(tmp), "TargetLinkLayer=%s ", tmp2);
StrCat(info, sizeof(info), tmp);
}
if (ol->Prefix != NULL)
{
char tmp2[MAX_SIZE];
IP6AddrToStr(tmp2, sizeof(tmp2), &ol->Prefix->Prefix);
snprintf(tmp, sizeof(tmp), "Prefix=%s/%u PrefixFlag=0x%02X ", tmp2,
ol->Prefix->SubnetLength, ol->Prefix->Flags);
StrCat(info, sizeof(info), tmp);
}
if (ol->Mtu != NULL)
{
snprintf(tmp, sizeof(tmp), "Mtu=%u ", Endian32(ol->Mtu->Mtu));
StrCat(info, sizeof(info), tmp);
}
Trim(info);
if (IsEmptyStr(info) == false)
{
t->Token[14] = CopyStr(info);
} }
} }
break; break;
case ICMPV6_TYPE_ROUTER_ADVERTISEMENT:
{
ICMPV6_ROUTER_ADVERTISEMENT_HEADER *h = icmp->Headers.RouterAdvertisementHeader;
// Router Advertisement
t->Token[7] = CopyStr("Router Advertisement");
if (h != NULL)
{
snprintf(tmp, sizeof(tmp), "CurHopLimit=%u "
"Flags=0x%02X Lifetime=%u ",
h->CurHopLimit, h->Flags, Endian16(h->Lifetime));
StrCat(info, sizeof(info), tmp);
}
}
break;
case ICMPV6_TYPE_NEIGHBOR_SOLICIATION:
{
ICMPV6_NEIGHBOR_SOLICIATION_HEADER *h = icmp->Headers.NeighborSoliciationHeader;
// Neighbor Solicitation
t->Token[7] = CopyStr("Neighbor Soliciation");
if (h != NULL)
{
char tmp2[MAX_SIZE];
IP6AddrToStr(tmp2, sizeof(tmp2), &h->TargetAddress);
snprintf(tmp, sizeof(tmp), "TargetAddress=%s ",
tmp2);
StrCat(info, sizeof(info), tmp);
}
}
break;
case ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT:
{
ICMPV6_NEIGHBOR_ADVERTISEMENT_HEADER *h = icmp->Headers.NeighborAdvertisementHeader;
// Neighbor Advertisement
t->Token[7] = CopyStr("Neighbor Advertisement");
if (h != NULL)
{
char tmp2[MAX_SIZE];
IP6AddrToStr(tmp2, sizeof(tmp2), &h->TargetAddress);
snprintf(tmp, sizeof(tmp), "TargetAddress=%s Flags=0x%02X ",
tmp2, h->Flags);
StrCat(info, sizeof(info), tmp);
}
}
break;
default:
{
snprintf(tmp, sizeof(tmp), "Type=%u", icmp->Type);
t->Token[7] = CopyStr(tmp);
}
break;
}
// Option data
if (ol->SourceLinkLayer != NULL)
{
char tmp2[MAX_SIZE];
BinToStr(tmp2, sizeof(tmp2), ol->SourceLinkLayer->Address, 6);
snprintf(tmp, sizeof(tmp), "SourceLinkLayer=%s ", tmp2);
StrCat(info, sizeof(info), tmp);
}
if (ol->TargetLinkLayer != NULL)
{
char tmp2[MAX_SIZE];
BinToStr(tmp2, sizeof(tmp2), ol->TargetLinkLayer->Address, 6);
snprintf(tmp, sizeof(tmp), "TargetLinkLayer=%s ", tmp2);
StrCat(info, sizeof(info), tmp);
}
for (i = 0; i < ICMPV6_OPTION_PREFIXES_MAX_COUNT; i++)
{
if (ol->Prefix[i] != NULL)
{
char tmp2[MAX_SIZE];
IP6AddrToStr(tmp2, sizeof(tmp2), &ol->Prefix[i]->Prefix);
snprintf(tmp, sizeof(tmp), "Prefix=%s/%u PrefixFlag=0x%02X ", tmp2,
ol->Prefix[i]->SubnetLength, ol->Prefix[i]->Flags);
StrCat(info, sizeof(info), tmp);
}
else
{
break;
}
}
if (ol->Mtu != NULL)
{
snprintf(tmp, sizeof(tmp), "Mtu=%u ", Endian32(ol->Mtu->Mtu));
StrCat(info, sizeof(info), tmp);
}
Trim(info);
if (IsEmptyStr(info) == false)
{
t->Token[14] = CopyStr(info);
}
}
break;
case L4_TCP: case L4_TCP:
// TCP packet // TCP packet
tcp_conn = false; tcp_conn = false;
@ -1786,26 +1794,26 @@ char *PacketLogParseProc(RECORD *rec)
{ {
Format(tmp, sizeof(tmp), "InitiatorCookie=%I64u ResponderCookie=%I64u " Format(tmp, sizeof(tmp), "InitiatorCookie=%I64u ResponderCookie=%I64u "
"Version=0x%x ExchangeType=0x%x Flag=0x%x MessageId=%u MessageSize=%u", "Version=0x%x ExchangeType=0x%x Flag=0x%x MessageId=%u MessageSize=%u",
Endian64(p->L7.IkeHeader->InitiatorCookie), Endian64(p->L7.IkeHeader->InitiatorCookie),
Endian64(p->L7.IkeHeader->ResponderCookie), Endian64(p->L7.IkeHeader->ResponderCookie),
p->L7.IkeHeader->Version, p->L7.IkeHeader->Version,
p->L7.IkeHeader->ExchangeType, p->L7.IkeHeader->ExchangeType,
p->L7.IkeHeader->Flag, p->L7.IkeHeader->Flag,
Endian32(p->L7.IkeHeader->MessageId), Endian32(p->L7.IkeHeader->MessageId),
Endian32(p->L7.IkeHeader->MessageSize)); Endian32(p->L7.IkeHeader->MessageSize));
t->Token[14] = CopyStr(tmp); t->Token[14] = CopyStr(tmp);
} }
} }
break; break;
case L7_DNS: case L7_DNS:
// DNS query // DNS query
t->Token[6] = CopyStr("DNSv6"); t->Token[6] = CopyStr("DNSv6");
t->Token[7] = CopyStr("DNS_Query"); t->Token[7] = CopyStr("DNS_Query");
t->Token[14] = CopyStr(p->DnsQueryHost); t->Token[14] = CopyStr(p->DnsQueryHost);
break; break;
default: default:
t->Token[6] = CopyStr("UDPv6"); t->Token[6] = CopyStr("UDPv6");
@ -1975,7 +1983,7 @@ char *GenCsvLine(TOKEN_LIST *t)
} }
b = NewBuf(); b = NewBuf();
for (i = 0;i < t->NumTokens;i++) for (i = 0; i < t->NumTokens; i++)
{ {
if (t->Token[i] != NULL) if (t->Token[i] != NULL)
{ {
@ -2019,7 +2027,7 @@ void ReplaceForCsv(char *str)
len = StrLen(str); len = StrLen(str);
for (i = 0;i < len;i++) for (i = 0; i < len; i++)
{ {
// Convert the comma to underscore // Convert the comma to underscore
if (str[i] == ',') if (str[i] == ',')
@ -2154,7 +2162,7 @@ void MakeLogFileNameStringFromTick(LOG *g, char *str, UINT size, UINT64 tick, UI
if (g->CacheFlag) if (g->CacheFlag)
{ {
if (g->LastTick == tick && if (g->LastTick == tick &&
g->LastSwitchType == switch_type) g->LastSwitchType == switch_type)
{ {
StrCpy(str, size, g->LastStr); StrCpy(str, size, g->LastStr);
return; return;
@ -2168,12 +2176,12 @@ void MakeLogFileNameStringFromTick(LOG *g, char *str, UINT size, UINT64 tick, UI
{ {
case LOG_SWITCH_SECOND: // Secondly basis case LOG_SWITCH_SECOND: // Secondly basis
snprintf(str, size, "_%04u%02u%02u_%02u%02u%02u", snprintf(str, size, "_%04u%02u%02u_%02u%02u%02u",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
break; break;
case LOG_SWITCH_MINUTE: // Minutely basis case LOG_SWITCH_MINUTE: // Minutely basis
snprintf(str, size, "_%04u%02u%02u_%02u%02u", snprintf(str, size, "_%04u%02u%02u_%02u%02u",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute); st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute);
break; break;
case LOG_SWITCH_HOUR: // Hourly basis case LOG_SWITCH_HOUR: // Hourly basis
@ -2271,9 +2279,9 @@ bool MakeLogFileName(LOG *g, char *name, UINT size, char *dir, char *prefix, UIN
} }
snprintf(name, size, "%s%s%s%s%s.log", dir, snprintf(name, size, "%s%s%s%s%s.log", dir,
StrLen(dir) == 0 ? "" : "/", StrLen(dir) == 0 ? "" : "/",
prefix, tmp, tmp2 prefix, tmp, tmp2
); );
return ret; return ret;
} }
@ -2533,7 +2541,7 @@ static bool LogThreadWriteGeneral(LOG *log_object, BUF *buffer, IO **io, bool *l
LockLog(log_object); LockLog(log_object);
{ {
*log_date_changed = MakeLogFileName(log_object, file_name, sizeof(file_name), *log_date_changed = MakeLogFileName(log_object, file_name, sizeof(file_name),
log_object->DirName, log_object->Prefix, rec->Tick, log_object->SwitchType, log_object->CurrentLogNumber, current_logfile_datename); log_object->DirName, log_object->Prefix, rec->Tick, log_object->SwitchType, log_object->CurrentLogNumber, current_logfile_datename);
if (*log_date_changed) if (*log_date_changed)
{ {
@ -2541,12 +2549,12 @@ static bool LogThreadWriteGeneral(LOG *log_object, BUF *buffer, IO **io, bool *l
log_object->CurrentLogNumber = 0; log_object->CurrentLogNumber = 0;
MakeLogFileName(log_object, file_name, sizeof(file_name), MakeLogFileName(log_object, file_name, sizeof(file_name),
log_object->DirName, log_object->Prefix, rec->Tick, log_object->SwitchType, 0, current_logfile_datename); log_object->DirName, log_object->Prefix, rec->Tick, log_object->SwitchType, 0, current_logfile_datename);
for (i = 0;;i++) for (i = 0;; i++)
{ {
char tmp[MAX_SIZE]; char tmp[MAX_SIZE];
MakeLogFileName(log_object, tmp, sizeof(tmp), MakeLogFileName(log_object, tmp, sizeof(tmp),
log_object->DirName, log_object->Prefix, rec->Tick, log_object->SwitchType, i, current_logfile_datename); log_object->DirName, log_object->Prefix, rec->Tick, log_object->SwitchType, i, current_logfile_datename);
if (IsFileExists(tmp) == false) if (IsFileExists(tmp) == false)
{ {
@ -2564,7 +2572,7 @@ static bool LogThreadWriteGeneral(LOG *log_object, BUF *buffer, IO **io, bool *l
if (StrCmp(current_file_name, file_name) != 0) if (StrCmp(current_file_name, file_name) != 0)
{ {
// If a log file is currently opened and writing to another log // If a log file is currently opened and writing to another log
// file is needed for this time, write the contents of the // file is needed for this time, write the contents of the
//buffer and close the log file. Write the contents of the buffer //buffer and close the log file. Write the contents of the buffer
if (*io != NULL) if (*io != NULL)
{ {

View File

@ -365,7 +365,7 @@ void PPPThread(THREAD *thread, void *param)
PPPSendPacketEx(p, pp, true); PPPSendPacketEx(p, pp, true);
FreePPPPacketEx(pp, true); FreePPPPacketEx(pp, true);
Free(b); Free(b); // Not FreeBlock because freed in FreePPPPacketEx
} }
} }
else else
@ -396,7 +396,7 @@ void PPPThread(THREAD *thread, void *param)
PPPSendPacketEx(p, pp, true); PPPSendPacketEx(p, pp, true);
FreePPPPacketEx(pp, true); FreePPPPacketEx(pp, true);
Free(b); Free(b); // Not FreeBlock because freed in FreePPPPacketEx
} }
} }
else else
@ -1961,7 +1961,7 @@ bool PPPProcessIPv6CPRequestPacket(PPP_SESSION *p, PPP_PACKET *pp)
{ {
UINT64 newValue = 0; UINT64 newValue = 0;
UINT64 value = READ_UINT64(t->Data); UINT64 value = READ_UINT64(t->Data);
if (!IPCIPv6CheckExistingLinkLocal(p->Ipc, value)) if (value != 0 && !IPCIPv6CheckExistingLinkLocal(p->Ipc, value))
{ {
t->IsAccepted = true; t->IsAccepted = true;
p->Ipc->IPv6ClientEUI = value; p->Ipc->IPv6ClientEUI = value;

View File

@ -1140,6 +1140,7 @@ void BuildICMPv6OptionValue(BUF *b, UCHAR type, void *header_pointer, UINT total
BUF *BuildICMPv6Options(ICMPV6_OPTION_LIST *o) BUF *BuildICMPv6Options(ICMPV6_OPTION_LIST *o)
{ {
BUF *b; BUF *b;
UINT i;
// Validate arguments // Validate arguments
if (o == NULL) if (o == NULL)
{ {
@ -1156,9 +1157,16 @@ BUF *BuildICMPv6Options(ICMPV6_OPTION_LIST *o)
{ {
BuildICMPv6OptionValue(b, ICMPV6_OPTION_TYPE_TARGET_LINK_LAYER, o->TargetLinkLayer, sizeof(ICMPV6_OPTION_LINK_LAYER)); BuildICMPv6OptionValue(b, ICMPV6_OPTION_TYPE_TARGET_LINK_LAYER, o->TargetLinkLayer, sizeof(ICMPV6_OPTION_LINK_LAYER));
} }
if (o->Prefix != NULL) for (i = 0; i < ICMPV6_OPTION_PREFIXES_MAX_COUNT; i++)
{ {
BuildICMPv6OptionValue(b, ICMPV6_OPTION_TYPE_PREFIX, o->Prefix, sizeof(ICMPV6_OPTION_PREFIX)); if (o->Prefix[i] != NULL)
{
BuildICMPv6OptionValue(b, ICMPV6_OPTION_TYPE_PREFIX, o->Prefix[i], sizeof(ICMPV6_OPTION_PREFIX));
}
else
{
break;
}
} }
if (o->Mtu != NULL) if (o->Mtu != NULL)
{ {
@ -2402,7 +2410,15 @@ bool ParseICMPv6Options(ICMPV6_OPTION_LIST *o, UCHAR *buf, UINT size)
// Prefix Information // Prefix Information
if (header_total_size >= sizeof(ICMPV6_OPTION_PREFIX)) if (header_total_size >= sizeof(ICMPV6_OPTION_PREFIX))
{ {
o->Prefix = (ICMPV6_OPTION_PREFIX *)header_pointer; UINT i;
for (i = 0; i < ICMPV6_OPTION_PREFIXES_MAX_COUNT; i++)
{
if (o->Prefix[i] == NULL)
{
o->Prefix[i] = (ICMPV6_OPTION_PREFIX *)header_pointer;
break;
}
}
} }
else else
{ {
@ -2556,6 +2572,7 @@ bool ParseICMPv6(PKT *p, UCHAR *buf, UINT size)
// Release of the ICMPv6 options // Release of the ICMPv6 options
void FreeCloneICMPv6Options(ICMPV6_OPTION_LIST *o) void FreeCloneICMPv6Options(ICMPV6_OPTION_LIST *o)
{ {
UINT i;
// Validate arguments // Validate arguments
if (o == NULL) if (o == NULL)
{ {
@ -2564,13 +2581,19 @@ void FreeCloneICMPv6Options(ICMPV6_OPTION_LIST *o)
Free(o->SourceLinkLayer); Free(o->SourceLinkLayer);
Free(o->TargetLinkLayer); Free(o->TargetLinkLayer);
Free(o->Prefix);
for (i = 0; i < ICMPV6_OPTION_PREFIXES_MAX_COUNT; i++)
{
Free(o->Prefix[i]);
o->Prefix[i] = NULL;
}
Free(o->Mtu); Free(o->Mtu);
} }
// Clone of the ICMPv6 options // Clone of the ICMPv6 options
void CloneICMPv6Options(ICMPV6_OPTION_LIST *dst, ICMPV6_OPTION_LIST *src) void CloneICMPv6Options(ICMPV6_OPTION_LIST *dst, ICMPV6_OPTION_LIST *src)
{ {
UINT i;
// Validate arguments // Validate arguments
if (dst == NULL || src == NULL) if (dst == NULL || src == NULL)
{ {
@ -2581,7 +2604,17 @@ void CloneICMPv6Options(ICMPV6_OPTION_LIST *dst, ICMPV6_OPTION_LIST *src)
dst->SourceLinkLayer = Clone(src->SourceLinkLayer, sizeof(ICMPV6_OPTION_LINK_LAYER)); dst->SourceLinkLayer = Clone(src->SourceLinkLayer, sizeof(ICMPV6_OPTION_LINK_LAYER));
dst->TargetLinkLayer = Clone(src->TargetLinkLayer, sizeof(ICMPV6_OPTION_LINK_LAYER)); dst->TargetLinkLayer = Clone(src->TargetLinkLayer, sizeof(ICMPV6_OPTION_LINK_LAYER));
dst->Prefix = Clone(src->Prefix, sizeof(ICMPV6_OPTION_PREFIX)); for (i = 0; i < ICMPV6_OPTION_PREFIXES_MAX_COUNT; i++)
{
if (src->Prefix[i] != NULL)
{
dst->Prefix[i] = Clone(src->Prefix[i], sizeof(ICMPV6_OPTION_PREFIX));
}
else
{
break;
}
}
dst->Mtu = Clone(src->Mtu, sizeof(ICMPV6_OPTION_MTU)); dst->Mtu = Clone(src->Mtu, sizeof(ICMPV6_OPTION_MTU));
} }

View File

@ -399,12 +399,14 @@ struct ICMPV6_NEIGHBOR_ADVERTISEMENT_HEADER
#define ICMPV6_NEIGHBOR_ADVERTISEMENT_FLAG_SOLICITED 0x40 // Solicited flag #define ICMPV6_NEIGHBOR_ADVERTISEMENT_FLAG_SOLICITED 0x40 // Solicited flag
#define ICMPV6_NEIGHBOR_ADVERTISEMENT_FLAG_OVERWRITE 0x20 // Overwrite flag #define ICMPV6_NEIGHBOR_ADVERTISEMENT_FLAG_OVERWRITE 0x20 // Overwrite flag
#define ICMPV6_OPTION_PREFIXES_MAX_COUNT 10
// ICMPv6 option list // ICMPv6 option list
struct ICMPV6_OPTION_LIST struct ICMPV6_OPTION_LIST
{ {
ICMPV6_OPTION_LINK_LAYER *SourceLinkLayer; // Source link-layer address ICMPV6_OPTION_LINK_LAYER *SourceLinkLayer; // Source link-layer address
ICMPV6_OPTION_LINK_LAYER *TargetLinkLayer; // Target link-layer address ICMPV6_OPTION_LINK_LAYER *TargetLinkLayer; // Target link-layer address
ICMPV6_OPTION_PREFIX *Prefix; // Prefix Information ICMPV6_OPTION_PREFIX *Prefix[ICMPV6_OPTION_PREFIXES_MAX_COUNT]; // Prefix Information - may be multiple in one request
ICMPV6_OPTION_MTU *Mtu; // MTU ICMPV6_OPTION_MTU *Mtu; // MTU
} GCC_PACKED; } GCC_PACKED;