From 3eef5e0699f60db7fbdb0fd439305142c21167e7 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sun, 11 Sep 2016 11:05:46 +0200 Subject: [PATCH] Prepare DNS decoding --- kernel/include/net/dns_layer.hpp | 49 ++++++++++++++++++++++++++++++++ kernel/src/net/dns_layer.cpp | 41 ++++++++++++++++++++++++++ kernel/src/net/udp_layer.cpp | 7 +++-- 3 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 kernel/include/net/dns_layer.hpp create mode 100644 kernel/src/net/dns_layer.cpp diff --git a/kernel/include/net/dns_layer.hpp b/kernel/include/net/dns_layer.hpp new file mode 100644 index 00000000..0b2f2f3a --- /dev/null +++ b/kernel/include/net/dns_layer.hpp @@ -0,0 +1,49 @@ +//======================================================================= +// Copyright Baptiste Wicht 2013-2016. +// Distributed under the terms of the MIT License. +// (See accompanying file LICENSE or copy at +// http://www.opensource.org/licenses/MIT) +//======================================================================= + +#ifndef NET_DNS_LAYER_H +#define NET_DNS_LAYER_H + +#include + +#include "net/ethernet_layer.hpp" +#include "net/ip_layer.hpp" +#include "net/network.hpp" + +namespace network { + +namespace dns { + +struct flags_t { + uint8_t qr : 1; + uint8_t opcode : 4; + uint8_t aa : 1; + uint8_t tc : 1; + uint8_t rd : 1; + uint8_t ra : 1; + uint8_t zeroes : 3; + uint8_t rcode : 4; +} __attribute__((packed)); + +static_assert(sizeof(flags_t) == 2, "DNS flags must be 16 bits"); + +struct header { + uint16_t identification; + flags_t flags; + uint16_t questions; + uint16_t answers; + uint16_t authority_rrs; + uint16_t additional_rrs; +} __attribute__((packed)); + +void decode(network::interface_descriptor& interface, network::ethernet::packet& packet); + +} // end of dns namespace + +} // end of network namespace + +#endif diff --git a/kernel/src/net/dns_layer.cpp b/kernel/src/net/dns_layer.cpp new file mode 100644 index 00000000..7044a582 --- /dev/null +++ b/kernel/src/net/dns_layer.cpp @@ -0,0 +1,41 @@ +//======================================================================= +// Copyright Baptiste Wicht 2013-2016. +// Distributed under the terms of the MIT License. +// (See accompanying file LICENSE or copy at +// http://www.opensource.org/licenses/MIT) +//======================================================================= + +#include "net/dns_layer.hpp" + +#include "kernel_utils.hpp" + +namespace { + + +} //end of anonymous namespace + +void network::dns::decode(network::interface_descriptor& /*interface*/, network::ethernet::packet& packet){ + packet.tag(3, packet.index); + + auto* dns_header = reinterpret_cast(packet.payload + packet.index); + + logging::logf(logging::log_level::TRACE, "dns: Start DNS packet handling\n"); + + auto identification = switch_endian_16(dns_header->identification); + auto questions = switch_endian_16(dns_header->questions); + auto answers = switch_endian_16(dns_header->answers); + + logging::logf(logging::log_level::TRACE, "dns: Identification %h \n", size_t(identification)); + logging::logf(logging::log_level::TRACE, "dns: Questions %h \n", size_t(questions)); + logging::logf(logging::log_level::TRACE, "dns: Answers %h \n", size_t(answers)); + + auto flags = dns_header->flags; + + if(flags.qr){ + logging::logf(logging::log_level::TRACE, "dns: Query\n"); + } else { + logging::logf(logging::log_level::TRACE, "dns: Response\n"); + } + + //TODO +} diff --git a/kernel/src/net/udp_layer.cpp b/kernel/src/net/udp_layer.cpp index 714a85ed..8106c065 100644 --- a/kernel/src/net/udp_layer.cpp +++ b/kernel/src/net/udp_layer.cpp @@ -6,6 +6,7 @@ //======================================================================= #include "net/udp_layer.hpp" +#include "net/dns_layer.hpp" #include "kernel_utils.hpp" @@ -69,7 +70,7 @@ void prepare_packet(network::ethernet::packet& packet, size_t source, size_t tar } //end of anonymous namespace -void network::udp::decode(network::interface_descriptor& /*interface*/, network::ethernet::packet& packet){ +void network::udp::decode(network::interface_descriptor& interface, network::ethernet::packet& packet){ packet.tag(2, packet.index); auto* udp_header = reinterpret_cast(packet.payload + packet.index); @@ -84,8 +85,10 @@ void network::udp::decode(network::interface_descriptor& /*interface*/, network: logging::logf(logging::log_level::TRACE, "udp: Target Port %h \n", target_port); logging::logf(logging::log_level::TRACE, "udp: Length %h \n", length); + packet.index += sizeof(header); + if(target_port == 53){ - //TODO DNS decoding + network::dns::decode(interface, packet); } }