Support setting reuseaddr for UDP socket

This commit is contained in:
jiangjianfeng 2025-07-25 02:22:45 +00:00 committed by Ruihan Li
parent ff39f6df75
commit 28d5d94c8c
3 changed files with 25 additions and 10 deletions

View File

@ -8,7 +8,7 @@ use aster_bigtcp::{
use crate::{
events::IoEvents,
net::{
iface::{Iface, UdpSocket},
iface::{BoundPort, Iface, UdpSocket},
socket::util::{datagram_common, SendRecvFlags},
},
prelude::*,
@ -31,6 +31,10 @@ impl BoundDatagram {
pub(super) fn iface(&self) -> &Arc<Iface> {
self.bound_socket.iface()
}
pub(super) fn bound_port(&self) -> &BoundPort {
self.bound_socket.bound_port()
}
}
impl datagram_common::Bound for BoundDatagram {

View File

@ -260,4 +260,12 @@ impl GetSocketLevelOption for Inner<UnboundDatagram, BoundDatagram> {
}
}
impl SetSocketLevelOption for Inner<UnboundDatagram, BoundDatagram> {}
impl SetSocketLevelOption for Inner<UnboundDatagram, BoundDatagram> {
fn set_reuse_addr(&self, reuse_addr: bool) {
let Inner::Bound(bound) = self else {
return;
};
bound.bound_port().set_can_reuse(reuse_addr);
}
}

View File

@ -184,14 +184,11 @@ FN_TEST(bind_reuseaddr)
TEST_ERRNO(bind(sk2, psaddr, addrlen), EADDRINUSE);
// FIXME: The test will fail in Asterinas since it doesn't check
// if the previous socket was bound with `SO_REUSEADDR`
//
// TEST_SUCC(setsockopt(sk1, SOL_SOCKET, SO_REUSEADDR, &disable,
// sizeof(disable)));
// TEST_SUCC(setsockopt(sk2, SOL_SOCKET, SO_REUSEADDR, &enable,
// sizeof(enable)));
// TEST_ERRNO(bind(sk2, psaddr, addrlen), EADDRINUSE);
TEST_SUCC(setsockopt(sk1, SOL_SOCKET, SO_REUSEADDR, &disable,
sizeof(disable)));
TEST_SUCC(setsockopt(sk2, SOL_SOCKET, SO_REUSEADDR, &enable,
sizeof(enable)));
TEST_ERRNO(bind(sk2, psaddr, addrlen), EADDRINUSE);
TEST_SUCC(setsockopt(sk1, SOL_SOCKET, SO_REUSEADDR, &enable,
sizeof(enable)));
@ -199,6 +196,12 @@ FN_TEST(bind_reuseaddr)
sizeof(disable)));
TEST_ERRNO(bind(sk2, psaddr, addrlen), EADDRINUSE);
TEST_SUCC(setsockopt(sk1, SOL_SOCKET, SO_REUSEADDR, &disable,
sizeof(disable)));
TEST_SUCC(setsockopt(sk2, SOL_SOCKET, SO_REUSEADDR, &enable,
sizeof(enable)));
TEST_ERRNO(bind(sk2, psaddr, addrlen), EADDRINUSE);
TEST_SUCC(setsockopt(sk1, SOL_SOCKET, SO_REUSEADDR, &enable,
sizeof(enable)));
TEST_SUCC(setsockopt(sk2, SOL_SOCKET, SO_REUSEADDR, &enable,