51817f6e59
This commit adds a network abstraction designed to implement bsd:s but at the same time work as a generic abstraction to implement any networking code we have to use from core. This is implemented on top of BSD sockets on Unix systems and winsock on Windows. The code is designed around winsocks having compatibility definitions to support both BSD and Windows sockets.
88 lines
1.5 KiB
C++
88 lines
1.5 KiB
C++
// Copyright 2020 yuzu emulator team
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <array>
|
|
#include <utility>
|
|
|
|
#include "common/common_types.h"
|
|
|
|
namespace Network {
|
|
|
|
class Socket;
|
|
|
|
/// Error code for network functions
|
|
enum class Errno {
|
|
SUCCESS,
|
|
BADF,
|
|
INVAL,
|
|
MFILE,
|
|
NOTCONN,
|
|
AGAIN,
|
|
};
|
|
|
|
/// Address families
|
|
enum class Domain {
|
|
INET, ///< Address family for IPv4
|
|
};
|
|
|
|
/// Socket types
|
|
enum class Type {
|
|
STREAM,
|
|
DGRAM,
|
|
RAW,
|
|
SEQPACKET,
|
|
};
|
|
|
|
/// Protocol values for sockets
|
|
enum class Protocol {
|
|
ICMP,
|
|
TCP,
|
|
UDP,
|
|
};
|
|
|
|
/// Shutdown mode
|
|
enum class ShutdownHow {
|
|
RD,
|
|
WR,
|
|
RDWR,
|
|
};
|
|
|
|
/// Array of IPv4 address
|
|
using IPv4Address = std::array<u8, 4>;
|
|
|
|
/// Cross-platform sockaddr structure
|
|
struct SockAddrIn {
|
|
Domain family;
|
|
IPv4Address ip;
|
|
u16 portno;
|
|
};
|
|
|
|
/// Cross-platform poll fd structure
|
|
struct PollFD {
|
|
Socket* socket;
|
|
u16 events;
|
|
u16 revents;
|
|
};
|
|
|
|
constexpr u16 POLL_IN = 1 << 0;
|
|
constexpr u16 POLL_PRI = 1 << 1;
|
|
constexpr u16 POLL_OUT = 1 << 2;
|
|
constexpr u16 POLL_ERR = 1 << 3;
|
|
constexpr u16 POLL_HUP = 1 << 4;
|
|
constexpr u16 POLL_NVAL = 1 << 5;
|
|
|
|
class NetworkInstance {
|
|
public:
|
|
explicit NetworkInstance();
|
|
~NetworkInstance();
|
|
};
|
|
|
|
/// @brief Returns host's IPv4 address
|
|
/// @return Pair of an array of human ordered IPv4 address (e.g. 192.168.0.1) and an error code
|
|
std::pair<IPv4Address, Errno> GetHostIPv4Address();
|
|
|
|
} // namespace Network
|