undefined4 hapd_ioctl_param(int param_1,int *param_2,int param_3)

{
  undefined1 uVar1;
  int *piVar2;
  uint uVar3;
  code *pcVar4;
  char *pcVar5;
  uint uVar6;
  uint *puVar7;
  char *pcVar8;
  int iVar9;
  uint uVar10;
  int unaff_gp;
  uint local_68;
  uint local_64;
  char local_60 [2];
  ushort local_5e;
  byte local_5c;
  undefined1 auStack_5a [26];
  undefined1 auStack_40 [16];
  undefined1 auStack_30 [8];
  undefined1 auStack_28 [8];
  
  switch(*(short *)(param_3 + 0x16) + -1) {
  case 0:
LAB_0009284c:
    return 0xfffffff2;
  case 1:
    uVar3 = (uint)*(byte *)(*param_2 + 0xfc);
    if (param_1 != 0) {
      switch(param_2[uVar3 * 0x450 + 0x1477]) {
      case 0:
        local_68 = 1;
        break;
      case 1:
        local_68 = 2;
        break;
      case 2:
        local_68 = 3;
        break;
      case 3:
        local_68 = 4;
        break;
      case 4:
        local_68 = 0x14;
        break;
      case 5:
      default:
        pcVar5 = "%s: unknown AuthMode %d\n";
        pcVar8 = "hapd_param_authmode";
LAB_00091b94:
        printk(pcVar5,pcVar8)   //possible issue identified - semgrep
        return 0xfffffff2;
      case 6:
        local_68 = 8;
        break;
      case 7:
        local_68 = 0x18;
        break;
      case 8:
        local_68 = 0xc;
        break;
      case 9:
        local_68 = 0x1c;
      }
      uVar3 = *(uint *)(param_3 + 0x10);
      *(undefined2 *)(param_3 + 0x14) = 4;
      puVar7 = &local_68;
      if (((uVar3 + 4 | uVar3) & *(uint *)(unaff_gp + 0x18)) != 0) {
        return 0xfffffff2;
      }
LAB_00091bdc:
      iVar9 = 4;
      local_64 = local_68;
      __copy_user(uVar3,puVar7);
      if (iVar9 != 0) {
        return 0xfffffff2;
      }
      return 0;
    }
    iVar9 = 4;
    if ((((*(uint *)(param_3 + 0x10) + 4 | *(uint *)(param_3 + 0x10)) & *(uint *)(unaff_gp + 0x18))
         != 0) || (__copy_user(&local_64), iVar9 != 0)) {
      pcVar5 = "%s: unable to copy_from_user() !!\n";
      pcVar8 = "hapd_param_authmode";
      goto LAB_00091eec;
    }
    switch(local_64) {
    case 1:
      param_2[uVar3 * 0x450 + 0x1477] = 0;
      goto LAB_00091990;
    case 2:
      piVar2 = param_2 + uVar3 * 0x450;
      iVar9 = 1;
      break;
    case 3:
      piVar2 = param_2 + uVar3 * 0x450;
      iVar9 = 2;
      break;
    case 4:
      piVar2 = param_2 + uVar3 * 0x450;
      iVar9 = 3;
      break;
    case 5:
    case 6:
    case 7:
    case 9:
    case 10:
    case 0xb:
    case 0xd:
    case 0xe:
    case 0xf:
    case 0x10:
    case 0x11:
    case 0x12:
    case 0x13:
    case 0x15:
    case 0x16:
    case 0x17:
    case 0x19:
    case 0x1a:
    case 0x1b:
      goto LAB_0009284c;
    case 8:
      piVar2 = param_2 + uVar3 * 0x450;
      iVar9 = 6;
      break;
    case 0xc:
      piVar2 = param_2 + uVar3 * 0x450;
      iVar9 = 8;
      break;
    case 0x14:
      piVar2 = param_2 + uVar3 * 0x450;
      iVar9 = 4;
      break;
    case 0x18:
      piVar2 = param_2 + uVar3 * 0x450;
      iVar9 = 7;
      break;
    case 0x1c:
      piVar2 = param_2 + uVar3 * 0x450;
      iVar9 = 9;
      break;
    default:
      return 0xfffffff2;
    }
    piVar2[0x1477] = iVar9;
LAB_00091990:
    piVar2 = param_2 + 0x173ce;
    iVar9 = 0;
    do {
      if (*piVar2 == 1) {
        *(undefined2 *)((int)piVar2 + 0x1f2) = 2;
      }
      iVar9 = iVar9 + 1;
      piVar2 = piVar2 + 0x288;
    } while (iVar9 != 0x20);
    local_64 = param_2[uVar3 * 0x450 + 0x1478];
    iVar9 = param_2[uVar3 * 0x450 + 0x1477];
    *(undefined1 *)((int)param_2 + uVar3 * 0x1140 + 0x52d7) = 2;
    goto LAB_00091cf8;
  case 2:
    uVar3 = *(uint *)(param_3 + 0x10);
    uVar10 = (uint)*(byte *)(*param_2 + 0xfc);
    if (param_1 == 0) {
      if (((uVar3 | uVar3 + 4) & *(uint *)(unaff_gp + 0x18)) == 0) {
        iVar9 = 4;
        __copy_user(&local_64,uVar3);
        if (iVar9 == 0) {
          *(bool *)((int)param_2 + uVar10 * 0x1140 + 0x52b5) = local_64 != 0;
          return 0;
        }
      }
      pcVar5 = "%s: unable to copy_from_user() !!\n";
      pcVar8 = "hapd_param_ieee8021x";
      goto LAB_00091eec;
    }
    local_68 = (uint)*(byte *)((int)param_2 + uVar10 * 0x1140 + 0x52b5);
    *(undefined2 *)(param_3 + 0x14) = 4;
    puVar7 = &local_68;
    if (((uVar3 | uVar3 + 4) & *(uint *)(unaff_gp + 0x18)) != 0) {
      return 0xfffffff2;
    }
    goto LAB_00091dc0;
  case 3:
    uVar3 = (uint)*(byte *)(*param_2 + 0xfc);
    if (param_1 != 0) {
      switch(param_2[uVar3 * 0x450 + 0x1478]) {
      case 0:
        local_68 = 1;
        break;
      case 1:
        local_68 = 0;
        break;
      case 2:
      case 3:
      case 5:
      case 7:
      default:
        pcVar5 = "%s: unknown encyption type %d\n";
        pcVar8 = "hapd_param_encrypt";
        goto LAB_00091b94;
      case 4:
        local_68 = 2;
        break;
      case 6:
        local_68 = 4;
        break;
      case 8:
        local_68 = 6;
      }
      uVar3 = *(uint *)(param_3 + 0x10);
      *(undefined2 *)(param_3 + 0x14) = 4;
      if (((uVar3 + 4 | uVar3) & *(uint *)(unaff_gp + 0x18)) != 0) {
        return 0xfffffff2;
      }
      puVar7 = &local_64;
      goto LAB_00091bdc;
    }
    iVar9 = 4;
    if ((((*(uint *)(param_3 + 0x10) + 4 | *(uint *)(param_3 + 0x10)) & *(uint *)(unaff_gp + 0x18))
         != 0) || (__copy_user(&local_68), iVar9 != 0)) {
      pcVar5 = "%s: unable to copy_from_user() !!\n";
      pcVar8 = "hapd_param_encrypt";
      goto LAB_00091eec;
    }
    uVar10 = local_68 & 6;
    if (uVar10 == 4) {
      iVar9 = 6;
LAB_00091ca4:
      param_2[uVar3 * 0x450 + 0x1478] = iVar9;
    }
    else {
      if (uVar10 == 6) {
        iVar9 = 8;
        goto LAB_00091ca4;
      }
      if (uVar10 == 2) {
        param_2[uVar3 * 0x450 + 0x1478] = 4;
      }
      else {
        param_2[uVar3 * 0x450 + 0x1478] = (local_68 ^ 1) & 1;
      }
    }
    if (3 < (uint)param_2[uVar3 * 0x450 + 0x1478]) {
      *(undefined1 *)(param_2 + uVar3 * 0x450 + 0x1490) = 1;
    }
    local_64 = param_2[uVar3 * 0x450 + 0x1478];
    iVar9 = param_2[uVar3 * 0x450 + 0x1477];
LAB_00091cf8:
    pcVar4 = RTMPMakeRSNIE;
LAB_0009275c:
    (*pcVar4)(param_2,iVar9,local_64);
    return 0;
  case 4:
    uVar3 = *(uint *)(param_3 + 0x10);
    if (param_1 == 0) {
      if (((uVar3 | uVar3 + 4) & *(uint *)(unaff_gp + 0x18)) == 0) {
        iVar9 = 4;
        __copy_user(&local_68,uVar3);
        if (iVar9 == 0) {
          *(char *)((int)param_2 + 0x16e11) = (char)local_68;
          return 0;
        }
      }
      pcVar5 = "%s: unable to copy_from_user() !!\n";
      pcVar8 = "hapd_param_iwevent";
      goto LAB_00091eec;
    }
    local_64 = (uint)*(byte *)((int)param_2 + 0x16e11);
    *(undefined2 *)(param_3 + 0x14) = 4;
    goto LAB_00091da4;
  case 5:
    if (param_1 == 0) {
      return 0xffffffea;
    }
    uVar3 = *(uint *)(param_3 + 0x10);
    local_64 = 0x16;
    *(undefined2 *)(param_3 + 0x14) = 4;
LAB_00091da4:
    if (((uVar3 + 4 | uVar3) & *(uint *)(unaff_gp + 0x18)) != 0) {
      return 0xfffffff2;
    }
    puVar7 = &local_64;
LAB_00091dc0:
    uVar10 = 4;
    __copy_user(uVar3,puVar7);
    break;
  case 6:
    if (param_1 == 0) {
      return 0xffffffea;
    }
    if (*(ushort *)(param_3 + 0x14) < 6) {
      return 0xffffffea;
    }
    iVar9 = 6;
    if ((((*(uint *)(param_3 + 0x10) + 6 | *(uint *)(param_3 + 0x10)) & *(uint *)(unaff_gp + 0x18))
         == 0) && (__copy_user(local_60), iVar9 == 0)) {
      iVar9 = MacTableLookup(param_2,local_60);
      if (iVar9 == 0) {
        pcVar5 = "%s: unable to find station !\n";
      }
      else {
        uVar3 = *(uint *)(param_3 + 0x10);
        if (*(char *)(iVar9 + 0x4b0) == '\x01') {
          *(undefined2 *)(param_3 + 0x14) = 0;
          if ((uVar3 & *(uint *)(unaff_gp + 0x18)) != 0) {
            return 0;
          }
          uVar10 = 0;
          __copy_user(uVar3,0);
        }
        else {
          *(ushort *)(param_3 + 0x14) = (ushort)*(byte *)(iVar9 + 0x32);
          uVar10 = (uint)*(byte *)(iVar9 + 0x32);
          if (((uVar3 | uVar3 + uVar10 | uVar10) & *(uint *)(unaff_gp + 0x18)) == 0) {
            __copy_user(uVar3,iVar9 + 0x33);
          }
        }
        if (uVar10 == 0) {
          return 0;
        }
        pcVar5 = "%s: unable to copy_to_user() !!\n";
      }
    }
    else {
      pcVar5 = "%s: unable to copy_from_user() !!\n";
    }
    pcVar8 = "hapd_param_wpaie";
LAB_00091eec:
    printk(pcVar5,pcVar8);
    return 0xfffffff2;
  case 7:
    uVar3 = (uint)*(byte *)(*param_2 + 0xfc);
    if (param_1 == 0) {
      uVar10 = 0x100;
      if (*(ushort *)(param_3 + 0x14) < 0x100) {
        uVar10 = (uint)*(ushort *)(param_3 + 0x14);
      }
      param_2[uVar3 * 0x450 + 0x1837] = uVar10;
      if (((*(uint *)(param_3 + 0x10) + uVar10 | *(uint *)(param_3 + 0x10) | uVar10) &
          *(uint *)(unaff_gp + 0x18)) == 0) {
        __copy_user((int)param_2 + uVar3 * 0x1140 + 0x5fdb);
      }
      if (uVar10 == 0) {
        APMakeAllBssBeacon(param_2);
        APUpdateAllBeaconFrame(param_2);
        return 0;
      }
      return 0xfffffff2;
    }
    uVar6 = *(uint *)(param_3 + 0x10);
    *(short *)(param_3 + 0x14) = (short)param_2[uVar3 * 0x450 + 0x1837];
    uVar10 = param_2[uVar3 * 0x450 + 0x1837];
    if (((uVar6 + uVar10 | uVar6 | uVar10) & *(uint *)(unaff_gp + 0x18)) == 0) {
      __copy_user(uVar6,(int)param_2 + uVar3 * 0x1140 + 0x5fdb);
    }
    break;
  case 8:
    uVar3 = (uint)*(byte *)(*param_2 + 0xfc);
    if (param_1 == 0) {
      uVar10 = 0x100;
      if (*(ushort *)(param_3 + 0x14) < 0x100) {
        uVar10 = (uint)*(ushort *)(param_3 + 0x14);
      }
      param_2[uVar3 * 0x450 + 0x1878] = uVar10;
      if (((*(uint *)(param_3 + 0x10) + uVar10 | *(uint *)(param_3 + 0x10) | uVar10) &
          *(uint *)(unaff_gp + 0x18)) == 0) {
        __copy_user(param_2 + uVar3 * 0x450 + 0x1838);
      }
    }
    else {
      uVar6 = *(uint *)(param_3 + 0x10);
      *(short *)(param_3 + 0x14) = (short)param_2[uVar3 * 0x450 + 0x1878];
      uVar10 = param_2[uVar3 * 0x450 + 0x1878];
      if (((uVar6 + uVar10 | uVar6 | uVar10) & *(uint *)(unaff_gp + 0x18)) == 0) {
        __copy_user(uVar6,param_2 + uVar3 * 0x450 + 0x1838);
      }
    }
    break;
  case 9:
    uVar3 = (uint)*(byte *)(*param_2 + 0xfc);
    if (param_1 == 0) {
      uVar10 = 0x100;
      if (*(ushort *)(param_3 + 0x14) < 0x100) {
        uVar10 = (uint)*(ushort *)(param_3 + 0x14);
      }
      param_2[uVar3 * 0x450 + 0x18b9] = uVar10;
      if (((*(uint *)(param_3 + 0x10) + uVar10 | *(uint *)(param_3 + 0x10) | uVar10) &
          *(uint *)(unaff_gp + 0x18)) == 0) {
        __copy_user(param_2 + uVar3 * 0x450 + 0x1879);
      }
    }
    else {
      uVar6 = *(uint *)(param_3 + 0x10);
      *(short *)(param_3 + 0x14) = (short)param_2[uVar3 * 0x450 + 0x18b9];
      uVar10 = param_2[uVar3 * 0x450 + 0x18b9];
      if (((uVar6 + uVar10 | uVar6 | uVar10) & *(uint *)(unaff_gp + 0x18)) == 0) {
        __copy_user(uVar6,param_2 + uVar3 * 0x450 + 0x1879);
      }
    }
    break;
  case 10:
    uVar3 = *(uint *)(*param_2 + 0xfc);
    if (param_1 != 0) {
      return 0xffffffea;
    }
    if (*(ushort *)(param_3 + 0x14) < 0x40) {
      return 0xffffffea;
    }
    if (((*(uint *)(param_3 + 0x10) + 0x40 | *(uint *)(param_3 + 0x10)) & *(uint *)(unaff_gp + 0x18)
        ) != 0) {
      return 0xfffffff2;
    }
    iVar9 = 0x40;
    __copy_user(local_60);
    if (iVar9 != 0) {
      return 0xfffffff2;
    }
    if (0x20 < local_5c) {
      return 0xfffffff9;
    }
    uVar10 = (uint)local_5e;
    uVar3 = uVar3 & 0xff;
    if (uVar10 != 0xffff) {
      *(char *)(param_2 + uVar3 * 0x450 + 0x1490) = (char)local_5e;
      AsicUpdateWCIDIVEIV(param_2,(*(byte *)(param_2 + 0x2c) - 3) + uVar3 & 0xffff);
      iVar9 = uVar3 * 0x10c + uVar10 * 0x43;
      memset((void *)((int)param_2 + iVar9 + 0x755b4),0,0x10)   //possible issue identified - semgrep
      if (local_5c == 0) {
        *(undefined1 *)((int)param_2 + iVar9 + 0x755d5) = 0x10;
      }
      else {
        *(byte *)((int)param_2 + iVar9 + 0x755d5) = local_5c;
      }
      iVar9 = uVar3 * 0x10c + uVar10 * 0x43;
      memcpy((void *)((int)param_2 + iVar9 + 0x75594),auStack_40,(uint)local_5c)   //possible issue identified - semgrep
      if (local_5c == 0x20) {
        memcpy((void *)((int)param_2 + iVar9 + 0x755a4),auStack_30,8)   //possible issue identified - semgrep
        memcpy((void *)((int)param_2 + iVar9 + 0x755ac),auStack_28,8)   //possible issue identified - semgrep
      }
      if (local_60[0] == '\x02') {
        iVar9 = uVar3 * 0x10c + uVar10 * 0x43;
        uVar1 = 3;
      }
      else {
        if (local_60[0] == '\x04') {
          *(undefined1 *)((int)param_2 + uVar3 * 0x10c + uVar10 * 0x43 + 0x755d4) = 4;
          goto LAB_00092568;
        }
        if (local_60[0] != '\x01') {
          *(undefined1 *)((int)param_2 + uVar3 * 0x10c + uVar10 * 0x43 + 0x755d4) = 0;
          goto LAB_00092568;
        }
        if ((local_5c != 5) && (local_5c != 10)) {
          *(undefined1 *)((int)param_2 + uVar3 * 0x10c + uVar10 * 0x43 + 0x755d4) = 2;
          goto LAB_00092568;
        }
        iVar9 = uVar3 * 0x10c + uVar10 * 0x43;
        uVar1 = 1;
      }
      *(undefined1 *)((int)param_2 + iVar9 + 0x755d4) = uVar1;
LAB_00092568:
      iVar9 = uVar10 * 0x43 + uVar3 * 0x10c;
      AsicAddSharedKeyEntry(param_2,uVar3,uVar10 & 0xff,(int)param_2 + iVar9 + 0x75594);
      RTMPAddWcidAttributeEntry
                (param_2,uVar3,uVar10 & 0xff,*(undefined1 *)((int)param_2 + iVar9 + 0x755d4),0);
      return 0;
    }
    iVar9 = MacTableLookup(param_2,auStack_5a);
    if (iVar9 == 0) {
      return 0xfffffffe;
    }
    memset((void *)(iVar9 + 0x1f8),0,0x43)   //possible issue identified - semgrep
    AsicUpdateWCIDIVEIV(param_2,*(undefined2 *)(iVar9 + 0x27e),0,0);
    if (local_5c == 0) {
      *(undefined1 *)(iVar9 + 0x239) = 0x10;
    }
    else {
      *(byte *)(iVar9 + 0x239) = local_5c;
    }
    memcpy((void *)(iVar9 + 0x1f8),auStack_40,(uint)local_5c)   //possible issue identified - semgrep
    if (local_5c == 0x20) {
      memcpy((void *)(iVar9 + 0x208),auStack_30,8)   //possible issue identified - semgrep
      memcpy((void *)(iVar9 + 0x210),auStack_28,8)   //possible issue identified - semgrep
    }
    uVar1 = 3;
    if (local_60[0] != '\x02') {
      if (local_60[0] == '\x04') {
        *(undefined1 *)(iVar9 + 0x238) = 4;
        goto LAB_000922ec;
      }
      if (local_60[0] != '\x01') {
        *(undefined1 *)(iVar9 + 0x238) = 0;
        goto LAB_000922ec;
      }
      if ((local_5c != 5) && (local_5c != 10)) {
        *(undefined1 *)(iVar9 + 0x238) = 2;
        goto LAB_000922ec;
      }
      uVar1 = 1;
    }
    *(undefined1 *)(iVar9 + 0x238) = uVar1;
LAB_000922ec:
    AsicAddPairwiseKeyEntry(param_2,*(undefined1 *)(iVar9 + 0x27e),(void *)(iVar9 + 0x1f8));
    RTMPAddWcidAttributeEntry
              (param_2,*(undefined1 *)(iVar9 + 0x31),0,*(undefined1 *)(iVar9 + 0x238),iVar9);
    *(undefined1 *)(iVar9 + 0x1f0) = 10;
    *(undefined4 *)(iVar9 + 500) = 0;
    *(undefined2 *)(iVar9 + 0x1f2) = 1;
    *(undefined1 *)((int)param_2 + (uint)*(byte *)(iVar9 + 0x31) * 0x1140 + 0x52d7) = 1;
    return 0;
  case 0xb:
    uVar3 = *(uint *)(*param_2 + 0xfc);
    if (param_1 != 0) {
      return 0xffffffea;
    }
    if (*(ushort *)(param_3 + 0x14) < 0x40) {
      return 0xfffffff2;
    }
    if (((*(uint *)(param_3 + 0x10) + 0x40 | *(uint *)(param_3 + 0x10)) & *(uint *)(unaff_gp + 0x18)
        ) != 0) {
      return 0xfffffff2;
    }
    iVar9 = 0x40;
    __copy_user(local_60);
    local_64 = (uint)local_5e;
    if (iVar9 != 0) {
      return 0xfffffff2;
    }
    if (local_64 == 0xffff) {
      iVar9 = MacTableLookup(param_2,auStack_5a);
      if (iVar9 == 0) {
        return 0;
      }
      memset((void *)(iVar9 + 0x1f8),0,0x43)   //possible issue identified - semgrep
      AsicRemovePairwiseKeyEntry(param_2,*(undefined1 *)(iVar9 + 0x27e));
      return 0;
    }
    uVar3 = uVar3 & 0xff;
    iVar9 = uVar3 * 0x10c + local_64 * 0x43;
    *(undefined1 *)((int)param_2 + iVar9 + 0x755d5) = 0;
    *(undefined1 *)((int)param_2 + iVar9 + 0x755d4) = 0;
    local_64 = local_64 & 0xff;
    pcVar4 = AsicRemoveSharedKeyEntry;
    goto LAB_00092800;
  case 0xc:
    if (param_1 != 0) {
      return 0xffffffea;
    }
    if (*(ushort *)(param_3 + 0x14) < 8) {
      return 0xfffffff2;
    }
    if (((*(uint *)(param_3 + 0x10) + 8 | *(uint *)(param_3 + 0x10)) & *(uint *)(unaff_gp + 0x18))
        != 0) {
      return 0xfffffff2;
    }
    iVar9 = 8;
    __copy_user(local_60);
    if (iVar9 != 0) {
      return 0xfffffff2;
    }
    memcpy(&local_64,local_60,2)   //possible issue identified - semgrep
    iVar9 = MacTableLookup(param_2,&local_5e);
    if (iVar9 == 0) {
      return 0;
    }
    local_64 = local_64 & 0xffff;
    pcVar4 = MlmeDeAuthAction;
    goto LAB_0009275c;
  case 0xd:
    if (param_1 != 0) {
      return 0xffffffea;
    }
    if (*(ushort *)(param_3 + 0x14) < 8) {
      return 0xfffffff2;
    }
    if (((*(uint *)(param_3 + 0x10) + 8 | *(uint *)(param_3 + 0x10)) & *(uint *)(unaff_gp + 0x18))
        != 0) {
      return 0xfffffff2;
    }
    iVar9 = 8;
    __copy_user(local_60);
    if (iVar9 != 0) {
      return 0xfffffff2;
    }
    memcpy(&local_64,local_60,2)   //possible issue identified - semgrep
    uVar3 = MacTableLookup(param_2,&local_5e);
    if (uVar3 == 0) {
      return 0;
    }
    local_64 = local_64 & 0xffff;
    pcVar4 = HapdDeauthAction;
LAB_00092800:
    (*pcVar4)(param_2,uVar3,local_64);
    return 0;
  default:
    printk("%s: unsupported parameter %d\n","hapd_ioctl_param");
    return 0xffffffea;
  }
  if (uVar10 != 0) {
    return 0xfffffff2;
  }
  return 0;
}