void FUN_00404a1c(void)

{
  uint uVar1;
  cmsghdr *__cmsg;
  int iVar2;
  undefined4 uVar3;
  undefined4 uVar4;
  undefined4 uVar5;
  int iVar6;
  undefined4 *puVar7;
  undefined4 *puVar8;
  int iVar9;
  int *piVar10;
  uint uVar11;
  char *pcVar12;
  short sVar13;
  int *piVar14;
  int *piVar15;
  cmsghdr *pcVar16;
  int *piVar17;
  undefined2 local_2218 [2];
  iovec local_2214;
  int local_220c;
  int local_2208;
  int local_2204;
  int local_2200;
  int local_21fc;
  int local_21f8;
  int local_21f4;
  undefined4 local_21f0;
  msghdr local_21ec;
  undefined4 local_21d0;
  undefined4 local_21cc;
  undefined4 local_21c8;
  undefined4 local_21c4;
  undefined4 local_21c0;
  undefined4 local_21bc;
  undefined4 local_21b8;
  undefined4 local_21b4;
  undefined1 auStack_21b0 [128];
  int local_2130 [2];
  int local_2128 [2];
  int local_2120;
  int local_211c;
  int local_2118;
  int local_2110;
  int local_210c;
  undefined1 auStack_2108 [8];
  undefined1 auStack_2100 [16];
  int *local_20f0 [2];
  int *local_20e8;
  int *local_20e0;
  int *local_20c8;
  int *local_20c0;
  int *local_20b8;
  undefined4 local_2064;
  undefined4 local_2060;
  uint local_2038;
  undefined1 auStack_2034 [4092];
  cmsghdr local_1038 [341];
  int local_38;
  int *local_34;
  int *local_30;
  
  local_21ec.msg_iov = &local_2214;
  local_21ec.msg_namelen = 0x80;
  local_21ec.msg_control = local_1038;
  local_21ec.msg_controllen = 0x1000;
  local_2214.iov_len = 0x1000;
  local_21ec.msg_iovlen = 1;
  local_21ec.msg_flags = 0;
  local_2214.iov_base = &local_2038;
  local_21ec.msg_name = auStack_21b0;
  uVar1 = recvmsg(sock,&local_21ec,0);
  if ((int)uVar1 < 0) {
    piVar17 = __errno_location();
    pcVar12 = strerror(*piVar17);
    dprintf(3,"client6_recv","recvmsg: %s",pcVar12);
    return;
  }
  if ((local_21ec.msg_controllen < 0xc) ||
     (pcVar16 = (cmsghdr *)0x0, __cmsg = (cmsghdr *)local_21ec.msg_control,
     (cmsghdr *)local_21ec.msg_control == (cmsghdr *)0x0)) {
LAB_00404cec:
    dprintf(5,"client6_recv","failed to get packet info");
    return;
  }
  do {
    while ((__cmsg->cmsg_level == 0x29 &&
           ((__cmsg->cmsg_type == 0x32 && (__cmsg->cmsg_len == 0x20))))) {
      pcVar16 = __cmsg + 1;
      __cmsg = __cmsg_nxthdr(&local_21ec,__cmsg);
      if (__cmsg == (cmsghdr *)0x0) goto LAB_00404b4c;
    }
    __cmsg = __cmsg_nxthdr(&local_21ec,__cmsg);
  } while (__cmsg != (cmsghdr *)0x0);
LAB_00404b4c:
  if (pcVar16 == (cmsghdr *)0x0) goto LAB_00404cec;
  iVar2 = find_ifconfbyid(pcVar16[1].cmsg_level);
  if (iVar2 == 0) {
    dprintf(6,"client6_recv","unexpected interface (%d)",pcVar16[1].cmsg_level);
    return;
  }
  if (uVar1 < 4) {
    dprintf(6,"client6_recv","short packet (%d bytes)",uVar1);
    return;
  }
  uVar3 = dhcp6msgstr(local_2038 & 0xff);
  uVar4 = addr2str(auStack_21b0);
  uVar5 = *(undefined4 *)(iVar2 + 0x10);
  dprintf(7,"client6_recv","receive %s from %s on %s",uVar3,uVar4,uVar5);
  local_34 = local_2130;
  dhcp6_init_options(local_34);
  iVar6 = dhcp6_get_options(auStack_2034,(int)&local_2038 + uVar1,local_34);
  if (iVar6 < 0) {
    dprintf(6,"client6_recv","failed to parse options");
    return;
  }
  uVar11 = local_2038 & 0xff;
  if (uVar11 == 7) {
    piVar17 = *(int **)(iVar2 + 8);
    if (piVar17 == (int *)0x0) {
LAB_00404f30:
      pcVar12 = "client6_recvreply";
LAB_00404fc0:
      dprintf(6,pcVar12,"XID mismatch");
      goto LAB_00404c80;
    }
    uVar11 = piVar17[0xe];
    while ((local_2038 >> 0x18 | (local_2038 & 0xff0000) >> 8 | (local_2038 & 0xff00) << 8) !=
           uVar11) {
      piVar17 = (int *)*piVar17;
      if (piVar17 == (int *)0x0) goto LAB_00404f30;
      uVar11 = piVar17[0xe];
    }
    local_38 = piVar17[0xf];
    if ((((4 < local_38 - 2U) && (local_38 != 8)) && (local_38 != 9)) &&
       ((local_38 != 1 || ((*(uint *)(iVar2 + 0x2c) & 2) == 0)))) {
      dprintf(6,"client6_recvreply","unexpected reply");
      goto LAB_00404c80;
    }
    if (local_2128[0] == 0) {
      pcVar12 = "client6_recvreply";
      goto LAB_00405d04;
    }
    if (local_2130[0] == 0) {
      pcVar12 = "client6_recvreply";
      goto LAB_00405d3c;
    }
    iVar6 = duidcmp(local_34,&DAT_0043e9f4);
    if (iVar6 == 0) {
      iVar6 = FUN_0040448c(piVar17[0x12],&local_2038,uVar1,local_34);
      if (iVar6 == 0) {
        if (((local_38 == 1) && ((*(uint *)(iVar2 + 0x2c) & 2) != 0)) && (local_2120 == 0)) {
          dprintf(6,"client6_recvreply","no rapid commit");
        }
        else if (local_20f0[0] == (int *)0x0) {
LAB_00405758:
          if (local_20c8 != (int *)0x0) {
            iVar6 = 0;
            piVar14 = local_20c8;
            do {
              uVar3 = in6addr2str(piVar14 + 3,0);
              FUN_00404978("nameserver[%d] %s",iVar6,uVar3);
              piVar14 = (int *)*piVar14;
              iVar6 = iVar6 + 1;
            } while (piVar14 != (int *)0x0);
          }
          if (local_20c0 != (int *)0x0) {
            iVar6 = 0;
            piVar14 = local_20c0;
            do {
              FUN_00404978("Domain search list[%d] %s",iVar6,piVar14[4]);
              piVar14 = (int *)*piVar14;
              iVar6 = iVar6 + 1;
            } while (piVar14 != (int *)0x0);
          }
          if (local_20b8 != (int *)0x0) {
            iVar6 = 0;
            piVar14 = local_20b8;
            do {
              uVar3 = in6addr2str(piVar14 + 3,0);
              FUN_00404978("NTP server[%d] %s",iVar6,uVar3);
              piVar14 = (int *)*piVar14;
              iVar6 = iVar6 + 1;
            } while (piVar14 != (int *)0x0);
          }
          if (local_20e8 != (int *)0x0) {
            iVar6 = 0;
            piVar14 = local_20e8;
            do {
              uVar3 = in6addr2str(piVar14 + 3,0);
              FUN_00404978("SIP server address[%d] %s",iVar6,uVar3);
              piVar14 = (int *)*piVar14;
              iVar6 = iVar6 + 1;
            } while (piVar14 != (int *)0x0);
          }
          if (local_20e0 != (int *)0x0) {
            iVar6 = 0;
            piVar14 = local_20e0;
            do {
              FUN_00404978("SIP domain name[%d] %s",iVar6,piVar14[4]);
              piVar14 = (int *)*piVar14;
              iVar6 = iVar6 + 1;
            } while (piVar14 != (int *)0x0);
          }
          if (local_38 == 2) {
            iVar6 = local_2110;
            if ((local_2110 == -1) && (local_210c == -1)) {
              iVar6 = 0x15180;
            }
            iVar9 = dhcp6_add_timer(&LAB_00404090,iVar2);
            *(int *)(iVar2 + 4) = iVar9;
            if (iVar9 == 0) {
              dprintf(4,"client6_recvreply","failed to add timer for refresh time");
            }
            else {
              local_21f0 = 0;
              local_21f4 = iVar6;
              if (iVar6 < 0) {
                dprintf(4,"client6_recvreply","refresh time is too large: %lu",iVar6);
                local_21f4 = 0x7fffffff;
              }
              dhcp6_set_timer(&local_21f4,*(undefined4 *)(iVar2 + 4));
            }
          }
          else if ((local_2110 != -1) || (local_210c != -1)) {
            dprintf(6,"client6_recvreply","unexpected information refresh time option (ignored)");
          }
          if (((local_38 - 4U < 2) || (local_38 == 8)) &&
             (piVar14 = (int *)piVar17[0x13], piVar14 != (int *)0x0)) {
            do {
              if (piVar14[3] == 1) {
                for (piVar15 = *(int **)piVar14[4]; piVar15 != (int *)0x0; piVar15 = (int *)*piVar15
                    ) {
                  iVar6 = dhcp6_find_listval(auStack_2100,6,piVar15 + 3,0);
                  if (iVar6 == 0) goto LAB_00405a6c;
                }
              }
              piVar14 = (int *)*piVar14;
            } while (piVar14 != (int *)0x0);
LAB_00405a6c:
            piVar14 = (int *)piVar17[0x13];
            if (piVar14 != (int *)0x0) {
              do {
                if (piVar14[3] == 0) {
                  for (piVar15 = *(int **)piVar14[4]; piVar15 != (int *)0x0;
                      piVar15 = (int *)*piVar15) {
                    iVar6 = dhcp6_find_listval(auStack_2108,4,piVar15 + 3,0);
                    if (iVar6 == 0) {
                      reset_ia_timer(piVar15,0,iVar2,local_2128);
                    }
                  }
                }
                piVar14 = (int *)*piVar14;
              } while (piVar14 != (int *)0x0);
            }
          }
          if (local_38 == 6) {
            dhcp6_remove_event(piVar17);
            FUN_00402a70();
          }
          else {
            iVar6 = update_ia(0,auStack_2108,iVar2,local_2128,piVar17[0x12]);
            if (iVar6 < 0) goto LAB_00404c80;
            update_ia(1,auStack_2100,iVar2,local_2128,piVar17[0x12]);
            dhcp6_remove_event(piVar17);
          }
          dprintf(7,"client6_recvreply","got an expected reply, sleeping.");
          if (DAT_0043e9c0 != 0) {
            DAT_0043e9c4 = 1;
            FUN_004041e4(0);
            unlink(PTR_s__var_run_dhcp6c_pid_0043e300)   //possible issue identified - semgrep
            FUN_00402a70();
          }
          if ((*(char **)(iVar2 + 0x44) != (char *)0x0) && (**(char **)(iVar2 + 0x44) != '\0')) {
            dprintf(7,"client6_recvreply","executes %s");
            client6_script(*(undefined4 *)(iVar2 + 0x44),local_38,local_34);
          }
        }
        else {
          sVar13 = (short)local_20f0[0][3]   //possible issue identified - semgrep
          if ((sVar13 != 1) && (piVar14 = local_20f0[0], sVar13 != 5)) {
LAB_004051b4:
            if (sVar13 == 4) {
              if (piVar17[0xf] == 8) {
                release_choose_ia(1,auStack_2100,iVar2,local_2128);
                goto LAB_004051ec;
              }
            }
            else if ((sVar13 == 0) && (piVar17[0xf] == 9)) {
              piVar14 = (int *)piVar17[0x13];
              if (piVar14 != (int *)0x0) {
                do {
                  if (piVar14[3] == 1) {
                    release_choose_ia(1,piVar14[4],iVar2,local_2128);
                  }
                  piVar14 = (int *)*piVar14;
                } while (piVar14 != (int *)0x0);
              }
LAB_004051ec:
              dhcp6_remove_event(piVar17);
              goto LAB_00404c80;
            }
            uVar3 = dhcp6_stcodestr(sVar13);
            dprintf(6,"client6_recvreply","status code: %s",uVar3);
            piVar14 = (int *)*piVar14;
            if (piVar14 == (int *)0x0) goto LAB_00405758;
            sVar13 = *(short *)(piVar14 + 3)   //possible issue identified - semgrep
            if ((sVar13 == 1) || (sVar13 == 5)) goto LAB_00404c80;
            goto LAB_004051b4;
          }
        }
        goto LAB_00404c80;
      }
      pcVar12 = "client6_recvreply";
LAB_00405ebc:
      dprintf(6,pcVar12,"failed to process authentication");
      goto LAB_00404c80;
    }
    pcVar12 = "client6_recvreply";
  }
  else if (uVar11 == 10) {
    if (local_2128[0] == 0) {
      pcVar12 = "client6_recvreconf";
LAB_00405d04:
      dprintf(6,pcVar12,"no server ID option");
      goto LAB_00404c80;
    }
    if (local_2130[0] == 0) {
      pcVar12 = "client6_recvreconf";
LAB_00405d3c:
      dprintf(6,pcVar12,"no client ID option");
      goto LAB_00404c80;
    }
    iVar6 = duidcmp(local_34,&DAT_0043e9f4);
    if (iVar6 == 0) {
      puVar7 = (undefined4 *)malloc(0x20)   //possible issue identified - semgrep
      if (puVar7 != (undefined4 *)0x0) {
        *puVar7 = local_2064;
        puVar7[1] = local_2060;
        puVar7[2] = 0;
        puVar7[3] = 0;
        puVar7[4] = 0;
        puVar7[5] = 0;
        puVar7[6] = 0;
        puVar7[7] = 0;
        puVar8 = (undefined4 *)malloc(0x20)   //possible issue identified - semgrep
        puVar7[3] = puVar8;
        uVar3 = DAT_0043ea04;
        if (puVar8 == (undefined4 *)0x0) {
          free(puVar7);
        }
        else {
          puVar7[6] = g_prevrd;
          puVar7[7] = uVar3;
          puVar8[5] = &reconfig_key;
          puVar8[6] = 0x10;
          *puVar8 = 0;
          puVar8[1] = 0;
          puVar8[2] = 0;
          puVar8[3] = 0;
          puVar8[4] = 0;
          puVar8[7] = 0;
          iVar6 = FUN_0040448c(puVar7,&local_2038,uVar1,local_34);
          if (iVar6 == 0) {
            if (local_2118 == 5) {
              renew_all_ia(iVar2);
            }
            else if (local_2118 == 6) {
              rebind_all_ia(iVar2);
            }
            else if (local_2118 == 0xb) {
              FUN_004034b0(iVar2);
            }
          }
          free(puVar7);
          free((void *)puVar7[3])   //possible issue identified - semgrep
        }
      }
      goto LAB_00404c80;
    }
    pcVar12 = "client6_recvreconf";
  }
  else {
    if (uVar11 != 2) {
      uVar3 = dhcp6msgstr();
      uVar4 = addr2str(auStack_21b0);
      dprintf(6,"client6_recv","received an unexpected message (%s) from %s",uVar3,uVar4);
      goto LAB_00404c80;
    }
    piVar17 = *(int **)(iVar2 + 8);
    if (piVar17 == (int *)0x0) {
LAB_00404fb4:
      pcVar12 = "client6_recvadvert";
      goto LAB_00404fc0;
    }
    uVar11 = piVar17[0xe];
    while ((local_2038 >> 0x18 | (local_2038 & 0xff0000) >> 8 | (local_2038 & 0xff00) << 8) !=
           uVar11) {
      piVar17 = (int *)*piVar17;
      if (piVar17 == (int *)0x0) goto LAB_00404fb4;
      uVar11 = piVar17[0xe];
    }
    if (local_2128[0] == 0) {
      pcVar12 = "client6_recvadvert";
      goto LAB_00405d04;
    }
    local_30 = local_2128;
    uVar3 = duidstr(local_2128);
    dprintf(7,"client6_recvadvert","server ID: %s, pref=%d",uVar3,local_211c,uVar5);
    if (local_2130[0] == 0) {
      pcVar12 = "client6_recvadvert";
      goto LAB_00405d3c;
    }
    iVar6 = duidcmp(local_34,&DAT_0043e9f4);
    if (iVar6 == 0) {
      puVar7 = (undefined4 *)piVar17[0x12];
      local_21b4 = puVar7[7];
      local_21d0 = *puVar7;
      local_21cc = puVar7[1];
      local_21c8 = puVar7[2];
      local_21c4 = puVar7[3];
      local_21c0 = puVar7[4];
      local_21bc = puVar7[5];
      local_21b8 = puVar7[6];
      iVar6 = FUN_0040448c(&local_21d0,&local_2038,uVar1,local_34);
      if (iVar6 == 0) {
        piVar14 = (int *)piVar17[0x13];
        if (piVar14 != (int *)0x0) {
          do {
            if (piVar14[3] == 0) {
              local_2218[0] = 6;
              pcVar12 = "NoPrefixAvail";
LAB_00405310:
              iVar6 = dhcp6_find_listval(local_20f0,2,local_2218,0);
              if (iVar6 != 0) {
                dprintf(6,"client6_recvadvert","advertise contains %s status",pcVar12);
                goto LAB_00404c80;
              }
            }
            else if (piVar14[3] == 1) {
              local_2218[0] = 2;
              pcVar12 = "NoAddrsAvail";
              goto LAB_00405310;
            }
            piVar14 = (int *)*piVar14;
          } while (piVar14 != (int *)0x0);
        }
        if (((piVar17[0xf] != 1) || ((*(uint *)(iVar2 + 0x2c) & 2) != 0)) || (DAT_0043e9c0 != 0)) {
          dprintf(6,"client6_recvadvert","unexpected advertise");
        }
        for (piVar14 = (int *)piVar17[0x11]; piVar14 != (int *)0x0; piVar14 = (int *)*piVar14) {
          iVar6 = duidcmp(piVar14 + 4,local_30);
          if (iVar6 == 0) {
            uVar3 = duidstr(local_30);
            dprintf(6,"client6_recvadvert","duplicated server (ID: %s)",uVar3);
            goto LAB_00404c80;
          }
        }
        puVar7 = (undefined4 *)malloc(0x110)   //possible issue identified - semgrep
        if (puVar7 == (undefined4 *)0x0) {
          dprintf(4,"client6_recvadvert","memory allocation failed for server");
        }
        else {
          memset(puVar7,0,0x110)   //possible issue identified - semgrep
          iVar6 = piVar17[0x12];
          puVar7[0x42] = iVar6;
          puVar8 = (undefined4 *)piVar17[0x12];
          uVar5 = puVar8[2];
          uVar3 = *puVar8;
          uVar4 = puVar8[1];
          *(undefined4 *)(iVar6 + 0xc) = local_21c4;
          *(undefined4 *)(iVar6 + 0x10) = local_21c0;
          *(undefined4 *)(iVar6 + 0x18) = local_21b8;
          *(undefined4 *)(iVar6 + 0x1c) = local_21b4;
          iVar6 = new_authparam(uVar3,uVar4,uVar5);
          if (iVar6 == 0) {
            dprintf(4,"client6_recvadvert","memory allocation failed for authentication parameters")
            ;
          }
          else {
            piVar17[0x12] = iVar6;
            dhcp6_init_options(puVar7 + 2);
            iVar6 = dhcp6_copy_options(puVar7 + 2,local_34);
            if (iVar6 == 0) {
              if (local_211c != -1) {
                puVar7[0x40] = local_211c;
              }
              piVar14 = (int *)piVar17[0x11];
              puVar7[0x41] = 1;
              piVar15 = piVar17 + 0x11;
              if (piVar14 == (int *)0x0) {
                iVar6 = puVar7[0x40];
              }
              else {
                iVar6 = puVar7[0x40];
                do {
                  piVar10 = piVar14;
                  if ((piVar10[0x40] != 0xff) && (piVar14 = piVar10, piVar10[0x40] < iVar6)) break;
                  piVar14 = (int *)*piVar10;
                  piVar15 = piVar10;
                } while (piVar14 != (int *)0x0);
              }
              *puVar7 = piVar14;
              *piVar15 = (int)puVar7;
              if (iVar6 == 0xff) {
                piVar17[0x10] = (int)puVar7;
                iVar6 = duidcpy(piVar17 + 4,puVar7 + 4);
                if (iVar6 == 0) {
                  iVar2 = FUN_004035c0(iVar2,piVar17[0x10] + 8,piVar17);
                  if (iVar2 == 0) {
                    piVar17[0xf] = 3;
                    piVar17[0xd] = 0;
                    free((void *)piVar17[0x12]);
                    piVar17[0x12] = puVar7[0x42];
                    puVar7[0x42] = 0;
                    client6_send(piVar17);
                    dhcp6_set_timeoparam(piVar17);
                    dhcp6_reset_timer(piVar17);
                  }
                  else {
                    dprintf(5,"client6_recvadvert","failed to construct request data");
                  }
                }
                else {
                  dprintf(5,"client6_recvadvert","can\'t copy server ID");
                }
              }
              else if (*(int *)piVar17[0x11] == 0) {
                uVar3 = dhcp6_timer_rest(piVar17[3]);
                local_2204 = piVar17[8] / 1000;
                local_2200 = (piVar17[8] * 1000) % 1000000;
                local_21fc = piVar17[9] / 1000;
                local_21f8 = (piVar17[9] * 1000) % 1000000;
                timeval_sub(&local_2204,uVar3,&local_220c);
                if ((local_220c < local_21fc) ||
                   ((local_220c == local_21fc && (local_2208 <= local_21f8)))) {
                  timeval_sub(&local_21fc,&local_220c,&local_21f4);
                }
                else {
                  local_21f0 = 0;
                  local_21f4 = 0;
                }
                dprintf(7,"client6_recvadvert","reset timer for %s to %d.%06d",
                        *(undefined4 *)(iVar2 + 0x10),local_21f4,local_21f0);
                dhcp6_set_timer(&local_21f4,piVar17[3]);
              }
              goto LAB_00404c80;
            }
            dprintf(3,"client6_recvadvert","failed to copy options");
            if ((void *)puVar7[0x42] != (void *)0x0) {
              free((void *)puVar7[0x42]);
            }
          }
          free(puVar7);
        }
        goto LAB_00404c80;
      }
      pcVar12 = "client6_recvadvert";
      goto LAB_00405ebc;
    }
    pcVar12 = "client6_recvadvert";
  }
  dprintf(6,pcVar12,"client DUID mismatch");
LAB_00404c80:
  dhcp6_clear_options(local_34);
  return;
}