/* WARNING: Restarted to delay deadcode elimination for space: stack */
undefined4 FUN_0040f438(int param_1,uint *param_2,uint *param_3,undefined4 param_4)
{
uint uVar1;
uint uVar2;
uint uVar3;
uint uVar4;
uint uVar5;
uint uVar6;
undefined4 uVar7;
int iVar8;
uint uVar9;
undefined4 uVar10;
char *pcVar11;
uint uVar12;
char *pcVar13;
uint *puVar14;
uint in_t0;
uint in_t2;
uint in_t3;
uint in_t4;
uint in_t5;
uint in_t6;
uint uVar15;
uint uVar16;
uint *puVar17;
undefined8 uVar18;
ushort local_b0 [2];
undefined4 local_ac;
undefined4 *local_a8;
uint local_a4;
uint local_a0;
uint local_9c;
uint local_98;
uint local_94;
uint local_90;
uint local_8c;
uint local_88;
uint local_84;
uint local_80;
uint local_7c;
uint local_78;
uint local_74;
uint local_70;
uint local_6c;
uint local_68;
uint local_64;
uint local_60;
uint local_5c;
uint local_58;
uint local_50;
uint local_4c;
uint local_48;
undefined1 local_44 [4];
undefined1 local_40 [4];
undefined1 local_3c [4];
undefined1 local_38 [4];
byte local_34;
undefined4 *local_30;
local_a8 = &local_ac;
puVar14 = param_2 + 1;
local_ac = 0;
local_30 = local_a8;
do {
if (param_3 < puVar14) {
return 0;
}
uVar12 = *param_2;
uVar16 = (uVar12 & 0xff) << 8 | (uVar12 & 0xffff) >> 8;
uVar15 = (uVar12 >> 0x10 & 0xff) << 8 | uVar12 >> 0x18;
puVar17 = (uint *)((int)puVar14 + uVar15);
uVar18 = dhcp6optstr(uVar16);
uVar9 = 7;
pcVar11 = "copyin_option";
pcVar13 = "get DHCP option %s, len %d";
uVar12 = uVar15;
dprintf(7,"copyin_option","get DHCP option %s, len %d",(int)uVar18,uVar15);
if (param_3 < puVar17) {
dprintf(6,"copyin_option","malformed DHCP option");
goto LAB_0040fa08;
}
if (uVar16 == 0xd) {
if (((param_1 - 0x19U < 2) || (param_1 == 3)) || (param_1 == 5)) {
if (uVar15 + 4 < 6) goto LAB_0040fad8;
uVar9 = ((ushort)param_2[1] & 0xff) << 8 | (uint)(ushort)((ushort)param_2[1] >> 8);
local_b0[0] = (ushort)uVar9;
uVar7 = FUN_0040b0f0(uVar9);
dprintf(7,""," status code: %s",uVar7,uVar12);
iVar8 = dhcp6_find_listval(param_4,2,local_b0,0);
if (iVar8 == 0) {
iVar8 = dhcp6_add_listval(param_4,2,local_b0,0);
if (iVar8 == 0) goto LAB_0040fa08;
}
else {
dprintf(6,"copyin_option","duplicated status code (%d)",(uint)local_b0[0],uVar12);
}
}
else {
uVar7 = dhcp6optstr(param_1);
uVar10 = dhcp6optstr(0xd);
dprintf(6,"copyin_option","%s is an invalid position for %s",uVar7,uVar10);
}
}
else {
if (uVar16 == 0x1a) {
if (param_1 == 0x19) {
if (0x1c < uVar15 + 4) {
uVar15 = (int)param_2 + 3U & 3;
uVar1 = (int)param_2 + 7U & 3;
uVar5 = (int)param_2 + 0xbU & 3;
uVar2 = (int)param_2 + 0xfU & 3;
uVar3 = (int)param_2 + 0x13U & 3;
uVar4 = (int)param_2 + 0x17U & 3;
uVar6 = (uint)param_2 & 3;
local_50 = (*(int *)(((int)param_2 + 3U) - uVar15) << (3 - uVar15) * 8 |
(uint)((ulonglong)uVar18 >> 0x20) & 0xffffffffU >> (uVar15 + 1) * 8) &
-1 << (4 - uVar6) * 8 | *(uint *)((int)param_2 - uVar6) >> uVar6 * 8;
uVar15 = (uint)(param_2 + 1) & 3;
local_4c = (*(int *)(((int)param_2 + 7U) - uVar1) << (3 - uVar1) * 8 |
uVar9 & 0xffffffffU >> (uVar1 + 1) * 8) & -1 << (4 - uVar15) * 8 |
*(uint *)((int)(param_2 + 1) - uVar15) >> uVar15 * 8;
uVar9 = (uint)(param_2 + 2) & 3;
local_48 = (*(int *)(((int)param_2 + 0xbU) - uVar5) << (3 - uVar5) * 8 |
(uint)pcVar11 & 0xffffffffU >> (uVar5 + 1) * 8) & -1 << (4 - uVar9) * 8 |
*(uint *)((int)(param_2 + 2) - uVar9) >> uVar9 * 8;
uVar9 = (uint)(param_2 + 3) & 3;
local_44 = (undefined1 [4])
((*(int *)(((int)param_2 + 0xfU) - uVar2) << (3 - uVar2) * 8 |
(uint)pcVar13 & 0xffffffffU >> (uVar2 + 1) * 8) & -1 << (4 - uVar9) * 8 |
*(uint *)((int)(param_2 + 3) - uVar9) >> uVar9 * 8);
uVar9 = (uint)(param_2 + 4) & 3;
local_40 = (undefined1 [4])
((*(int *)(((int)param_2 + 0x13U) - uVar3) << (3 - uVar3) * 8 |
(uint)uVar18 & 0xffffffffU >> (uVar3 + 1) * 8) & -1 << (4 - uVar9) * 8 |
*(uint *)((int)(param_2 + 4) - uVar9) >> uVar9 * 8);
uVar9 = (uint)(param_2 + 5) & 3;
local_3c = (undefined1 [4])
((*(int *)(((int)param_2 + 0x17U) - uVar4) << (3 - uVar4) * 8 |
in_t0 & 0xffffffffU >> (uVar4 + 1) * 8) & -1 << (4 - uVar9) * 8 |
*(uint *)((int)(param_2 + 5) - uVar9) >> uVar9 * 8);
local_38 = (undefined1 [4])param_2[6];
uVar9 = (uint)local_44 & 0xff;
local_34 = (byte)param_2[7];
if (uVar9 < 0x81) {
in_t6 = local_4c >> 0x18;
in_t0 = (local_48 & 0xff0000) >> 8;
uVar12 = (uint)(local_38 + 1) & 3;
in_t5 = ((uint)local_34 << 0x18 | in_t5 & 0xffffff) & -1 << (4 - uVar12) * 8 |
*(uint *)(local_38 + 1 + -uVar12) >> uVar12 * 8;
uVar12 = (uint)(local_40 + 1) & 3;
in_t3 = ((int)local_3c << 0x18 | in_t3 & 0xffffff) & -1 << (4 - uVar12) * 8 |
*(uint *)(local_40 + 1 + -uVar12) >> uVar12 * 8;
uVar12 = (uint)(local_3c + 1) & 3;
in_t4 = (param_2[6] << 0x18 | in_t4 & 0xffffff) & -1 << (4 - uVar12) * 8 |
*(uint *)(local_3c + 1 + -uVar12) >> uVar12 * 8;
uVar12 = (uint)(local_44 + 1) & 3;
in_t2 = ((int)local_40 << 0x18 | in_t2 & 0xffffff) & -1 << (4 - uVar12) * 8 |
*(uint *)(local_44 + 1 + -uVar12) >> uVar12 * 8;
local_a4 = local_4c << 0x18 | in_t6 | (local_4c & 0xff0000) >> 8 |
(local_4c & 0xff00) << 8;
local_a0 = local_48 << 0x18 | local_48 >> 0x18 | in_t0 | (local_48 & 0xff00) << 8;
local_9c = in_t2;
local_98 = in_t3;
local_94 = in_t4;
local_90 = in_t5;
local_8c = uVar9;
uVar7 = in6addr2str(&local_9c,0);
puVar14 = &local_a4;
dprintf(7,"copyin_option"," IA_PD prefix: %s/%d pltime=%lu vltime=%lu",uVar7,local_8c
,local_a4,local_a0);
iVar8 = dhcp6_find_listval(param_4,5,puVar14,0);
if (iVar8 == 0) {
local_ac = 0;
local_a8 = local_30;
iVar8 = FUN_0040f438(0x1a,(int)param_2 + 0x1d,puVar17);
if (iVar8 != 0) goto LAB_0040fa08;
uVar7 = 5;
goto LAB_0040f9ac;
}
uVar7 = in6addr2str(&local_9c,0);
dprintf(6,"copyin_option","duplicated IA_PD prefix %s/%d pltime=%lu vltime=%lu",uVar7,
local_8c,local_a4,local_a0);
goto LAB_0040f530;
}
dprintf(6,"copyin_option","invalid prefix length (%d)",uVar9,uVar12);
}
LAB_0040fad8:
dprintf(6,""," malformed DHCP option: type %d",uVar16,uVar12);
goto LAB_0040fa08;
}
uVar7 = dhcp6optstr(param_1);
uVar10 = 0x1a;
LAB_0040f9e4:
uVar10 = dhcp6optstr(uVar10);
dprintf(6,"copyin_option","%s is an invalid position for %s",uVar7,uVar10);
LAB_0040fa08:
dhcp6_clear_list(local_30);
return 0xffffffff;
}
if (uVar16 == 5) {
if (param_1 != 3) {
uVar7 = dhcp6optstr(param_1);
uVar10 = 5;
goto LAB_0040f9e4;
}
if (uVar15 + 4 < 0x1c) goto LAB_0040fad8;
local_74 = param_2[5];
local_70 = param_2[6];
uVar12 = (int)param_2 + 3U & 3;
uVar9 = (int)param_2 + 7U & 3;
uVar15 = (int)param_2 + 0xbU & 3;
uVar16 = (int)param_2 + 0xfU & 3;
uVar1 = (int)param_2 + 0x13U & 3;
in_t0 = local_74 >> 0x18;
uVar5 = (uint)(param_2 + 1) & 3;
in_t3 = (*(int *)(((int)param_2 + 7U) - uVar9) << (3 - uVar9) * 8 |
in_t3 & 0xffffffffU >> (uVar9 + 1) * 8) & -1 << (4 - uVar5) * 8 |
*(uint *)((int)(param_2 + 1) - uVar5) >> uVar5 * 8;
uVar9 = (uint)(param_2 + 2) & 3;
in_t4 = (*(int *)(((int)param_2 + 0xbU) - uVar15) << (3 - uVar15) * 8 |
in_t4 & 0xffffffffU >> (uVar15 + 1) * 8) & -1 << (4 - uVar9) * 8 |
*(uint *)((int)(param_2 + 2) - uVar9) >> uVar9 * 8;
uVar9 = (uint)(param_2 + 3) & 3;
in_t5 = (*(int *)(((int)param_2 + 0xfU) - uVar16) << (3 - uVar16) * 8 |
in_t5 & 0xffffffffU >> (uVar16 + 1) * 8) & -1 << (4 - uVar9) * 8 |
*(uint *)((int)(param_2 + 3) - uVar9) >> uVar9 * 8;
uVar9 = (uint)(param_2 + 4) & 3;
in_t6 = (*(int *)(((int)param_2 + 0x13U) - uVar1) << (3 - uVar1) * 8 |
in_t6 & 0xffffffffU >> (uVar1 + 1) * 8) & -1 << (4 - uVar9) * 8 |
*(uint *)((int)(param_2 + 4) - uVar9) >> uVar9 * 8;
uVar9 = (uint)param_2 & 3;
in_t2 = (*(int *)(((int)param_2 + 3U) - uVar12) << (3 - uVar12) * 8 |
in_t2 & 0xffffffffU >> (uVar12 + 1) * 8) & -1 << (4 - uVar9) * 8 |
*(uint *)((int)param_2 - uVar9) >> uVar9 * 8;
local_6c = local_74 << 0x18 | in_t0 | (local_74 & 0xff0000) >> 8 | (local_74 & 0xff00) << 8;
local_68 = local_70 << 0x18 | local_70 >> 0x18 | (local_70 & 0xff0000) >> 8 |
(local_70 & 0xff00) << 8;
local_88 = in_t2;
local_84 = in_t3;
local_80 = in_t4;
local_7c = in_t5;
local_78 = in_t6;
local_64 = in_t3;
local_60 = in_t4;
local_5c = in_t5;
local_58 = in_t6;
uVar7 = in6addr2str(&local_64,0);
puVar14 = &local_6c;
dprintf(7,"copyin_option"," IA_NA address: %s pltime=%lu vltime=%lu",uVar7,local_6c,
local_68);
iVar8 = dhcp6_find_listval(param_4,7,puVar14,0);
if (iVar8 == 0) {
local_ac = 0;
local_a8 = local_30;
iVar8 = FUN_0040f438(5,param_2 + 7,puVar17);
if (iVar8 != 0) goto LAB_0040fa08;
uVar7 = 7;
LAB_0040f9ac:
iVar8 = dhcp6_add_listval(param_4,uVar7,puVar14,local_30);
if (iVar8 == 0) {
dhcp6_clear_list(local_30);
goto LAB_0040fa08;
}
dhcp6_clear_list(local_30);
}
else {
uVar7 = in6addr2str(&local_64,0);
dprintf(6,"copyin_option","duplicated IA_NA address%s pltime=%lu vltime=%lu",uVar7,
local_6c,local_68);
}
}
}
LAB_0040f530:
puVar14 = puVar17 + 1;
param_2 = puVar17;
} while( true );
}