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 );
}