some fixes with SetSocketOptions

This commit is contained in:
georgemoralis 2025-05-02 18:50:34 +03:00
parent b6d4e0a814
commit ab5985aa30
2 changed files with 19 additions and 4 deletions

View File

@ -253,10 +253,15 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, u3
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_USECRYPTO, &sockopt_so_usecrypto); CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_USECRYPTO, &sockopt_so_usecrypto);
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_USESIGNATURE, &sockopt_so_usesignature); CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_USESIGNATURE, &sockopt_so_usesignature);
case ORBIS_NET_SO_LINGER: { case ORBIS_NET_SO_LINGER: {
if (optlen < sizeof(OrbisNetLinger)) if (socket_type ! = ORBIS_NET_SOCK_STREAM) {
return ORBIS_NET_EPROCUNAVAIL;
}
if (optlen < sizeof(OrbisNetLinger)) {
LOG_ERROR(Lib_Net, "size missmatched! optlen = {} OrbisNetLinger={}", optlen,
sizeof(OrbisNetLinger));
return ORBIS_NET_ERROR_EINVAL; return ORBIS_NET_ERROR_EINVAL;
}
int native_opt = SO_LINGER;
const void* native_val = &native_linger; const void* native_val = &native_linger;
u32 native_len = sizeof(native_linger); u32 native_len = sizeof(native_linger);
native_linger.l_onoff = reinterpret_cast<const OrbisNetLinger*>(optval)->l_onoff; native_linger.l_onoff = reinterpret_cast<const OrbisNetLinger*>(optval)->l_onoff;
@ -283,7 +288,7 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, u3
} }
} else if (level == IPPROTO_IP) { } else if (level == IPPROTO_IP) {
switch (optname) { switch (optname) {
CASE_SETSOCKOPT(IP_HDRINCL); // CASE_SETSOCKOPT(IP_HDRINCL);
CASE_SETSOCKOPT(IP_TOS); CASE_SETSOCKOPT(IP_TOS);
CASE_SETSOCKOPT(IP_TTL); CASE_SETSOCKOPT(IP_TTL);
CASE_SETSOCKOPT(IP_MULTICAST_IF); CASE_SETSOCKOPT(IP_MULTICAST_IF);
@ -293,6 +298,13 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, u3
CASE_SETSOCKOPT(IP_DROP_MEMBERSHIP); CASE_SETSOCKOPT(IP_DROP_MEMBERSHIP);
CASE_SETSOCKOPT_VALUE(ORBIS_NET_IP_TTLCHK, &sockopt_ip_ttlchk); CASE_SETSOCKOPT_VALUE(ORBIS_NET_IP_TTLCHK, &sockopt_ip_ttlchk);
CASE_SETSOCKOPT_VALUE(ORBIS_NET_IP_MAXTTL, &sockopt_ip_maxttl); CASE_SETSOCKOPT_VALUE(ORBIS_NET_IP_MAXTTL, &sockopt_ip_maxttl);
case ORBIS_NET_IP_HDRINCL: {
if (socket_type != ORBIS_NET_SOCK_RAW) {
return ORBIS_NET_EPROCUNAVAIL;
}
return ConvertReturnErrorCode(
setsockopt(sock, level, optname, (const char*)optval, optlen));
}
} }
} else if (level == IPPROTO_TCP) { } else if (level == IPPROTO_TCP) {
switch (optname) { switch (optname) {

View File

@ -63,8 +63,11 @@ struct PosixSocket : public Socket {
int sockopt_ip_ttlchk = 0; int sockopt_ip_ttlchk = 0;
int sockopt_ip_maxttl = 0; int sockopt_ip_maxttl = 0;
int sockopt_tcp_mss_to_advertise = 0; int sockopt_tcp_mss_to_advertise = 0;
int socket_type;
explicit PosixSocket(int domain, int type, int protocol) explicit PosixSocket(int domain, int type, int protocol)
: Socket(domain, type, protocol), sock(socket(domain, type, protocol)) {} : Socket(domain, type, protocol), sock(socket(domain, type, protocol)) {
socket_type = type;
}
explicit PosixSocket(net_socket sock) : Socket(0, 0, 0), sock(sock) {} explicit PosixSocket(net_socket sock) : Socket(0, 0, 0), sock(sock) {}
int Close() override; int Close() override;
int SetSocketOptions(int level, int optname, const void* optval, u32 optlen) override; int SetSocketOptions(int level, int optname, const void* optval, u32 optlen) override;