From 41faeb1df925def173251328a50d8c656a5ca475 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Fri, 27 May 2022 16:36:12 -0400 Subject: [PATCH] net_interface & datalink: Fix MTU handling. The device is what actually controls the MTU, and it has its own field for this, so having a second one just meant the MTU never got updated after startup. Remove the "mtu" field from the interface, use the "device->mtu" directly, and then actually invoke device->module->set_mtu when updating. --- headers/private/net/net_datalink.h | 1 - .../kernel/network/protocols/ipv4/ipv4.cpp | 4 ++-- .../kernel/network/protocols/ipv6/ipv6.cpp | 4 ++-- src/add-ons/kernel/network/stack/datalink.cpp | 17 +++++++---------- src/add-ons/kernel/network/stack/interfaces.cpp | 2 -- 5 files changed, 11 insertions(+), 17 deletions(-) diff --git a/headers/private/net/net_datalink.h b/headers/private/net/net_datalink.h index 69ce5d1f11..19333d52e7 100644 --- a/headers/private/net/net_datalink.h +++ b/headers/private/net/net_datalink.h @@ -48,7 +48,6 @@ typedef struct net_interface { uint32 index; uint32 flags; uint8 type; - uint32 mtu; uint32 metric; } net_interface; diff --git a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp index 6153c4f033..7407425411 100644 --- a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp +++ b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp @@ -1580,7 +1580,7 @@ ipv4_send_routed_data(net_protocol* _protocol, struct net_route* route, TRACE_SK(protocol, " SendRoutedData(): destination: %08x", ntohl(destination.sin_addr.s_addr)); - uint32 mtu = route->mtu ? route->mtu : interface->mtu; + uint32 mtu = route->mtu ? route->mtu : interface->device->mtu; if (buffer->size > mtu) { // we need to fragment the packet return send_fragments(protocol, route, buffer, mtu); @@ -1689,7 +1689,7 @@ ipv4_get_mtu(net_protocol* protocol, const struct sockaddr* address) if (route->mtu != 0) mtu = route->mtu; else - mtu = route->interface_address->interface->mtu; + mtu = route->interface_address->interface->device->mtu; sDatalinkModule->put_route(sDomain, route); return mtu - sizeof(ipv4_header); diff --git a/src/add-ons/kernel/network/protocols/ipv6/ipv6.cpp b/src/add-ons/kernel/network/protocols/ipv6/ipv6.cpp index f9184219a8..d72fde0f0f 100644 --- a/src/add-ons/kernel/network/protocols/ipv6/ipv6.cpp +++ b/src/add-ons/kernel/network/protocols/ipv6/ipv6.cpp @@ -1330,7 +1330,7 @@ ipv6_send_routed_data(net_protocol* _protocol, struct net_route* route, ip6_sprintf(&destination.sin6_addr, addrbuf); TRACE_SK(protocol, " SendRoutedData(): destination: %s", addrbuf); - uint32 mtu = route->mtu ? route->mtu : interface->mtu; + uint32 mtu = route->mtu ? route->mtu : interface->device->mtu; if (buffer->size > mtu) { // we need to fragment the packet return send_fragments(protocol, route, buffer, mtu); @@ -1428,7 +1428,7 @@ ipv6_get_mtu(net_protocol* protocol, const struct sockaddr* address) if (route->mtu != 0) mtu = route->mtu; else - mtu = route->interface_address->interface->mtu; + mtu = route->interface_address->interface->device->mtu; sDatalinkModule->put_route(sDomain, route); // TODO: what about extension headers? diff --git a/src/add-ons/kernel/network/stack/datalink.cpp b/src/add-ons/kernel/network/stack/datalink.cpp index 8fa8c6c620..9d4d7fb512 100644 --- a/src/add-ons/kernel/network/stack/datalink.cpp +++ b/src/add-ons/kernel/network/stack/datalink.cpp @@ -875,7 +875,7 @@ interface_protocol_control(net_datalink_protocol* _protocol, int32 option, { // get MTU struct ifreq request; - request.ifr_mtu = interface->mtu; + request.ifr_mtu = interface->device->mtu; return user_memcpy(&((struct ifreq*)argument)->ifr_mtu, &request.ifr_mtu, sizeof(request.ifr_mtu)); @@ -884,17 +884,14 @@ interface_protocol_control(net_datalink_protocol* _protocol, int32 option, { // set MTU struct ifreq request; - if (user_memcpy(&request, argument, sizeof(struct ifreq)) < B_OK) + if (user_memcpy(&request, argument, sizeof(struct ifreq)) != B_OK) return B_BAD_ADDRESS; - // check for valid bounds - if (request.ifr_mtu < 100 - || (uint32)request.ifr_mtu > interface->device->mtu) - return B_BAD_VALUE; - - interface->mtu = request.ifr_mtu; - notify_interface_changed(interface); - return B_OK; + status_t status = interface->device->module->set_mtu( + interface->device, request.ifr_mtu); + if (status == B_OK) + notify_interface_changed(interface); + return status; } case SIOCSIFMEDIA: diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index 8921092aa3..ae004b896c 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -464,7 +464,6 @@ Interface::Interface(const char* interfaceName, index = ++sInterfaceIndex; flags = 0; type = 0; - mtu = deviceInterface->device->mtu; metric = 0; fDeviceInterface = acquire_device_interface(deviceInterface); @@ -1049,7 +1048,6 @@ Interface::Dump() const kprintf("index: %" B_PRIu32 "\n", index); kprintf("flags: %#" B_PRIx32 "\n", flags); kprintf("type: %u\n", type); - kprintf("mtu: %" B_PRIu32 "\n", mtu); kprintf("metric: %" B_PRIu32 "\n", metric); kprintf("ref count: %" B_PRId32 "\n", CountReferences());