// 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
