diff --git a/kernel/include/net/arp_cache.hpp b/kernel/include/net/arp_cache.hpp index 947d52e8..cd2f693f 100644 --- a/kernel/include/net/arp_cache.hpp +++ b/kernel/include/net/arp_cache.hpp @@ -47,7 +47,7 @@ uint64_t get_mac(network::ip::address ip); * \param ip The IP address to look for in the cache * \return The MAC address of the IP address */ -uint64_t get_mac_force(network::interface_descriptor& interface, network::ip::address ip); +std::expected get_mac_force(network::interface_descriptor& interface, network::ip::address ip); /*! * \brief Returns the MAC address of the given IP address. If the diff --git a/kernel/src/net/arp_cache.cpp b/kernel/src/net/arp_cache.cpp index 36947e07..38244834 100644 --- a/kernel/src/net/arp_cache.cpp +++ b/kernel/src/net/arp_cache.cpp @@ -121,7 +121,7 @@ uint64_t network::arp::get_mac(network::ip::address ip){ thor_unreachable("The IP is not cached in the ARP table"); } -uint64_t network::arp::get_mac_force(network::interface_descriptor& interface, network::ip::address ip){ +std::expected network::arp::get_mac_force(network::interface_descriptor& interface, network::ip::address ip){ // Check cache first if(is_ip_cached(ip)){ return get_mac(ip); @@ -137,8 +137,10 @@ uint64_t network::arp::get_mac_force(network::interface_descriptor& interface, n logging::logf(logging::log_level::TRACE, "arp: IP %u.%u.%u.%u not cached, generate ARP Request\n", ip(0), ip(1), ip(2), ip(3)); - // TODO Handle error here - arp_request(interface, ip); + auto arp_result = arp_request(interface, ip); + if(!arp_result){ + return std::make_expected_from_error(arp_result.error()); + } while(!is_ip_cached(ip)){ network::arp::wait_for_reply(); @@ -165,8 +167,10 @@ std::expected network::arp::get_mac_force(network::interface_descripto logging::logf(logging::log_level::TRACE, "arp: IP %u.%u.%u.%u not cached, generate ARP Request\n", ip(0), ip(1), ip(2), ip(3)); - // TODO Handle error here - arp_request(interface, ip); + auto arp_result = arp_request(interface, ip); + if(!arp_result){ + return std::make_expected_from_error(arp_result.error()); + } auto start = timer::milliseconds(); diff --git a/kernel/src/net/icmp_layer.cpp b/kernel/src/net/icmp_layer.cpp index 6f5213e3..8098ca57 100644 --- a/kernel/src/net/icmp_layer.cpp +++ b/kernel/src/net/icmp_layer.cpp @@ -136,7 +136,12 @@ void network::icmp::ping(network::interface_descriptor& interface, network::ip:: auto target_mac = network::arp::get_mac_force(interface, target_ip); - logging::logf(logging::log_level::TRACE, "icmp: Target MAC Address: %h\n", target_mac); + if(!target_mac){ + logging::logf(logging::log_level::TRACE, "icmp: Failed to get MAC Address from IP\n"); + return; + } + + logging::logf(logging::log_level::TRACE, "icmp: Target MAC Address: %h\n", *target_mac); // Ask the ICMP layer to craft a packet auto packet = network::icmp::prepare_packet(interface, target_ip, 0, type::ECHO_REQUEST, 0); diff --git a/kernel/src/net/ip_layer.cpp b/kernel/src/net/ip_layer.cpp index fcf5d8dc..820a6ea8 100644 --- a/kernel/src/net/ip_layer.cpp +++ b/kernel/src/net/ip_layer.cpp @@ -113,8 +113,12 @@ void network::ip::decode(network::interface_descriptor& interface, network::ethe std::expected network::ip::prepare_packet(network::interface_descriptor& interface, size_t size, address& target_ip, size_t protocol){ auto target_mac = network::arp::get_mac_force(interface, target_ip); + if(!target_mac){ + return std::make_expected_from_error(target_mac.error()); + } + // Ask the ethernet layer to craft a packet - auto packet = network::ethernet::prepare_packet(interface, size + sizeof(header), target_mac, ethernet::ether_type::IPV4); + auto packet = network::ethernet::prepare_packet(interface, size + sizeof(header), *target_mac, ethernet::ether_type::IPV4); if(packet){ ::prepare_packet(*packet, interface, size, target_ip, protocol); @@ -126,8 +130,12 @@ std::expected network::ip::prepare_packet(network::in std::expected network::ip::prepare_packet(char* buffer, network::interface_descriptor& interface, size_t size, address& target_ip, size_t protocol){ auto target_mac = network::arp::get_mac_force(interface, target_ip); + if(!target_mac){ + return std::make_expected_from_error(target_mac.error()); + } + // Ask the ethernet layer to craft a packet - auto packet = network::ethernet::prepare_packet(buffer, interface, size + sizeof(header), target_mac, ethernet::ether_type::IPV4); + auto packet = network::ethernet::prepare_packet(buffer, interface, size + sizeof(header), *target_mac, ethernet::ether_type::IPV4); if(packet){ ::prepare_packet(*packet, interface, size, target_ip, protocol);