From 434f143e30fdc7ce146a82bdd5fb39ff429df206 Mon Sep 17 00:00:00 2001 From: Yuke Peng Date: Sat, 24 Aug 2024 12:01:08 +0800 Subject: [PATCH] Pass can reuse to bind_socket --- kernel/src/net/iface/common.rs | 1 + kernel/src/net/socket/ip/datagram/mod.rs | 13 +++++++++---- kernel/src/net/socket/ip/datagram/unbound.rs | 8 ++++++-- kernel/src/net/socket/ip/stream/init.rs | 5 +++-- kernel/src/net/socket/ip/stream/mod.rs | 3 ++- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/kernel/src/net/iface/common.rs b/kernel/src/net/iface/common.rs index 55859054e..18cd31333 100644 --- a/kernel/src/net/iface/common.rs +++ b/kernel/src/net/iface/common.rs @@ -94,6 +94,7 @@ impl IfaceCommon { let mut used_ports = self.used_ports.write(); if let Some(used_times) = used_ports.get_mut(&port) { if *used_times == 0 || can_reuse { + // FIXME: Check if the previous socket was bound with SO_REUSEADDR. *used_times += 1; } else { return_errno_with_message!(Errno::EADDRINUSE, "the address is already in use"); diff --git a/kernel/src/net/socket/ip/datagram/mod.rs b/kernel/src/net/socket/ip/datagram/mod.rs index d97771aae..b2d562a99 100644 --- a/kernel/src/net/socket/ip/datagram/mod.rs +++ b/kernel/src/net/socket/ip/datagram/mod.rs @@ -56,7 +56,11 @@ enum Inner { } impl Inner { - fn bind(self, endpoint: &IpEndpoint) -> core::result::Result { + fn bind( + self, + endpoint: &IpEndpoint, + can_reuse: bool, + ) -> core::result::Result { let unbound_datagram = match self { Inner::Unbound(unbound_datagram) => unbound_datagram, Inner::Bound(bound_datagram) => { @@ -67,7 +71,7 @@ impl Inner { } }; - let bound_datagram = match unbound_datagram.bind(endpoint) { + let bound_datagram = match unbound_datagram.bind(endpoint, can_reuse) { Ok(bound_datagram) => bound_datagram, Err((err, unbound_datagram)) => return Err((err, Inner::Unbound(unbound_datagram))), }; @@ -83,7 +87,7 @@ impl Inner { } let endpoint = get_ephemeral_endpoint(remote_endpoint); - self.bind(&endpoint) + self.bind(&endpoint, false) } } @@ -271,9 +275,10 @@ impl Socket for DatagramSocket { fn bind(&self, socket_addr: SocketAddr) -> Result<()> { let endpoint = socket_addr.try_into()?; + let can_reuse = self.options.read().socket.reuse_addr(); let mut inner = self.inner.write(); inner.borrow_result(|owned_inner| { - let bound_datagram = match owned_inner.bind(&endpoint) { + let bound_datagram = match owned_inner.bind(&endpoint, can_reuse) { Ok(bound_datagram) => bound_datagram, Err((err, err_inner)) => { return (err_inner, Err(err)); diff --git a/kernel/src/net/socket/ip/datagram/unbound.rs b/kernel/src/net/socket/ip/datagram/unbound.rs index fb714715a..7d363eddc 100644 --- a/kernel/src/net/socket/ip/datagram/unbound.rs +++ b/kernel/src/net/socket/ip/datagram/unbound.rs @@ -24,8 +24,12 @@ impl UnboundDatagram { } } - pub fn bind(self, endpoint: &IpEndpoint) -> core::result::Result { - let bound_socket = match bind_socket(self.unbound_socket, endpoint, false) { + pub fn bind( + self, + endpoint: &IpEndpoint, + can_reuse: bool, + ) -> core::result::Result { + let bound_socket = match bind_socket(self.unbound_socket, endpoint, can_reuse) { Ok(bound_socket) => bound_socket, Err((err, unbound_socket)) => return Err((err, Self { unbound_socket })), }; diff --git a/kernel/src/net/socket/ip/stream/init.rs b/kernel/src/net/socket/ip/stream/init.rs index 3dfc581fb..8f04de7c2 100644 --- a/kernel/src/net/socket/ip/stream/init.rs +++ b/kernel/src/net/socket/ip/stream/init.rs @@ -30,6 +30,7 @@ impl InitStream { pub fn bind( self, endpoint: &IpEndpoint, + can_reuse: bool, ) -> core::result::Result { let unbound_socket = match self { InitStream::Unbound(unbound_socket) => unbound_socket, @@ -40,7 +41,7 @@ impl InitStream { )); } }; - let bound_socket = match bind_socket(unbound_socket, endpoint, false) { + let bound_socket = match bind_socket(unbound_socket, endpoint, can_reuse) { Ok(bound_socket) => bound_socket, Err((err, unbound_socket)) => return Err((err, InitStream::Unbound(unbound_socket))), }; @@ -52,7 +53,7 @@ impl InitStream { remote_endpoint: &IpEndpoint, ) -> core::result::Result { let endpoint = get_ephemeral_endpoint(remote_endpoint); - self.bind(&endpoint) + self.bind(&endpoint, false) } pub fn connect( diff --git a/kernel/src/net/socket/ip/stream/mod.rs b/kernel/src/net/socket/ip/stream/mod.rs index 1e153f177..5ca0d552c 100644 --- a/kernel/src/net/socket/ip/stream/mod.rs +++ b/kernel/src/net/socket/ip/stream/mod.rs @@ -398,6 +398,7 @@ impl Socket for StreamSocket { fn bind(&self, socket_addr: SocketAddr) -> Result<()> { let endpoint = socket_addr.try_into()?; + let can_reuse = self.options.read().socket.reuse_addr(); let mut state = self.state.write(); state.borrow_result(|owned_state| { @@ -411,7 +412,7 @@ impl Socket for StreamSocket { ); }; - let bound_socket = match init_stream.bind(&endpoint) { + let bound_socket = match init_stream.bind(&endpoint, can_reuse) { Ok(bound_socket) => bound_socket, Err((err, init_stream)) => { return (State::Init(init_stream), Err(err));