undefined4 update_ia(int param_1,int *param_2,int param_3,undefined1 *param_4,int param_5)
{
int iVar1;
int iVar2;
undefined4 *puVar3;
undefined *puVar4;
undefined4 uVar5;
uint uVar6;
undefined4 *puVar7;
undefined4 uVar8;
void *pvVar9;
int iVar10;
undefined4 *puVar11;
char *pcVar12;
undefined *puVar13;
int *piVar14;
undefined1 *puVar15;
code *pcVar16;
undefined1 *puVar17;
undefined1 *local_88;
undefined4 local_84;
undefined1 *local_80;
undefined4 local_7c;
undefined4 local_78;
int local_74;
int local_70;
int local_6c;
int local_68;
uint local_64;
int local_60;
undefined1 auStack_5c [36];
int local_38;
int local_34;
undefined1 *local_30;
param_2 = (int *)*param_2;
if (param_2 == (int *)0x0) {
return 0;
}
local_34 = param_3 + 0x50;
do {
while (iVar1 = find_iaconf(local_34,param_1,param_2[3]), iVar1 == 0) {
LAB_00416320:
param_2 = (int *)*param_2;
if (param_2 == (int *)0x0) {
return 0;
}
}
puVar4 = (undefined *)param_2[5];
if ((puVar4 != (undefined *)0x0) && (puVar13 = (undefined *)param_2[4], puVar4 < puVar13)) {
pcVar12 = "invalid IA: T1(%lu) > T2(%lu)";
iVar1 = 6;
LAB_00416ac8:
dprintf(iVar1,"update_ia",pcVar12,puVar13,puVar4);
goto LAB_00416320;
}
puVar17 = param_4;
iVar2 = FUN_00414500(param_1,param_3,iVar1,param_2,param_4);
if (iVar2 == 0) {
if (*(int *)(iVar1 + 8) == 0) {
puVar13 = &DAT_00429fec;
}
else if (*(int *)(iVar1 + 8) == 1) {
puVar13 = &DAT_00429fe8;
}
else {
puVar13 = &DAT_00427600;
}
puVar4 = *(undefined **)(iVar1 + 0xc);
pcVar12 = "failed to get an IA type: %s, ID: %u";
iVar1 = 4;
goto LAB_00416ac8;
}
if (param_5 != 0) {
iVar10 = *(int *)(iVar2 + 0x30);
if (iVar10 != 0) {
uVar5 = *(undefined4 *)(param_5 + 0x1c);
uVar8 = *(undefined4 *)(param_5 + 0x10);
*(undefined4 *)(iVar10 + 0x18) = *(undefined4 *)(param_5 + 0x18);
*(undefined4 *)(iVar10 + 0x1c) = uVar5;
*(undefined4 *)(iVar10 + 0x10) = uVar8;
goto LAB_004163e0;
}
iVar10 = copy_authparam();
*(int *)(iVar2 + 0x30) = iVar10;
if (iVar10 != 0) goto LAB_004163e0;
dprintf(4,"update_authparam","failed to copy authparam");
if (*(int *)(iVar1 + 8) == 0) {
puVar4 = &DAT_00429fec;
}
else if (*(int *)(iVar1 + 8) == 1) {
puVar4 = &DAT_00429fe8;
}
else {
puVar4 = &DAT_00427600;
}
dprintf(4,"update_ia","failed to update authentication param for IA type: %s, ID: %u",puVar4,
*(undefined4 *)(iVar1 + 0xc));
LAB_00416d10:
FUN_00414f50(iVar2);
goto LAB_00416320;
}
LAB_004163e0:
piVar14 = (int *)param_2[10];
if (piVar14 != (int *)0x0) {
local_30 = auStack_5c;
puVar15 = (undefined1 *)(iVar2 + 0x2c);
local_38 = iVar1 + 0x20;
do {
iVar1 = piVar14[2];
if (iVar1 != 5) {
if (iVar1 == 7) {
puVar17 = &LAB_004154d0;
iVar1 = update_address(iVar2,piVar14 + 3,param_3,puVar15,&LAB_004154d0);
if (iVar1 != 0) {
uVar5 = in6addr2str(piVar14 + 5,0);
dprintf(5,"update_ia","failed to update an address %s",uVar5);
}
sleep(1);
local_64 = 0;
local_60 = 0;
local_68 = piVar14[8];
local_74 = piVar14[5];
local_70 = piVar14[6];
local_6c = piVar14[7];
local_64 = if_nametoindex(*(char **)(param_3 + 0x10));
if ((local_64 != 0) && (iVar1 = rtnl_open(local_30,0), -1 < iVar1)) { //possible issue identified - semgrep
iVar1 = rtnl_wilddump_request(local_30,10,0x16);
if (-1 < iVar1) {
puVar17 = (undefined1 *)0x0;
iVar1 = rtnl_dump_filter(local_30,FUN_004161d0,&local_74,0,0);
if ((-1 < iVar1) && (local_60 == 0)) {
iVar1 = -0x3d;
}
}
rtnl_close(local_30);
if (-1 < iVar1) goto LAB_0041644c;
}
remove_declined_address(puVar15,piVar14 + 3);
iVar1 = *(int *)(*(int *)(iVar2 + 8) + 8);
*(undefined4 *)(iVar2 + 0x14) = 4;
if (iVar1 == 0) {
puVar4 = &DAT_00429fec;
}
else if (iVar1 == 1) {
puVar4 = &DAT_00429fe8;
}
else {
puVar4 = &DAT_00427600;
}
dprintf(7,"decline_ia","declining IA: %s-%lu",puVar4,
*(undefined4 *)(*(int *)(iVar2 + 8) + 0xc));
piVar14 = *(int **)(iVar2 + 0x1c);
if (piVar14 != (int *)0x0) {
if (*piVar14 == 0) {
*(int *)(piVar14[2] + 0x50) = piVar14[1];
}
else {
*(int *)(*piVar14 + 4) = piVar14[1];
}
*(int *)piVar14[1] = *piVar14;
pvVar9 = *(void **)(iVar2 + 0x1c);
if (*(code **)((int)pvVar9 + 0x14) != (code *)0x0) {
(**(code **)((int)pvVar9 + 0x14))();
pvVar9 = *(void **)(iVar2 + 0x1c);
}
free(pvVar9);
*(undefined4 *)(iVar2 + 0x1c) = 0;
}
if (*(int *)(iVar2 + 0x18) != 0) {
dhcp6_remove_timer(iVar2 + 0x18);
}
puVar3 = (undefined4 *)dhcp6_create_event(*(undefined4 *)(iVar2 + 0x20),9);
if (puVar3 == (undefined4 *)0x0) {
pcVar12 = "decline_ia";
LAB_00417058:
dprintf(5,pcVar12,"failed to create a new event");
goto LAB_00416320;
}
iVar1 = *(int *)(iVar2 + 0x20);
puVar3[1] = *(undefined4 *)(iVar1 + 0xc);
puVar11 = *(undefined4 **)(iVar1 + 0xc);
*puVar3 = 0;
*(undefined4 **)(iVar1 + 0xc) = puVar3;
*puVar11 = puVar3;
iVar1 = dhcp6_add_timer(client6_timo,puVar3);
puVar3[3] = iVar1;
if (iVar1 == 0) {
dprintf(5,"decline_ia","failed to create a new event timer");
}
else {
iVar1 = duidcpy(puVar3 + 4,iVar2 + 0x24);
if (iVar1 == 0) {
puVar11 = (undefined4 *)malloc(0x1c) //possible issue identified - semgrep
if (puVar11 == (undefined4 *)0x0) {
dprintf(5,"decline_ia","failed to create a new event data");
}
else {
puVar11[3] = 0;
puVar11[1] = 0;
puVar11[4] = 0;
puVar11[5] = 0;
puVar11[6] = 0;
local_80 = *(undefined1 **)(*(int *)(iVar2 + 8) + 0xc);
puVar11[1] = puVar3[0x14];
local_7c = *(undefined4 *)(iVar2 + 0xc);
puVar7 = (undefined4 *)puVar3[0x14];
local_78 = *(undefined4 *)(iVar2 + 0x10);
iVar1 = *(int *)(iVar2 + 0x2c);
*puVar11 = 0;
*puVar7 = puVar11;
puVar11[2] = puVar3;
puVar3[0x14] = puVar11;
if (((iVar1 == 0) || (*(code **)(iVar1 + 0x1c) == (code *)0x0)) ||
(iVar1 = (**(code **)(iVar1 + 0x1c))(iVar1,&local_80,iVar2 + 0x1c,puVar11),
iVar1 == 0)) {
if (*(int *)(iVar2 + 0x30) != 0) {
iVar1 = copy_authparam();
puVar3[0x12] = iVar1;
if (iVar1 == 0) {
dprintf(4,"decline_ia","failed to copy authparam");
goto LAB_00416a9c;
}
}
puVar3[0xd] = 0;
dhcp6_set_timeoparam(puVar3);
dhcp6_reset_timer(puVar3);
*(undefined4 **)(iVar2 + 0x1c) = puVar11;
client6_send(puVar3);
goto LAB_00416320;
}
dprintf(5,"decline_ia","failed to make reestablish data");
}
}
else {
dprintf(5,"decline_ia","failed to copy server ID");
}
}
LAB_00416a9c:
dhcp6_remove_event(puVar3);
goto LAB_00416320;
}
if (iVar1 != 2) {
dprintf(3,"update_ia","impossible case",0x430000,puVar17);
goto LAB_00416320;
}
if (param_1 == 0) {
puVar4 = &DAT_00429fec;
}
else if (param_1 == 1) {
puVar4 = &DAT_00429fe8;
}
else {
puVar4 = &DAT_00427600;
}
puVar17 = (undefined1 *)param_2[3];
uVar5 = dhcp6_stcodestr((short)piVar14[3]);
dprintf(6,"update_ia","status code for %s-%lu: %s",puVar4,puVar17,uVar5);
if ((1 < *(int *)(iVar2 + 0x14) - 1U) || ((short)piVar14[3] != 3)) goto LAB_0041644c;
iVar1 = *(int *)(*(int *)(iVar2 + 8) + 8);
if (iVar1 == 0) {
puVar4 = &DAT_00429fec;
}
else if (iVar1 == 1) {
puVar4 = &DAT_00429fe8;
}
else {
puVar4 = &DAT_00427600;
}
dprintf(6,"update_ia","receive NoBinding against renew/rebind for %s-%lu",puVar4,
*(undefined4 *)(*(int *)(iVar2 + 8) + 0xc),uVar5);
iVar1 = *(int *)(*(int *)(iVar2 + 8) + 8);
if (iVar1 == 0) {
puVar4 = &DAT_00429fec;
}
else if (iVar1 == 1) {
puVar4 = &DAT_00429fe8;
}
else {
puVar4 = &DAT_00427600;
}
dprintf(7,"reestablish_ia","re-establishing IA: %s-%lu",puVar4,
*(undefined4 *)(*(int *)(iVar2 + 8) + 0xc),uVar5);
if (1 < *(int *)(iVar2 + 0x14) - 1U) {
dprintf(3,"reestablish_ia","internal error (invalid IA status)");
/* WARNING: Subroutine does not return */
exit(1);
}
piVar14 = *(int **)(iVar2 + 0x1c);
if (piVar14 != (int *)0x0) {
if (*piVar14 == 0) {
*(int *)(piVar14[2] + 0x50) = piVar14[1];
}
else {
*(int *)(*piVar14 + 4) = piVar14[1];
}
*(int *)piVar14[1] = *piVar14;
pvVar9 = *(void **)(iVar2 + 0x1c);
if (*(code **)((int)pvVar9 + 0x14) != (code *)0x0) {
(**(code **)((int)pvVar9 + 0x14))();
pvVar9 = *(void **)(iVar2 + 0x1c);
}
free(pvVar9);
*(undefined4 *)(iVar2 + 0x1c) = 0;
}
if (*(int *)(iVar2 + 0x18) != 0) {
dhcp6_remove_timer(iVar2 + 0x18);
}
puVar3 = (undefined4 *)dhcp6_create_event(*(undefined4 *)(iVar2 + 0x20),3);
if (puVar3 == (undefined4 *)0x0) {
pcVar12 = "reestablish_ia";
goto LAB_00417058;
}
iVar1 = *(int *)(iVar2 + 0x20);
puVar3[1] = *(undefined4 *)(iVar1 + 0xc);
puVar11 = *(undefined4 **)(iVar1 + 0xc);
*puVar3 = 0;
*(undefined4 **)(iVar1 + 0xc) = puVar3;
*puVar11 = puVar3;
iVar1 = dhcp6_add_timer(client6_timo,puVar3);
puVar3[3] = iVar1;
if (iVar1 == 0) {
dprintf(5,"reestablish_ia","failed to create a new event timer");
}
else {
puVar11 = (undefined4 *)malloc(0x1c) //possible issue identified - semgrep
if (puVar11 == (undefined4 *)0x0) {
dprintf(5,"reestablish_ia","failed to create a new event data");
}
else {
puVar11[1] = 0;
puVar11[3] = 0;
puVar11[4] = 0;
puVar11[5] = 0;
puVar11[6] = 0;
puVar11[1] = puVar3[0x14];
puVar7 = (undefined4 *)puVar3[0x14];
*puVar11 = 0;
puVar11[2] = puVar3;
*puVar7 = puVar11;
puVar3[0x14] = puVar11;
iVar1 = duidcpy(puVar3 + 4,iVar2 + 0x24);
if (iVar1 == 0) {
iVar1 = *(int *)(iVar2 + 0x2c);
local_80 = *(undefined1 **)(*(int *)(iVar2 + 8) + 0xc);
local_7c = *(undefined4 *)(iVar2 + 0xc);
local_78 = *(undefined4 *)(iVar2 + 0x10);
if (iVar1 != 0) {
if ((*(code **)(iVar1 + 0x1c) != (code *)0x0) &&
(iVar1 = (**(code **)(iVar1 + 0x1c))(iVar1,&local_80,iVar2 + 0x1c,puVar11),
iVar1 != 0)) {
dprintf(5,"reestablish_ia","failed to make reestablish data");
goto LAB_00417148;
}
}
if (*(int *)(iVar2 + 0x30) != 0) {
iVar1 = copy_authparam();
puVar3[0x12] = iVar1;
if (iVar1 == 0) {
dprintf(4,"reestablish_ia","failed to copy authparam");
goto LAB_00417148;
}
}
puVar3[0xd] = 0;
dhcp6_set_timeoparam(puVar3);
dhcp6_reset_timer(puVar3);
*(undefined4 **)(iVar2 + 0x1c) = puVar11;
client6_send(puVar3);
goto LAB_00416320;
}
dprintf(5,"reestablish_ia","failed to copy server ID");
}
}
LAB_00417148:
dhcp6_remove_event(puVar3);
goto LAB_00416320;
}
puVar17 = puVar15;
iVar1 = update_prefix(iVar2,piVar14 + 3,local_38,param_3,puVar15,&LAB_004154d0);
if (iVar1 != 0) {
uVar5 = in6addr2str(piVar14 + 5,0);
dprintf(5,"update_ia","failed to update a prefix %s/%d",uVar5,piVar14[9]);
return 0xffffffea;
}
LAB_0041644c:
piVar14 = (int *)*piVar14;
} while (piVar14 != (int *)0x0);
}
if ((*(int *)(iVar2 + 0x2c) == 0) ||
(iVar1 = (**(code **)(*(int *)(iVar2 + 0x2c) + 8))(), iVar1 == 0)) {
iVar1 = *(int *)(*(int *)(iVar2 + 8) + 8);
if (iVar1 == 0) {
puVar4 = &DAT_00429fec;
}
else if (iVar1 == 1) {
puVar4 = &DAT_00429fe8;
}
else {
puVar4 = &DAT_00427600;
}
dprintf(7,"update_ia","IA %s-%lu is invalidated",puVar4,
*(undefined4 *)(*(int *)(iVar2 + 8) + 0xc));
goto LAB_00416d10;
}
puVar15 = *(undefined1 **)(iVar2 + 0xc);
if ((puVar15 == (undefined1 *)0x0) || (uVar6 = *(uint *)(iVar2 + 0x10), uVar6 == 0)) {
if ((*(int *)(iVar2 + 0x2c) == 0) ||
(pcVar16 = *(code **)(*(int *)(iVar2 + 0x2c) + 0xc), pcVar16 == (code *)0x0)) {
uVar6 = 0x708;
}
else {
uVar6 = (*pcVar16)();
puVar15 = *(undefined1 **)(iVar2 + 0xc);
}
if (puVar15 == (undefined1 *)0x0) {
puVar15 = (undefined1 *)(uVar6 >> 1);
if (uVar6 == 0xffffffff) {
*(undefined4 *)(iVar2 + 0xc) = 0xffffffff;
puVar15 = (undefined1 *)0xffffffff;
}
else {
*(undefined1 **)(iVar2 + 0xc) = puVar15;
}
}
puVar17 = *(undefined1 **)(iVar2 + 0x10);
if (puVar17 == (undefined1 *)0x0) {
if (uVar6 != 0xffffffff) {
puVar17 = (undefined1 *)((uVar6 << 2) / 5);
*(undefined1 **)(iVar2 + 0x10) = puVar17;
goto LAB_00416dcc;
}
*(undefined4 *)(iVar2 + 0x10) = 0xffffffff;
puVar17 = (undefined1 *)0xffffffff;
}
else {
LAB_00416dcc:
if (puVar17 < puVar15) {
puVar15 = (undefined1 *)((uint)((int)puVar17 * 5) >> 3);
puVar17 = *(undefined1 **)(iVar2 + 0x10);
*(undefined1 **)(iVar2 + 0xc) = puVar15;
}
}
dprintf(6,"update_ia","T1(%lu) and/or T2(%lu) is locally determined",puVar15,puVar17);
uVar6 = *(uint *)(iVar2 + 0x10);
puVar15 = *(undefined1 **)(iVar2 + 0xc);
}
if (uVar6 < 0x1e) {
dprintf(6,"update_ia","T1 (%lu) or T2 (%lu) is too small",puVar15,uVar6);
*(undefined4 *)(iVar2 + 0xc) = 0x12;
*(undefined4 *)(iVar2 + 0x10) = 0x1e;
puVar17 = (undefined1 *)0x1e;
dprintf(6,""," adjusted to %lu and %lu",0x12,0x1e);
puVar15 = *(undefined1 **)(iVar2 + 0xc);
}
if (puVar15 == (undefined1 *)0xffffffff) {
if (*(int *)(iVar2 + 0x18) == 0) goto LAB_004164e8;
dhcp6_remove_timer(iVar2 + 0x18);
*(undefined4 *)(iVar2 + 0x14) = 0;
}
else {
iVar1 = *(int *)(iVar2 + 0x18);
if (iVar1 == 0) {
iVar1 = dhcp6_add_timer(FUN_00415a0c,iVar2);
*(int *)(iVar2 + 0x18) = iVar1;
if (iVar1 == 0) {
dprintf(3,"update_ia","failed to add IA timer",0x430000,puVar17);
goto LAB_00416d10;
}
puVar15 = *(undefined1 **)(iVar2 + 0xc);
}
local_84 = 0;
local_88 = puVar15;
dhcp6_set_timer(&local_88,iVar1);
LAB_004164e8:
*(undefined4 *)(iVar2 + 0x14) = 0;
}
param_2 = (int *)*param_2;
if (param_2 == (int *)0x0) {
return 0;
}
} while( true );
}