diff options
author | mrb0nk500 <b0nk@b0nk.xyz> | 2023-03-03 20:01:22 -0400 |
---|---|---|
committer | mrb0nk500 <b0nk@b0nk.xyz> | 2023-03-03 20:02:24 -0400 |
commit | 310be43184c5af1cfe791bb955fd9e70ca861e0f (patch) | |
tree | 5327da1af72da44cd574d518f85b7cbb5cc9bf42 /src | |
parent | 232dd530a98b7d633bc46a3b8066fb8305c1c2e0 (diff) |
TTcpSocket: Revert `TTcpSocket: Make most of the virtuals inline`
Caused unwanted inlining in some cases.
Diffstat (limited to 'src')
-rw-r--r-- | src/pso/TTcpSocket.cpp | 171 |
1 files changed, 167 insertions, 4 deletions
diff --git a/src/pso/TTcpSocket.cpp b/src/pso/TTcpSocket.cpp index d5151a2..7244ad6 100644 --- a/src/pso/TTcpSocket.cpp +++ b/src/pso/TTcpSocket.cpp @@ -11,6 +11,173 @@ OBJECT_NAME(TTcpSocket); TTcpSocket *tcp_socket_table[16] = {nullptr}; +struct at_ip4_opt { + u8 ttl; + u8 svctype; + u8 df_flag; +}; + +struct at_ip6_opt { + u8 traffic_class; + u32 flow_label; + u8 hop_limit; +}; + +struct at_ip_option { + u32 type; + union { + struct at_ip6_opt ip6; + struct at_ip4_opt ip4; + } ip46; +}; + +struct at_ip_addr { + u32 type; + union { + u8 ip6[16]; + u32 ip4; + } ip46; +}; + +struct send_buffs { + short len; + u8 *buff; +}; + +void func_80019aa0(); +void controller_stuff(); +char func_801a5d1c(); +void render_tick(); +void func_803d96a4(); +short tcp_abort(short nh); +short tcp_bind(short nh, struct at_ip_addr *addr, u16 port); +short tcp_connect(short nh, struct at_ip_addr *addr, u16 port, struct at_ip_option *option); +short tcp_create(); +short tcp_delete(short nh); +short tcp_get_opt(short nh, short type, u32 *opt); +short tcp_send(short nh, void (*notify)(short size, short sock_fd), char bufnum, struct send_buffs *sb); +short tcp_stat(short nh, short *stat, short *backlog, u32 *sendwin, u32 *recvwin); +short tcp_receive(short nh, void (*notify)(short size, short sock_fd), short len, u8 *buf); +int get_link_status(); +char *get_sock_status_name(short code); + + +WEAK_FUNC TTcpSocket::TTcpSocket(TObject *parent) : TSocket(parent) { + set_name(TTcpSocket_name); +} + +TTcpSocket::~TTcpSocket() { + close(); +} + +void TTcpSocket::recv() { + if (sock_fd() != -1) { + packet_buffer().fill(0); + set_buffer_cleared(true); + (int)tcp_receive(sock_fd(), notify, packet_buffer().size(), packet_buffer().data()); + } +} + +void TTcpSocket::notify(short size, short sock_fd) { + char tmp_str[64]; + TTcpSocket *socket = tcp_socket_table[sock_fd]; + + if (socket != nullptr) { + if (size > 0) { + socket->set_buffer_cleared(false); + socket->set_size(size); + socket->set_buffer_offset(0); + sprintf(tmp_str, "Rcv:%d byte", size); + socket->log(tmp_str); + if (socket->callback() != nullptr) { + socket->callback()(socket); + } + } else { + socket->set_flags(1); + } + } +} + +int TTcpSocket::send(u8 *data, size_t size) { + if (sock_fd() != -1) { + if (!m_is_encrypted) { + m_send_crypt.encrypt(data, size); + } + + const s8 flags = sock_flags(); + if (flags || !get_link_status()) { + return -1; + } else { + if (int status = stat()) { + log(get_sock_status_name(status)); + set_flags(1); + return 1; + } else { + if (send_window() <= size) { + set_flags(1); + return 1; + } else { + if (stat_val() < 0) { + set_flags(1); + return 1; + } else { + struct send_buffs sb; + sb.buff = data; + sb.len = size; + set_unused(0); + int ret = tcp_send(sock_fd(), nullptr, 1, &sb); + if (ret >= 1 || ret < -1) { + set_flags(1); + log(get_sock_status_name(ret)); + close(); + return ret; + } + } + } + } + } + } else { + return -1; + } +} + +short TTcpSocket::send(u8 *data) { + if (sock_fd() != -1) { + const s8 flags = sock_flags(); + if (flags || !get_link_status()) { + return -1; + } else { + if (short status = stat()) { + log(get_sock_status_name(status)); + set_flags(1); + return 1; + } else { + if (stat_val() < 0) { + set_flags(1); + return 1; + } else { + s8 len = strlen(reinterpret_cast<const char *>(data)); + struct send_buffs sb; + sb.buff = data; + sb.len = len; + if (send_window() <= len) { + set_flags(1); + return 1; + } else { + short ret = tcp_send(sock_fd(), nullptr, 1, &sb); + if (ret) { + close(); + } + return ret; + } + } + } + } + } else { + return -1; + } +} + int TTcpSocket::test_connection() { for (int i = 0; i < 1800; ++i) { if (int status = stat()) { @@ -137,10 +304,6 @@ short TTcpSocket::open() { } } -WEAK_FUNC TTcpSocket::TTcpSocket(TObject *parent) : TSocket(parent) { - set_name(TTcpSocket_name); -} - void func_80019aa0() {} void controller_stuff() {} char func_801a5d1c() {} |