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 <errno.h>
     18 
     19 #include <stdio.h>
     20 #include <stdlib.h>
     21 #include <string.h>
     22 #include <unistd.h>
     23 
     24 #include <dirent.h>
     25 
     26 #include <netdb.h>
     27 #include <netinet/in.h>
     28 
     29 #include <sys/mman.h>
     30 #include <sys/socket.h>
     31 #include <sys/stat.h>
     32 #include <sys/types.h>
     33 #include <sys/un.h>
     34 
     35 #include <utils/RefBase.h>
     36 
     37 #include <fstream>
     38 #include <iostream>
     39 #include <sstream>
     40 #include <string>
     41 #include <vector>
     42 
     43 #include "AgentRequestHandler.h"
     44 #include "test/vts/proto/VtsDriverControlMessage.pb.h"
     45 
     46 #include "BinderClientToDriver.h"
     47 #include "SocketClientToDriver.h"
     48 
     49 #define LOCALHOST_IP "127.0.0.1"
     50 
     51 using namespace std;
     52 
     53 namespace android {
     54 namespace vts {
     55 
     56 
     57 bool VtsDriverSocketClient::Exit() {
     58   VtsDriverControlCommandMessage command_message;
     59   command_message.set_command_type(EXIT);
     60   if (!VtsSocketSendMessage(command_message)) return false;
     61 
     62   VtsDriverControlResponseMessage response_message;
     63   if (!VtsSocketRecvMessage(&response_message)) return false;
     64   return true;
     65 }
     66 
     67 int32_t VtsDriverSocketClient::LoadHal(const string& file_path,
     68                                        int target_class, int target_type,
     69                                        float target_version,
     70                                        const string& target_package,
     71                                        const string& target_component_name,
     72                                        const string& hw_binder_service_name,
     73                                        const string& module_name) {
     74   VtsDriverControlCommandMessage command_message;
     75   command_message.set_command_type(LOAD_HAL);
     76   command_message.set_file_path(file_path);
     77   command_message.set_target_class(target_class);
     78   command_message.set_target_type(target_type);
     79   command_message.set_target_version(target_version);
     80   command_message.set_target_package(target_package);
     81   command_message.set_target_component_name(target_component_name);
     82   command_message.set_module_name(module_name);
     83   command_message.set_hw_binder_service_name(hw_binder_service_name);
     84   if (!VtsSocketSendMessage(command_message)) return -1;
     85 
     86   VtsDriverControlResponseMessage response_message;
     87   if (!VtsSocketRecvMessage(&response_message)) return -1;
     88   cout << __func__ << " response code: " << response_message.response_code()
     89        << endl;
     90   return response_message.response_code();
     91 }
     92 
     93 const char* VtsDriverSocketClient::GetFunctions() {
     94   cout << "[agent->driver] LIST_FUNCTIONS" << endl;
     95 
     96   VtsDriverControlCommandMessage command_message;
     97   command_message.set_command_type(LIST_FUNCTIONS);
     98   if (!VtsSocketSendMessage(command_message)) return NULL;
     99 
    100   VtsDriverControlResponseMessage response_message;
    101   if (!VtsSocketRecvMessage(&response_message)) return NULL;
    102 
    103   char* result =
    104       (char*)malloc(strlen(response_message.return_message().c_str()) + 1);
    105   if (!result) {
    106     cerr << __func__ << " ERROR result is NULL" << endl;
    107     return NULL;
    108   }
    109   strcpy(result, response_message.return_message().c_str());
    110   return result;
    111 }
    112 
    113 const char* VtsDriverSocketClient::ReadSpecification(
    114     const string& component_name,
    115     int target_class,
    116     int target_type,
    117     float target_version,
    118     const string& target_package) {
    119   cout << "[agent->driver] LIST_FUNCTIONS" << endl;
    120 
    121   VtsDriverControlCommandMessage command_message;
    122   command_message.set_command_type(
    123       VTS_DRIVER_COMMAND_READ_SPECIFICATION);
    124   command_message.set_module_name(component_name);
    125   command_message.set_target_class(target_class);
    126   command_message.set_target_type(target_type);
    127   command_message.set_target_version(target_version);
    128   command_message.set_target_package(target_package);
    129 
    130   if (!VtsSocketSendMessage(command_message)) return NULL;
    131 
    132   VtsDriverControlResponseMessage response_message;
    133   if (!VtsSocketRecvMessage(&response_message)) return NULL;
    134 
    135   char* result =
    136       (char*)malloc(strlen(response_message.return_message().c_str()) + 1);
    137   if (!result) {
    138     cerr << __func__ << " ERROR result is NULL" << endl;
    139     return NULL;
    140   }
    141   strcpy(result, response_message.return_message().c_str());
    142   return result;
    143 }
    144 
    145 const char* VtsDriverSocketClient::Call(const string& arg, const string& uid) {
    146   VtsDriverControlCommandMessage command_message;
    147   command_message.set_command_type(CALL_FUNCTION);
    148   command_message.set_arg(arg);
    149   command_message.set_driver_caller_uid(uid);
    150   if (!VtsSocketSendMessage(command_message)) return NULL;
    151 
    152   VtsDriverControlResponseMessage response_message;
    153   if (!VtsSocketRecvMessage(&response_message)) return NULL;
    154 
    155   char* result =
    156       (char*)malloc(strlen(response_message.return_message().c_str()) + 1);
    157   if (!result) {
    158     cerr << __func__ << " ERROR result is NULL" << endl;
    159     return NULL;
    160   }
    161   strcpy(result, response_message.return_message().c_str());
    162   return result;
    163 }
    164 
    165 const char* VtsDriverSocketClient::GetAttribute(const string& arg) {
    166   VtsDriverControlCommandMessage command_message;
    167   command_message.set_command_type(GET_ATTRIBUTE);
    168   command_message.set_arg(arg);
    169   if (!VtsSocketSendMessage(command_message)) return NULL;
    170 
    171   VtsDriverControlResponseMessage response_message;
    172   if (!VtsSocketRecvMessage(&response_message)) return NULL;
    173 
    174   char* result =
    175       (char*)malloc(strlen(response_message.return_message().c_str()) + 1);
    176   if (!result) {
    177     cerr << __func__ << " ERROR result is NULL" << endl;
    178     return NULL;
    179   }
    180   strcpy(result, response_message.return_message().c_str());
    181   return result;
    182 }
    183 
    184 VtsDriverControlResponseMessage* VtsDriverSocketClient::ExecuteShellCommand(
    185     const ::google::protobuf::RepeatedPtrField<::std::string> shell_command) {
    186   VtsDriverControlCommandMessage command_message;
    187   command_message.set_command_type(EXECUTE_COMMAND);
    188   for (const auto& cmd : shell_command) {
    189     command_message.add_shell_command(cmd);
    190   }
    191   if (!VtsSocketSendMessage(command_message)) return NULL;
    192 
    193   VtsDriverControlResponseMessage* response_message =
    194       new VtsDriverControlResponseMessage();
    195   if (!VtsSocketRecvMessage(response_message)) return NULL;
    196 
    197   return response_message;
    198 }
    199 
    200 int32_t VtsDriverSocketClient::Status(int32_t type) {
    201   VtsDriverControlCommandMessage command_message;
    202   command_message.set_command_type(CALL_FUNCTION);
    203   command_message.set_status_type(type);
    204   if (!VtsSocketSendMessage(command_message)) return 0;
    205 
    206   VtsDriverControlResponseMessage response_message;
    207   if (!VtsSocketRecvMessage(&response_message)) return 0;
    208   return response_message.return_value();
    209 }
    210 
    211 string GetSocketPortFilePath(const string& service_name) {
    212   string result("/data/local/tmp/");
    213   result += service_name;
    214   // static int count = 0;
    215   // result += std::to_string(count++);
    216   return result;
    217 }
    218 
    219 bool IsDriverRunning(const string& service_name, int retry_count) {
    220   for (int retry = 0; retry < retry_count; retry++) {
    221     VtsDriverSocketClient* client = GetDriverSocketClient(service_name);
    222     if (client) {
    223       client->Exit();
    224       delete client;
    225       return true;
    226     }
    227     sleep(1);
    228   }
    229   cout << __func__ << " "
    230        << "couldn't connect to " << service_name << endl;
    231   return false;
    232 }
    233 
    234 VtsDriverSocketClient* GetDriverSocketClient(const string& service_name) {
    235   string socket_port_file_path = GetSocketPortFilePath(service_name);
    236   VtsDriverSocketClient* client = new VtsDriverSocketClient();
    237   if (!client->Connect(socket_port_file_path)) {
    238     cerr << __func__ << " can't connect to " << socket_port_file_path << endl;
    239     delete client;
    240     return NULL;
    241   }
    242   return client;
    243 }
    244 
    245 }  // namespace vts
    246 }  // namespace android
    247