int FUN_0040fb5c(undefined4 param_1,uint param_2,int param_3,uint *param_4)

{
  undefined4 uVar1;
  undefined4 uVar2;
  int iVar3;
  char *pcVar4;
  uint uVar5;
  uint local_40;
  uint local_3c;
  uint local_38;
  uint local_34;
  uint local_30;
  uint local_2c;
  uint local_28;
  
  uVar5 = param_4[6];
  local_40 = *param_4;
  local_3c = param_4[1];
  local_34 = param_4[3];
  local_38 = param_4[2];
  local_30 = param_4[4];
  local_2c = param_4[5];
  local_28 = uVar5;
  if (uVar5 < 0x81) {
    prefix6_mask(&local_38,uVar5);
    if ((((param_4[2] != local_38) || (param_4[3] != local_34)) || (param_4[4] != local_30)) ||
       (param_4[5] != local_2c)) {
      uVar1 = in6addr2str(param_4 + 2,0);
      uVar5 = param_4[6];
      uVar2 = in6addr2str(&local_38,0);
      dprintf(4,"add_prefix","prefix %s/%d for %s has a trailing garbage.  It should be %s/%d",uVar1
              ,uVar5,param_2,uVar2,local_28);
    }
    if ((((char)local_38 != -1) && ((local_38 & 0xc0ff) != 0x80fe)) &&
       ((local_38 & 0xc0ff) != 0xc0fe)) {
      iVar3 = dhcp6_find_listval(param_1,param_3,&local_40,0);
      if (iVar3 == 0) {
        if ((local_3c == 0xffffffff) || ((local_40 != 0xffffffff && (local_40 <= local_3c)))) {
          iVar3 = dhcp6_add_listval(param_1,param_3,&local_40,0);
          return -(uint)(iVar3 == 0);
        }
        if (param_3 != 5) {
          uVar1 = in6addr2str(&local_38,0);
          dprintf(5,"add_prefix","%s has larger preferred lifetime than valid lifetime",uVar1);
          return -1;
        }
        uVar1 = in6addr2str(&local_38,0);
        pcVar4 = "%s/%d has larger preferred lifetime than valid lifetime";
        param_2 = local_28;
      }
      else if (param_3 == 5) {
        uVar1 = in6addr2str(&local_38,0);
        pcVar4 = "duplicated prefix: %s/%d for %s";
        param_2 = local_28;
      }
      else {
        uVar1 = in6addr2str(&local_38,0);
        pcVar4 = "duplicated address: %s for %s";
      }
      dprintf(5,"add_prefix",pcVar4,uVar1,param_2);
      return -1;
    }
    uVar5 = in6addr2str(&local_38,0);
    pcVar4 = "invalid prefix address: %s";
  }
  else {
    pcVar4 = "invalid prefix: %d";
  }
  dprintf(3,"add_prefix",pcVar4,uVar5);
  return -1;
}