Home | History | Annotate | Download | only in hal
      1 /*
      2  * Copyright 2016 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 
     17 #include "AgentRequestHandler.h"
     18 
     19 #include <errno.h>
     20 
     21 #include <dirent.h>
     22 #include <netdb.h>
     23 #include <netinet/in.h>
     24 #include <stdio.h>
     25 #include <stdlib.h>
     26 #include <string.h>
     27 #include <sys/socket.h>
     28 #include <sys/stat.h>
     29 #include <sys/types.h>
     30 #include <unistd.h>
     31 #include <utils/RefBase.h>
     32 
     33 #include <fstream>
     34 #include <iostream>
     35 #include <sstream>
     36 #include <string>
     37 #include <vector>
     38 
     39 #include "BinderClientToDriver.h"
     40 #include "SocketClientToDriver.h"
     41 #include "SocketServerForDriver.h"
     42 #include "test/vts/proto/AndroidSystemControlMessage.pb.h"
     43 #include "test/vts/proto/VtsDriverControlMessage.pb.h"
     44 
     45 using namespace std;
     46 using namespace google::protobuf;
     47 
     48 namespace android {
     49 namespace vts {
     50 
     51 bool AgentRequestHandler::ListHals(const RepeatedPtrField<string>& base_paths) {
     52   cout << "[runner->agent] command " << __FUNCTION__ << endl;
     53   AndroidSystemControlResponseMessage response_msg;
     54   ResponseCode result = FAIL;
     55 
     56   for (const string& path : base_paths) {
     57     cout << __FUNCTION__ << ": open a dir " << path << endl;
     58     DIR* dp;
     59     if (!(dp = opendir(path.c_str()))) {
     60       cerr << "Error(" << errno << ") opening " << path << endl;
     61       continue;
     62     }
     63 
     64     struct dirent* dirp;
     65     int len;
     66     while ((dirp = readdir(dp)) != NULL) {
     67       len = strlen(dirp->d_name);
     68       if (len > 3 && !strcmp(&dirp->d_name[len - 3], ".so")) {
     69         string found_path = path + "/" + string(dirp->d_name);
     70         cout << __FUNCTION__ << ": found " << found_path << endl;
     71         response_msg.add_file_names(found_path);
     72         result = SUCCESS;
     73       }
     74     }
     75     closedir(dp);
     76   }
     77   response_msg.set_response_code(result);
     78   return VtsSocketSendMessage(response_msg);
     79 }
     80 
     81 bool AgentRequestHandler::SetHostInfo(const int callback_port) {
     82   cout << "[runner->agent] command " << __FUNCTION__ << endl;
     83   callback_port_ = callback_port;
     84   AndroidSystemControlResponseMessage response_msg;
     85   response_msg.set_response_code(SUCCESS);
     86   return VtsSocketSendMessage(response_msg);
     87 }
     88 
     89 bool AgentRequestHandler::CheckDriverService(const string& service_name,
     90                                              bool* live) {
     91   cout << "[runner->agent] command " << __FUNCTION__ << endl;
     92   AndroidSystemControlResponseMessage response_msg;
     93 
     94 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
     95   if (IsDriverRunning(service_name, 10)) {
     96 #else  // binder
     97   sp<IVtsFuzzer> binder = GetBinderClient(service_name);
     98   if (binder.get()) {
     99 #endif
    100     if (live) *live = true;
    101     response_msg.set_response_code(SUCCESS);
    102     response_msg.set_reason("found the service");
    103     cout << "set service_name " << service_name << endl;
    104     service_name_ = service_name;
    105   } else {
    106     if (live) *live = false;
    107     response_msg.set_response_code(FAIL);
    108     response_msg.set_reason("service not found");
    109   }
    110   return VtsSocketSendMessage(response_msg);
    111 }
    112 
    113 static const char kUnixSocketNamePrefixForCallbackServer[] =
    114     "/data/local/tmp/vts_agent_callback";
    115 
    116 bool AgentRequestHandler::LaunchDriverService(
    117     const AndroidSystemControlCommandMessage& command_msg) {
    118   int driver_type = command_msg.driver_type();
    119   const string& service_name = command_msg.service_name();
    120   const string& file_path = command_msg.file_path();
    121   int target_class = command_msg.target_class();
    122   int target_type = command_msg.target_type();
    123   float target_version = command_msg.target_version() / 100.0;
    124   const string& target_package = command_msg.target_package();
    125   const string& target_component_name = command_msg.target_component_name();
    126   const string& module_name = command_msg.module_name();
    127   const string& hw_binder_service_name = command_msg.hw_binder_service_name();
    128   int bits = command_msg.bits();
    129 
    130   cout << "[runner->agent] command " << __FUNCTION__ << " (file_path="
    131        << file_path << ")" << endl;
    132   ResponseCode result = FAIL;
    133 
    134   // TODO: shall check whether there's a service with the same name and return
    135   // success immediately if exists.
    136   AndroidSystemControlResponseMessage response_msg;
    137 
    138   // deletes the service file if exists before starting to launch a driver.
    139   string socket_port_flie_path = GetSocketPortFilePath(service_name);
    140   struct stat file_stat;
    141   if (stat(socket_port_flie_path.c_str(), &file_stat) == 0  // file exists
    142       && remove(socket_port_flie_path.c_str()) == -1) {
    143     cerr << __func__ << " " << socket_port_flie_path << " delete error" << endl;
    144     response_msg.set_reason("service file already exists.");
    145   } else {
    146     pid_t pid = fork();
    147     if (pid == 0) {  // child
    148       Close();
    149 
    150       string driver_binary_path;
    151       char* cmd = NULL;
    152       if (driver_type == VTS_DRIVER_TYPE_HAL_CONVENTIONAL ||
    153           driver_type == VTS_DRIVER_TYPE_HAL_LEGACY ||
    154           driver_type == VTS_DRIVER_TYPE_HAL_HIDL) {
    155         // TODO: check whether the port is available and handle if fails.
    156         static int port = 0;
    157         string callback_socket_name(kUnixSocketNamePrefixForCallbackServer);
    158         callback_socket_name += std::to_string(port++);
    159         cout << "callback_socket_name: " << callback_socket_name << endl;
    160         StartSocketServerForDriver(callback_socket_name, -1);
    161 
    162         if (bits == 32) {
    163           driver_binary_path = driver_hal_binary32_;
    164         } else {
    165           driver_binary_path = driver_hal_binary64_;
    166         }
    167         size_t offset = driver_binary_path.find_last_of("/");
    168         string ld_dir_path = driver_binary_path.substr(0, offset);
    169 
    170         if (driver_hal_spec_dir_path_.length() < 1) {
    171 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
    172           asprintf(&cmd,
    173                    "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s "
    174                    "--server_socket_path=%s "
    175                    "--callback_socket_name=%s",
    176                    ld_dir_path.c_str(), driver_binary_path.c_str(),
    177                    socket_port_flie_path.c_str(), callback_socket_name.c_str());
    178 #else  // binder
    179           asprintf(&cmd,
    180                    "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s "
    181                    "--service_name=%s "
    182                    "--callback_socket_name=%s",
    183                    ld_dir_path.c_str(), driver_binary_path.c_str(),
    184                    service_name.c_str(), callback_socket_name.c_str());
    185 #endif
    186         } else {
    187 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
    188           asprintf(&cmd,
    189                    "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s "
    190                    "--server_socket_path=%s "
    191                    "--spec_dir_path=%s --callback_socket_name=%s",
    192                    ld_dir_path.c_str(), driver_binary_path.c_str(),
    193                    socket_port_flie_path.c_str(),
    194                    driver_hal_spec_dir_path_.c_str(),
    195                    callback_socket_name.c_str());
    196 #else  // binder
    197           asprintf(&cmd,
    198                    "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s "
    199                    "--service_name=%s "
    200                    "--spec_dir_path=%s --callback_socket_name=%s",
    201                    ld_dir_path.c_str(), driver_binary_path.c_str(),
    202                    service_name.c_str(), driver_hal_spec_dir_path_.c_str(),
    203                    callback_socket_name.c_str());
    204 #endif
    205         }
    206       } else if (driver_type == VTS_DRIVER_TYPE_SHELL) {
    207         if (bits == 32) {
    208           driver_binary_path = driver_shell_binary32_;
    209         } else {
    210           driver_binary_path = driver_shell_binary64_;
    211         }
    212         size_t offset = driver_binary_path.find_last_of("/");
    213         string ld_dir_path = driver_binary_path.substr(0, offset);
    214 
    215 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
    216         asprintf(
    217             &cmd,
    218             "LD_LIBRARY_PATH=%s:$LD_LIBRARY_PATH %s --server_socket_path=%s",
    219             ld_dir_path.c_str(), driver_binary_path.c_str(),
    220             socket_port_flie_path.c_str());
    221 #else  // binder
    222         cerr << __func__ << " no binder implementation available." << endl;
    223         exit(-1);
    224 #endif
    225       } else {
    226         cerr << __func__ << " unsupported driver type." << endl;
    227       }
    228 
    229       if (cmd) {
    230         cout << __func__ << "launch a driver - " << cmd << endl;
    231         system(cmd);
    232         cout << __func__ << "driver exits" << endl;
    233         free(cmd);
    234       }
    235       exit(0);
    236     } else if (pid > 0) {
    237       for (int attempt = 0; attempt < 10; attempt++) {
    238         sleep(1);
    239         if (IsDriverRunning(service_name, 10)) {
    240           result = SUCCESS;
    241           break;
    242         }
    243       }
    244       if (result) {
    245 // TODO: use an attribute (client) of a newly defined class.
    246 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
    247         VtsDriverSocketClient* client =
    248             android::vts::GetDriverSocketClient(service_name);
    249         if (!client) {
    250 #else  // binder
    251         android::sp<android::vts::IVtsFuzzer> client =
    252             android::vts::GetBinderClient(service_name);
    253         if (!client.get()) {
    254 #endif
    255           response_msg.set_response_code(FAIL);
    256           response_msg.set_reason("Failed to start a driver.");
    257           // TODO: kill the driver?
    258           return VtsSocketSendMessage(response_msg);
    259         }
    260 
    261         if (driver_type == VTS_DRIVER_TYPE_HAL_CONVENTIONAL ||
    262             driver_type == VTS_DRIVER_TYPE_HAL_LEGACY ||
    263             driver_type == VTS_DRIVER_TYPE_HAL_HIDL) {
    264           cout << "[agent->driver]: LoadHal " << module_name << endl;
    265           int32_t driver_id = client->LoadHal(
    266               file_path, target_class, target_type, target_version,
    267               target_package, target_component_name, hw_binder_service_name,
    268               module_name);
    269           cout << "[driver->agent]: LoadHal returns " << driver_id << endl;
    270           if (driver_id == -1) {
    271             response_msg.set_response_code(FAIL);
    272             response_msg.set_reason("Failed to load the selected HAL.");
    273           } else {
    274             response_msg.set_response_code(SUCCESS);
    275             response_msg.set_result(std::to_string(driver_id));
    276             response_msg.set_reason("Loaded the selected HAL.");
    277             cout << "set service_name " << service_name << endl;
    278             service_name_ = service_name;
    279           }
    280         } else if (driver_type == VTS_DRIVER_TYPE_SHELL) {
    281           response_msg.set_response_code(SUCCESS);
    282           response_msg.set_reason("Loaded the shell driver.");
    283           cout << "set service_name " << service_name << endl;
    284           service_name_ = service_name;
    285         }
    286 
    287 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
    288         driver_client_ = client;
    289 #endif
    290         return VtsSocketSendMessage(response_msg);
    291       }
    292     }
    293     response_msg.set_reason(
    294         "Failed to fork a child process to start a driver.");
    295   }
    296   response_msg.set_response_code(FAIL);
    297   cerr << "can't fork a child process to run the vts_hal_driver." << endl;
    298   return VtsSocketSendMessage(response_msg);
    299 }
    300 
    301 bool AgentRequestHandler::ReadSpecification(
    302     const AndroidSystemControlCommandMessage& command_message) {
    303   cout << "[runner->agent] command " << __FUNCTION__ << endl;
    304 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
    305   VtsDriverSocketClient* client = driver_client_;
    306   if (!client) {
    307 #else  // binder
    308   android::sp<android::vts::IVtsFuzzer> client =
    309       android::vts::GetBinderClient(service_name_);
    310   if (!client.get()) {
    311 #endif
    312     return false;
    313   }
    314 
    315   const string& result = client->ReadSpecification(
    316       command_message.service_name(), command_message.target_class(),
    317       command_message.target_type(), command_message.target_version() / 100.0f,
    318       command_message.target_package());
    319 
    320   return SendApiResult("ReadSpecification", result);
    321 }
    322 
    323 bool AgentRequestHandler::ListApis() {
    324   cout << "[runner->agent] command " << __FUNCTION__ << endl;
    325 // TODO: use an attribute (client) of a newly defined class.
    326 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
    327   VtsDriverSocketClient* client = driver_client_;
    328   if (!client) {
    329 #else  // binder
    330   android::sp<android::vts::IVtsFuzzer> client =
    331       android::vts::GetBinderClient(service_name_);
    332   if (!client.get()) {
    333 #endif
    334     return false;
    335   }
    336   return SendApiResult("GetAttribute", "", client->GetFunctions());
    337 }
    338 
    339 bool AgentRequestHandler::CallApi(const string& call_payload,
    340                                   const string& uid) {
    341   cout << "[runner->agent] command " << __FUNCTION__ << endl;
    342 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
    343   VtsDriverSocketClient* client = driver_client_;
    344   if (!client) {
    345 #else  // binder
    346   // TODO: use an attribute (client) of a newly defined class.
    347   android::sp<android::vts::IVtsFuzzer> client =
    348       android::vts::GetBinderClient(service_name_);
    349   if (!client.get()) {
    350 #endif
    351     return false;
    352   }
    353 
    354   return SendApiResult("Call", client->Call(call_payload, uid));
    355 }
    356 
    357 bool AgentRequestHandler::GetAttribute(const string& payload) {
    358   cout << "[runner->agent] command " << __FUNCTION__ << endl;
    359 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
    360   VtsDriverSocketClient* client = driver_client_;
    361   if (!client) {
    362 #else  // binder
    363   // TODO: use an attribute (client) of a newly defined class.
    364   android::sp<android::vts::IVtsFuzzer> client =
    365       android::vts::GetBinderClient(service_name_);
    366   if (!client.get()) {
    367 #endif
    368     return false;
    369   }
    370 
    371   return SendApiResult("GetAttribute", client->GetAttribute(payload));
    372 }
    373 
    374 bool AgentRequestHandler::SendApiResult(const string& func_name,
    375                                         const string& result,
    376                                         const string& spec) {
    377   AndroidSystemControlResponseMessage response_msg;
    378   if (result.size() > 0 || spec.size() > 0) {
    379     cout << "[agent] Call: success" << endl;
    380     response_msg.set_response_code(SUCCESS);
    381     if (result.size() > 0) {
    382       response_msg.set_result(result);
    383     }
    384     if (spec.size() > 0) {
    385       response_msg.set_spec(spec);
    386     }
    387   } else {
    388     cout << "[agent] Call: fail" << endl;
    389     response_msg.set_response_code(FAIL);
    390     response_msg.set_reason("Failed to call api function: " + func_name);
    391   }
    392   return VtsSocketSendMessage(response_msg);
    393 }
    394 
    395 bool AgentRequestHandler::DefaultResponse() {
    396   cout << "[agent] " << __FUNCTION__ << endl;
    397   AndroidSystemControlResponseMessage response_msg;
    398   response_msg.set_response_code(SUCCESS);
    399   response_msg.set_reason("an example reason here");
    400   return VtsSocketSendMessage(response_msg);
    401 }
    402 
    403 bool AgentRequestHandler::ExecuteShellCommand(
    404     const AndroidSystemControlCommandMessage& command_message) {
    405   cout << "[runner->agent] command " << __FUNCTION__ << endl;
    406 #ifndef VTS_AGENT_DRIVER_COMM_BINDER  // socket
    407   VtsDriverSocketClient* client = driver_client_;
    408   if (!client) {
    409 #else  // binder
    410   cerr << __func__ << " binder not supported." << endl;
    411   {
    412 #endif
    413     return false;
    414   }
    415 
    416   auto result_message =
    417       client->ExecuteShellCommand(command_message.shell_command());
    418 
    419   AndroidSystemControlResponseMessage response_msg;
    420 
    421   if (result_message) {
    422     CreateSystemControlResponseFromDriverControlResponse(*result_message,
    423                                                          &response_msg);
    424   } else {
    425     cout << "ExecuteShellCommand: failed to call the api" << endl;
    426     response_msg.set_response_code(FAIL);
    427     response_msg.set_reason("Failed to call the api.");
    428   }
    429 
    430   return VtsSocketSendMessage(response_msg);
    431 }
    432 
    433 void AgentRequestHandler::CreateSystemControlResponseFromDriverControlResponse(
    434     const VtsDriverControlResponseMessage& driver_control_response_message,
    435     AndroidSystemControlResponseMessage* system_control_response_message) {
    436 
    437   if (driver_control_response_message.response_code() ==
    438       VTS_DRIVER_RESPONSE_SUCCESS) {
    439     cout << "ExecuteShellCommand: shell driver reported success" << endl;
    440     system_control_response_message->set_response_code(SUCCESS);
    441   } else if (driver_control_response_message.response_code() ==
    442       VTS_DRIVER_RESPONSE_FAIL) {
    443     cout << "ExecuteShellCommand: shell driver reported fail" << endl;
    444     system_control_response_message->set_response_code(FAIL);
    445   } else if (driver_control_response_message.response_code() ==
    446       UNKNOWN_VTS_DRIVER_RESPONSE_CODE) {
    447     cout << "ExecuteShellCommand: shell driver reported unknown" << endl;
    448     system_control_response_message->set_response_code(UNKNOWN_RESPONSE_CODE);
    449   }
    450 
    451   for (const auto& log_stdout : driver_control_response_message.stdout()) {
    452     system_control_response_message->add_stdout(log_stdout);
    453   }
    454 
    455   for (const auto& log_stderr : driver_control_response_message.stderr()) {
    456     system_control_response_message->add_stderr(log_stderr);
    457   }
    458 
    459   for (const auto& exit_code : driver_control_response_message.exit_code()) {
    460     system_control_response_message->add_exit_code(exit_code);
    461   }
    462 }
    463 
    464 bool AgentRequestHandler::ProcessOneCommand() {
    465   AndroidSystemControlCommandMessage command_msg;
    466   if (!VtsSocketRecvMessage(&command_msg)) return false;
    467 
    468   cout << getpid() << " " << __func__
    469        << " command_type = " << command_msg.command_type() << endl;
    470   switch (command_msg.command_type()) {
    471     case LIST_HALS:
    472       return ListHals(command_msg.paths());
    473     case SET_HOST_INFO:
    474       return SetHostInfo(command_msg.callback_port());
    475     case CHECK_DRIVER_SERVICE:
    476       return CheckDriverService(command_msg.service_name(), NULL);
    477     case LAUNCH_DRIVER_SERVICE:
    478       return LaunchDriverService(command_msg);
    479     case VTS_AGENT_COMMAND_READ_SPECIFICATION:
    480       return ReadSpecification(command_msg);
    481     case LIST_APIS:
    482       return ListApis();
    483     case CALL_API:
    484       return CallApi(command_msg.arg(), command_msg.driver_caller_uid());
    485     case VTS_AGENT_COMMAND_GET_ATTRIBUTE:
    486       return GetAttribute(command_msg.arg());
    487     // for shell driver
    488     case VTS_AGENT_COMMAND_EXECUTE_SHELL_COMMAND:
    489       ExecuteShellCommand(command_msg);
    490       return true;
    491     default:
    492       cerr << __func__ << " ERROR unknown command "
    493            << command_msg.command_type() << endl;
    494       return DefaultResponse();
    495   }
    496 }
    497 
    498 }  // namespace vts
    499 }  // namespace android
    500