/* WARNING: Restarted to delay deadcode elimination for space: stack */

undefined4 FUN_0040c1a8(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_0040c778;
    }
    if (uVar16 == 0xd) {
      if (((param_1 - 0x19U < 2) || (param_1 == 3)) || (param_1 == 5)) {
        if (uVar15 + 4 < 6) goto LAB_0040c848;
        uVar9 = ((ushort)param_2[1] & 0xff) << 8 | (uint)(ushort)((ushort)param_2[1] >> 8);
        local_b0[0] = (ushort)uVar9;
        uVar7 = dhcp6_stcodestr(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_0040c778;
        }
        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_0040c1a8(0x1a,(int)param_2 + 0x1d,puVar17);
                if (iVar8 != 0) goto LAB_0040c778;
                uVar7 = 5;
                goto LAB_0040c71c;
              }
              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_0040c2a0;
            }
            dprintf(6,"copyin_option","invalid prefix length (%d)",uVar9,uVar12);
          }
LAB_0040c848:
          dprintf(6,"","  malformed DHCP option: type %d",uVar16,uVar12);
          goto LAB_0040c778;
        }
        uVar7 = dhcp6optstr(param_1);
        uVar10 = 0x1a;
LAB_0040c754:
        uVar10 = dhcp6optstr(uVar10);
        dprintf(6,"copyin_option","%s is an invalid position for %s",uVar7,uVar10);
LAB_0040c778:
        dhcp6_clear_list(local_30);
        return 0xffffffff;
      }
      if (uVar16 == 5) {
        if (param_1 != 3) {
          uVar7 = dhcp6optstr(param_1);
          uVar10 = 5;
          goto LAB_0040c754;
        }
        if (uVar15 + 4 < 0x1c) goto LAB_0040c848;
        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_0040c1a8(5,param_2 + 7,puVar17);
          if (iVar8 != 0) goto LAB_0040c778;
          uVar7 = 7;
LAB_0040c71c:
          iVar8 = dhcp6_add_listval(param_4,uVar7,puVar14,local_30);
          if (iVar8 == 0) {
            dhcp6_clear_list(local_30);
            goto LAB_0040c778;
          }
          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_0040c2a0:
    puVar14 = puVar17 + 1;
    param_2 = puVar17;
  } while( true );
}