blob: d62bf9f62a66e8b383157c37c57a17b46fde3edd [file] [log] [blame]
/*
* wl mfp command module
*
* Broadcom Proprietary and Confidential. Copyright (C) 2017,
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom;
* the contents of this file may not be disclosed to third parties, copied
* or duplicated in any form, in whole or in part, without the prior
* written permission of Broadcom.
*
*
* <<Broadcom-WL-IPTag/Proprietary:>>
*
* $Id: wluc_mfp.c 458728 2014-02-27 18:15:25Z $
*/
#ifdef WIN32
#include <windows.h>
#endif
#include <wlioctl.h>
#if defined(DONGLEBUILD)
#include <typedefs.h>
#include <osl.h>
#endif
/* Because IL_BIGENDIAN was removed there are few warnings that need
* to be fixed. Windows was not compiled earlier with IL_BIGENDIAN.
* Hence these warnings were not seen earlier.
* For now ignore the following warnings
*/
#ifdef WIN32
#pragma warning(push)
#pragma warning(disable : 4244)
#pragma warning(disable : 4761)
#endif
#include <bcmutils.h>
#include <bcmendian.h>
#include "wlu_common.h"
#include "wlu.h"
static int wl_mfp_config(void *wl, cmd_t *cmd, char **argv);
static int wl_mfp_sha256(void *wl, cmd_t *cmd, char **argv);
static int wl_mfp_sa_query(void *wl, cmd_t *cmd, char **argv);
static int wl_mfp_disassoc(void *wl, cmd_t *cmd, char **argv);
static int wl_mfp_deauth(void *wl, cmd_t *cmd, char **argv);
static int wl_mfp_assoc(void *wl, cmd_t *cmd, char **argv);
static int wl_mfp_auth(void *wl, cmd_t *cmd, char **argv);
static int wl_mfp_reassoc(void *wl, cmd_t *cmd, char **argv);
static cmd_t wl_mfp_cmds[] = {
{ "mfp_config", wl_mfp_config, -1, WLC_SET_VAR,
"Config PMF capability\n"
"\tusage: wl mfp 0/disable, 1/capable, 2/requred" },
{ "mfp_sha256", wl_mfp_sha256, WLC_GET_VAR, WLC_SET_VAR,
"Config SHA256 capability\n"
"\tusage: wl sha256 0/disable, 1/enable" },
{ "mfp_sa_query", wl_mfp_sa_query, -1, WLC_SET_VAR,
"Send a sa query req/resp to a peer\n"
"\tusage: wl mfp_sa_query flag action id" },
{ "mfp_disassoc", wl_mfp_disassoc, WLC_GET_VAR, WLC_SET_VAR,
"send bogus disassoc\n"
"\tUsage: wl mfp_disassoc"},
{ "mfp_deauth", wl_mfp_deauth, WLC_GET_VAR, WLC_SET_VAR,
"send bogus deauth\n"
"\tUsage: wl mfp_dedauth"},
{ "mfp_assoc", wl_mfp_assoc, WLC_GET_VAR, WLC_SET_VAR,
"send assoc\n"
"\tUsage: wl mfp_assoc"},
{ "mfp_auth", wl_mfp_auth, WLC_GET_VAR, WLC_SET_VAR,
"send auth\n"
"\tUsage: wl mfp_auth"},
{ "mfp_reassoc", wl_mfp_reassoc, WLC_GET_VAR, WLC_SET_VAR,
"send reassoc\n"
"\tUsage: wl mfp_reassoc"},
{ NULL, NULL, 0, 0, NULL }
};
static char *buf;
/* module initialization */
void
wluc_mfp_module_init(void)
{
/* get the global buf */
buf = wl_get_buf();
/* register mfp commands */
wl_module_cmds_register(wl_mfp_cmds);
}
static int
wl_mfp_config(void *wl, cmd_t *cmd, char **argv)
{
int argc;
int err = 0;
int flag = 0;
const char *cmdname = "mfp";
UNUSED_PARAMETER(cmd);
/* arg count */
for (argc = 0; argv[argc]; argc++)
;
if (argc > 1 && argv[1]) {
flag = htod32(atoi(argv[1]));
*(int *)buf = flag;
}
err = wlu_iovar_set(wl, cmdname, buf, 256);
return (err);
}
static int
wl_mfp_sha256(void *wl, cmd_t *cmd, char **argv)
{
int argc;
int err = 0;
int flag = 0;
const char *cmdname = "mfp_sha256";
UNUSED_PARAMETER(cmd);
/* arg count */
for (argc = 0; argv[argc]; argc++)
;
if (argc > 1 && argv[1]) {
flag = htod32(atoi(argv[1]));
*(int *)buf = flag;
err = wlu_iovar_set(wl, cmdname, buf, 256);
} else {
/* get */
err = wlu_iovar_getint(wl, cmdname, &flag);
if (err == BCME_OK)
printf("%d\n", flag);
}
return (err);
}
static int
wl_mfp_sa_query(void *wl, cmd_t *cmd, char **argv)
{
wl_sa_query_t * query;
int argc;
int err = 0;
UNUSED_PARAMETER(cmd);
/* arg count */
for (argc = 0; argv[argc]; argc++)
;
if ((query = (wl_sa_query_t *) malloc(sizeof(wl_sa_query_t))) == NULL) {
printf("unable to allocate frame \n");
return BCME_NOMEM;
}
memset(query, 0, sizeof(wl_sa_query_t));
/* add the flag */
if (argc > 1 && argv[1]) {
query->flag = htod32(atoi(argv[1]));
}
/* add the action */
if (argc > 2 && argv[2]) {
query->action = htod32(atoi(argv[2]));
}
/* add the id */
if (argc > 3 && argv[3]) {
query->id = htod32(atoi(argv[3]));
}
err = wlu_var_setbuf(wl, "mfp_sa_query", query, sizeof(wl_sa_query_t));
free(query);
return (err);
}
static int
wl_mfp_disassoc(void *wl, cmd_t *cmd, char **argv)
{
const char *cmdname = "mfp_disassoc";
int argc;
int flag;
char varbuf[256];
int err;
UNUSED_PARAMETER(cmd);
memset(varbuf, 0, 256);
/* arg count */
for (argc = 0; argv[argc]; argc++)
;
/* add the action */
if (argc > 1 && argv[1]) {
flag = htod32(atoi(argv[1]));
*(int *)varbuf = flag;
}
if (argc > 2 && argv[2]) {
flag = htod32(atoi(argv[2]));
*(int *)(varbuf + sizeof(flag)) = flag;
}
err = wlu_iovar_set(wl, cmdname, varbuf, 256);
return err;
}
static int
wl_mfp_deauth(void *wl, cmd_t *cmd, char **argv)
{
const char *cmdname = "mfp_deauth";
int argc;
int flag;
char varbuf[256];
int err;
UNUSED_PARAMETER(cmd);
memset(varbuf, 0, 256);
/* arg count */
for (argc = 0; argv[argc]; argc++)
;
/* add the action */
if (argc > 1 && argv[1]) {
flag = htod32(atoi(argv[1]));
*(int *)varbuf = flag;
}
if (argc > 2 && argv[2]) {
flag = htod32(atoi(argv[2]));
*(int *)(varbuf + sizeof(flag)) = flag;
}
err = wlu_iovar_set(wl, cmdname, varbuf, 256);
return err;
}
static int
wl_mfp_assoc(void *wl, cmd_t *cmd, char **argv)
{
const char *cmdname = "mfp_assoc";
int argc;
int flag;
char varbuf[256];
int err;
UNUSED_PARAMETER(cmd);
memset(varbuf, 0, 256);
/* arg count */
for (argc = 0; argv[argc]; argc++)
;
/* add the action */
if (argc > 1 && argv[1]) {
flag = htod32(atoi(argv[1]));
*(int *)varbuf = flag;
}
if (argc > 2 && argv[2]) {
flag = htod32(atoi(argv[2]));
*(int *)(varbuf + sizeof(int)) = flag;
}
err = wlu_iovar_set(wl, cmdname, varbuf, 256);
return err;
}
static int
wl_mfp_auth(void *wl, cmd_t *cmd, char **argv)
{
const char *cmdname = "mfp_auth";
int argc;
int flag;
char varbuf[256];
int err;
UNUSED_PARAMETER(cmd);
memset(varbuf, 0, 256);
/* arg count */
for (argc = 0; argv[argc]; argc++)
;
/* add the action */
if (argc > 1 && argv[1]) {
flag = htod32(atoi(argv[1]));
*(int *)varbuf = flag;
}
if (argc > 2 && argv[2]) {
flag = htod32(atoi(argv[2]));
*(int *)(varbuf + sizeof(int)) = flag;
}
err = wlu_iovar_set(wl, cmdname, varbuf, 256);
return err;
}
static int
wl_mfp_reassoc(void *wl, cmd_t *cmd, char **argv)
{
const char *cmdname = "mfp_reassoc";
int argc;
int flag;
char varbuf[256];
int err;
UNUSED_PARAMETER(cmd);
memset(varbuf, 0, 256);
/* arg count */
for (argc = 0; argv[argc]; argc++)
;
/* add the action */
if (argc > 1 && argv[1]) {
flag = htod32(atoi(argv[1]));
*(int *)varbuf = flag;
}
if (argc > 2 && argv[2]) {
flag = htod32(atoi(argv[2]));
*(int *)(varbuf + sizeof(int)) = flag;
}
err = wlu_iovar_set(wl, cmdname, varbuf, 256);
return err;
}