diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-10-03 15:59:49 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-10-03 15:59:49 -0700 |
commit | 13fc20b0eed39084b6b0fbaf55696c7688796706 (patch) | |
tree | c7f222a094a61d74c3c6aa0d06d30f99022889fe /control/NodeControlService.cpp | |
parent | 351db7f1a06721628c46a89d74f242979d31085a (diff) | |
download | infinitytier-13fc20b0eed39084b6b0fbaf55696c7688796706.tar.gz infinitytier-13fc20b0eed39084b6b0fbaf55696c7688796706.zip |
Add inject (undocumented in help) to NodeControlService.
Diffstat (limited to 'control/NodeControlService.cpp')
-rw-r--r-- | control/NodeControlService.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/control/NodeControlService.cpp b/control/NodeControlService.cpp index 285eae58..ea07634e 100644 --- a/control/NodeControlService.cpp +++ b/control/NodeControlService.cpp @@ -30,6 +30,7 @@ #include <stdlib.h> #include "../node/Constants.hpp" +#include "../node/MAC.hpp" #include "NodeControlService.hpp" #include "NodeControlClient.hpp" #include "../node/Node.hpp" @@ -118,6 +119,7 @@ void NodeControlService::_doCommand(IpcConnection *ipcc,const char *commandLine) ipcc->printf("200 help leave <network ID>"ZT_EOL_S); ipcc->printf("200 help terminate [<reason>]"ZT_EOL_S); ipcc->printf("200 help updatecheck"ZT_EOL_S); + //ipcc->printf("200 help inject <network ID> <from MAC> <to MAC> <ethertype(hex)> <string>"); } else if (cmd[0] == "auth") { if ((cmd.size() > 1)&&(_authToken.length() > 0)&&(_authToken == cmd[1])) { Mutex::Lock _l(_connections_m); @@ -227,12 +229,29 @@ void NodeControlService::_doCommand(IpcConnection *ipcc,const char *commandLine) } else { ipcc->printf("200 OK"ZT_EOL_S); } + } else if (cmd[0] == "inject") { + if (cmd.size() >= 6) { + MAC from,to; + unsigned char from2[6]; + unsigned char to2[6]; + from.fromString(cmd[2].c_str()); + to.fromString(cmd[3].c_str()); + from.copyTo(from2,6); + to.copyTo(to2,6); + if (_node->injectPacketFromHost(Utils::hexStrToU64(cmd[1].c_str()),from2,to2,Utils::hexStrToUInt(cmd[4].c_str()),cmd[5].c_str(),cmd[5].length()+1)) { + ipcc->printf("200 OK"ZT_EOL_S); + } else { + ipcc->printf("500 inject failed or not supported by this tap device"ZT_EOL_S); + } + } else { + ipcc->printf("400 missing required arguments"ZT_EOL_S); + } } else { ipcc->printf("404 %s No such command. Use 'help' for help."ZT_EOL_S,cmd[0].c_str()); } } - ipcc->printf("."ZT_EOL_S); // blank line ends response + ipcc->printf("."ZT_EOL_S); } } // namespace ZeroTier |