Skip to content

Commit 85e025e

Browse files
authored
Merge pull request #85 from quartiq/feature/tcp-updates
Adding new TCP socket APIs
2 parents 2432d58 + 15d1e37 commit 85e025e

File tree

5 files changed

+23
-11
lines changed

5 files changed

+23
-11
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1111
- Bump dependency version of `no-std-net` to `v0.6`.
1212
- Bump MSRV to 1.53.0 due to `no-std-net`'s use of or-patterns.
1313
- Added support for `core::net` with the `ip_in_core` feature.
14+
- [breaking] New TCP error enumerations added for identifying TCP-related connection errors
15+
- [breaking] Removed the `TcpClientStack::is_connected` API
1416

1517
## [0.6.0] - 2021-05-25
1618

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ pub use no_std_net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, Socke
2222

2323
pub use dns::{AddrType, Dns};
2424
pub use stack::{
25-
SharableStack, SharedStack, TcpClientStack, TcpFullStack, UdpClientStack, UdpFullStack,
25+
SharableStack, SharedStack, TcpClientStack, TcpError, TcpErrorKind, TcpFullStack,
26+
UdpClientStack, UdpFullStack,
2627
};

src/stack/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ mod tcp;
33
mod udp;
44

55
pub use share::{SharableStack, SharedStack};
6-
pub use tcp::{TcpClientStack, TcpFullStack};
6+
pub use tcp::{TcpClientStack, TcpError, TcpErrorKind, TcpFullStack};
77
pub use udp::{UdpClientStack, UdpFullStack};

src/stack/share.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ where
128128
forward! {connect(socket: &mut Self::TcpSocket, address: SocketAddr) -> Result<(), nb::Error<<T as TcpClientStack>::Error>>}
129129
forward! {send(socket: &mut Self::TcpSocket, data: &[u8]) -> Result<usize, nb::Error<<T as TcpClientStack>::Error>>}
130130
forward! {receive(socket: &mut Self::TcpSocket, data: &mut [u8]) -> Result<usize, nb::Error<<T as TcpClientStack>::Error>>}
131-
forward! {is_connected(socket: &Self::TcpSocket) -> Result<bool, Self::Error>}
132131
forward! {close(socket: Self::TcpSocket) -> Result<(), Self::Error>}
133132
}
134133

src/stack/tcp.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,22 @@
11
use crate::SocketAddr;
22

3+
/// Represents specific errors encountered during TCP operations.
4+
#[non_exhaustive]
5+
#[derive(Copy, Clone, PartialEq, Debug)]
6+
pub enum TcpErrorKind {
7+
/// The socket has been closed in the direction in which the failing operation was attempted.
8+
PipeClosed,
9+
10+
/// Some other error has occurred.
11+
Other,
12+
}
13+
14+
/// Methods to resolve errors into identifiable, actionable codes on the client side.
15+
pub trait TcpError: core::fmt::Debug {
16+
/// Determines the kind of error that occurred.
17+
fn kind(&self) -> TcpErrorKind;
18+
}
19+
320
/// This trait is implemented by TCP/IP stacks. You could, for example, have an implementation
421
/// which knows how to send AT commands to an ESP8266 WiFi module. You could have another implementation
522
/// which knows how to driver the Rust Standard Library's `std::net` module. Given this trait, you can
@@ -8,7 +25,7 @@ pub trait TcpClientStack {
825
/// The type returned when we create a new TCP socket
926
type TcpSocket;
1027
/// The type returned when we have an error
11-
type Error: core::fmt::Debug;
28+
type Error: TcpError;
1229

1330
/// Open a socket for usage as a TCP client.
1431
///
@@ -27,9 +44,6 @@ pub trait TcpClientStack {
2744
remote: SocketAddr,
2845
) -> nb::Result<(), Self::Error>;
2946

30-
/// Check if this socket is connected
31-
fn is_connected(&mut self, socket: &Self::TcpSocket) -> Result<bool, Self::Error>;
32-
3347
/// Write to the stream.
3448
///
3549
/// Returns the number of bytes written (which may be less than `buffer.len()`) or an error.
@@ -98,10 +112,6 @@ impl<T: TcpClientStack> TcpClientStack for &mut T {
98112
T::connect(self, socket, remote)
99113
}
100114

101-
fn is_connected(&mut self, socket: &Self::TcpSocket) -> Result<bool, Self::Error> {
102-
T::is_connected(self, socket)
103-
}
104-
105115
fn send(
106116
&mut self,
107117
socket: &mut Self::TcpSocket,

0 commit comments

Comments
 (0)