undefined4 FUN_0040249c(int param_1)
{
byte bVar1;
ushort uVar2;
uint uVar3;
char *pcVar4;
int iVar5;
undefined4 uVar6;
int iVar7;
uint uVar8;
uint uVar9;
in_addr iVar10;
in_addr iVar11;
byte *pbVar12;
byte *pbVar13;
code *pcVar14;
socklen_t local_480;
sockaddr sStack_47c;
char acStack_46c [32];
char acStack_44c [32];
undefined4 local_42c;
undefined4 uStack_428;
char local_423;
byte local_422;
in_addr local_420;
in_addr local_41c;
local_480 = 0x10;
uVar3 = recvfrom(param_1,&local_42c,0x400,0,&sStack_47c,&local_480) //possible issue identified - semgrep
iVar11.s_addr = local_41c.s_addr;
iVar10.s_addr = local_420.s_addr;
if ((int)uVar3 < 1) {
return 0;
}
pcVar4 = inet_ntoa(local_420);
strcpy(acStack_46c,pcVar4) //possible issue identified - semgrep
pcVar4 = inet_ntoa(local_41c);
strcpy(acStack_44c,pcVar4) //possible issue identified - semgrep
if (local_423 == '\0') {
iVar5 = vifs_is_upstream(local_422);
if (iVar5 == 0) {
return 0;
}
uVar3 = (uint)local_422;
pcVar14 = mrt_activate_route;
iVar10.s_addr = local_420.s_addr;
iVar11.s_addr = local_41c.s_addr;
LAB_0040275c:
(*pcVar14)(iVar10.s_addr,iVar11.s_addr,uVar3);
}
else {
uVar9 = local_42c & 0xf;
uVar8 = (local_42c._2_2_ & 0xff) << 8 | (uint)(local_42c._2_2_ >> 8);
iVar5 = uVar8 + uVar9 * -4;
if (uVar8 != uVar3) {
return 0;
}
pbVar13 = (byte *)(&local_42c + uVar9);
uVar3 = (&uStack_428)[uVar9];
if (iVar5 < 8) {
return 0;
}
uVar6 = vifs_find_by_ip(iVar10.s_addr,0,0);
verbose("%s: type=0x%x, vifi=%d, src=%s, dst=%s\n","igmp_read",*pbVar13,uVar6,acStack_46c,
acStack_44c);
bVar1 = *pbVar13;
if (bVar1 != 0x16) {
if (0x16 < bVar1) {
if (bVar1 == 0x17) {
iVar5 = FUN_00402354(uVar3);
if (iVar5 != 0) {
return 0;
}
vifs_update_igmp_ver(iVar10.s_addr,0,1,0x16);
mrt_leave_group(iVar10.s_addr,iVar11.s_addr,uVar3,&local_42c);
return 0;
}
uVar3 = 0;
if (bVar1 != 0x22) {
return 0;
}
uVar2 = *(ushort *)((int)&uStack_428 + uVar9 * 4 + 2);
do {
iVar5 = uVar3 + 1;
if (((uVar2 & 0xff) << 8 | (uint)(uVar2 >> 8)) <= uVar3) {
return 0;
}
pbVar12 = pbVar13 + iVar5 * 8;
iVar7 = FUN_00402354(*(undefined4 *)(pbVar12 + 4));
if (iVar7 != 0) goto switchD_004027e0_default;
switch(*pbVar12 - 1) {
case 0:
case 2:
if (*(short *)(pbVar12 + 2) == 0) goto switchD_004027e0_caseD_5;
break;
case 1:
case 3:
if (*(short *)(pbVar12 + 2) != 0) goto switchD_004027e0_caseD_5;
break;
case 4:
break;
case 5:
switchD_004027e0_caseD_5:
mrt_leave_group(iVar10.s_addr,iVar11.s_addr,*(undefined4 *)(pbVar13 + iVar5 * 8 + 4),
&local_42c);
default:
goto switchD_004027e0_default;
}
mrt_membership_report
(iVar10.s_addr,iVar11.s_addr,*(undefined4 *)(pbVar13 + iVar5 * 8 + 4),*pbVar13,
&local_42c);
switchD_004027e0_default:
uVar3 = uVar3 + 1 & 0xffff;
} while( true );
}
if (bVar1 == 0x11) {
iVar7 = FUN_00402354(uVar3);
if (iVar7 != 0) {
return 0;
}
if (iVar5 == 8) {
vifs_update_igmp_ver_all(1,0x16);
}
pcVar14 = mrt_membership_query;
goto LAB_0040275c;
}
if (bVar1 != 0x12) {
return 0;
}
}
iVar5 = FUN_00402354(uVar3);
if (iVar5 == 0) {
vifs_update_igmp_ver(iVar10.s_addr,0,1,0x16);
mrt_membership_report(iVar10.s_addr,iVar11.s_addr,uVar3,*pbVar13,&local_42c);
}
}
return 0;
}