blob: 8ff1e728709f9b7f4f57da35de54fd637d428181 [file] [log] [blame]
Hansong Zhang29f99002019-04-24 17:25:42 +00001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Hansong Zhang30bf8692019-05-02 15:25:54 -070017#include "stack_manager.h"
Hansong Zhang29f99002019-04-24 17:25:42 +000018
Hansong Zhanga4432622019-09-04 12:25:34 -070019#include <netinet/in.h>
20#include <sys/socket.h>
21#include <sys/types.h>
Hansong Zhang663ee012019-05-03 15:06:24 -070022#include <unistd.h>
Hansong Zhang29f99002019-04-24 17:25:42 +000023#include <csignal>
Hansong Zhang663ee012019-05-03 15:06:24 -070024#include <cstring>
Hansong Zhang29f99002019-04-24 17:25:42 +000025#include <string>
26#include <thread>
27
Hansong Zhang30bf8692019-05-02 15:25:54 -070028#include "facade/grpc_root_server.h"
29#include "grpc/grpc_module.h"
30#include "hal/hci_hal.h"
31#include "hal/hci_hal_host_rootcanal.h"
32#include "hal/snoop_logger.h"
Zach Johnsone0e158c2019-04-26 11:57:05 -070033
Hansong Zhang29f99002019-04-24 17:25:42 +000034using ::bluetooth::hal::HciHalHostRootcanalConfig;
Zach Johnsone0e158c2019-04-26 11:57:05 -070035using ::bluetooth::StackManager;
36using ::bluetooth::grpc::GrpcModule;
37using ::bluetooth::ModuleList;
Zach Johnson7ea20682019-04-29 14:48:42 -070038using ::bluetooth::os::Thread;
Hansong Zhang29f99002019-04-24 17:25:42 +000039
40namespace {
Hansong Zhang30bf8692019-05-02 15:25:54 -070041::bluetooth::facade::GrpcRootServer grpc_root_server;
Zach Johnsone0e158c2019-04-26 11:57:05 -070042
Hansong Zhang29f99002019-04-24 17:25:42 +000043void interrupt_handler(int) {
Hansong Zhang30bf8692019-05-02 15:25:54 -070044 grpc_root_server.StopServer();
Hansong Zhang29f99002019-04-24 17:25:42 +000045}
46} // namespace
47
48// The entry point for the binary with libbluetooth + facades
49int main(int argc, const char** argv) {
Hansong Zhang30bf8692019-05-02 15:25:54 -070050 int root_server_port = 8897;
51 int grpc_port = 8899;
Hansong Zhanga4432622019-09-04 12:25:34 -070052 int signal_port = 8895;
Zach Johnsone0e158c2019-04-26 11:57:05 -070053
Hansong Zhang30bf8692019-05-02 15:25:54 -070054 const std::string arg_grpc_root_server_port = "--root-server-port=";
55 const std::string arg_grpc_server_port = "--grpc-port=";
Hansong Zhang29f99002019-04-24 17:25:42 +000056 const std::string arg_rootcanal_port = "--rootcanal-port=";
Hansong Zhanga4432622019-09-04 12:25:34 -070057 const std::string arg_signal_port = "--signal-port=";
Hansong Zhang5158bf52019-04-30 14:52:43 -070058 const std::string arg_btsnoop_path = "--btsnoop=";
59 std::string btsnoop_path;
Hansong Zhang29f99002019-04-24 17:25:42 +000060 for (int i = 1; i < argc; i++) {
61 std::string arg = argv[i];
Hansong Zhang30bf8692019-05-02 15:25:54 -070062 if (arg.find(arg_grpc_root_server_port) == 0) {
63 auto port_number = arg.substr(arg_grpc_root_server_port.size());
64 root_server_port = std::stoi(port_number);
65 }
66 if (arg.find(arg_grpc_server_port) == 0) {
67 auto port_number = arg.substr(arg_grpc_server_port.size());
68 grpc_port = std::stoi(port_number);
Hansong Zhang29f99002019-04-24 17:25:42 +000069 }
70 if (arg.find(arg_rootcanal_port) == 0) {
71 auto port_number = arg.substr(arg_rootcanal_port.size());
72 HciHalHostRootcanalConfig::Get()->SetPort(std::stoi(port_number));
73 }
Hansong Zhang5158bf52019-04-30 14:52:43 -070074 if (arg.find(arg_btsnoop_path) == 0) {
75 btsnoop_path = arg.substr(arg_btsnoop_path.size());
76 ::bluetooth::hal::SnoopLogger::SetFilePath(btsnoop_path);
77 }
Hansong Zhanga4432622019-09-04 12:25:34 -070078 if (arg.find(arg_signal_port) == 0) {
79 auto port_number = arg.substr(arg_signal_port.size());
80 signal_port = std::stoi(port_number);
81 }
Hansong Zhang29f99002019-04-24 17:25:42 +000082 }
83
Zach Johnsone0e158c2019-04-26 11:57:05 -070084 signal(SIGINT, interrupt_handler);
Hansong Zhang30bf8692019-05-02 15:25:54 -070085 grpc_root_server.StartServer("0.0.0.0", root_server_port, grpc_port);
Hansong Zhanga4432622019-09-04 12:25:34 -070086 int tester_signal_socket = socket(AF_INET, SOCK_STREAM, 0);
87 struct sockaddr_in addr;
88 memset(&addr, 0, sizeof(addr));
89 addr.sin_family = AF_INET;
90 addr.sin_port = htons(signal_port);
91 addr.sin_addr.s_addr = htonl(INADDR_ANY);
92 connect(tester_signal_socket, (sockaddr*)&addr, sizeof(addr));
93 close(tester_signal_socket);
Hansong Zhang30bf8692019-05-02 15:25:54 -070094 auto wait_thread = std::thread([] { grpc_root_server.RunGrpcLoop(); });
Hansong Zhang29f99002019-04-24 17:25:42 +000095 wait_thread.join();
Zach Johnsone0e158c2019-04-26 11:57:05 -070096
Hansong Zhang29f99002019-04-24 17:25:42 +000097 return 0;
98}