A little more iwpan logic.
This commit is contained in:
parent
fc4e819d21
commit
0e1fd20646
@ -34,6 +34,7 @@
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
@ -42,6 +43,31 @@
|
||||
#include "wireless/ieee802154.h"
|
||||
#include "wireless/iwpan.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* The address family that we used to create the socket really does not
|
||||
* matter. It should, however, be valid in the current configuration.
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_NET_IPv4)
|
||||
# define PF_INETX PF_INET
|
||||
#elif defined(CONFIG_NET_IPv6)
|
||||
# define PF_INETX PF_INET6
|
||||
#endif
|
||||
|
||||
/* SOCK_DGRAM is the preferred socket type to use when we just want a
|
||||
* socket for performing driver ioctls. However, we can't use SOCK_DRAM
|
||||
* if UDP is disabled.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_NET_UDP
|
||||
# define SOCK_IWPAN SOCK_DGRAM
|
||||
#else
|
||||
# define SOCK_IWPAN SOCK_STREAM
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
@ -67,36 +93,247 @@ typedef void (*cmd3_t)(int sock, FAR const char *arg1,
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
static void iwpan_show_cmd(int sock, FAR const char *ifname);
|
||||
static void iwpan_cca_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *ccastr);
|
||||
static void iwpan_chan_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *chanstr);
|
||||
static void iwpan_devmode_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *modstr);
|
||||
static void iwpan_eaddr_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *addrstr);
|
||||
static void iwpan_panid_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *panstr);
|
||||
static void iwpan_promisc_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *boolstr);
|
||||
static void iwpan_saddr_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *addrstr);
|
||||
static void iwpan_txpwr_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *pwrstr);
|
||||
|
||||
static void iwpan_showusage(FAR const char *progname, int exitcode);
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
static const struct iwpan_command_s g_iwpan_commands[] =
|
||||
{
|
||||
{"help", 0, (CODE void *)NULL},
|
||||
{"show", 1, (CODE void *)iwpan_show_cmd},
|
||||
{"cca", 2, (CODE void *)iwpan_cca_cmd},
|
||||
{"chan", 2, (CODE void *)iwpan_chan_cmd},
|
||||
{"devmode", 2, (CODE void *)iwpan_devmode_cmd},
|
||||
{"eaddr", 2, (CODE void *)iwpan_eaddr_cmd},
|
||||
{"panid", 2, (CODE void *)iwpan_panid_cmd},
|
||||
{"promisc", 2, (CODE void *)iwpan_promisc_cmd},
|
||||
{"saddr", 2, (CODE void *)iwpan_saddr_cmd},
|
||||
{"txpwr", 2, (CODE void *)iwpan_txpwr_cmd},
|
||||
};
|
||||
|
||||
#define NCOMMANDS (sizeof(g_iwpan_commands) / sizeof(struct iwpan_command_s))
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_str2int
|
||||
*
|
||||
* Description:
|
||||
* Convert a string to an integer value
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int iwpan_str2int(FAR const char *str)
|
||||
{
|
||||
FAR char *endptr;
|
||||
long value;
|
||||
|
||||
value = strtol(str, &endptr, 0);
|
||||
if (*endptr != '\0')
|
||||
{
|
||||
fprintf(stderr, "ERROR: Garbage after numeric argument\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (value > INT_MAX || value < INT_MIN)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Integer value out of range\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return (int)value;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_str2double
|
||||
*
|
||||
* Description:
|
||||
* Convert a string to a double value
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static double iwpan_str2double(FAR const char *str)
|
||||
{
|
||||
FAR char *endptr;
|
||||
double value;
|
||||
|
||||
value = strtod(str, &endptr);
|
||||
if (*endptr != '\0')
|
||||
{
|
||||
fprintf(stderr, "ERROR: Garbage after numeric argument\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_show_cmd
|
||||
*
|
||||
* Description:
|
||||
* Show all radio device settings
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void iwpan_show_cmd(int sock, FAR const char *ifname)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_cca_cmd
|
||||
*
|
||||
* Description:
|
||||
* Set radio device Clear Channel Assessment (CCA) thresholds.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void iwpan_cca_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *ccastr)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_chan_cmd
|
||||
*
|
||||
* Description:
|
||||
* Set radio device channel
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void iwpan_chan_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *chanstr)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_devmode_cmd
|
||||
*
|
||||
* Description:
|
||||
* Set radio device mode
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void iwpan_devmode_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *modstr)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_eaddr_cmd
|
||||
*
|
||||
* Description:
|
||||
* Set radio device extended address
|
||||
*
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void iwpan_eaddr_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *addrstr)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_panid_cmd
|
||||
*
|
||||
* Description:
|
||||
* Set radio device PAN ID.
|
||||
*
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void iwpan_panid_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *panstr)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_promisc_cmd
|
||||
*
|
||||
* Description:
|
||||
* Set radio device PAN ID.
|
||||
*
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void iwpan_promisc_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *boolstr)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_saddr_cmd
|
||||
*
|
||||
* Description:
|
||||
* Set radio device short address
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void iwpan_saddr_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *addrstr)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_txpwr_cmd
|
||||
*
|
||||
* Description:
|
||||
* Set radio device TX power
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void iwpan_txpwr_cmd(int sock, FAR const char *ifname,
|
||||
FAR const char *pwrstr)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: iwpan_showusage
|
||||
*
|
||||
* Description:
|
||||
* Show program usage.
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void iwpan_showusage(FAR const char *progname, int exitcode)
|
||||
{
|
||||
fprintf(stderr, "Usage:\n", progname);
|
||||
fprintf(stderr, "\t%s <command> <ifname> [OPTIONS]\n");
|
||||
fprintf(stderr, "\t%s <command> <ifname> [OPTIONS]\n", progname);
|
||||
fprintf(stderr, "\nWhere supported commands an [OPTIONS] appear below\n");
|
||||
fprintf(stderr, "\nRadio Query:\n");
|
||||
fprintf(stderr, "\t%s show <ifname>\n", progname);
|
||||
fprintf(stderr, "\nRadio Settings:\n");
|
||||
fprintf(stderr, "\t%s cca <ifname> <cca>\n", progname);
|
||||
fprintf(stderr, "\t%s cca <ifname> <hex cca>\n", progname);
|
||||
fprintf(stderr, "\t%s chan <ifname> <channel>\n", progname);
|
||||
fprintf(stderr, "\t%s devmode <ifname> <devmode>\n", progname);
|
||||
fprintf(stderr, "\t%s eaddr <ifname> <eaddr>\n", progname);
|
||||
@ -128,5 +365,93 @@ int main(int argc, FAR char *argv[])
|
||||
int iwpan_main(int argc, char *argv[])
|
||||
#endif
|
||||
{
|
||||
FAR const char *cmdname;
|
||||
FAR const struct iwpan_command_s *iwpancmd;
|
||||
int sock;
|
||||
int i;
|
||||
|
||||
/* Get the command */
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Missing command\n");
|
||||
iwpan_showusage(argv[0], EXIT_FAILURE);
|
||||
}
|
||||
|
||||
cmdname = argv[1];
|
||||
|
||||
/* Find the command in the g_iwpan_command[] list */
|
||||
|
||||
iwpancmd = NULL;
|
||||
for (i = 0; i < NCOMMANDS; i++)
|
||||
{
|
||||
FAR const struct iwpan_command_s *cmd = &g_iwpan_commands[i];
|
||||
if (strcmp(cmdname, cmd->name) == 0)
|
||||
{
|
||||
iwpancmd = cmd;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (iwpancmd == NULL)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unsupported command: %s\n", cmdname);
|
||||
iwpan_showusage(argv[0], EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (iwpancmd->noptions + 2 < argc)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Garbage at end of command ignored\n");
|
||||
}
|
||||
else if (iwpancmd->noptions + 2 > argc)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Missing required command options: %s\n",
|
||||
cmdname);
|
||||
iwpan_showusage(argv[0], EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Special case the help command which has no arguments, no handler,
|
||||
* and does not need a socket.
|
||||
*/
|
||||
|
||||
if (iwpancmd->handler == NULL)
|
||||
{
|
||||
iwpan_showusage(argv[0], EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
/* Create a communication socket */
|
||||
|
||||
sock = socket(PF_INETX, SOCK_IWPAN, 0);
|
||||
if (sock < 0)
|
||||
{
|
||||
fprintf(stderr, "ERROR: iwpan_make_socket() failed: %d\n", sock);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Dispatch the command handling */
|
||||
|
||||
switch (iwpancmd->noptions)
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
fprintf(stderr, "ERROR: Internal craziness\n");
|
||||
iwpan_showusage(argv[0], EXIT_FAILURE);
|
||||
|
||||
case 1:
|
||||
((cmd1_t)iwpancmd->handler)(sock, argv[2]);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
((cmd2_t)iwpancmd->handler)(sock, argv[2], argv[3]);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
((cmd3_t)iwpancmd->handler)(sock, argv[2], argv[3], argv[4]);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Close communication socket */
|
||||
|
||||
close(sock);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* apps/wireless/wapi/examples/network.c
|
||||
*
|
||||
* Copyright (C) 2011, 2017Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2011, 2017 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Adapted for Nuttx from WAPI:
|
||||
|
Loading…
Reference in New Issue
Block a user