mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-15 15:37:51 -04:00
Refactorings
This commit is contained in:
parent
fd2529453c
commit
b2f7916b9f
@ -52,6 +52,9 @@ enum class type : uint8_t {
|
|||||||
|
|
||||||
void decode(network::interface_descriptor& interface, network::ethernet::packet& packet);
|
void decode(network::interface_descriptor& interface, network::ethernet::packet& packet);
|
||||||
|
|
||||||
|
network::ethernet::packet prepare_packet(network::interface_descriptor& interface, network::ip::address target_ip, size_t payload_size, type t, size_t code);
|
||||||
|
void finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p);
|
||||||
|
|
||||||
void ping(network::interface_descriptor& interface, network::ip::address addr);
|
void ping(network::interface_descriptor& interface, network::ip::address addr);
|
||||||
|
|
||||||
} // end of icmp namespace
|
} // end of icmp namespace
|
||||||
|
@ -66,6 +66,34 @@ void network::icmp::decode(network::interface_descriptor& /*interface*/, network
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
network::ethernet::packet network::icmp::prepare_packet(network::interface_descriptor& interface, network::ip::address target_ip, size_t payload_size, type t, size_t code){
|
||||||
|
// Ask the IP layer to craft a packet
|
||||||
|
auto packet = network::ip::prepare_packet(interface, sizeof(header) + payload_size, target_ip, 0x01);
|
||||||
|
|
||||||
|
// Set the ICMP header
|
||||||
|
|
||||||
|
auto* icmp_header = reinterpret_cast<header*>(packet.payload + packet.index);
|
||||||
|
|
||||||
|
icmp_header->type = static_cast<uint8_t>(t);
|
||||||
|
icmp_header->code = code;
|
||||||
|
|
||||||
|
packet.index += sizeof(header) - sizeof(uint32_t);
|
||||||
|
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
void network::icmp::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& packet){
|
||||||
|
packet.index -= sizeof(header) - sizeof(uint32_t);
|
||||||
|
|
||||||
|
auto* icmp_header = reinterpret_cast<header*>(packet.payload + packet.index);
|
||||||
|
|
||||||
|
// Compute the checksum
|
||||||
|
compute_checksum(icmp_header, 0);
|
||||||
|
|
||||||
|
// Give the packet to the IP layer for finalization
|
||||||
|
network::ip::finalize_packet(interface, packet);
|
||||||
|
}
|
||||||
|
|
||||||
void network::icmp::ping(network::interface_descriptor& interface, network::ip::address target_ip){
|
void network::icmp::ping(network::interface_descriptor& interface, network::ip::address target_ip){
|
||||||
logging::logf(logging::log_level::TRACE, "icmp: Ping %u.%u.%u.%u \n",
|
logging::logf(logging::log_level::TRACE, "icmp: Ping %u.%u.%u.%u \n",
|
||||||
uint64_t(target_ip(0)), uint64_t(target_ip(1)), uint64_t(target_ip(2)), uint64_t(target_ip(3)));
|
uint64_t(target_ip(0)), uint64_t(target_ip(1)), uint64_t(target_ip(2)), uint64_t(target_ip(3)));
|
||||||
@ -74,27 +102,16 @@ void network::icmp::ping(network::interface_descriptor& interface, network::ip::
|
|||||||
|
|
||||||
logging::logf(logging::log_level::TRACE, "icmp: Target MAC Address: %h\n", target_mac);
|
logging::logf(logging::log_level::TRACE, "icmp: Target MAC Address: %h\n", target_mac);
|
||||||
|
|
||||||
// Ask the IP layer to craft a packet
|
// Ask the ICMP layer to craft a packet
|
||||||
auto packet = network::ip::prepare_packet(interface, sizeof(header), target_ip, 0x01);
|
auto packet = network::icmp::prepare_packet(interface, target_ip, 0, type::ECHO_REQUEST, 0);
|
||||||
|
|
||||||
// Set the ICMP header
|
// Set the Command header
|
||||||
|
|
||||||
auto* icmp_header = reinterpret_cast<header*>(packet.payload + packet.index);
|
auto* command_header = reinterpret_cast<echo_request_header*>(packet.payload + packet.index);
|
||||||
|
|
||||||
icmp_header->type = static_cast<uint8_t>(type::ECHO_REQUEST);
|
|
||||||
icmp_header->code = 0;
|
|
||||||
|
|
||||||
// Set the command header
|
|
||||||
|
|
||||||
auto* command_header = reinterpret_cast<echo_request_header*>(&icmp_header->rest);
|
|
||||||
|
|
||||||
command_header->identifier = 0x666;
|
command_header->identifier = 0x666;
|
||||||
command_header->sequence = echo_sequence++;
|
command_header->sequence = echo_sequence++;
|
||||||
|
|
||||||
// Compute the checksum
|
// Send the packet back to ICMP
|
||||||
|
network::icmp::finalize_packet(interface, packet);
|
||||||
compute_checksum(icmp_header, 0);
|
|
||||||
|
|
||||||
// Give the packet to the IP layer for finalization
|
|
||||||
network::ip::finalize_packet(interface, packet);
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user