1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef _MTP_FFS_HANDLE_H 18*ec779b8eSAndroid Build Coastguard Worker #define _MTP_FFS_HANDLE_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <android-base/properties.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <android-base/unique_fd.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <linux/aio_abi.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <mutex> 24*ec779b8eSAndroid Build Coastguard Worker #include <sys/poll.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <time.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <thread> 27*ec779b8eSAndroid Build Coastguard Worker #include <vector> 28*ec779b8eSAndroid Build Coastguard Worker 29*ec779b8eSAndroid Build Coastguard Worker #include <IMtpHandle.h> 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker namespace android { 32*ec779b8eSAndroid Build Coastguard Worker 33*ec779b8eSAndroid Build Coastguard Worker constexpr int NUM_IO_BUFS = 2; 34*ec779b8eSAndroid Build Coastguard Worker 35*ec779b8eSAndroid Build Coastguard Worker struct io_buffer { 36*ec779b8eSAndroid Build Coastguard Worker std::vector<struct iocb> iocbs; // Holds memory for all iocbs. Not used directly. 37*ec779b8eSAndroid Build Coastguard Worker std::vector<struct iocb*> iocb; // Pointers to individual iocbs, for syscalls 38*ec779b8eSAndroid Build Coastguard Worker std::vector<unsigned char> bufs; // A large buffer, used with filesystem io 39*ec779b8eSAndroid Build Coastguard Worker std::vector<unsigned char*> buf; // Pointers within the larger buffer, for syscalls 40*ec779b8eSAndroid Build Coastguard Worker unsigned actual; // The number of buffers submitted for this request 41*ec779b8eSAndroid Build Coastguard Worker }; 42*ec779b8eSAndroid Build Coastguard Worker 43*ec779b8eSAndroid Build Coastguard Worker template <class T> class MtpFfsHandleTest; 44*ec779b8eSAndroid Build Coastguard Worker 45*ec779b8eSAndroid Build Coastguard Worker class MtpFfsHandle : public IMtpHandle { 46*ec779b8eSAndroid Build Coastguard Worker template <class T> friend class MtpFfsHandleTest; 47*ec779b8eSAndroid Build Coastguard Worker protected: 48*ec779b8eSAndroid Build Coastguard Worker void closeConfig(); 49*ec779b8eSAndroid Build Coastguard Worker void closeEndpoints(); 50*ec779b8eSAndroid Build Coastguard Worker void advise(int fd); 51*ec779b8eSAndroid Build Coastguard Worker int handleControlRequest(const struct usb_ctrlrequest *request); 52*ec779b8eSAndroid Build Coastguard Worker int doAsync(void* data, size_t len, bool read, bool zero_packet); 53*ec779b8eSAndroid Build Coastguard Worker int handleEvent(); 54*ec779b8eSAndroid Build Coastguard Worker void cancelTransaction(); 55*ec779b8eSAndroid Build Coastguard Worker void doSendEvent(mtp_event me); 56*ec779b8eSAndroid Build Coastguard Worker bool openEndpoints(bool ptp); 57*ec779b8eSAndroid Build Coastguard Worker 58*ec779b8eSAndroid Build Coastguard Worker static int getPacketSize(int ffs_fd); 59*ec779b8eSAndroid Build Coastguard Worker 60*ec779b8eSAndroid Build Coastguard Worker bool mCanceled; 61*ec779b8eSAndroid Build Coastguard Worker bool mBatchCancel; 62*ec779b8eSAndroid Build Coastguard Worker 63*ec779b8eSAndroid Build Coastguard Worker std::vector<std::thread> mChildThreads; 64*ec779b8eSAndroid Build Coastguard Worker 65*ec779b8eSAndroid Build Coastguard Worker android::base::unique_fd mControl; 66*ec779b8eSAndroid Build Coastguard Worker // "in" from the host's perspective => sink for mtp server 67*ec779b8eSAndroid Build Coastguard Worker android::base::unique_fd mBulkIn; 68*ec779b8eSAndroid Build Coastguard Worker // "out" from the host's perspective => source for mtp server 69*ec779b8eSAndroid Build Coastguard Worker android::base::unique_fd mBulkOut; 70*ec779b8eSAndroid Build Coastguard Worker android::base::unique_fd mIntr; 71*ec779b8eSAndroid Build Coastguard Worker 72*ec779b8eSAndroid Build Coastguard Worker aio_context_t mCtx; 73*ec779b8eSAndroid Build Coastguard Worker 74*ec779b8eSAndroid Build Coastguard Worker android::base::unique_fd mEventFd; 75*ec779b8eSAndroid Build Coastguard Worker struct pollfd mPollFds[2]; 76*ec779b8eSAndroid Build Coastguard Worker 77*ec779b8eSAndroid Build Coastguard Worker struct io_buffer mIobuf[NUM_IO_BUFS]; 78*ec779b8eSAndroid Build Coastguard Worker 79*ec779b8eSAndroid Build Coastguard Worker // Submit an io request of given length. Return amount submitted or -1. 80*ec779b8eSAndroid Build Coastguard Worker int iobufSubmit(struct io_buffer *buf, int fd, unsigned length, bool read); 81*ec779b8eSAndroid Build Coastguard Worker 82*ec779b8eSAndroid Build Coastguard Worker // Cancel submitted requests from start to end in the given array. Return 0 or -1. 83*ec779b8eSAndroid Build Coastguard Worker int cancelEvents(struct iocb **iocb, struct io_event *events, unsigned start, unsigned end, 84*ec779b8eSAndroid Build Coastguard Worker bool is_batch_cancel); 85*ec779b8eSAndroid Build Coastguard Worker 86*ec779b8eSAndroid Build Coastguard Worker // Wait for at minimum the given number of events. Returns the amount of data in the returned 87*ec779b8eSAndroid Build Coastguard Worker // events. Increments counter by the number of events returned. 88*ec779b8eSAndroid Build Coastguard Worker int waitEvents(struct io_buffer *buf, int min_events, struct io_event *events, int *counter); 89*ec779b8eSAndroid Build Coastguard Worker 90*ec779b8eSAndroid Build Coastguard Worker public: 91*ec779b8eSAndroid Build Coastguard Worker int read(void *data, size_t len) override; 92*ec779b8eSAndroid Build Coastguard Worker int write(const void *data, size_t len) override; 93*ec779b8eSAndroid Build Coastguard Worker 94*ec779b8eSAndroid Build Coastguard Worker int receiveFile(mtp_file_range mfr, bool zero_packet) override; 95*ec779b8eSAndroid Build Coastguard Worker int sendFile(mtp_file_range mfr) override; 96*ec779b8eSAndroid Build Coastguard Worker int sendEvent(mtp_event me) override; 97*ec779b8eSAndroid Build Coastguard Worker 98*ec779b8eSAndroid Build Coastguard Worker int start(bool ptp) override; 99*ec779b8eSAndroid Build Coastguard Worker void close() override; 100*ec779b8eSAndroid Build Coastguard Worker 101*ec779b8eSAndroid Build Coastguard Worker bool writeDescriptors(bool ptp); 102*ec779b8eSAndroid Build Coastguard Worker 103*ec779b8eSAndroid Build Coastguard Worker MtpFfsHandle(int controlFd); 104*ec779b8eSAndroid Build Coastguard Worker ~MtpFfsHandle(); 105*ec779b8eSAndroid Build Coastguard Worker }; 106*ec779b8eSAndroid Build Coastguard Worker 107*ec779b8eSAndroid Build Coastguard Worker struct mtp_data_header { 108*ec779b8eSAndroid Build Coastguard Worker /* length of packet, including this header */ 109*ec779b8eSAndroid Build Coastguard Worker __le32 length; 110*ec779b8eSAndroid Build Coastguard Worker /* container type (2 for data packet) */ 111*ec779b8eSAndroid Build Coastguard Worker __le16 type; 112*ec779b8eSAndroid Build Coastguard Worker /* MTP command code */ 113*ec779b8eSAndroid Build Coastguard Worker __le16 command; 114*ec779b8eSAndroid Build Coastguard Worker /* MTP transaction ID */ 115*ec779b8eSAndroid Build Coastguard Worker __le32 transaction_id; 116*ec779b8eSAndroid Build Coastguard Worker }; 117*ec779b8eSAndroid Build Coastguard Worker 118*ec779b8eSAndroid Build Coastguard Worker } // namespace android 119*ec779b8eSAndroid Build Coastguard Worker 120*ec779b8eSAndroid Build Coastguard Worker #endif // _MTP_FFS_HANDLE_H 121*ec779b8eSAndroid Build Coastguard Worker 122