diff --git a/src/common/define_enum.h b/src/common/define_enum.h index 9c9a3394238a0df672927abd8b4c38fb4e04a71b..20dbbdcc3c145c98ea4c04cf5bd896fb9bd7bf92 100644 --- a/src/common/define_enum.h +++ b/src/common/define_enum.h @@ -175,6 +175,8 @@ enum HdcCommand { CMD_FORWARD_LIST, CMD_FORWARD_REMOVE, CMD_FORWARD_SUCCESS, + CMD_FORWARD_LIST_REVERSE, + CMD_FORWARD_REMOVE_REVERSE, // File commands CMD_FILE_INIT = 3000, CMD_FILE_CHECK, diff --git a/src/host/client.cpp b/src/host/client.cpp index 5340a8a3b3e14015fb62836868a85ca2501252b8..cffda2b42c6ee67f1e614ab645da4c7227436fb3 100755 --- a/src/host/client.cpp +++ b/src/host/client.cpp @@ -237,6 +237,8 @@ string HdcClient::AutoConnectKey(string &doCommand, const string &preConnectKey) vecNoConnectKeyCommand.push_back(CMDSTR_WAIT_FOR); vecNoConnectKeyCommand.push_back(CMDSTR_FORWARD_FPORT + " ls"); vecNoConnectKeyCommand.push_back(CMDSTR_FORWARD_FPORT + " rm"); + vecNoConnectKeyCommand.push_back(CMDSTR_FORWARD_RPORT + " ls"); + vecNoConnectKeyCommand.push_back(CMDSTR_FORWARD_RPORT + " rm"); for (string v : vecNoConnectKeyCommand) { if (!doCommand.compare(0, v.size(), v)) { isNoTargetCommand = true; diff --git a/src/host/server.cpp b/src/host/server.cpp index e45db0449c32eb82023cfa058c18dc2827dadb7b..f6299185d4f9488814adabe49cbe80e8e74bb671 100644 --- a/src/host/server.cpp +++ b/src/host/server.cpp @@ -638,7 +638,7 @@ bool HdcServer::FetchCommand(HSession hSession, const uint32_t channelId, const pdiNew->connectKey = hSession->connectKey; pdiNew->forwardDirection = (reinterpret_cast(payload))[0] == '1'; pdiNew->taskString = reinterpret_cast(payload); - AdminForwardMap(OP_ADD, STRING_EMPTY, pdiNew); + AdminForwardMap(OP_ADD, STRING_EMPTY, pdiNew, pdiNew->forwardDirection); Base::TryCloseHandle((uv_handle_t *)&hChannel->hChildWorkTCP); // detch client channel break; } @@ -685,22 +685,46 @@ void HdcServer::BuildForwardVisableLine(bool fullOrSimble, HForwardInfo hfi, str echo += buf; } -string HdcServer::AdminForwardMap(uint8_t opType, const string &taskString, HForwardInfo &hForwardInfoInOut) +void HdcServer::AddForwardForMap(const string &taskString, HForwardInfo &hForwardInfoInOut, bool isForward) +{ + HForwardInfo pfiNew = new(std::nothrow) HdcForwardInformation(); + if (pfiNew == nullptr) { + WRITE_LOG(LOG_FATAL, "AdminForwardMap new pfiNew failed"); + return; + } + *pfiNew = *hForwardInfoInOut; + pfiNew->forwardDirection = isForward; + uv_rwlock_wrlock(&forwardAdmin); + if (!mapForward[hForwardInfoInOut->taskString]) { + mapForward[hForwardInfoInOut->taskString] = pfiNew; + } + uv_rwlock_wrunlock(&forwardAdmin); +} + +void HdcServer::DeleteForwardForMap(const string &taskString, HForwardInfo &hForwardInfoInOut, bool isForward) +{ + uv_rwlock_wrlock(&forwardAdmin); + if (mapForward.count(taskString)) { + HForwardInfo hForwardInfo = mapForward[taskString]; + if (hForwardInfo->forwardDirection != isForward) { + uv_rwlock_wrunlock(&forwardAdmin); + return; + } + mapForward.erase(taskString); + if (hForwardInfo != nullptr) { + delete hForwardInfo; + } + } + uv_rwlock_wrunlock(&forwardAdmin); +} + +string HdcServer::AdminForwardMap(uint8_t opType, const string &taskString, HForwardInfo &hForwardInfoInOut, + bool isForward) { string sRet; switch (opType) { case OP_ADD: { - HForwardInfo pfiNew = new(std::nothrow) HdcForwardInformation(); - if (pfiNew == nullptr) { - WRITE_LOG(LOG_FATAL, "AdminForwardMap new pfiNew failed"); - break; - } - *pfiNew = *hForwardInfoInOut; - uv_rwlock_wrlock(&forwardAdmin); - if (!mapForward[hForwardInfoInOut->taskString]) { - mapForward[hForwardInfoInOut->taskString] = pfiNew; - } - uv_rwlock_wrunlock(&forwardAdmin); + AddForwardForMap(taskString, hForwardInfoInOut, isForward); break; } case OP_GET_STRLIST: @@ -709,9 +733,10 @@ string HdcServer::AdminForwardMap(uint8_t opType, const string &taskString, HFor map::iterator iter; for (iter = mapForward.begin(); iter != mapForward.end(); ++iter) { HForwardInfo di = iter->second; - if (!di) { + if (!di || di->forwardDirection != isForward) { continue; } + BuildForwardVisableLine(opType == OP_GET_STRLIST_FULL, di, sRet); } uv_rwlock_rdunlock(&forwardAdmin); @@ -726,15 +751,7 @@ string HdcServer::AdminForwardMap(uint8_t opType, const string &taskString, HFor break; } case OP_REMOVE: { - uv_rwlock_wrlock(&forwardAdmin); - if (mapForward.count(taskString)) { - HForwardInfo hForwardInfo = mapForward[taskString]; - mapForward.erase(taskString); - if (hForwardInfo != nullptr) { - delete hForwardInfo; - } - } - uv_rwlock_wrunlock(&forwardAdmin); + DeleteForwardForMap(taskString, hForwardInfoInOut, isForward); break; } default: diff --git a/src/host/server.h b/src/host/server.h index 0d1640af4e91002d3711b2119f9f14f89d4e5c75..35e5935cbd7be207215c8b2117ce22a99e88c7db 100755 --- a/src/host/server.h +++ b/src/host/server.h @@ -25,7 +25,9 @@ public: const int payloadSize) override; virtual string AdminDaemonMap(uint8_t opType, const string &connectKey, HDaemonInfo &hDaemonInfoInOut); void AdminDaemonMapForWait(const string &connectKey, HDaemonInfo &hDaemonInfoInOut); - string AdminForwardMap(uint8_t opType, const string &taskString, HForwardInfo &hForwardInfoInOut); + void AddForwardForMap(const string &taskString, HForwardInfo &hForwardInfoInOut, bool isForward); + void DeleteForwardForMap(const string &taskString, HForwardInfo &hForwardInfoInOut, bool isForward); + string AdminForwardMap(uint8_t opType, const string &taskString, HForwardInfo &hForwardInfoInOut, bool isForward); void CleanForwardMap(uint32_t sessionId); int CreateConnect(const string &connectKey, bool isCheck); bool Initial(const char *listenString); diff --git a/src/host/server_for_client.cpp b/src/host/server_for_client.cpp index ff763a17235778edc0a63e2bd4b5ffb7b8479bf1..a177e57e936a1b01b1c9bdc9b45766d2cd108d71 100755 --- a/src/host/server_for_client.cpp +++ b/src/host/server_for_client.cpp @@ -364,18 +364,17 @@ bool HdcServerForClient::CommandRemoveSession(HChannel hChannel, const char *con return true; } -bool HdcServerForClient::CommandRemoveForward(const string &forwardKey) +bool HdcServerForClient::CommandRemoveForward(const string &forwardKey, bool isForward) { - bool ret = RemoveFportkey("0|" + forwardKey); - ret |= RemoveFportkey("1|" + forwardKey); - return ret; + return isForward ? RemoveFportkey("1|" + forwardKey, isForward) : + RemoveFportkey("0|" + forwardKey, isForward); } -bool HdcServerForClient::RemoveFportkey(const string &forwardKey) +bool HdcServerForClient::RemoveFportkey(const string &forwardKey, bool isForward) { HdcServer *ptrServer = (HdcServer *)clsServer; HForwardInfo hfi = nullptr; - ptrServer->AdminForwardMap(OP_QUERY, forwardKey, hfi); + ptrServer->AdminForwardMap(OP_QUERY, forwardKey, hfi, isForward); if (!hfi) { WRITE_LOG(LOG_FATAL, "CommandRemoveForward hfi nullptr forwardKey:%s", forwardKey.c_str()); return false; @@ -383,13 +382,13 @@ bool HdcServerForClient::RemoveFportkey(const string &forwardKey) HSession hSession = ptrServer->AdminSession(OP_QUERY, hfi->sessionId, nullptr); if (!hSession) { WRITE_LOG(LOG_FATAL, "CommandRemoveForward hSession nullptr sessionId:%u", hfi->sessionId); - ptrServer->AdminForwardMap(OP_REMOVE, forwardKey, hfi); + ptrServer->AdminForwardMap(OP_REMOVE, forwardKey, hfi, isForward); return true; } ptrServer->ClearOwnTasks(hSession, hfi->channelId); FreeChannel(hfi->channelId); hfi = nullptr; - ptrServer->AdminForwardMap(OP_REMOVE, forwardKey, hfi); + ptrServer->AdminForwardMap(OP_REMOVE, forwardKey, hfi, isForward); return true; } @@ -450,26 +449,27 @@ bool HdcServerForClient::WaitForAny(HChannel hChannel) return true; } -bool HdcServerForClient::RemoveForward(HChannel hChannel, const char *parameterString) +bool HdcServerForClient::RemoveForward(HChannel hChannel, const char *parameterString, + bool isForward) { HdcServer *ptrServer = (HdcServer *)clsServer; if (parameterString == nullptr) { // remove all HForwardInfo hfi = nullptr; // dummy - string echo = ptrServer->AdminForwardMap(OP_GET_STRLIST, "", hfi); + string echo = ptrServer->AdminForwardMap(OP_GET_STRLIST, "", hfi, isForward); if (!echo.length()) { return false; } vector filterStrings; Base::SplitString(echo, string("\n"), filterStrings); for (auto &&s : filterStrings) { - if (CommandRemoveForward(s.c_str())) { + if (CommandRemoveForward(s.c_str(), isForward)) { EchoClient(hChannel, MSG_OK, "Remove forward ruler success, ruler:%s", s.c_str()); } else { EchoClient(hChannel, MSG_FAIL, "Remove forward ruler failed, ruler is not exist %s", s.c_str()); } } } else { // remove single - if (CommandRemoveForward(parameterString)) { + if (CommandRemoveForward(parameterString, isForward)) { EchoClient(hChannel, MSG_OK, "Remove forward ruler success, ruler:%s", parameterString); } else { EchoClient(hChannel, MSG_FAIL, "Remove forward ruler failed, ruler is not exist %s", parameterString); @@ -540,7 +540,7 @@ bool HdcServerForClient::DoCommandLocal(HChannel hChannel, void *formatCommandIn // task will be global task,Therefore, it can only be controlled in the global session. case CMD_FORWARD_LIST: { HForwardInfo hfi = nullptr; // dummy - string echo = ptrServer->AdminForwardMap(OP_GET_STRLIST_FULL, "", hfi); + string echo = ptrServer->AdminForwardMap(OP_GET_STRLIST_FULL, "", hfi, true); if (!echo.length()) { echo = EMPTY_ECHO; } @@ -548,7 +548,20 @@ bool HdcServerForClient::DoCommandLocal(HChannel hChannel, void *formatCommandIn break; } case CMD_FORWARD_REMOVE: { - RemoveForward(hChannel, formatCommand->parameters.c_str()); + RemoveForward(hChannel, formatCommand->parameters.c_str(), true); + break; + } + case CMD_FORWARD_LIST_REVERSE: { + HForwardInfo hfi = nullptr; // dummy + string echo = ptrServer->AdminForwardMap(OP_GET_STRLIST_FULL, "", hfi, false); + if (!echo.length()) { + echo = EMPTY_ECHO; + } + EchoClient(hChannel, MSG_OK, const_cast(echo.c_str())); + break; + } + case CMD_FORWARD_REMOVE_REVERSE: { + RemoveForward(hChannel, formatCommand->parameters.c_str(), false); break; } case CMD_KERNEL_ENABLE_KEEPALIVE: { @@ -704,7 +717,8 @@ bool HdcServerForClient::DoCommand(HChannel hChannel, void *formatCommandInput, TranslateCommand::FormatCommand *formatCommand = (TranslateCommand::FormatCommand *)formatCommandInput; if (!hChannel->hChildWorkTCP.loop || formatCommand->cmdFlag == CMD_FORWARD_REMOVE || - formatCommand->cmdFlag == CMD_SERVICE_START) { + formatCommand->cmdFlag == CMD_SERVICE_START || + formatCommand->cmdFlag == CMD_FORWARD_REMOVE_REVERSE) { // Main thread command, direct Listen main thread ret = DoCommandLocal(hChannel, formatCommandInput); } else { // CONNECT DAEMON's work thread command, non-primary thread diff --git a/src/host/server_for_client.h b/src/host/server_for_client.h index 7c540efd4b5e74332799ecd242e85495e3a34e99..8f31ec59648c8c1767e5be61e881bea23117aceb 100755 --- a/src/host/server_for_client.h +++ b/src/host/server_for_client.h @@ -44,14 +44,14 @@ private: int BindChannelToSession(HChannel hChannel, uint8_t *bufPtr, const int bytesIO); bool CheckAutoFillTarget(HChannel hChannel); bool CommandRemoveSession(HChannel hChannel, const char *connectKey); - bool CommandRemoveForward(const string &forwardKey); - bool RemoveFportkey(const string &forwardKey); + bool CommandRemoveForward(const string &forwardKey, bool isForward); + bool RemoveFportkey(const string &forwardKey, bool isForward); bool DoCommandLocal(HChannel hChannel, void *formatCommandInput); bool DoCommandRemote(HChannel hChannel, void *formatCommandInput); void GetTargetList(HChannel hChannel, void *formatCommandInput); bool GetAnyTarget(HChannel hChannel); bool WaitForAny(HChannel hChannel); - bool RemoveForward(HChannel hChannel, const char *parameterString); + bool RemoveForward(HChannel hChannel, const char *parameterString, bool isForward); bool TaskCommand(HChannel hChannel, void *formatCommandInput); void HandleRemote(HChannel hChannel, string ¶meters, RemoteType flag); int ChannelHandShake(HChannel hChannel, uint8_t *bufPtr, const int bytesIO); diff --git a/src/host/translate.cpp b/src/host/translate.cpp index ac7ee2ecbd253a2a786d1a6112aa6e08af06364b..86ab4ac824ddde90c0b5bbf88ff9271bc25bf2de 100755 --- a/src/host/translate.cpp +++ b/src/host/translate.cpp @@ -66,8 +66,10 @@ namespace TranslateCommand { " dev:\n" " jdwp: (remote only)\n" " ark:pid@tid@Debugger" - " fport ls - Display forward/reverse tasks\n" - " fport rm taskstr - Remove forward/reverse task by taskstring\n" + " fport ls - Display forward tasks\n" + " fport rm taskstr - Remove forward task by taskstring\n" + " rport ls - Display reverse tasks\n" + " rport rm taskstr - Remove reverse task by taskstring\n" "\n" "app commands:\n" " install [-r|-s] src - Send package(s) to device and install them\n" @@ -163,8 +165,10 @@ namespace TranslateCommand { " dev:\n" " jdwp: (remote only)\n" " ark:pid@tid@Debugger" - " fport ls - Display forward/reverse tasks\n" - " fport rm taskstr - Remove forward/reverse task by taskstring\n" + " fport ls - Display forward tasks\n" + " fport rm taskstr - Remove forward task by taskstring\n" + " rport ls - Display reverse tasks\n" + " rport rm taskstr - Remove reverse task by taskstring\n" "\n" "app commands:\n" " install [-r|-s] src - Send package(s) to device and install them\n" @@ -271,6 +275,15 @@ namespace TranslateCommand { if (strcmp(pExtra, "rm")) { outCmd->parameters = input + FORWORD_PORT_RM_BUF_SIZE; } + } else if (!strncmp(input, CMDSTR_FORWARD_RPORT.c_str(), CMDSTR_FORWARD_RPORT.size()) && + !strcmp(pExtra, "ls")) { + outCmd->cmdFlag = CMD_FORWARD_LIST_REVERSE; + } else if (!strncmp(input, CMDSTR_FORWARD_RPORT.c_str(), CMDSTR_FORWARD_RPORT.size()) && + !strncmp(pExtra, "rm", 2)) { // 2: "rm" size + outCmd->cmdFlag = CMD_FORWARD_REMOVE_REVERSE; + if (strcmp(pExtra, "rm")) { + outCmd->parameters = input + FORWORD_PORT_RM_BUF_SIZE; + } } else { const char *p = input + FORWORD_PORT_OTHER_BUF_SIZE; // clang-format off diff --git a/test/scripts/testModule/test_hdc_fport.py b/test/scripts/testModule/test_hdc_fport.py index 767528926cdcb4b219ce903bb16239718d0acd07..1c682a27e1e2baef0b915035b1a6d6261cc3a785 100644 --- a/test/scripts/testModule/test_hdc_fport.py +++ b/test/scripts/testModule/test_hdc_fport.py @@ -37,10 +37,10 @@ class TestXportCommand: netstat_line = get_shell_result(f'shell "netstat -anp | grep {local_port}"') assert "LISTEN" in netstat_line assert "hdcd" in netstat_line - fport_list = get_shell_result(f"fport ls") + fport_list = get_shell_result(f"rport ls") assert "Reverse" in fport_list assert rport_arg in fport_list - assert check_hdc_cmd(f"fport rm {rport_arg}", "success") + assert check_hdc_cmd(f"rport rm {rport_arg}", "success") @pytest.mark.L0 def test_fport_cmd(self): @@ -68,11 +68,11 @@ class TestXportCommand: for rport in rport_list: assert check_hdc_cmd(f"rport {rport}", "Forwardport result:OK") assert check_hdc_cmd(f"rport {rport}", "TCP Port listen failed at") - assert check_hdc_cmd("rport ls", rport) or check_hdc_cmd("fport ls", rport) + assert check_hdc_cmd("rport ls", rport) for rport in rport_list: - assert check_hdc_cmd(f"fport rm {rport}", "success") - assert not check_hdc_cmd("rport ls", fport) and not check_hdc_cmd("fport ls", fport) + assert check_hdc_cmd(f"rport rm {rport}", "success") + assert not check_hdc_cmd("rport ls", fport) task_str1 = "tcp:33333 tcp:33333" assert check_hdc_cmd(f"fport {task_str1}", "Forwardport result:OK") @@ -81,7 +81,18 @@ class TestXportCommand: assert check_hdc_cmd(f"fport rm {task_str1}", "success") task_str2 = "tcp:44444 tcp:44444" - assert check_hdc_cmd(f"rport {task_str2}", "Forwardport result:OK") + assert check_hdc_cmd(f"fport {task_str2}", "Forwardport result:OK") assert check_hdc_cmd(f"fport rm {task_str2}", "success") assert check_hdc_cmd(f"rport {task_str2}", "Forwardport result:OK") - assert check_hdc_cmd(f"fport rm {task_str2}", "success") + assert check_hdc_cmd(f"rport rm {task_str2}", "success") + + task_str3 = "tcp:12345 tcp:54321" + assert check_hdc_cmd(f"fport {task_str3}", "Forwardport result:OK") + assert check_hdc_cmd(f"rport {task_str3}", "Forwardport result:OK") + assert check_hdc_cmd("rport ls", task_str3) and check_hdc_cmd("rport ls", "[Reverse]") + assert check_hdc_cmd("fport ls", task_str3) and check_hdc_cmd("fport ls", "[Forward]") + assert check_hdc_cmd(f"fport rm {task_str3}", "success") + assert check_hdc_cmd("rport ls", task_str3) and check_hdc_cmd("rport ls", "[Reverse]") + assert not check_hdc_cmd("fport ls", task_str3) and not check_hdc_cmd("fport ls", "[Forward]") + assert check_hdc_cmd(f"rport rm {task_str3}", "success") + assert not check_hdc_cmd("rport ls", task_str3) and not check_hdc_cmd("rport ls", "[Reverse]")