Handle SYS_NET_IPPROTO_IP get/setsockopt

Improve net logging.

Should allow latest vsh to load (Depending on windows version apparantly..)
This commit is contained in:
clienthax 2021-12-26 17:13:01 +00:00 committed by Ivan
parent 9cfdd8afea
commit 6837370a62
2 changed files with 288 additions and 8 deletions

View File

@ -16,6 +16,7 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
@ -121,6 +122,98 @@ void fmt_class_string<lv2_socket_family>::format(std::string& out, u64 arg)
});
}
template <>
void fmt_class_string<lv2_ip_protocol>::format(std::string& out, u64 arg)
{
format_enum(out, arg, [](auto value)
{
switch (value)
{
case SYS_NET_IPPROTO_IP: return "IPPROTO_IP";
case SYS_NET_IPPROTO_ICMP: return "IPPROTO_ICMP";
case SYS_NET_IPPROTO_IGMP: return "IPPROTO_IGMP";
case SYS_NET_IPPROTO_TCP: return "IPPROTO_TCP";
case SYS_NET_IPPROTO_UDP: return "IPPROTO_UDP";
case SYS_NET_IPPROTO_ICMPV6: return "IPPROTO_ICMPV6";
}
return unknown;
});
}
template <>
void fmt_class_string<lv2_tcp_option>::format(std::string& out, u64 arg)
{
format_enum(out, arg, [](auto value)
{
switch (value)
{
case SYS_NET_TCP_NODELAY: return "TCP_NODELAY";
case SYS_NET_TCP_MAXSEG: return "TCP_MAXSEG";
case SYS_NET_TCP_MSS_TO_ADVERTISE: return "TCP_MSS_TO_ADVERTISE";
}
return unknown;
});
}
template <>
void fmt_class_string<lv2_socket_option>::format(std::string& out, u64 arg)
{
format_enum(out, arg, [](auto value)
{
switch (value)
{
case SYS_NET_SO_SNDBUF: return "SO_SNDBUF";
case SYS_NET_SO_RCVBUF: return "SO_RCVBUF";
case SYS_NET_SO_SNDLOWAT: return "SO_SNDLOWAT";
case SYS_NET_SO_RCVLOWAT: return "SO_RCVLOWAT";
case SYS_NET_SO_SNDTIMEO: return "SO_SNDTIMEO";
case SYS_NET_SO_RCVTIMEO: return "SO_RCVTIMEO";
case SYS_NET_SO_ERROR: return "SO_ERROR";
case SYS_NET_SO_TYPE: return "SO_TYPE";
case SYS_NET_SO_NBIO: return "SO_NBIO";
case SYS_NET_SO_TPPOLICY: return "SO_TPPOLICY";
case SYS_NET_SO_REUSEADDR: return "SO_REUSEADDR";
case SYS_NET_SO_KEEPALIVE: return "SO_KEEPALIVE";
case SYS_NET_SO_BROADCAST: return "SO_BROADCAST";
case SYS_NET_SO_LINGER: return "SO_LINGER";
case SYS_NET_SO_OOBINLINE: return "SO_OOBINLINE";
case SYS_NET_SO_REUSEPORT: return "SO_REUSEPORT";
case SYS_NET_SO_ONESBCAST: return "SO_ONESBCAST";
case SYS_NET_SO_USECRYPTO: return "SO_USECRYPTO";
case SYS_NET_SO_USESIGNATURE: return "SO_USESIGNATURE";
case SYS_NET_SOL_SOCKET: return "SOL_SOCKET";
}
return unknown;
});
}
template <>
void fmt_class_string<lv2_ip_option>::format(std::string& out, u64 arg)
{
format_enum(out, arg, [](auto value)
{
switch (value)
{
case SYS_NET_IP_HDRINCL: return "IP_HDRINCL";
case SYS_NET_IP_TOS: return "IP_TOS";
case SYS_NET_IP_TTL: return "IP_TTL";
case SYS_NET_IP_MULTICAST_IF: return "IP_MULTICAST_IF";
case SYS_NET_IP_MULTICAST_TTL: return "IP_MULTICAST_TTL";
case SYS_NET_IP_MULTICAST_LOOP: return "IP_MULTICAST_LOOP";
case SYS_NET_IP_ADD_MEMBERSHIP: return "IP_ADD_MEMBERSHIP";
case SYS_NET_IP_DROP_MEMBERSHIP: return "IP_DROP_MEMBERSHIP";
case SYS_NET_IP_TTLCHK: return "IP_TTLCHK";
case SYS_NET_IP_MAXTTL: return "IP_MAXTTL";
case SYS_NET_IP_DONTFRAG: return "IP_DONTFRAG";
}
return unknown;
});
}
template <>
void fmt_class_string<struct in_addr>::format(std::string& out, u64 arg)
@ -1980,7 +2073,21 @@ error_code sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optnam
{
ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_getsockopt(s=%d, level=0x%x, optname=0x%x, optval=*0x%x, optlen=*0x%x)", s, level, optname, optval, optlen);
switch (level)
{
case SYS_NET_SOL_SOCKET:
sys_net.warning("sys_net_bnet_getsockopt(s=%d, level=SYS_NET_SOL_SOCKET, optname=%s, optval=*0x%x, optlen=%u)", s, static_cast<lv2_socket_option>(optname), optval, optlen);
break;
case SYS_NET_IPPROTO_TCP:
sys_net.warning("sys_net_bnet_getsockopt(s=%d, level=SYS_NET_IPPROTO_TCP, optname=%s, optval=*0x%x, optlen=%u)", s, static_cast<lv2_tcp_option>(optname), optval, optlen);
break;
case SYS_NET_IPPROTO_IP:
sys_net.warning("sys_net_bnet_getsockopt(s=%d, level=SYS_NET_IPPROTO_IP, optname=%s, optval=*0x%x, optlen=%u)", s, static_cast<lv2_ip_option>(optname), optval, optlen);
break;
default:
sys_net.warning("sys_net_bnet_getsockopt(s=%d, level=0x%x, optname=0x%x, optval=*0x%x, optlen=%u)", s, level, optname, optval, optlen);
break;
}
if (!optval || !optlen)
{
@ -2148,6 +2255,77 @@ error_code sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optnam
}
}
}
else if (level == SYS_NET_IPPROTO_IP)
{
native_level = IPPROTO_IP;
switch (optname)
{
case SYS_NET_IP_HDRINCL:
{
native_opt = IP_HDRINCL;
break;
}
case SYS_NET_IP_TOS:
{
native_opt = IP_TOS;
break;
}
case SYS_NET_IP_TTL:
{
native_opt = IP_TTL;
break;
}
case SYS_NET_IP_MULTICAST_IF:
{
native_opt = IP_MULTICAST_IF;
break;
}
case SYS_NET_IP_MULTICAST_TTL:
{
native_opt = IP_MULTICAST_TTL;
break;
}
case SYS_NET_IP_MULTICAST_LOOP:
{
native_opt = IP_MULTICAST_LOOP;
break;
}
case SYS_NET_IP_ADD_MEMBERSHIP:
{
native_opt = IP_ADD_MEMBERSHIP;
break;
}
case SYS_NET_IP_DROP_MEMBERSHIP:
{
native_opt = IP_DROP_MEMBERSHIP;
break;
}
case SYS_NET_IP_TTLCHK:
{
sys_net.error("sys_net_bnet_getsockopt(s=%d, IPPROTO_IP): Stubbed option (0x%x) (SYS_NET_IP_TTLCHK)", s, optname);
return {};
}
case SYS_NET_IP_MAXTTL:
{
sys_net.error("sys_net_bnet_getsockopt(s=%d, IPPROTO_IP): Stubbed option (0x%x) (SYS_NET_IP_MAXTTL)", s, optname);
return {};
}
case SYS_NET_IP_DONTFRAG:
{
#ifdef _WIN32
native_opt = IP_DONTFRAGMENT;
#else
native_opt = IP_DF;
#endif
break;
}
default:
{
sys_net.error("sys_net_bnet_getsockopt(s=%d, IPPROTO_IP): unknown option (0x%x)", s, optname);
return SYS_NET_EINVAL;
}
}
}
else
{
sys_net.error("sys_net_bnet_getsockopt(s=%d): unknown level (0x%x)", s, level);
@ -2827,7 +3005,22 @@ error_code sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optnam
{
ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_setsockopt(s=%d, level=0x%x, optname=0x%x, optval=*0x%x, optlen=%u)", s, level, optname, optval, optlen);
switch (level)
{
case SYS_NET_SOL_SOCKET:
sys_net.warning("sys_net_bnet_setsockopt(s=%d, level=SYS_NET_SOL_SOCKET, optname=%s, optval=*0x%x, optlen=%u)", s, static_cast<lv2_socket_option>(optname), optval, optlen);
break;
case SYS_NET_IPPROTO_TCP:
sys_net.warning("sys_net_bnet_setsockopt(s=%d, level=SYS_NET_IPPROTO_TCP, optname=%s, optval=*0x%x, optlen=%u)", s, static_cast<lv2_tcp_option>(optname), optval, optlen);
break;
case SYS_NET_IPPROTO_IP:
sys_net.warning("sys_net_bnet_setsockopt(s=%d, level=SYS_NET_IPPROTO_IP, optname=%s, optval=*0x%x, optlen=%u)", s, static_cast<lv2_ip_option>(optname), optval, optlen);
break;
default:
sys_net.warning("sys_net_bnet_setsockopt(s=%d, level=0x%x, optname=0x%x, optval=*0x%x, optlen=%u)", s, level, optname, optval, optlen);
break;
}
switch(optlen)
{
case 1:
@ -3025,6 +3218,77 @@ error_code sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optnam
}
}
}
else if (level == SYS_NET_IPPROTO_IP)
{
native_level = IPPROTO_IP;
switch (optname)
{
case SYS_NET_IP_HDRINCL:
{
native_opt = IP_HDRINCL;
break;
}
case SYS_NET_IP_TOS:
{
native_opt = IP_TOS;
break;
}
case SYS_NET_IP_TTL:
{
native_opt = IP_TTL;
break;
}
case SYS_NET_IP_MULTICAST_IF:
{
native_opt = IP_MULTICAST_IF;
break;
}
case SYS_NET_IP_MULTICAST_TTL:
{
native_opt = IP_MULTICAST_TTL;
break;
}
case SYS_NET_IP_MULTICAST_LOOP:
{
native_opt = IP_MULTICAST_LOOP;
break;
}
case SYS_NET_IP_ADD_MEMBERSHIP:
{
native_opt = IP_ADD_MEMBERSHIP;
break;
}
case SYS_NET_IP_DROP_MEMBERSHIP:
{
native_opt = IP_DROP_MEMBERSHIP;
break;
}
case SYS_NET_IP_TTLCHK:
{
sys_net.error("sys_net_bnet_setsockopt(s=%d, IPPROTO_IP): Stubbed option (0x%x) (SYS_NET_IP_TTLCHK)", s, optname);
break;
}
case SYS_NET_IP_MAXTTL:
{
sys_net.error("sys_net_bnet_setsockopt(s=%d, IPPROTO_IP): Stubbed option (0x%x) (SYS_NET_IP_MAXTTL)", s, optname);
break;
}
case SYS_NET_IP_DONTFRAG:
{
#ifdef _WIN32
native_opt = IP_DONTFRAGMENT;
#else
native_opt = IP_DF;
#endif
break;
}
default:
{
sys_net.error("sys_net_bnet_setsockopt(s=%d, IPPROTO_IP): unknown option (0x%x)", s, optname);
return SYS_NET_EINVAL;
}
}
}
else
{
sys_net.error("sys_net_bnet_setsockopt(s=%d): unknown level (0x%x)", s, level);
@ -3104,11 +3368,11 @@ error_code sys_net_bnet_shutdown(ppu_thread& ppu, s32 s, s32 how)
return CELL_OK;
}
error_code sys_net_bnet_socket(ppu_thread& ppu, s32 family, s32 type, s32 protocol)
error_code sys_net_bnet_socket(ppu_thread& ppu, lv2_socket_family family, lv2_socket_type type, lv2_ip_protocol protocol)
{
ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_socket(family=%d, type=%d, protocol=%d)", family, type, protocol);
sys_net.warning("sys_net_bnet_socket(family=%s, type=%s, protocol=%s)", family, type, protocol);
if (family != SYS_NET_AF_INET && family != SYS_NET_AF_UNSPEC)
{

View File

@ -70,7 +70,7 @@ enum lv2_socket_type : s32
};
// Socket options (prefixed with SYS_NET_)
enum
enum lv2_socket_option : s32
{
SYS_NET_SO_SNDBUF = 0x1001,
SYS_NET_SO_RCVBUF = 0x1002,
@ -96,6 +96,22 @@ enum
SYS_NET_SOL_SOCKET = 0xffff,
};
// IP options (prefixed with SYS_NET_)
enum lv2_ip_option : s32
{
SYS_NET_IP_HDRINCL = 2,
SYS_NET_IP_TOS = 3,
SYS_NET_IP_TTL = 4,
SYS_NET_IP_MULTICAST_IF = 9,
SYS_NET_IP_MULTICAST_TTL = 10,
SYS_NET_IP_MULTICAST_LOOP = 11,
SYS_NET_IP_ADD_MEMBERSHIP = 12,
SYS_NET_IP_DROP_MEMBERSHIP = 13,
SYS_NET_IP_TTLCHK = 23,
SYS_NET_IP_MAXTTL = 24,
SYS_NET_IP_DONTFRAG = 26
};
// Family (prefixed with SYS_NET_)
enum lv2_socket_family : s32
{
@ -132,7 +148,7 @@ enum
};
// TCP options (prefixed with SYS_NET_)
enum
enum lv2_tcp_option : s32
{
SYS_NET_TCP_NODELAY = 1,
SYS_NET_TCP_MAXSEG = 2,
@ -140,7 +156,7 @@ enum
};
// IP protocols (prefixed with SYS_NET_)
enum
enum lv2_ip_protocol : s32
{
SYS_NET_IPPROTO_IP = 0,
SYS_NET_IPPROTO_ICMP = 1,
@ -447,7 +463,7 @@ error_code sys_net_bnet_sendmsg(ppu_thread&, s32 s, vm::cptr<sys_net_msghdr> msg
error_code sys_net_bnet_sendto(ppu_thread&, s32 s, vm::cptr<void> buf, u32 len, s32 flags, vm::cptr<sys_net_sockaddr> addr, u32 addrlen);
error_code sys_net_bnet_setsockopt(ppu_thread&, s32 s, s32 level, s32 optname, vm::cptr<void> optval, u32 optlen);
error_code sys_net_bnet_shutdown(ppu_thread&, s32 s, s32 how);
error_code sys_net_bnet_socket(ppu_thread&, s32 family, s32 type, s32 protocol);
error_code sys_net_bnet_socket(ppu_thread&, lv2_socket_family family, lv2_socket_type type, lv2_ip_protocol protocol);
error_code sys_net_bnet_close(ppu_thread&, s32 s);
error_code sys_net_bnet_poll(ppu_thread&, vm::ptr<sys_net_pollfd> fds, s32 nfds, s32 ms);
error_code sys_net_bnet_select(ppu_thread&, s32 nfds, vm::ptr<sys_net_fd_set> readfds, vm::ptr<sys_net_fd_set> writefds, vm::ptr<sys_net_fd_set> exceptfds, vm::ptr<sys_net_timeval> timeout);