|
@@ -1660,13 +1660,15 @@ void HubWatchDogThread(THREAD *t, void *param)
|
|
|
o2 = NewListFast(NULL);
|
|
|
|
|
|
// Send an ARP packet
|
|
|
- LockList(hub->IpTable);
|
|
|
+ LockHashList(hub->MacHashTable);
|
|
|
{
|
|
|
num = LIST_NUM(hub->IpTable);
|
|
|
for (i = 0;i < LIST_NUM(hub->IpTable);i++)
|
|
|
{
|
|
|
IP_TABLE_ENTRY *e = LIST_DATA(hub->IpTable, i);
|
|
|
|
|
|
+ if (e == NULL) continue;
|
|
|
+
|
|
|
if ((e->UpdatedTime + (UINT64)(IP_TABLE_EXPIRE_TIME)) > Tick64())
|
|
|
{
|
|
|
if (e->MacAddress[0] != 0xff || e->MacAddress[1] != 0xff || e->MacAddress[2] != 0xff ||
|
|
@@ -1742,7 +1744,7 @@ void HubWatchDogThread(THREAD *t, void *param)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- UnlockList(hub->IpTable);
|
|
|
+ UnlockHashList(hub->MacHashTable);
|
|
|
|
|
|
if ((LIST_NUM(o) + LIST_NUM(o2)) != 0)
|
|
|
{
|
|
@@ -4120,6 +4122,17 @@ void StorePacket(HUB *hub, SESSION *s, PKT *packet)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (s != NULL)
|
|
|
+ {
|
|
|
+ if (s->EnableLightRecvFilter)
|
|
|
+ {
|
|
|
+ if (IsValidUnicastMacAddress(packet->MacAddressSrc))
|
|
|
+ {
|
|
|
+ s->LightRecvFilterMac = READ_UINT(packet->MacAddressSrc + 2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// Lock the entire MAC address table
|
|
|
LockHashList(hub->MacHashTable);
|
|
|
{
|
|
@@ -4789,6 +4802,18 @@ UPDATE_FDB:
|
|
|
|
|
|
Insert(hub->IpTable, e);
|
|
|
|
|
|
+ if (s->EnableLightRecvFilter)
|
|
|
+ {
|
|
|
+ if (s->LightRecvFilterIPv4_1 == 0)
|
|
|
+ {
|
|
|
+ s->LightRecvFilterIPv4_1 = uint_ip;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ s->LightRecvFilterIPv4_2 = uint_ip;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (0)
|
|
|
{
|
|
|
char ip_address[64];
|
|
@@ -5036,6 +5061,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
{
|
|
|
// Flooding as a broadcast packet
|
|
|
UINT current_tcp_queue_size = 0;
|
|
|
+ UINT bcast_mac_dst = READ_UINT(packet->MacAddressDest + 2);
|
|
|
|
|
|
// Take a packet log
|
|
|
if (s != NULL)
|
|
@@ -5061,9 +5087,60 @@ DISCARD_UNICAST_PACKET:
|
|
|
{
|
|
|
bool delete_default_router_in_ra = false;
|
|
|
|
|
|
+ if (dest_session->Policy != NULL && dest_session->Policy->DHCPNoServer)
|
|
|
+ {
|
|
|
+ if (packet->TypeL3 == L3_IPV4 &&
|
|
|
+ packet->TypeL4 == L4_UDP &&
|
|
|
+ packet->TypeL7 == L7_DHCPV4 &&
|
|
|
+ (packet->DhcpOpCode == DHCP_DISCOVER || packet->DhcpOpCode == DHCP_REQUEST || packet->DhcpOpCode == DHCP_RELEASE || packet->DhcpOpCode == DHCP_INFORM))
|
|
|
+ {
|
|
|
+ discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dest_session->EnableLightRecvFilter)
|
|
|
+ {
|
|
|
+ if (packet->BroadcastPacket == false &&
|
|
|
+ dest_session->LightRecvFilterMac != 0 &&
|
|
|
+ dest_session->LightRecvFilterMac != bcast_mac_dst)
|
|
|
+ {
|
|
|
+ discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (packet->BroadcastPacket &&
|
|
|
+ packet->TypeL3 == L3_ARPV4 &&
|
|
|
+ packet->L3.ARPv4Header->HardwareSize == 6 &&
|
|
|
+ Endian16(packet->L3.ARPv4Header->HardwareType) == ARP_HARDWARE_TYPE_ETHERNET &&
|
|
|
+ packet->L3.ARPv4Header->ProtocolSize == 4 &&
|
|
|
+ Endian16(packet->L3.ARPv4Header->ProtocolType) == MAC_PROTO_IPV4)
|
|
|
+ {
|
|
|
+ if (Endian16(packet->L3.ARPv4Header->Operation) == ARP_OPERATION_REQUEST)
|
|
|
+ {
|
|
|
+ bool ok = false;
|
|
|
+
|
|
|
+ if (dest_session->LightRecvFilterIPv4_1 != 0)
|
|
|
+ if (dest_session->LightRecvFilterIPv4_1 == packet->L3.ARPv4Header->TargetIP)
|
|
|
+ ok = true;
|
|
|
+
|
|
|
+ if (dest_session->LightRecvFilterIPv4_2 != 0)
|
|
|
+ if (dest_session->LightRecvFilterIPv4_2 == packet->L3.ARPv4Header->TargetIP)
|
|
|
+ ok = true;
|
|
|
+
|
|
|
+ if (ok == false)
|
|
|
+ {
|
|
|
+ discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (dest_session->IsMonitorMode)
|
|
|
{
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
|
|
|
if (dest_session->NormalClient)
|
|
@@ -5075,6 +5152,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
{
|
|
|
// This is dormant session
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -5090,6 +5168,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
dest_session->Connection->Protocol == CONNECTION_TCP)
|
|
|
{
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
|
|
|
if (dest_session->LinkModeServer)
|
|
@@ -5097,6 +5176,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
LINK *k = dest_session->Link;
|
|
|
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -5105,6 +5185,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
packet->VlanId != dest_session->VLanId)
|
|
|
{
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
|
|
|
if (dest_session->Policy->NoIPv6DefaultRouterInRA ||
|
|
@@ -5128,6 +5209,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
packet->ICMPv6HeaderPacketInfo.Type == ICMPV6_TYPE_ROUTER_ADVERTISEMENT))
|
|
|
{
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -5138,6 +5220,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
packet->TypeL7 == L7_DHCPV4)
|
|
|
{
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -5148,6 +5231,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
(Endian16(packet->L4.UDPHeader->DstPort) == 546 || Endian16(packet->L4.UDPHeader->DstPort) == 547))
|
|
|
{
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -5191,6 +5275,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
if (packet->TypeL3 == L3_IPV4 || packet->TypeL3 == L3_ARPV4)
|
|
|
{
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
}
|
|
|
if (dest_session->Policy->FilterIPv6)
|
|
@@ -5198,6 +5283,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
if (packet->TypeL3 == L3_IPV6)
|
|
|
{
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
}
|
|
|
if (dest_session->Policy->FilterNonIP)
|
|
@@ -5205,6 +5291,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
if (packet->TypeL3 != L3_IPV4 && packet->TypeL3 != L3_ARPV4 && packet->TypeL3 != L3_IPV6)
|
|
|
{
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -5218,6 +5305,7 @@ DISCARD_UNICAST_PACKET:
|
|
|
if (drop_arp_packet_privacy || packet->TypeL3 != L3_ARPV4)
|
|
|
{
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -5227,9 +5315,12 @@ DISCARD_UNICAST_PACKET:
|
|
|
memcmp(packet->MacAddressDest, s->Hub->HubMacAddr, 6) == 0)
|
|
|
{
|
|
|
discard = true;
|
|
|
+ goto L_SKIP_TO_DISCARD;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+L_SKIP_TO_DISCARD:
|
|
|
+
|
|
|
if (discard == false && dest_pa != NULL)
|
|
|
{
|
|
|
if (s == NULL ||
|
|
@@ -5899,6 +5990,21 @@ bool StorePacketFilterByPolicy(SESSION *s, PKT *p)
|
|
|
UINTToIP(&ip, ip_uint);
|
|
|
Copy(&t.Ip, &ip, sizeof(IP));
|
|
|
|
|
|
+ if (mac_table->Session != NULL)
|
|
|
+ {
|
|
|
+ if (mac_table->Session->EnableLightRecvFilter)
|
|
|
+ {
|
|
|
+ if (mac_table->Session->LightRecvFilterIPv4_1 == 0)
|
|
|
+ {
|
|
|
+ mac_table->Session->LightRecvFilterIPv4_1 = ip_uint;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ mac_table->Session->LightRecvFilterIPv4_2 = ip_uint;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
e = Search(hub->IpTable, &t);
|
|
|
if (e == NULL)
|
|
|
{
|