Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc3a190b authored by Junyu Lai's avatar Junyu Lai Committed by Gerrit Code Review
Browse files

Merge "Improve keepalive offload documentation and error handling"

parents b8f2ab93 1d5cd190
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -45,13 +45,14 @@ final class TcpSocketKeepalive extends SocketKeepalive {
     * - The application must not write to or read from the socket after calling this method, until
     *   onDataReceived, onStopped, or onError are called. If it does, the keepalive will fail
     *   with {@link #ERROR_SOCKET_NOT_IDLE}, or {@code #ERROR_INVALID_SOCKET} if the socket
     *   experienced an error (as in poll(2) returned POLLERR); if this happens, the data received
     *   from the socket may be invalid, and the socket can't be recovered.
     *   experienced an error (as in poll(2) returned POLLERR or POLLHUP); if this happens, the data
     *   received from the socket may be invalid, and the socket can't be recovered.
     * - If the socket has data in the send or receive buffer, then this call will fail with
     *   {@link #ERROR_SOCKET_NOT_IDLE} and can be retried after the data has been processed.
     *   An app could ensure this by using an application-layer protocol where it can receive
     *   acknowledgement that it will go into keepalive mode. It could then go into keepalive
     *   mode after having read the acknowledgement, draining the socket.
     *   An app could ensure this by using an application-layer protocol to receive acknowledgement
     *   that indicates all data has been delivered to server, e.g. HTTP 200 OK.
     *   Then the app could go into keepalive mode after reading all remaining data within the
     *   acknowledgement.
     */
    @Override
    void startImpl(int intervalSec) {
+6 −1
Original line number Diff line number Diff line
@@ -239,7 +239,12 @@ public class KeepaliveTracker {
                                .sendMessage(CMD_START_SOCKET_KEEPALIVE, slot, mInterval, mPacket);
                        break;
                    case TYPE_TCP:
                        try {
                            mTcpController.startSocketMonitor(mFd, this, mSlot);
                        } catch (InvalidSocketException e) {
                            handleStopKeepalive(mNai, mSlot, ERROR_INVALID_SOCKET);
                            return;
                        }
                        mNai.asyncChannel
                                .sendMessage(CMD_ADD_KEEPALIVE_PACKET_FILTER, slot, 0 /* Unused */,
                                        mPacket);
+5 −3
Original line number Diff line number Diff line
@@ -215,18 +215,20 @@ public class TcpKeepaliveController {
     * Start monitoring incoming packets.
     *
     * @param fd socket fd to monitor.
     * @param messenger a callback to notify socket status.
     * @param ki a {@link KeepaliveInfo} that tracks information about a socket keepalive.
     * @param slot keepalive slot.
     */
    public void startSocketMonitor(@NonNull final FileDescriptor fd,
            @NonNull final KeepaliveInfo ki, final int slot) {
            @NonNull final KeepaliveInfo ki, final int slot)
            throws IllegalArgumentException, InvalidSocketException {
        synchronized (mListeners) {
            if (null != mListeners.get(slot)) {
                throw new IllegalArgumentException("This slot is already taken");
            }
            for (int i = 0; i < mListeners.size(); ++i) {
                if (fd.equals(mListeners.valueAt(i))) {
                    throw new IllegalArgumentException("This fd is already registered");
                    Log.e(TAG, "This fd is already registered.");
                    throw new InvalidSocketException(ERROR_INVALID_SOCKET);
                }
            }
            mFdHandlerQueue.addOnFileDescriptorEventListener(fd, FD_EVENTS, (readyFd, events) -> {