mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-08 20:10:04 -04:00
finalize_packet may fail
This commit is contained in:
parent
42cb0a97a8
commit
2f0ee33ba9
@ -24,7 +24,8 @@ void decode(network::interface_descriptor& interface, network::ethernet::packet&
|
|||||||
|
|
||||||
std::expected<network::ethernet::packet> prepare_packet_query(network::interface_descriptor& interface, network::ip::address target_ip, uint16_t source_port, uint16_t identification, size_t payload_size);
|
std::expected<network::ethernet::packet> prepare_packet_query(network::interface_descriptor& interface, network::ip::address target_ip, uint16_t source_port, uint16_t identification, size_t payload_size);
|
||||||
std::expected<network::ethernet::packet> prepare_packet_query(char* buffer, network::interface_descriptor& interface, network::ip::address target_ip, uint16_t source_port, uint16_t identification, size_t payload_size);
|
std::expected<network::ethernet::packet> prepare_packet_query(char* buffer, network::interface_descriptor& interface, network::ip::address target_ip, uint16_t source_port, uint16_t identification, size_t payload_size);
|
||||||
void finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p);
|
|
||||||
|
std::expected<void> finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p);
|
||||||
|
|
||||||
} // end of dns namespace
|
} // end of dns namespace
|
||||||
|
|
||||||
|
@ -28,7 +28,8 @@ void decode(network::interface_descriptor& interface, packet& packet);
|
|||||||
|
|
||||||
std::expected<packet> prepare_packet(network::interface_descriptor& interface, size_t size, size_t destination, ether_type type);
|
std::expected<packet> prepare_packet(network::interface_descriptor& interface, size_t size, size_t destination, ether_type type);
|
||||||
std::expected<packet> prepare_packet(char* buffer, network::interface_descriptor& interface, size_t size, size_t destination, ether_type type);
|
std::expected<packet> prepare_packet(char* buffer, network::interface_descriptor& interface, size_t size, size_t destination, ether_type type);
|
||||||
void finalize_packet(network::interface_descriptor& interface, packet& p);
|
|
||||||
|
std::expected<void> finalize_packet(network::interface_descriptor& interface, packet& p);
|
||||||
|
|
||||||
} // end of ethernet namespace
|
} // end of ethernet namespace
|
||||||
|
|
||||||
|
@ -26,7 +26,8 @@ void decode(network::interface_descriptor& interface, network::ethernet::packet&
|
|||||||
|
|
||||||
std::expected<network::ethernet::packet> prepare_packet(network::interface_descriptor& interface, network::ip::address target_ip, size_t payload_size, type t, size_t code);
|
std::expected<network::ethernet::packet> prepare_packet(network::interface_descriptor& interface, network::ip::address target_ip, size_t payload_size, type t, size_t code);
|
||||||
std::expected<network::ethernet::packet> prepare_packet(char* buffer, network::interface_descriptor& interface, network::ip::address target_ip, size_t payload_size, type t, size_t code);
|
std::expected<network::ethernet::packet> prepare_packet(char* buffer, 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);
|
|
||||||
|
std::expected<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);
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ void decode(network::interface_descriptor& interface, network::ethernet::packet&
|
|||||||
|
|
||||||
std::expected<network::ethernet::packet> prepare_packet(network::interface_descriptor& interface, size_t size, address& destination, size_t protocol);
|
std::expected<network::ethernet::packet> prepare_packet(network::interface_descriptor& interface, size_t size, address& destination, size_t protocol);
|
||||||
std::expected<network::ethernet::packet> prepare_packet(char* buffer, network::interface_descriptor& interface, size_t size, address& destination, size_t protocol);
|
std::expected<network::ethernet::packet> prepare_packet(char* buffer, network::interface_descriptor& interface, size_t size, address& destination, size_t protocol);
|
||||||
void finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p);
|
std::expected<void> finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p);
|
||||||
|
|
||||||
} // end of ip namespace
|
} // end of ip namespace
|
||||||
|
|
||||||
|
@ -24,8 +24,8 @@ void decode(network::interface_descriptor& interface, network::ethernet::packet&
|
|||||||
std::expected<network::ethernet::packet> prepare_packet(network::interface_descriptor& interface, network::ip::address target_ip, size_t source, size_t target, size_t payload_size);
|
std::expected<network::ethernet::packet> prepare_packet(network::interface_descriptor& interface, network::ip::address target_ip, size_t source, size_t target, size_t payload_size);
|
||||||
std::expected<network::ethernet::packet> prepare_packet(char* buffer, network::socket& socket, size_t payload_size);
|
std::expected<network::ethernet::packet> prepare_packet(char* buffer, network::socket& socket, size_t payload_size);
|
||||||
|
|
||||||
void finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p);
|
std::expected<void> finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p);
|
||||||
void finalize_packet(network::interface_descriptor& interface, network::socket& socket, network::ethernet::packet& p);
|
std::expected<void> finalize_packet(network::interface_descriptor& interface, network::socket& socket, network::ethernet::packet& p);
|
||||||
|
|
||||||
std::expected<void> connect(network::socket& socket, network::interface_descriptor& interface, size_t local_port, size_t server_port, network::ip::address server);
|
std::expected<void> connect(network::socket& socket, network::interface_descriptor& interface, size_t local_port, size_t server_port, network::ip::address server);
|
||||||
std::expected<void> disconnect(network::socket& socket);
|
std::expected<void> disconnect(network::socket& socket);
|
||||||
|
@ -29,7 +29,7 @@ void decode(network::interface_descriptor& interface, network::ethernet::packet&
|
|||||||
|
|
||||||
std::expected<network::ethernet::packet> prepare_packet(network::interface_descriptor& interface, network::ip::address target_ip, size_t source, size_t target, size_t payload_size);
|
std::expected<network::ethernet::packet> prepare_packet(network::interface_descriptor& interface, network::ip::address target_ip, size_t source, size_t target, size_t payload_size);
|
||||||
std::expected<network::ethernet::packet> prepare_packet(char* buffer, network::interface_descriptor& interface, network::ip::address target_ip, size_t source, size_t target, size_t payload_size);
|
std::expected<network::ethernet::packet> prepare_packet(char* buffer, network::interface_descriptor& interface, network::ip::address target_ip, size_t source, size_t target, size_t payload_size);
|
||||||
void finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p);
|
std::expected<void> finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p);
|
||||||
|
|
||||||
} // end of upd namespace
|
} // end of upd namespace
|
||||||
|
|
||||||
|
@ -214,9 +214,9 @@ std::expected<network::ethernet::packet> network::dns::prepare_packet_query(char
|
|||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
void network::dns::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p) {
|
std::expected<void> network::dns::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p) {
|
||||||
p.index -= sizeof(header);
|
p.index -= sizeof(header);
|
||||||
|
|
||||||
// Give the packet to the UDP layer for finalization
|
// Give the packet to the UDP layer for finalization
|
||||||
network::udp::finalize_packet(interface, p);
|
return network::udp::finalize_packet(interface, p);
|
||||||
}
|
}
|
||||||
|
@ -144,7 +144,7 @@ std::expected<network::ethernet::packet> network::ethernet::prepare_packet(char*
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void network::ethernet::finalize_packet(network::interface_descriptor& interface, packet& p){
|
std::expected<void> network::ethernet::finalize_packet(network::interface_descriptor& interface, packet& p){
|
||||||
if(p.user){
|
if(p.user){
|
||||||
// The packet will be handled by a kernel thread, needs to
|
// The packet will be handled by a kernel thread, needs to
|
||||||
// be copied to kernel memory
|
// be copied to kernel memory
|
||||||
@ -160,4 +160,6 @@ void network::ethernet::finalize_packet(network::interface_descriptor& interface
|
|||||||
} else {
|
} else {
|
||||||
interface.send(p);
|
interface.send(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ std::expected<network::ethernet::packet> network::icmp::prepare_packet(char* buf
|
|||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
void network::icmp::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& packet){
|
std::expected<void> network::icmp::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& packet){
|
||||||
packet.index -= sizeof(header) - sizeof(uint32_t);
|
packet.index -= sizeof(header) - sizeof(uint32_t);
|
||||||
|
|
||||||
auto* icmp_header = reinterpret_cast<header*>(packet.payload + packet.index);
|
auto* icmp_header = reinterpret_cast<header*>(packet.payload + packet.index);
|
||||||
@ -145,7 +145,7 @@ void network::icmp::finalize_packet(network::interface_descriptor& interface, ne
|
|||||||
compute_checksum(icmp_header, 0);
|
compute_checksum(icmp_header, 0);
|
||||||
|
|
||||||
// Give the packet to the IP layer for finalization
|
// Give the packet to the IP layer for finalization
|
||||||
network::ip::finalize_packet(interface, packet);
|
return 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){
|
||||||
|
@ -186,7 +186,7 @@ std::expected<network::ethernet::packet> network::ip::prepare_packet(char* buffe
|
|||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
void network::ip::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p){
|
std::expected<void> network::ip::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p){
|
||||||
// Send the packet to the ethernet layer
|
// Send the packet to the ethernet layer
|
||||||
network::ethernet::finalize_packet(interface, p);
|
return network::ethernet::finalize_packet(interface, p);
|
||||||
}
|
}
|
||||||
|
@ -345,24 +345,23 @@ std::expected<void> network::finalize_packet(socket_fd_t socket_fd, size_t packe
|
|||||||
auto& packet = socket.get_packet(packet_fd);
|
auto& packet = socket.get_packet(packet_fd);
|
||||||
auto& interface = network::interface(packet.interface);
|
auto& interface = network::interface(packet.interface);
|
||||||
|
|
||||||
|
auto check_and_return = [&socket, &packet_fd](const std::expected<void>& ret){
|
||||||
|
if(ret){
|
||||||
|
socket.erase_packet(packet_fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
switch(socket.protocol){
|
switch(socket.protocol){
|
||||||
case network::socket_protocol::ICMP:
|
case network::socket_protocol::ICMP:
|
||||||
network::icmp::finalize_packet(interface, packet);
|
return check_and_return(network::icmp::finalize_packet(interface, packet));
|
||||||
socket.erase_packet(packet_fd);
|
|
||||||
|
|
||||||
return std::make_expected();
|
|
||||||
|
|
||||||
case network::socket_protocol::TCP:
|
case network::socket_protocol::TCP:
|
||||||
network::tcp::finalize_packet(interface, socket, packet);
|
return check_and_return(network::tcp::finalize_packet(interface, packet));
|
||||||
socket.erase_packet(packet_fd);
|
|
||||||
|
|
||||||
return std::make_expected();
|
|
||||||
|
|
||||||
case network::socket_protocol::DNS:
|
case network::socket_protocol::DNS:
|
||||||
network::dns::finalize_packet(interface, packet);
|
return check_and_return(network::dns::finalize_packet(interface, packet));
|
||||||
socket.erase_packet(packet_fd);
|
|
||||||
|
|
||||||
return std::make_expected();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_unexpected<void>(std::ERROR_SOCKET_UNIMPLEMENTED);
|
return std::make_unexpected<void>(std::ERROR_SOCKET_UNIMPLEMENTED);
|
||||||
|
@ -297,17 +297,17 @@ std::expected<network::ethernet::packet> network::tcp::prepare_packet(char* buff
|
|||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
void network::tcp::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p) {
|
std::expected<void> network::tcp::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p) {
|
||||||
p.index -= sizeof(header);
|
p.index -= sizeof(header);
|
||||||
|
|
||||||
// Compute the checksum
|
// Compute the checksum
|
||||||
compute_checksum(p);
|
compute_checksum(p);
|
||||||
|
|
||||||
// Give the packet to the IP layer for finalization
|
// Give the packet to the IP layer for finalization
|
||||||
network::ip::finalize_packet(interface, p);
|
return network::ip::finalize_packet(interface, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void network::tcp::finalize_packet(network::interface_descriptor& interface, network::socket& socket, network::ethernet::packet& p) {
|
std::expected<void> network::tcp::finalize_packet(network::interface_descriptor& interface, network::socket& socket, network::ethernet::packet& p) {
|
||||||
p.index -= sizeof(header);
|
p.index -= sizeof(header);
|
||||||
|
|
||||||
// Compute the checksum
|
// Compute the checksum
|
||||||
@ -315,15 +315,14 @@ void network::tcp::finalize_packet(network::interface_descriptor& interface, net
|
|||||||
|
|
||||||
if (!p.user) {
|
if (!p.user) {
|
||||||
logging::logf(logging::log_level::ERROR, "tcp: Function uniquely implemented for user packets!\n");
|
logging::logf(logging::log_level::ERROR, "tcp: Function uniquely implemented for user packets!\n");
|
||||||
return; //TODO Fail
|
return std::make_unexpected<void>(std::ERROR_SOCKET_UNIMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& connection = socket.get_data<tcp_connection>();
|
auto& connection = socket.get_data<tcp_connection>();
|
||||||
|
|
||||||
// Make sure stream sockets are connected
|
// Make sure stream sockets are connected
|
||||||
if(!connection.connected){
|
if(!connection.connected){
|
||||||
//TODO return std::make_unexpected<void>(std::ERROR_SOCKET_NOT_CONNECTED);
|
return std::make_unexpected<void>(std::ERROR_SOCKET_NOT_CONNECTED);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
connection.listening = true;
|
connection.listening = true;
|
||||||
@ -335,7 +334,11 @@ void network::tcp::finalize_packet(network::interface_descriptor& interface, net
|
|||||||
|
|
||||||
for(size_t t = 0; t < max_tries; ++t){
|
for(size_t t = 0; t < max_tries; ++t){
|
||||||
// Give the packet to the IP layer for finalization
|
// Give the packet to the IP layer for finalization
|
||||||
network::ip::finalize_packet(interface, p);
|
auto result = network::ip::finalize_packet(interface, p);
|
||||||
|
|
||||||
|
if(!result){
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
auto before = timer::milliseconds();
|
auto before = timer::milliseconds();
|
||||||
auto after = before;
|
auto after = before;
|
||||||
@ -387,8 +390,10 @@ void network::tcp::finalize_packet(network::interface_descriptor& interface, net
|
|||||||
// Set the future sequence and acknowledgement numbers
|
// Set the future sequence and acknowledgement numbers
|
||||||
connection.seq_number = ack;
|
connection.seq_number = ack;
|
||||||
connection.ack_number = seq;
|
connection.ack_number = seq;
|
||||||
|
|
||||||
|
return {};
|
||||||
} else {
|
} else {
|
||||||
//TODO We need to be able to make finalize fail!
|
return std::make_unexpected<void>(std::ERROR_SOCKET_TCP_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ std::expected<network::ethernet::packet> network::udp::prepare_packet(char* buff
|
|||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
void network::udp::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p){
|
std::expected<void> network::udp::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p){
|
||||||
p.index -= sizeof(header);
|
p.index -= sizeof(header);
|
||||||
|
|
||||||
// Compute the checksum
|
// Compute the checksum
|
||||||
|
@ -44,6 +44,7 @@ constexpr const size_t ERROR_SOCKET_INVALID_PACKET_DESCRIPTOR = 29;
|
|||||||
constexpr const size_t ERROR_SOCKET_INVALID_TYPE_PROTOCOL = 30;
|
constexpr const size_t ERROR_SOCKET_INVALID_TYPE_PROTOCOL = 30;
|
||||||
constexpr const size_t ERROR_SOCKET_NOT_CONNECTED = 31;
|
constexpr const size_t ERROR_SOCKET_NOT_CONNECTED = 31;
|
||||||
constexpr const size_t ERROR_SOCKET_INVALID_CONNECTION = 32;
|
constexpr const size_t ERROR_SOCKET_INVALID_CONNECTION = 32;
|
||||||
|
constexpr const size_t ERROR_SOCKET_TCP_ERROR = 33;
|
||||||
|
|
||||||
inline const char* error_message(size_t error){
|
inline const char* error_message(size_t error){
|
||||||
switch(error){
|
switch(error){
|
||||||
@ -111,6 +112,8 @@ inline const char* error_message(size_t error){
|
|||||||
return "The socket is not connected";
|
return "The socket is not connected";
|
||||||
case ERROR_SOCKET_INVALID_CONNECTION:
|
case ERROR_SOCKET_INVALID_CONNECTION:
|
||||||
return "Issue with the internal connection";
|
return "Issue with the internal connection";
|
||||||
|
case ERROR_SOCKET_TCP_ERROR:
|
||||||
|
return "TCP packet was not acknowledged";
|
||||||
default:
|
default:
|
||||||
return "Unknonwn error";
|
return "Unknonwn error";
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user