diff --git a/Makefile b/Makefile index 9a98e14..efdbb2a 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ CXX=g++ CXXFLAGS=-O2 -g -Wall -Wextra -std=c++17 CXXLIBS= -OBJS=UdpVpn.o VpnPeer.o TunDevice.o util.o main.o +OBJS=UdpVpn.o VpnPeer.o TunDevice.o ip_header.o util.o main.o TARGET=congestvpn all: $(TARGET) diff --git a/ip_header.cpp b/ip_header.cpp new file mode 100644 index 0000000..6464266 --- /dev/null +++ b/ip_header.cpp @@ -0,0 +1,19 @@ +#include + +#include "ip_header.hpp" +#include "util.hpp" + +bool parse_ipv6_header(const char* data, size_t len, IPv6Header& header) { + if(len < 40) { // header too short + kdebugf("Bad v6 header -- too short.\n"); + return false; + } + if((data[0] & 0xf0) != 0x60) { // bad version number + kdebugf("Bad v6 header -- bad version number (byte = %x).\n", data[0]); + return false; + } + + memcpy(&(header.source), data + 8, 16); + memcpy(&(header.dest), data + 24, 16); + return true; +} diff --git a/ip_header.hpp b/ip_header.hpp new file mode 100644 index 0000000..1d86666 --- /dev/null +++ b/ip_header.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include + +struct IPv6Header { + in6_addr source; + in6_addr dest; +}; + +/** Parse an IPv6 header, filling `header`. Returns `true` on success. */ +bool parse_ipv6_header(const char* data, size_t len, IPv6Header& header);