| // Copyright 2014 The BoringSSL Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef HEADER_PACKETED_BIO |
| #define HEADER_PACKETED_BIO |
| |
| #include <functional> |
| |
| #include <openssl/base.h> |
| #include <openssl/bio.h> |
| |
| #if defined(OPENSSL_WINDOWS) |
| #include <winsock2.h> |
| #else |
| #include <sys/time.h> |
| #endif |
| |
| |
| // PacketedBioCreate creates a filter BIO which implements a reliable in-order |
| // blocking datagram socket. It uses the value of `*clock` as the clock. |
| // |
| // During a `BIO_read`, the peer may interrupt the filter BIO to perform |
| // operations on `ssl`, such as handling timeouts or updating the MTU. In this |
| // case, the `BIO_read` operation will fail with a retryable error, which should |
| // be surfaced from `ssl` as `SSL_ERROR_WANT_READ`. The caller must then call |
| // `PacketedBioHasInterrupt` and `PacketedBioHandleInterrupt` to handle the |
| // interrupt. |
| // |
| // Pending operations are deferred so that they are not triggered reentrantly in |
| // the middle of an operation on `ssl`. |
| bssl::UniquePtr<BIO> PacketedBioCreate(timeval *clock, SSL *ssl); |
| |
| // PacketedBioHasInterrupt returns whether `bio` has a pending interrupt. If it |
| // returns true, the caller must call `PacketedBioHandleInterrupt` to handle it. |
| bool PacketedBioHasInterrupt(BIO *bio); |
| |
| // PacketedBioHandleInterrupt handles the pending interrupt on `bio`. It returns |
| // true on success, in which case the caller should retry the operation, and |
| // false on error. |
| bool PacketedBioHandleInterrupt(BIO *bio); |
| |
| // PacketedBioAdvanceClock advances the clock by `microseconds` and handles the |
| // timeout on the `SSL` object. It returns true on success and false on error. |
| bool PacketedBioAdvanceClock(BIO *bio, uint64_t microseconds); |
| |
| #endif // HEADER_PACKETED_BIO |