diff options
| author | mrb0nk500 <b0nk@b0nk.xyz> | 2023-03-01 17:28:07 -0400 | 
|---|---|---|
| committer | mrb0nk500 <b0nk@b0nk.xyz> | 2023-03-01 17:28:07 -0400 | 
| commit | 0d82cc507e0c49e2871f18a7f574b3071b51f4a1 (patch) | |
| tree | 3ceb935b7387767da7324febc707165eb354d6b5 | |
| parent | 926f5f5ec7992651d2e0602f4fdb77f8be8a5ae5 (diff) | |
TTcpSocket: Match `open()`
I might do `test_connection()` next, if not, `TProtocol` will be next.
| -rw-r--r-- | context.h | 54 | ||||
| -rw-r--r-- | src/pso/TTcpSocket.cpp | 114 | 
2 files changed, 167 insertions, 1 deletions
| @@ -484,8 +484,26 @@ u32 render_shadow_flags;  u32 old_render_shadow_flags;  u32 some_id_805c6f74; -// THeap.cpp +// TTcpSocket.cpp  // func defs. +extern void func_80019aa0(); +extern void controller_stuff(); +extern char func_801a5d1c(); +extern void render_tick(); +extern void func_803d96a4(); +extern short tcp_abort(short nh); +extern short tcp_bind(short nh, struct at_ip_addr *addr, u16 port); +extern short tcp_connect(short nh, struct at_ip_addr *addr, u16 port, struct at_ip_option *option); +extern short tcp_create(); +extern short tcp_delete(short nh); +extern short tcp_get_opt(short nh, short type, u32 *opt); +extern short tcp_send(short nh, void (*notify)(short size, short sock_fd), char bufnum, struct send_buffs *sb); +extern short tcp_stat(short nh, short *stat, short *backlog, u32 *sendwin, u32 *recvwin); +extern short tcp_receive(short nh, void (*notify)(short size, short sock_fd), short len, u8 *buf); +extern int get_link_status(); +extern char *get_sock_status_name(short code); + +// THeap.cpp  extern void heap_xfree(void *ptr);  extern void *heap_xmalloc(size_t size); @@ -519,6 +537,40 @@ struct packet_header {  	void bswap();  } __packed__; +// TTcpSocket.cpp, but they're really from AVE-TCP +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; +}; +  // pso/TSocket.h  // Union defs.  union ipv4_addr { diff --git a/src/pso/TTcpSocket.cpp b/src/pso/TTcpSocket.cpp index 0317f37..e319b0e 100644 --- a/src/pso/TTcpSocket.cpp +++ b/src/pso/TTcpSocket.cpp @@ -3,6 +3,7 @@  #include <string.h>  #include "pso/macros.h"  #include "pso/TArray.h" +#include "pso/TMainTask.h"  #include "pso/TObject.h"  #include "pso/TSocket.h"  #include "pso/TTcpSocket.h" @@ -10,13 +11,50 @@  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); @@ -169,11 +207,87 @@ short TTcpSocket::close() {  }  short TTcpSocket::open() { +	set_sock_fd(-1); +	m_is_encrypted = 0; +	set_size(0); +	set_buffer_offset(0); +	set_buffer_cleared(true); +	set_unused(0); +	set_sock_fd(tcp_create()); + +	if (sock_fd() < 0) { +		log(get_sock_status_name(sock_fd())); +		return -1; +	} else { +		struct at_ip_option connect_option; +		struct at_ip_addr connect_addr; +		struct at_ip_addr bind_addr; + +		u32 opt = 1; + +		tcp_get_opt(sock_fd(), 0x2001, &opt); + +		bind_addr.type = 4; +		bind_addr.ip46.ip4 = 0; +		tcp_bind(sock_fd(), &bind_addr, src_port()); + +		connect_addr.type = 4; +		connect_addr.ip46.ip4 = dst_addr().addr; + +		connect_option.type = 4; +		connect_option.ip46.ip4.ttl = 120; +		connect_option.ip46.ip4.svctype = 0; +		connect_option.ip46.ip4.df_flag = 0; + +		if (tcp_connect(sock_fd(), &connect_addr, dst_port(), &connect_option)) { +			log(get_sock_status_name(sock_fd())); +			return -1; +		} else { +			for (;;) { +				func_803d96a4(); +				controller_stuff(); +				if (short status = stat()) { +					log(get_sock_status_name(status)); +					return -2; +				} else if (stat_val() < 0) { +					return -2; +				} else { +					some_stub(); +					if (stat_val() < 4) { +						if (!get_link_status()) { +							return -3; +						} else if (func_801a5d1c()) { +							return -2; +						} else { +							main_task.some_empty_func(); +							main_task.run_tl_camera_tasks(); +							main_task.render(); +							main_task.render_screen_overlay(); +							func_80019aa0(); +							render_tick(); +						} +					} else { +						tcp_socket_table[sock_fd()] = this; +						return sock_fd(); +					} +				} +			} +		} +	}  } +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) {} | 
