1 //! `tcpstream` provide an interface to establish tcp socket client.
2 
3 use crate::{Handle, IpAddress};
4 
5 extern "Rust" {
sys_tcp_stream_connect(ip: &[u8], port: u16, timeout: Option<u64>) -> Result<Handle, ()>6 	fn sys_tcp_stream_connect(ip: &[u8], port: u16, timeout: Option<u64>) -> Result<Handle, ()>;
sys_tcp_stream_close(handle: Handle) -> Result<(), ()>7 	fn sys_tcp_stream_close(handle: Handle) -> Result<(), ()>;
sys_tcp_stream_read(handle: Handle, buffer: &mut [u8]) -> Result<usize, ()>8 	fn sys_tcp_stream_read(handle: Handle, buffer: &mut [u8]) -> Result<usize, ()>;
sys_tcp_stream_write(handle: Handle, buffer: &[u8]) -> Result<usize, ()>9 	fn sys_tcp_stream_write(handle: Handle, buffer: &[u8]) -> Result<usize, ()>;
sys_tcp_stream_set_read_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>10 	fn sys_tcp_stream_set_read_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>;
sys_tcp_stream_get_read_timeout(handle: Handle) -> Result<Option<u64>, ()>11 	fn sys_tcp_stream_get_read_timeout(handle: Handle) -> Result<Option<u64>, ()>;
sys_tcp_stream_set_write_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>12 	fn sys_tcp_stream_set_write_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>;
sys_tcp_stream_get_write_timeout(handle: Handle) -> Result<Option<u64>, ()>13 	fn sys_tcp_stream_get_write_timeout(handle: Handle) -> Result<Option<u64>, ()>;
sys_tcp_stream_peek(handle: Handle, buf: &mut [u8]) -> Result<usize, ()>14 	fn sys_tcp_stream_peek(handle: Handle, buf: &mut [u8]) -> Result<usize, ()>;
sys_tcp_stream_set_nonblocking(handle: Handle, mode: bool) -> Result<(), ()>15 	fn sys_tcp_stream_set_nonblocking(handle: Handle, mode: bool) -> Result<(), ()>;
sys_tcp_stream_set_tll(handle: Handle, ttl: u32) -> Result<(), ()>16 	fn sys_tcp_stream_set_tll(handle: Handle, ttl: u32) -> Result<(), ()>;
sys_tcp_stream_get_tll(handle: Handle) -> Result<u32, ()>17 	fn sys_tcp_stream_get_tll(handle: Handle) -> Result<u32, ()>;
sys_tcp_stream_shutdown(handle: Handle, how: i32) -> Result<(), ()>18 	fn sys_tcp_stream_shutdown(handle: Handle, how: i32) -> Result<(), ()>;
sys_tcp_stream_peer_addr(handle: Handle) -> Result<(IpAddress, u16), ()>19 	fn sys_tcp_stream_peer_addr(handle: Handle) -> Result<(IpAddress, u16), ()>;
20 }
21 
22 /// Opens a TCP connection to a remote host.
23 #[inline(always)]
connect(ip: &[u8], port: u16, timeout: Option<u64>) -> Result<Handle, ()>24 pub fn connect(ip: &[u8], port: u16, timeout: Option<u64>) -> Result<Handle, ()> {
25 	unsafe { sys_tcp_stream_connect(ip, port, timeout) }
26 }
27 
28 /// Close a TCP connection
29 #[inline(always)]
close(handle: Handle) -> Result<(), ()>30 pub fn close(handle: Handle) -> Result<(), ()> {
31 	unsafe { sys_tcp_stream_close(handle) }
32 }
33 
34 #[inline(always)]
peek(handle: Handle, buf: &mut [u8]) -> Result<usize, ()>35 pub fn peek(handle: Handle, buf: &mut [u8]) -> Result<usize, ()> {
36 	unsafe { sys_tcp_stream_peek(handle, buf) }
37 }
38 
39 #[inline(always)]
peer_addr(handle: Handle) -> Result<(IpAddress, u16), ()>40 pub fn peer_addr(handle: Handle) -> Result<(IpAddress, u16), ()> {
41 	unsafe { sys_tcp_stream_peer_addr(handle) }
42 }
43 #[inline(always)]
read(handle: Handle, buffer: &mut [u8]) -> Result<usize, ()>44 pub fn read(handle: Handle, buffer: &mut [u8]) -> Result<usize, ()> {
45 	unsafe { sys_tcp_stream_read(handle, buffer) }
46 }
47 
48 #[inline(always)]
write(handle: Handle, buffer: &[u8]) -> Result<usize, ()>49 pub fn write(handle: Handle, buffer: &[u8]) -> Result<usize, ()> {
50 	unsafe { sys_tcp_stream_write(handle, buffer) }
51 }
52 
53 #[inline(always)]
set_read_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>54 pub fn set_read_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()> {
55 	unsafe { sys_tcp_stream_set_read_timeout(handle, timeout) }
56 }
57 
58 #[inline(always)]
set_write_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()>59 pub fn set_write_timeout(handle: Handle, timeout: Option<u64>) -> Result<(), ()> {
60 	unsafe { sys_tcp_stream_set_write_timeout(handle, timeout) }
61 }
62 
63 #[inline(always)]
get_read_timeout(handle: Handle) -> Result<Option<u64>, ()>64 pub fn get_read_timeout(handle: Handle) -> Result<Option<u64>, ()> {
65 	unsafe { sys_tcp_stream_get_read_timeout(handle) }
66 }
67 
68 #[inline(always)]
get_write_timeout(handle: Handle) -> Result<Option<u64>, ()>69 pub fn get_write_timeout(handle: Handle) -> Result<Option<u64>, ()> {
70 	unsafe { sys_tcp_stream_get_write_timeout(handle) }
71 }
72 
73 #[inline(always)]
set_nodelay(_: Handle, mode: bool) -> Result<(), ()>74 pub fn set_nodelay(_: Handle, mode: bool) -> Result<(), ()> {
75 	// smoltcp does not support Nagle's algorithm
76 	// => to enable Nagle's algorithm isn't possible
77 	if mode {
78 		Ok(())
79 	} else {
80 		Err(())
81 	}
82 }
83 
84 #[inline(always)]
nodelay(_: Handle) -> Result<bool, ()>85 pub fn nodelay(_: Handle) -> Result<bool, ()> {
86 	// smoltcp does not support Nagle's algorithm
87 	// => return always true
88 	Ok(true)
89 }
90 
91 #[inline(always)]
set_nonblocking(handle: Handle, mode: bool) -> Result<(), ()>92 pub fn set_nonblocking(handle: Handle, mode: bool) -> Result<(), ()> {
93 	unsafe { sys_tcp_stream_set_nonblocking(handle, mode) }
94 }
95 
96 #[inline(always)]
set_tll(handle: Handle, ttl: u32) -> Result<(), ()>97 pub fn set_tll(handle: Handle, ttl: u32) -> Result<(), ()> {
98 	unsafe { sys_tcp_stream_set_tll(handle, ttl) }
99 }
100 
101 #[inline(always)]
get_tll(handle: Handle) -> Result<u32, ()>102 pub fn get_tll(handle: Handle) -> Result<u32, ()> {
103 	unsafe { sys_tcp_stream_get_tll(handle) }
104 }
105 
106 #[inline(always)]
shutdown(handle: Handle, how: i32) -> Result<(), ()>107 pub fn shutdown(handle: Handle, how: i32) -> Result<(), ()> {
108 	unsafe { sys_tcp_stream_shutdown(handle, how) }
109 }
110