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; }