mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-21 16:33:24 +00:00
Pass can reuse to bind_socket
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
dc4df47007
commit
434f143e30
@ -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");
|
||||
|
@ -56,7 +56,11 @@ enum Inner {
|
||||
}
|
||||
|
||||
impl Inner {
|
||||
fn bind(self, endpoint: &IpEndpoint) -> core::result::Result<BoundDatagram, (Error, Self)> {
|
||||
fn bind(
|
||||
self,
|
||||
endpoint: &IpEndpoint,
|
||||
can_reuse: bool,
|
||||
) -> core::result::Result<BoundDatagram, (Error, Self)> {
|
||||
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));
|
||||
|
@ -24,8 +24,12 @@ impl UnboundDatagram {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn bind(self, endpoint: &IpEndpoint) -> core::result::Result<BoundDatagram, (Error, Self)> {
|
||||
let bound_socket = match bind_socket(self.unbound_socket, endpoint, false) {
|
||||
pub fn bind(
|
||||
self,
|
||||
endpoint: &IpEndpoint,
|
||||
can_reuse: bool,
|
||||
) -> core::result::Result<BoundDatagram, (Error, Self)> {
|
||||
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 })),
|
||||
};
|
||||
|
@ -30,6 +30,7 @@ impl InitStream {
|
||||
pub fn bind(
|
||||
self,
|
||||
endpoint: &IpEndpoint,
|
||||
can_reuse: bool,
|
||||
) -> core::result::Result<AnyBoundSocket, (Error, Self)> {
|
||||
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<AnyBoundSocket, (Error, Self)> {
|
||||
let endpoint = get_ephemeral_endpoint(remote_endpoint);
|
||||
self.bind(&endpoint)
|
||||
self.bind(&endpoint, false)
|
||||
}
|
||||
|
||||
pub fn connect(
|
||||
|
@ -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));
|
||||
|
Reference in New Issue
Block a user