blob: f7b78cb04b3d1b9e6d494953b69f491d633a4845 [file] [log] [blame]
/*
* Copyright (c) 2016, Nest Labs, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file contains definitions for the CLI interpreter.
*/
#ifndef CLI_HPP_
#define CLI_HPP_
#include <stdarg.h>
#include <cli/cli_server.hpp>
#include <net/icmp6.hpp>
namespace Thread {
/**
* @namespace Thread::Cli
*
* @brief
* This namespace contains definitions for the CLI interpreter.
*
*/
namespace Cli {
/**
* This class implements the response buffer for CLI command results.
*
*/
class ResponseBuffer
{
public:
/**
* This method initializes the response buffer.
*
*/
void Init(void) { mEnd = mBuffer; }
/**
* This method appends output according to the format string.
*
* @param[in] fmt A pointer to the NULL-terminated format string.
* @param[in] ... Arguments for the format specification.
*
*/
void Append(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vsnprintf(mEnd, sizeof(mBuffer) - (mEnd - mBuffer), fmt, ap);
va_end(ap);
mEnd += strlen(mEnd);
}
/**
* This method returns a pointer to the response string.
*
* @returns A pointer to the response string.
*
*/
const char *GetResponse(void) { return mBuffer; }
/**
* This method returns the length of the response string.
*
* @returns The length to the response string.
*
*/
uint16_t GetResponseLength(void) { return mEnd - mBuffer; }
private:
char mBuffer[512];
char *mEnd;
};
/**
* This structure represents a CLI command.
*
*/
struct Command
{
const char *mName; ///< A pointer to the command string.
void (*mCommand)(int argc, char *argv[]); ///< A function pointer to process the command.
};
/**
* This class implements the CLI interpreter.
*
*/
class Interpreter
{
public:
/**
* This method interprets a CLI command.
*
* @param[in] aBuf A pointer to a string.
* @param[in] aBufLength The length of the string in bytes.
* @param[in] aServer A reference to the CLI server.
*
*/
static void ProcessLine(char *aBuf, uint16_t aBufLength, Server &aServer);
private:
enum
{
kMaxArgs = 8,
};
static void ProcessHelp(int argc, char *argv[]);
static void ProcessChannel(int argc, char *argv[]);
static void ProcessChildTimeout(int argc, char *argv[]);
static void ProcessContextIdReuseDelay(int argc, char *argv[]);
static void ProcessExtAddress(int argc, char *argv[]);
static void ProcessExtPanId(int argc, char *argv[]);
static void ProcessIpAddr(int argc, char *argv[]);
static ThreadError ProcessIpAddrAdd(int argc, char *argv[]);
static ThreadError ProcessIpAddrDel(int argc, char *argv[]);
static void ProcessKeySequence(int argc, char *argv[]);
static void ProcessLeaderWeight(int argc, char *argv[]);
static void ProcessMasterKey(int argc, char *argv[]);
static void ProcessMode(int argc, char *argv[]);
static void ProcessNetworkDataRegister(int argc, char *argv[]);
static void ProcessNetworkIdTimeout(int argc, char *argv[]);
static void ProcessNetworkName(int argc, char *argv[]);
static void ProcessPanId(int argc, char *argv[]);
static void ProcessPing(int argc, char *argv[]);
static void ProcessPrefix(int argc, char *argv[]);
static ThreadError ProcessPrefixAdd(int argc, char *argv[]);
static ThreadError ProcessPrefixRemove(int argc, char *argv[]);
static void ProcessReleaseRouterId(int argc, char *argv[]);
static void ProcessRoute(int argc, char *argv[]);
static ThreadError ProcessRouteAdd(int argc, char *argv[]);
static ThreadError ProcessRouteRemove(int argc, char *argv[]);
static void ProcessRouterUpgradeThreshold(int argc, char *argv[]);
static void ProcessRloc16(int argc, char *argv[]);
static void ProcessScan(int argc, char *argv[]);
static void ProcessShutdown(int argc, char *argv[]);
static void ProcessStart(int argc, char *argv[]);
static void ProcessState(int argc, char *argv[]);
static void ProcessStop(int argc, char *argv[]);
static void ProcessWhitelist(int argc, char *argv[]);
static void HandleEchoResponse(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
static void HandleActiveScanResult(otActiveScanResult *aResult);
static int Hex2Bin(const char *aHex, uint8_t *aBin, uint16_t aBinLength);
static ThreadError ParseLong(char *argv, long &value);
static const struct Command sCommands[];
static ResponseBuffer sResponse;
static otNetifAddress sAddress;
static Ip6::SockAddr sSockAddr;
static Ip6::IcmpEcho sIcmpEcho;
static Server *sServer;
static uint8_t sEchoRequest[];
};
} // namespace Cli
} // namespace Thread
#endif // CLI_HPP_