summaryrefslogtreecommitdiff
path: root/Kernel/Net/ICMP.h
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-04-02 19:54:38 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-04-02 19:54:38 +0200
commit649c81a714e120a300439ca5d3fdd5e7f6f6b34d (patch)
treefe8b98b5facbbc517bd1d6505e8ba526c08534e4 /Kernel/Net/ICMP.h
parent718bea73b31d1deda79c787eaa4ab7107b8fa7ce (diff)
downloadserenity-649c81a714e120a300439ca5d3fdd5e7f6f6b34d.zip
Kernel: Move networking related files into Kernel/Net/.
Diffstat (limited to 'Kernel/Net/ICMP.h')
-rw-r--r--Kernel/Net/ICMP.h45
1 files changed, 45 insertions, 0 deletions
diff --git a/Kernel/Net/ICMP.h b/Kernel/Net/ICMP.h
new file mode 100644
index 0000000000..efc6cf4ca6
--- /dev/null
+++ b/Kernel/Net/ICMP.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include <Kernel/Net/MACAddress.h>
+#include <Kernel/Net/IPv4.h>
+
+struct ICMPType {
+enum {
+ EchoReply = 0,
+ EchoRequest = 8,
+};
+};
+
+class [[gnu::packed]] ICMPHeader {
+public:
+ ICMPHeader() { }
+ ~ICMPHeader() { }
+
+ byte type() const { return m_type; }
+ void set_type(byte b) { m_type = b; }
+
+ byte code() const { return m_code; }
+ void set_code(byte b) { m_code = b; }
+
+ word checksum() const { return m_checksum; }
+ void set_checksum(word w) { m_checksum = w; }
+
+ const void* payload() const { return this + 1; }
+ void* payload() { return this + 1; }
+
+private:
+ byte m_type { 0 };
+ byte m_code { 0 };
+ NetworkOrdered<word> m_checksum { 0 };
+ // NOTE: The rest of the header is 4 bytes
+};
+
+static_assert(sizeof(ICMPHeader) == 4);
+
+struct [[gnu::packed]] ICMPEchoPacket {
+ ICMPHeader header;
+ NetworkOrdered<word> identifier;
+ NetworkOrdered<word> sequence_number;
+ void* payload() { return this + 1; }
+ const void* payload() const { return this + 1; }
+};