mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 02:07:34 +00:00
Kernel: Support binding to INADDR_ANY (all IPs)
This commit is contained in:
parent
3eb659a2bb
commit
4fcbbd24f7
3 changed files with 17 additions and 8 deletions
|
@ -95,9 +95,6 @@ KResult IPv4Socket::listen(int backlog)
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return KResult(-EADDRINUSE);
|
return KResult(-EADDRINUSE);
|
||||||
|
|
||||||
if (m_local_address.to_u32() == 0)
|
|
||||||
return KResult(-EADDRINUSE);
|
|
||||||
|
|
||||||
set_backlog(backlog);
|
set_backlog(backlog);
|
||||||
|
|
||||||
kprintf("IPv4Socket{%p} listening with backlog=%d\n", this, backlog);
|
kprintf("IPv4Socket{%p} listening with backlog=%d\n", this, backlog);
|
||||||
|
|
|
@ -39,6 +39,7 @@ public:
|
||||||
const IPv4Address& local_address() const { return m_local_address; }
|
const IPv4Address& local_address() const { return m_local_address; }
|
||||||
u16 local_port() const { return m_local_port; }
|
u16 local_port() const { return m_local_port; }
|
||||||
void set_local_port(u16 port) { m_local_port = port; }
|
void set_local_port(u16 port) { m_local_port = port; }
|
||||||
|
bool has_specific_local_address() { return m_local_address.to_u32() != 0; }
|
||||||
|
|
||||||
const IPv4Address& peer_address() const { return m_peer_address; }
|
const IPv4Address& peer_address() const { return m_peer_address; }
|
||||||
u16 peer_port() const { return m_peer_port; }
|
u16 peer_port() const { return m_peer_port; }
|
||||||
|
|
|
@ -36,6 +36,11 @@ TCPSocketHandle TCPSocket::from_tuple(const IPv4SocketTuple& tuple)
|
||||||
if (address_match.has_value())
|
if (address_match.has_value())
|
||||||
return { move(address_match.value()) };
|
return { move(address_match.value()) };
|
||||||
|
|
||||||
|
auto wildcard_tuple = IPv4SocketTuple(IPv4Address(), tuple.local_port(), IPv4Address(), 0);
|
||||||
|
auto wildcard_match = sockets_by_tuple().resource().get(wildcard_tuple);
|
||||||
|
if (wildcard_match.has_value())
|
||||||
|
return { move(wildcard_match.value()) };
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,7 +211,7 @@ NetworkOrdered<u16> TCPSocket::compute_tcp_checksum(const IPv4Address& source, c
|
||||||
|
|
||||||
KResult TCPSocket::protocol_bind()
|
KResult TCPSocket::protocol_bind()
|
||||||
{
|
{
|
||||||
if (!m_adapter) {
|
if (has_specific_local_address() && !m_adapter) {
|
||||||
m_adapter = NetworkAdapter::from_ipv4_address(local_address());
|
m_adapter = NetworkAdapter::from_ipv4_address(local_address());
|
||||||
if (!m_adapter)
|
if (!m_adapter)
|
||||||
return KResult(-EADDRNOTAVAIL);
|
return KResult(-EADDRNOTAVAIL);
|
||||||
|
@ -230,11 +235,17 @@ KResult TCPSocket::protocol_listen()
|
||||||
KResult TCPSocket::protocol_connect(FileDescription& description, ShouldBlock should_block)
|
KResult TCPSocket::protocol_connect(FileDescription& description, ShouldBlock should_block)
|
||||||
{
|
{
|
||||||
if (!m_adapter) {
|
if (!m_adapter) {
|
||||||
m_adapter = adapter_for_route_to(peer_address());
|
if (has_specific_local_address()) {
|
||||||
if (!m_adapter)
|
m_adapter = NetworkAdapter::from_ipv4_address(local_address());
|
||||||
return KResult(-EHOSTUNREACH);
|
if (!m_adapter)
|
||||||
|
return KResult(-EADDRNOTAVAIL);
|
||||||
|
} else {
|
||||||
|
m_adapter = adapter_for_route_to(peer_address());
|
||||||
|
if (!m_adapter)
|
||||||
|
return KResult(-EHOSTUNREACH);
|
||||||
|
|
||||||
set_local_address(m_adapter->ipv4_address());
|
set_local_address(m_adapter->ipv4_address());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
allocate_local_port_if_needed();
|
allocate_local_port_if_needed();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue