diff --git a/kernel/src/net/socket/inet/datagram/inner.rs b/kernel/src/net/socket/inet/datagram/inner.rs index becbf4d86..1902a6991 100644 --- a/kernel/src/net/socket/inet/datagram/inner.rs +++ b/kernel/src/net/socket/inet/datagram/inner.rs @@ -69,7 +69,6 @@ impl UnboundUdp { Ok(BoundUdp { inner, remote: SpinLock::new(None), - local_endpoint: smoltcp::wire::IpEndpoint::new(bind_addr, bind_port), }) } @@ -85,7 +84,6 @@ impl UnboundUdp { Ok(BoundUdp { inner, remote: SpinLock::new(Some(endpoint)), - local_endpoint: endpoint, }) } } @@ -94,7 +92,6 @@ impl UnboundUdp { pub struct BoundUdp { inner: BoundInner, remote: SpinLock>, - local_endpoint: smoltcp::wire::IpEndpoint, } impl BoundUdp { @@ -117,6 +114,14 @@ impl BoundUdp { .with::(|socket| socket.endpoint()) } + pub fn remote_endpoint(&self) -> Result { + self.remote + .lock() + .as_ref() + .cloned() + .ok_or(SystemError::ENOTCONN) + } + pub fn connect(&self, remote: smoltcp::wire::IpEndpoint) { self.remote.lock().replace(remote); } @@ -165,10 +170,6 @@ impl BoundUdp { socket.close(); }); } - - pub fn local_endpoint(&self) -> smoltcp::wire::IpEndpoint { - self.local_endpoint - } } // Udp Inner 负责其内部资源管理 diff --git a/kernel/src/net/socket/inet/datagram/mod.rs b/kernel/src/net/socket/inet/datagram/mod.rs index a960f8cb5..86493d3b2 100644 --- a/kernel/src/net/socket/inet/datagram/mod.rs +++ b/kernel/src/net/socket/inet/datagram/mod.rs @@ -128,9 +128,10 @@ impl UdpSocket { { let mut inner_guard = self.inner.write(); let inner = match inner_guard.take().expect("Udp Inner is None") { + // TODO: 此处会为空,需要DEBUG UdpInner::Bound(bound) => bound, UdpInner::Unbound(unbound) => unbound - .bind_ephemeral(to.ok_or(SystemError::EADDRNOTAVAIL)?.addr, self.netns())?, + .bind_ephemeral(to.ok_or(SystemError::EDESTADDRREQ)?.addr, self.netns())?, }; // size = inner.try_send(buf, to)?; inner_guard.replace(UdpInner::Bound(inner)); @@ -263,13 +264,25 @@ impl Socket for UdpSocket { } fn remote_endpoint(&self) -> Result { - todo!() + match self.inner.read().as_ref().unwrap() { + UdpInner::Bound(bound) => Ok(Endpoint::Ip(bound.remote_endpoint()?)), + // TODO: IPv6 support + _ => Err(SystemError::ENOTCONN), + } } fn local_endpoint(&self) -> Result { + use smoltcp::wire::{IpAddress::*, IpEndpoint, IpListenEndpoint}; match self.inner.read().as_ref().unwrap() { - UdpInner::Bound(bound) => Ok(Endpoint::Ip(bound.local_endpoint())), - _ => Err(SystemError::ENOTCONN), + UdpInner::Bound(bound) => { + let IpListenEndpoint { addr, port } = bound.endpoint(); + Ok(Endpoint::Ip(IpEndpoint::new( + addr.unwrap_or(Ipv4([0, 0, 0, 0].into())), + port, + ))) + } + // TODO: IPv6 support + _ => Ok(Endpoint::Ip(IpEndpoint::new(Ipv4([0, 0, 0, 0].into()), 0))), } } diff --git a/user/apps/tests/syscall/gvisor/blocklists/socket_test b/user/apps/tests/syscall/gvisor/blocklists/socket_test new file mode 100644 index 000000000..ceeaaf5f5 --- /dev/null +++ b/user/apps/tests/syscall/gvisor/blocklists/socket_test @@ -0,0 +1,8 @@ +SocketTest.UnixSocketPairProtocol +# SocketTest.ProtocolInet # Only Inet sockets are enabled +SocketTest.ProtocolUnix +SocketTest.UnixSocketStat +SocketTest.UnixSocketStatFS +SocketTest.UnixSCMRightsOnlyPassedOnce +SocketTest.Permission +OpenModes/*.Unix/* \ No newline at end of file diff --git a/user/apps/tests/syscall/gvisor/blocklists/udp_socket_test b/user/apps/tests/syscall/gvisor/blocklists/udp_socket_test new file mode 100644 index 000000000..16d46a0a4 --- /dev/null +++ b/user/apps/tests/syscall/gvisor/blocklists/udp_socket_test @@ -0,0 +1,81 @@ +**/1 +**/2 +UdpInet6SocketTest.ConnectInet4Sockaddr +# **.Creation +# **.Getsockname +# **.Getpeername +**.SendNotConnected/** +**.ConnectBinds/** +**.ReceiveNotBound/** +**.Bind/** +**.BindInUse/** +**.ConnectWriteToInvalidPort/** +**.ConnectSimultaneousWriteToInvalidPort/** +**.ReceiveAfterConnect/** +**.ReceiveAfterDisconnect/** +**.Connect/** +**.ConnectAnyZero/** +**.ConnectAnyWithPort/** +**.DisconnectAfterConnectAny/** +**.DisconnectAfterConnectAnyWithPort/** +**.DisconnectAfterBind/** +**.DisconnectAfterBindToUnspecAndConnect/** +**.DisconnectAfterConnectWithoutBind/** +**.BindToAnyConnnectToLocalhost/** +**.DisconnectAfterBindToAny/** +**.Disconnect/** +**.ConnectBadAddress/** +**.SendToAddressOtherThanConnected/** +**.ConnectAndSendNoReceiver/** +**.RecvErrorConnRefusedOtherAFSockOpt/** +**.RecvErrorConnRefused/** +**.ZerolengthWriteAllowed/** +**.ZerolengthWriteAllowedNonBlockRead/** +**.SendAndReceiveNotConnected/** +**.SendAndReceiveConnected/** +**.ReceiveFromNotConnected/** +**.ReceiveBeforeConnect/** +**.ReceiveFrom/** +**.Listen/** +**.Accept/** +**.ReadShutdownNonblockPendingData/** +**.ReadShutdownSameSocketResetsShutdownState/** +**.ReadShutdown/** +**.ReadShutdownDifferentThread/** +**.WriteShutdown/** +**.SynchronousReceive/** +**.BoundaryPreserved_SendRecv/** +**.BoundaryPreserved_WritevReadv/** +**.BoundaryPreserved_SendMsgRecvMsg/** +**.FIONREADShutdown/** +**.FIONREADWriteShutdown/** +**.Fionread/** +**.FIONREADZeroLengthPacket/** +**.FIONREADZeroLengthWriteShutdown/** +**.SoNoCheckOffByDefault/** +**.SoNoCheck/** +**.ErrorQueue/** +**.SoTimestampOffByDefault/** +**.SoTimestamp/** +**.WriteShutdownNotConnected/** +**.TimestampIoctl/** +**.TimestampIoctlNothingRead/** +**.TimestampIoctlPersistence/** +**.RecvBufLimitsEmptyRcvBuf/** +**.RecvBufLimits/** +**.SetSocketDetachFilter/** +**.SetSocketDetachFilterNoInstalledFilter/** +**.GetSocketDetachFilter/** +**.SendToZeroPort/** +**.ConnectToZeroPortUnbound/** +**.ConnectToZeroPortBound/** +**.ConnectToZeroPortConnected/** +**.SetAndReceiveTOSOrTClass/** +**.SendAndReceiveTOSorTClass/** +**.SetAndReceiveTTLOrHopLimit/** +**.SendAndReceiveTTLOrHopLimit/** +**.SetAndReceivePktInfo/** +**.SendPacketLargerThanSendBufOnNonBlockingSocket/** +**.ReadShutdownOnBoundSocket/** +**.ReconnectDoesNotClearReadShutdown/** +**.ReconnectDoesNotClearWriteShutdown/** \ No newline at end of file diff --git a/user/apps/tests/syscall/gvisor/whitelist.txt b/user/apps/tests/syscall/gvisor/whitelist.txt index 2a1ace966..4af4fc66c 100644 --- a/user/apps/tests/syscall/gvisor/whitelist.txt +++ b/user/apps/tests/syscall/gvisor/whitelist.txt @@ -62,6 +62,8 @@ madvise_test #bind_test #connect_test #listen_test +socket_test +udp_socket_test # 信号处理测试 sigaction_test