1
#include "source/common/network/io_socket_error_impl.h"
2

            
3
#include "envoy/common/platform.h"
4

            
5
#include "source/common/common/assert.h"
6
#include "source/common/common/utility.h"
7

            
8
namespace Envoy {
9
namespace Network {
10

            
11
570363
Api::IoError::IoErrorCode IoSocketError::getErrorCode() const { return error_code_; }
12

            
13
621
std::string IoSocketError::getErrorDetails() const { return errorDetails(errno_); }
14

            
15
7
Api::IoErrorPtr IoSocketError::getIoSocketInvalidAddressError() {
16
7
  return Api::IoError::wrap(
17
7
      new IoSocketError(SOCKET_ERROR_NOT_SUP, Api::IoError::IoErrorCode::NoSupport));
18
7
}
19

            
20
581
Api::IoErrorPtr IoSocketError::create(int sys_errno) {
21
581
  return Api::IoError::wrap(new IoSocketError(sys_errno));
22
581
}
23

            
24
31
Api::IoErrorPtr IoSocketError::getIoSocketEbadfError() {
25
31
  return Api::IoError::wrap(new IoSocketError(SOCKET_ERROR_BADF, Api::IoError::IoErrorCode::BadFd));
26
31
}
27

            
28
568858
Api::IoErrorPtr IoSocketError::getIoSocketEagainError() {
29
568858
  static auto* instance = new IoSocketError(SOCKET_ERROR_AGAIN, Api::IoError::IoErrorCode::Again);
30
568858
  return Api::IoError::reusedStatic(instance);
31
568858
}
32

            
33
7
Api::IoCallUint64Result IoSocketError::ioResultSocketInvalidAddress() {
34
7
  return {0, getIoSocketInvalidAddressError()};
35
7
}
36

            
37
581
Api::IoError::IoErrorCode IoSocketError::errorCodeFromErrno(int sys_errno) {
38
581
  switch (sys_errno) {
39
1
  case SOCKET_ERROR_AGAIN:
40
1
    return IoErrorCode::Again;
41
4
  case SOCKET_ERROR_NOT_SUP:
42
4
    return IoErrorCode::NoSupport;
43
1
  case SOCKET_ERROR_AF_NO_SUP:
44
1
    return IoErrorCode::AddressFamilyNoSupport;
45
1
  case SOCKET_ERROR_IN_PROGRESS:
46
1
    return IoErrorCode::InProgress;
47
1
  case SOCKET_ERROR_PERM:
48
1
    return IoErrorCode::Permission;
49
5
  case SOCKET_ERROR_MSG_SIZE:
50
5
    return IoErrorCode::MessageTooBig;
51
3
  case SOCKET_ERROR_INTR:
52
3
    return IoErrorCode::Interrupt;
53
5
  case SOCKET_ERROR_ADDR_NOT_AVAIL:
54
5
    return IoErrorCode::AddressNotAvailable;
55
30
  case SOCKET_ERROR_BADF:
56
30
    return IoErrorCode::BadFd;
57
431
  case SOCKET_ERROR_CONNRESET:
58
431
    return IoErrorCode::ConnectionReset;
59
1
  case SOCKET_ERROR_NETUNREACH:
60
1
    return IoErrorCode::NetworkUnreachable;
61
5
  case SOCKET_ERROR_INVAL:
62
5
    return IoErrorCode::InvalidArgument;
63
  case SOCKET_ERROR_NOBUFS:
64
    return IoErrorCode::NoBufferSpace;
65
93
  default:
66
93
    ENVOY_LOG_MISC(debug, "Unknown error code {} details {}", sys_errno, errorDetails(sys_errno));
67
93
    return IoErrorCode::UnknownError;
68
581
  }
69
581
}
70

            
71
} // namespace Network
72
} // namespace Envoy