Home | History | Annotate | Download | only in export
      1 // Copyright (C) 2017 The Android Open Source Project
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //      http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 
     16 #ifndef ART_DT_FD_FORWARD_EXPORT_FD_TRANSPORT_H_
     17 #define ART_DT_FD_FORWARD_EXPORT_FD_TRANSPORT_H_
     18 
     19 #include <stdint.h>
     20 
     21 namespace dt_fd_forward {
     22 
     23 // The file-descriptors sent over a socket to the dt_fd_forward transport.
     24 struct FdSet {
     25   // A fd that can be read from which provides the JDWP data.
     26   int read_fd_;
     27 
     28   // A fd that can be written to in order to provide JDWP responses and events.
     29   int write_fd_;
     30 
     31   // A eventfd that can be locked to ensure that writes to write_fd_ are atomic. This must be held
     32   // when writing to write_fd_. This allows the proxy to insert packets into the response stream
     33   // without having to parse it.
     34   int write_lock_fd_;
     35 
     36   static constexpr size_t kDataLength = sizeof(int) * 3;
     37   void WriteData(void* buf) {
     38     int* ibuf = reinterpret_cast<int*>(buf);
     39     ibuf[0] = read_fd_;
     40     ibuf[1] = write_fd_;
     41     ibuf[2] = write_lock_fd_;
     42   }
     43 
     44   static FdSet ReadData(void* buf) {
     45     int* ibuf = reinterpret_cast<int*>(buf);
     46     return FdSet { ibuf[0], ibuf[1], ibuf[2] };
     47   }
     48 };
     49 
     50 // Sent with the file descriptors if the transport should not skip waiting for the handshake.
     51 static constexpr char kPerformHandshakeMessage[] = "HANDSHAKE:REQD";
     52 
     53 // Sent with the file descriptors if the transport can skip waiting for the handshake.
     54 static constexpr char kSkipHandshakeMessage[] = "HANDSHAKE:SKIP";
     55 
     56 // This message is sent over the fd associated with the transport when we are listening for fds.
     57 static constexpr char kListenStartMessage[] = "dt_fd_forward:START-LISTEN";
     58 
     59 // This message is sent over the fd associated with the transport when we stop listening for fds.
     60 static constexpr char kListenEndMessage[] = "dt_fd_forward:END-LISTEN";
     61 
     62 // This message is sent over the fd associated with the transport when we have accepted a
     63 // connection. This is sent before any handshaking has occurred. It is simply an acknowledgment
     64 // that the FdSet has been received. This will be paired with a single CLOSING message when these
     65 // fds are closed.
     66 static constexpr char kAcceptMessage[] = "dt_fd_forward:ACCEPTED";
     67 
     68 // This message is sent over the fd associated with the transport when we are closing the fds. This
     69 // can be used by the proxy to send additional data on a dup'd fd. The write_lock_fd_ will be held
     70 // until the other two fds are closed and then it will be released and closed.
     71 static constexpr char kCloseMessage[] = "dt_fd_forward:CLOSING";
     72 
     73 }  // namespace dt_fd_forward
     74 
     75 #endif  // ART_DT_FD_FORWARD_EXPORT_FD_TRANSPORT_H_
     76