|
@@ -99,7 +99,6 @@ impl TcpSocket {
|
|
|
}
|
|
|
|
|
|
pub fn try_accept(&self) -> Result<(Arc<TcpSocket>, smoltcp::wire::IpEndpoint), SystemError> {
|
|
|
- // poll_ifaces();
|
|
|
match self.inner.write().as_mut().expect("Tcp Inner is None") {
|
|
|
Inner::Listening(listening) => listening.accept().map(|(stream, remote)| {
|
|
|
(
|
|
@@ -227,16 +226,9 @@ impl TcpSocket {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- fn in_notify(&self) -> bool {
|
|
|
- self.update_events();
|
|
|
- // shouldn't pollee but just get the status of the socket
|
|
|
+ fn incoming(&self) -> bool {
|
|
|
EP::from_bits_truncate(self.poll() as u32).contains(EP::EPOLLIN)
|
|
|
}
|
|
|
-
|
|
|
- fn out_notify(&self) -> bool {
|
|
|
- self.update_events();
|
|
|
- EP::from_bits_truncate(self.poll() as u32).contains(EP::EPOLLOUT)
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
impl Socket for TcpSocket {
|
|
@@ -252,16 +244,25 @@ impl Socket for TcpSocket {
|
|
|
})),
|
|
|
Inner::Init(Init::Bound((_, local))) => Ok(Endpoint::Ip(*local)),
|
|
|
Inner::Connecting(connecting) => Ok(Endpoint::Ip(connecting.get_name())),
|
|
|
- Inner::Established(established) => Ok(Endpoint::Ip(established.local_endpoint())),
|
|
|
+ Inner::Established(established) => Ok(Endpoint::Ip(established.get_name())),
|
|
|
Inner::Listening(listening) => Ok(Endpoint::Ip(listening.get_name())),
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ fn get_peer_name(&self) -> Result<Endpoint, SystemError> {
|
|
|
+ match self.inner.read().as_ref().expect("Tcp Inner is None") {
|
|
|
+ Inner::Init(_) => Err(ENOTCONN),
|
|
|
+ Inner::Connecting(connecting) => Ok(Endpoint::Ip(connecting.get_peer_name())),
|
|
|
+ Inner::Established(established) => Ok(Endpoint::Ip(established.get_peer_name())),
|
|
|
+ Inner::Listening(_) => Err(ENOTCONN),
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
fn bind(&self, endpoint: Endpoint) -> Result<(), SystemError> {
|
|
|
if let Endpoint::Ip(addr) = endpoint {
|
|
|
return self.do_bind(addr);
|
|
|
}
|
|
|
- log::warn!("TcpSocket::bind: invalid endpoint");
|
|
|
+ log::debug!("TcpSocket::bind: invalid endpoint");
|
|
|
return Err(EINVAL);
|
|
|
}
|
|
|
|
|
@@ -295,7 +296,7 @@ impl Socket for TcpSocket {
|
|
|
loop {
|
|
|
match self.try_accept() {
|
|
|
Err(EAGAIN_OR_EWOULDBLOCK) => {
|
|
|
- wq_wait_event_interruptible!(self.wait_queue, self.in_notify(), {})?;
|
|
|
+ wq_wait_event_interruptible!(self.wait_queue, self.incoming(), {})?;
|
|
|
}
|
|
|
result => break result,
|
|
|
}
|
|
@@ -348,7 +349,15 @@ impl Socket for TcpSocket {
|
|
|
}
|
|
|
|
|
|
fn close(&self) -> Result<(), SystemError> {
|
|
|
- let inner = self.inner.write().take().unwrap();
|
|
|
+ let Some(inner) = self.inner.write().take() else {
|
|
|
+ log::warn!("TcpSocket::close: already closed, unexpected");
|
|
|
+ return Ok(());
|
|
|
+ };
|
|
|
+ if let Some(iface) = inner.iface() {
|
|
|
+ iface
|
|
|
+ .common()
|
|
|
+ .unbind_socket(self.self_ref.upgrade().unwrap());
|
|
|
+ }
|
|
|
|
|
|
match inner {
|
|
|
// complete connecting socket close logic
|
|
@@ -356,22 +365,21 @@ impl Socket for TcpSocket {
|
|
|
let conn = unsafe { conn.into_established() };
|
|
|
conn.close();
|
|
|
conn.release();
|
|
|
- Ok(())
|
|
|
}
|
|
|
Inner::Established(es) => {
|
|
|
es.close();
|
|
|
es.release();
|
|
|
- Ok(())
|
|
|
}
|
|
|
Inner::Listening(ls) => {
|
|
|
ls.close();
|
|
|
- Ok(())
|
|
|
+ ls.release();
|
|
|
}
|
|
|
Inner::Init(init) => {
|
|
|
init.close();
|
|
|
- Ok(())
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
+
|
|
|
+ Ok(())
|
|
|
}
|
|
|
|
|
|
fn set_option(&self, level: PSOL, name: usize, val: &[u8]) -> Result<(), SystemError> {
|