Home | History | Annotate | Download | only in protocol
      1 /* Copyright (C) 2010 The Android Open Source Project
      2 **
      3 ** This software is licensed under the terms of the GNU General Public
      4 ** License version 2, as published by the Free Software Foundation, and
      5 ** may be copied, distributed, and modified under those terms.
      6 **
      7 ** This program is distributed in the hope that it will be useful,
      8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
      9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     10 ** GNU General Public License for more details.
     11 */
     12 
     13 /*
     14  * This file contains declaration related to communication between emulator's
     15  * UI and core through a console port.
     16  */
     17 
     18 #ifndef QEMU_ANDROID_CORE_CONNECTION_H
     19 #define QEMU_ANDROID_CORE_CONNECTION_H
     20 
     21 #include "android/sync-utils.h"
     22 
     23 // Opaque CoreConnection structure.
     24 typedef struct CoreConnection CoreConnection;
     25 
     26 // Base console port
     27 #define CORE_BASE_PORT          5554
     28 
     29 // Maximum number of core porocesses running simultaneously on a machine.
     30 #define MAX_CORE_PROCS          16
     31 
     32 // Socket timeout in millisec (set to 5 seconds)
     33 #define CORE_PORT_TIMEOUT_MS    5000
     34 
     35 /* Opens core console socket.
     36  * Param:
     37  *  sockaddr Socket address to the core console.
     38  * Return:
     39  *  Sync socket descriptor on success, or -1 on failure, with errno appropriately
     40  *  set.
     41  */
     42 SyncSocket* core_connection_open_socket(SockAddress* sockaddr);
     43 
     44 /* Creates descriptor for a console client.
     45  * Param:
     46  *  console_socket Socket address for the console.
     47  * Return:
     48  *  Allocated and initialized descriptor for the client on success, or NULL
     49  *  on failure.
     50  */
     51 CoreConnection* core_connection_create(SockAddress* console_socket);
     52 
     53 /* Frees descriptor allocated with core_connection_create.
     54  * Param:
     55  *  desc Descriptor to free. Note that this routine will simply free the memory
     56  *      used by the descriptor.
     57  */
     58 void core_connection_free(CoreConnection* desc);
     59 
     60 /* Opens a socket handle to the console.
     61  * Param:
     62  *  desc Console client descriptor. Note that if the descriptor has been already
     63  *      opened, this routine will simply return with success.
     64  * Return:
     65  *  0 on success, or -1 on failure with errno properly set. This routine will
     66  *      return in at most one second.
     67  */
     68 int core_connection_open(CoreConnection* desc);
     69 
     70 /* Closes a socket handle to the console opened with core_connection_open.
     71  * Param:
     72  *  desc Console client descriptor opened with core_connection_open.
     73  */
     74 void core_connection_close(CoreConnection* desc);
     75 
     76 /* Synchronously writes to the console. See CORE_PORT_TIMEOUT_MS for the timeout
     77  * value used to wait for the write operation to complete.
     78  * Param:
     79  *  desc Console client descriptor opened with core_connection_open.
     80  *      buffer Buffer to write.
     81  *  to_write Number of bytes to write.
     82  *  written_bytes Upon success, contains number of bytes written. This parameter
     83  *      is optional, and can be NULL.
     84  * Return:
     85  *  0 on success, or -1 on failure.
     86  */
     87 int core_connection_write(CoreConnection* desc,
     88                           const void* buffer,
     89                           size_t to_write,
     90                           size_t* written_bytes);
     91 
     92 /* Synchronously reads from the console. See CORE_PORT_TIMEOUT_MS for the
     93  * timeout value used to wait for the read operation to complete.
     94  * Param:
     95  *  desc Console client descriptor opened with core_connection_open.
     96  *  buffer Buffer to read data to.
     97  *  to_read Number of bytes to read.
     98  *  read_bytes Upon success, contains number of bytes that have been actually
     99  *    read. This parameter is optional, and can be NULL.
    100  * Return:
    101  *  0 on success, or -1 on failure.
    102  */
    103 int core_connection_read(CoreConnection* desc,
    104                          void* buffer,
    105                          size_t to_read,
    106                          size_t* read_bytes);
    107 
    108 /* Switches opened console client to a given stream.
    109  * Param:
    110  *  desc Console client descriptor opened with core_connection_open. Note
    111  *      that this descriptor should represent console itself. In other words,
    112  *      there must have been no previous calls to this routine for that
    113  *      descriptor.
    114  *  stream_name Name of the stream to switch to.
    115  *  handshake Address of a string to allocate for a handshake message on
    116  *      success, or an error message on failure. If upon return from this
    117  *      routine that string is not NULL, its buffer must be freed with 'free'.
    118  * Return:
    119  *  0 on success, or -1 on failure.
    120  */
    121 int core_connection_switch_stream(CoreConnection* desc,
    122                                   const char* stream_name,
    123                                   char** handshake);
    124 
    125 /* Creates a console client, and switches it to a given stream.
    126  *  console_socket Socket address for the console.
    127  *  stream_name Name of the stream to switch to.
    128  *  handshake Address of a string to allocate for a handshake message on
    129  *      success, or an error message on failure. If upon return from this
    130  *      routine that string is not NULL, its buffer must be freed with 'free'.
    131  * Return:
    132  *  Allocated and initialized descriptor for the switched client on success, or
    133  *  NULL on failure.
    134  */
    135 CoreConnection* core_connection_create_and_switch(SockAddress* console_socket,
    136                                                   const char* stream_name,
    137                                                   char** handshake);
    138 
    139 /* Detaches opened console client from the console.
    140  * By console protocol, writing "\r\n" string to the console will destroy the
    141  * console client.
    142  * Param:
    143  *  desc Console client descriptor opened with core_connection_open.
    144  */
    145 void core_connection_detach(CoreConnection* desc);
    146 
    147 /* Gets socket descriptor associated with the core connection.
    148  * Param:
    149  *  desc Console client descriptor opened with core_connection_open.
    150  * Return
    151  *  Socket descriptor associated with the core connection.
    152  */
    153 int core_connection_get_socket(CoreConnection* desc);
    154 
    155 /* Calculates timeout for transferring the given number of bytes via core
    156  * connection.
    157  * Return:
    158  *  Number of milliseconds during which the entire number of bytes is expected
    159  *  to be transferred via core connection.
    160  */
    161 static inline int
    162 core_connection_get_timeout(size_t data_size)
    163 {
    164     // Min 2 seconds + 10 millisec for each transferring byte.
    165     // TODO: Come up with a better arithmetics here.
    166     return 2000 + data_size * 10;
    167 }
    168 
    169 #endif  // QEMU_ANDROID_CORE_CONNECTION_H
    170