void FUN_00404e0c(int param_1,int param_2,undefined2 param_3,byte *param_4,undefined2 param_5,
char param_6)
{
undefined **ppuVar1;
int *piVar2;
ushort uVar3;
int iVar4;
char cVar5;
undefined4 uVar6;
undefined **ppuVar7;
uint uVar8;
uint uVar9;
undefined *puVar10;
char *pcVar11;
undefined **ppuVar12;
iVar4 = g_conf;
uVar8 = *(uint *)(g_conf + 0x70) + 1;
*(uint *)(g_conf + 0x74) = (uint)(uVar8 < *(uint *)(g_conf + 0x70)) + *(int *)(g_conf + 0x74);
*(uint *)(iVar4 + 0x70) = uVar8;
uVar8 = *(uint *)(param_1 + 0x78) + 1;
*(uint *)(param_1 + 0x7c) = (uint)(uVar8 < *(uint *)(param_1 + 0x78)) + *(int *)(param_1 + 0x7c);
*(uint *)(param_1 + 0x78) = uVar8;
puVar10 = (undefined *)(uint)*param_4;
if ((((((uint)(puVar10 + 0x7d) & 0xff) < 2) || (puVar10 == (undefined *)0x8f)) ||
(puVar10 == (undefined *)0xce)) ||
((puVar10 == (undefined *)0x82 || (puVar10 == (undefined *)0x80)))) {
uVar3 = *(ushort *)(param_4 + 2);
param_4[2] = 0;
param_4[3] = 0;
uVar8 = FUN_004011e0(param_2,0x3a,param_4,param_5);
*(short *)(param_4 + 2) = (short)uVar8;
if (uVar8 != uVar3) {
puVar10 = (undefined *)(uint)*param_4;
ppuVar7 = &PTR_s_Destination_Unreachable_0041a114;
do {
pcVar11 = *ppuVar7;
if (pcVar11 == (char *)0x0) {
pcVar11 = "Unknown";
break;
}
ppuVar12 = ppuVar7 + -1;
ppuVar7 = ppuVar7 + 2;
} while (*ppuVar12 != puVar10);
uVar6 = FUN_00401330(puVar10,param_4[1]);
dolog(4,"CORRUPT->DROP (%s): Received a ICMPv6 %s (%u) with wrong checksum (%x vs %x)\n",
param_1 + 4,pcVar11,puVar10,uVar6,param_4[1],*(undefined2 *)(param_4 + 2),(uint)uVar3);
}
ppuVar12 = &PTR_s_Destination_Unreachable_0041a114;
puVar10 = (undefined *)(uint)*param_4;
ppuVar7 = ppuVar12;
do {
pcVar11 = *ppuVar7;
if (pcVar11 == (char *)0x0) {
pcVar11 = "Unknown";
break;
}
ppuVar1 = ppuVar7 + -1;
ppuVar7 = ppuVar7 + 2;
} while (*ppuVar1 != puVar10);
uVar6 = FUN_00401330(puVar10,param_4[1]);
dolog(7,"Received ICMPv6: %s (%u), %s (%u) received on %s\n",pcVar11,puVar10,uVar6,param_4[1],
param_1 + 4);
puVar10 = (undefined *)(uint)*param_4;
if (puVar10 == (undefined *)0x80) {
cVar5 = *(char *)(param_2 + 7) //possible issue identified - semgrep
if (cVar5 != '\0') {
*(char *)(param_2 + 7) = cVar5 + -1;
cVar5 = *(char *)(param_2 + 7) //possible issue identified - semgrep
}
iVar4 = g_conf;
if (cVar5 == '\0') {
uVar8 = *(uint *)(g_conf + 0x80);
piVar2 = (int *)(g_conf + 0x84);
uVar9 = uVar8 + 1;
*(uint *)(g_conf + 0x80) = uVar9;
*(uint *)(iVar4 + 0x84) = (uint)(uVar9 < uVar8) + *piVar2;
FUN_00404c14(param_1,param_2 + 8,0x81,0);
return;
}
if (param_6 != '\0') {
dolog(4,
"Ignoring (%s): ICMPv6 Echo Req because header chain includes some of extension headers\n"
,param_1 + 4);
return;
}
FUN_00402e60(param_1,param_2,param_3);
return;
}
if ((*(uint *)(param_2 + 8) & 0xc0ff) != 0x80fe) {
FUN_00401448(4,"Ignoring non-LinkLocal MLD from %s received on %s/%u\n",param_2 + 8,param_1);
return;
}
if (puVar10 == (undefined *)0x83) {
FUN_004043b8(param_1,param_2,param_3,param_4);
return;
}
if (puVar10 == (undefined *)0x84) {
FUN_00404a90(param_1,param_2,param_3,param_4);
return;
}
if ((puVar10 == (undefined *)0x8f) || (puVar10 == (undefined *)0xce)) {
FUN_00403fe8(param_1,param_2,param_3,param_4);
return;
}
if (puVar10 == (undefined *)0x82) {
FUN_00403d0c(param_1,param_2,param_3,param_4);
return;
}
do {
pcVar11 = *ppuVar12;
if (pcVar11 == (char *)0x0) {
pcVar11 = "Unknown";
break;
}
ppuVar7 = ppuVar12 + -1;
ppuVar12 = ppuVar12 + 2;
} while (*ppuVar7 != puVar10);
FUN_00401330(puVar10,param_4[1]);
dolog(7,"ICMP type %s (%u), %s (%u) got through\n",pcVar11,puVar10);
return;
}
ppuVar7 = &PTR_s_Destination_Unreachable_0041a114;
do {
pcVar11 = *ppuVar7;
if (pcVar11 == (char *)0x0) {
pcVar11 = "Unknown";
break;
}
ppuVar12 = ppuVar7 + -1;
ppuVar7 = ppuVar7 + 2;
} while (*ppuVar12 != puVar10);
uVar6 = FUN_00401330(puVar10,param_4[1]);
dolog(7,"Ignoring ICMPv6: %s (%u), %s (%u) received on %s\n",pcVar11,puVar10,uVar6,param_4[1],
param_1 + 4);
return;
}