From e4efd92e78728eabffe4301ea02165bd59e77269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Tue, 27 Feb 2024 22:00:00 +0100 Subject: [PATCH] ipv4 & ipv6: implement connect() by setting the socket's peer address Change-Id: Ic0fdc3f1a880aaef9326d8d4bfb13199c1d61dd4 Reviewed-on: https://review.haiku-os.org/c/haiku/+/7476 Reviewed-by: waddlesplash --- .../kernel/network/protocols/ipv4/ipv4.cpp | 16 ++++++++++++++-- .../kernel/network/protocols/ipv6/ipv6.cpp | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp index d7db63df29..ce51c0878a 100644 --- a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp +++ b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp @@ -1150,9 +1150,21 @@ ipv4_free(net_protocol* protocol) status_t -ipv4_connect(net_protocol* protocol, const struct sockaddr* address) +ipv4_connect(net_protocol* _protocol, const struct sockaddr* address) { - return B_ERROR; + ipv4_protocol* protocol = (ipv4_protocol*)_protocol; + RawSocket* raw = protocol->raw; + if (raw == NULL) + return B_ERROR; + if (address->sa_len != sizeof(struct sockaddr_in)) + return B_BAD_VALUE; + if (address->sa_family != AF_INET) + return EAFNOSUPPORT; + + memcpy(&protocol->socket->peer, address, sizeof(struct sockaddr_in)); + sSocketModule->set_connected(protocol->socket); + + return B_OK; } diff --git a/src/add-ons/kernel/network/protocols/ipv6/ipv6.cpp b/src/add-ons/kernel/network/protocols/ipv6/ipv6.cpp index f655937762..ab582444f9 100644 --- a/src/add-ons/kernel/network/protocols/ipv6/ipv6.cpp +++ b/src/add-ons/kernel/network/protocols/ipv6/ipv6.cpp @@ -1045,9 +1045,21 @@ ipv6_free(net_protocol* protocol) status_t -ipv6_connect(net_protocol* protocol, const struct sockaddr* address) +ipv6_connect(net_protocol* _protocol, const struct sockaddr* address) { - return B_ERROR; + ipv6_protocol* protocol = (ipv6_protocol*)_protocol; + RawSocket* raw = protocol->raw; + if (raw == NULL) + return B_ERROR; + if (address->sa_len != sizeof(struct sockaddr_in6)) + return B_BAD_VALUE; + if (address->sa_family != AF_INET6) + return EAFNOSUPPORT; + + memcpy(&protocol->socket->peer, address, sizeof(struct sockaddr_in6)); + sSocketModule->set_connected(protocol->socket); + + return B_OK; }