Home | History | Annotate | Download | only in adb
      1 /*
      2  * Copyright (C) 2015 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 #ifndef __ADB_SOCKET_H
     18 #define __ADB_SOCKET_H
     19 
     20 #include <stddef.h>
     21 
     22 #include <memory>
     23 
     24 #include "fdevent.h"
     25 
     26 struct apacket;
     27 class atransport;
     28 
     29 /* An asocket represents one half of a connection between a local and
     30  * remote entity.  A local asocket is bound to a file descriptor.  A
     31  * remote asocket is bound to the protocol engine.
     32  */
     33 struct asocket {
     34     /* chain pointers for the local/remote list of
     35      * asockets that this asocket lives in
     36      */
     37     asocket* next;
     38     asocket* prev;
     39 
     40     /* the unique identifier for this asocket
     41      */
     42     unsigned id;
     43 
     44     /* flag: set when the socket's peer has closed
     45      * but packets are still queued for delivery
     46      */
     47     int closing;
     48 
     49     // flag: set when the socket failed to write, so the socket will not wait to
     50     // write packets and close directly.
     51     bool has_write_error;
     52 
     53     /* flag: quit adbd when both ends close the
     54      * local service socket
     55      */
     56     int exit_on_close;
     57 
     58     // the asocket we are connected to
     59     asocket* peer;
     60 
     61     /* For local asockets, the fde is used to bind
     62      * us to our fd event system.  For remote asockets
     63      * these fields are not used.
     64      */
     65     fdevent fde;
     66     int fd;
     67 
     68     // queue of apackets waiting to be written
     69     apacket* pkt_first;
     70     apacket* pkt_last;
     71 
     72     /* enqueue is called by our peer when it has data
     73      * for us.  It should return 0 if we can accept more
     74      * data or 1 if not.  If we return 1, we must call
     75      * peer->ready() when we once again are ready to
     76      * receive data.
     77      */
     78     int (*enqueue)(asocket* s, apacket* pkt);
     79 
     80     /* ready is called by the peer when it is ready for
     81      * us to send data via enqueue again
     82      */
     83     void (*ready)(asocket* s);
     84 
     85     /* shutdown is called by the peer before it goes away.
     86      * the socket should not do any further calls on its peer.
     87      * Always followed by a call to close. Optional, i.e. can be NULL.
     88      */
     89     void (*shutdown)(asocket* s);
     90 
     91     /* close is called by the peer when it has gone away.
     92      * we are not allowed to make any further calls on the
     93      * peer once our close method is called.
     94      */
     95     void (*close)(asocket* s);
     96 
     97     /* A socket is bound to atransport */
     98     atransport* transport;
     99 
    100     size_t get_max_payload() const;
    101 };
    102 
    103 asocket *find_local_socket(unsigned local_id, unsigned remote_id);
    104 void install_local_socket(asocket *s);
    105 void remove_socket(asocket *s);
    106 void close_all_sockets(atransport *t);
    107 
    108 asocket *create_local_socket(int fd);
    109 asocket *create_local_service_socket(const char* destination,
    110                                      const atransport* transport);
    111 
    112 asocket *create_remote_socket(unsigned id, atransport *t);
    113 void connect_to_remote(asocket *s, const char *destination);
    114 void connect_to_smartsocket(asocket *s);
    115 
    116 // Internal functions that are only made available here for testing purposes.
    117 namespace internal {
    118 
    119 #if ADB_HOST
    120 char* skip_host_serial(char* service);
    121 #endif
    122 
    123 }  // namespace internal
    124 
    125 #endif  // __ADB_SOCKET_H
    126