mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 21:37:34 +00:00
Kernel: Implement the SO_DONTROUTE SOL_SOCKET-level option
This commit is contained in:
parent
641498954f
commit
613ade9dec
4 changed files with 20 additions and 2 deletions
|
@ -109,6 +109,7 @@ enum {
|
||||||
SO_BROADCAST,
|
SO_BROADCAST,
|
||||||
SO_LINGER,
|
SO_LINGER,
|
||||||
SO_ACCEPTCONN,
|
SO_ACCEPTCONN,
|
||||||
|
SO_DONTROUTE,
|
||||||
};
|
};
|
||||||
#define SO_RCVTIMEO SO_RCVTIMEO
|
#define SO_RCVTIMEO SO_RCVTIMEO
|
||||||
#define SO_SNDTIMEO SO_SNDTIMEO
|
#define SO_SNDTIMEO SO_SNDTIMEO
|
||||||
|
@ -125,6 +126,7 @@ enum {
|
||||||
#define SO_RCVBUF SO_RCVBUF
|
#define SO_RCVBUF SO_RCVBUF
|
||||||
#define SO_LINGER SO_LINGER
|
#define SO_LINGER SO_LINGER
|
||||||
#define SO_ACCEPTCONN SO_ACCEPTCONN
|
#define SO_ACCEPTCONN SO_ACCEPTCONN
|
||||||
|
#define SO_DONTROUTE SO_DONTROUTE
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SCM_TIMESTAMP,
|
SCM_TIMESTAMP,
|
||||||
|
|
|
@ -210,7 +210,7 @@ ErrorOr<size_t> IPv4Socket::sendto(OpenFileDescription&, const UserOrKernelBuffe
|
||||||
if (!is_connected() && m_peer_address.is_zero())
|
if (!is_connected() && m_peer_address.is_zero())
|
||||||
return set_so_error(EPIPE);
|
return set_so_error(EPIPE);
|
||||||
|
|
||||||
auto allow_using_gateway = (flags & MSG_DONTROUTE) ? AllowUsingGateway::No : AllowUsingGateway::Yes;
|
auto allow_using_gateway = ((flags & MSG_DONTROUTE) || m_routing_disabled) ? AllowUsingGateway::No : AllowUsingGateway::Yes;
|
||||||
auto routing_decision = route_to(m_peer_address, m_local_address, bound_interface(), allow_using_gateway);
|
auto routing_decision = route_to(m_peer_address, m_local_address, bound_interface(), allow_using_gateway);
|
||||||
if (routing_decision.is_zero())
|
if (routing_decision.is_zero())
|
||||||
return set_so_error(EHOSTUNREACH);
|
return set_so_error(EHOSTUNREACH);
|
||||||
|
|
|
@ -123,6 +123,14 @@ ErrorOr<void> Socket::setsockopt(int level, int option, Userspace<const void*> u
|
||||||
return ENOTSUP;
|
return ENOTSUP;
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
|
case SO_DONTROUTE: {
|
||||||
|
int routing_disabled;
|
||||||
|
if (user_value_size != sizeof(routing_disabled))
|
||||||
|
return EINVAL;
|
||||||
|
TRY(copy_from_user(&routing_disabled, static_ptr_cast<const int*>(user_value)));
|
||||||
|
m_routing_disabled = routing_disabled != 0;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
dbgln("setsockopt({}) at SOL_SOCKET not implemented.", option);
|
dbgln("setsockopt({}) at SOL_SOCKET not implemented.", option);
|
||||||
return ENOPROTOOPT;
|
return ENOPROTOOPT;
|
||||||
|
@ -216,6 +224,14 @@ ErrorOr<void> Socket::getsockopt(OpenFileDescription&, int level, int option, Us
|
||||||
size = sizeof(accepting_connections);
|
size = sizeof(accepting_connections);
|
||||||
return copy_to_user(value_size, &size);
|
return copy_to_user(value_size, &size);
|
||||||
}
|
}
|
||||||
|
case SO_DONTROUTE: {
|
||||||
|
int routing_disabled = m_routing_disabled ? 1 : 0;
|
||||||
|
if (size < sizeof(routing_disabled))
|
||||||
|
return EINVAL;
|
||||||
|
TRY(copy_to_user(static_ptr_cast<int*>(value), &routing_disabled));
|
||||||
|
size = sizeof(routing_disabled);
|
||||||
|
return copy_to_user(value_size, &size);
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
dbgln("setsockopt({}) at SOL_SOCKET not implemented.", option);
|
dbgln("setsockopt({}) at SOL_SOCKET not implemented.", option);
|
||||||
return ENOPROTOOPT;
|
return ENOPROTOOPT;
|
||||||
|
|
|
@ -154,9 +154,9 @@ protected:
|
||||||
|
|
||||||
void set_role(Role role) { m_role = role; }
|
void set_role(Role role) { m_role = role; }
|
||||||
|
|
||||||
protected:
|
|
||||||
ucred m_origin { 0, 0, 0 };
|
ucred m_origin { 0, 0, 0 };
|
||||||
ucred m_acceptor { 0, 0, 0 };
|
ucred m_acceptor { 0, 0, 0 };
|
||||||
|
bool m_routing_disabled { false };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual bool is_socket() const final { return true; }
|
virtual bool is_socket() const final { return true; }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue