#ifndef BITCOIN_COMMON_PCP_H
#define BITCOIN_COMMON_PCP_H
#include <netaddress.h>
#include <variant>
constexpr size_t PCP_MAP_NONCE_SIZE = 12;
typedef std::array<uint8_t, PCP_MAP_NONCE_SIZE> PCPMappingNonce;
enum class MappingError {
NETWORK_ERROR, PROTOCOL_ERROR, UNSUPP_VERSION, NO_RESOURCES, };
struct MappingResult {
MappingResult(uint8_t version, const CService &internal_in, const CService &external_in, uint32_t lifetime_in):
version(version), internal(internal_in), external(external_in), lifetime(lifetime_in) {}
uint8_t version;
CService internal;
CService external;
uint32_t lifetime;
std::string ToString() const;
};
std::variant<MappingResult, MappingError> NATPMPRequestPortMap(const CNetAddr &gateway, uint16_t port, uint32_t lifetime, int num_tries = 3, std::chrono::milliseconds timeout_per_try = std::chrono::milliseconds(1000));
std::variant<MappingResult, MappingError> PCPRequestPortMap(const PCPMappingNonce &nonce, const CNetAddr &gateway, const CNetAddr &bind, uint16_t port, uint32_t lifetime, int num_tries = 3, std::chrono::milliseconds timeout_per_try = std::chrono::milliseconds(1000));
#endif