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