2018-08-17 19:49:58 +00:00
|
|
|
#ifndef LLARP_IP_HPP
|
|
|
|
#define LLARP_IP_HPP
|
2018-12-12 02:52:51 +00:00
|
|
|
|
2019-01-11 01:19:36 +00:00
|
|
|
#include <ev/ev.h>
|
2019-01-11 01:42:02 +00:00
|
|
|
#include <net/net.hpp>
|
2019-02-02 23:12:42 +00:00
|
|
|
#include <util/buffer.hpp>
|
2019-01-10 19:41:51 +00:00
|
|
|
#include <util/time.hpp>
|
2018-09-19 13:24:36 +00:00
|
|
|
|
2018-08-18 03:19:00 +00:00
|
|
|
#ifndef _WIN32
|
2018-09-27 02:19:34 +00:00
|
|
|
// unix, linux
|
2018-09-21 14:36:06 +00:00
|
|
|
#include <sys/types.h> // FreeBSD needs this for uchar for ip.h
|
2018-08-16 22:36:15 +00:00
|
|
|
#include <netinet/in.h>
|
2018-08-17 19:49:58 +00:00
|
|
|
#include <netinet/ip.h>
|
2018-12-20 13:56:16 +00:00
|
|
|
// anything not win32
|
|
|
|
struct ip_header
|
|
|
|
{
|
2020-02-07 07:11:40 +00:00
|
|
|
#ifdef __LITTLE_ENDIAN__
|
2018-12-20 13:56:16 +00:00
|
|
|
unsigned int ihl : 4;
|
|
|
|
unsigned int version : 4;
|
2020-02-07 07:11:40 +00:00
|
|
|
#elif defined(__BIG_ENDIAN__)
|
2018-12-20 13:56:16 +00:00
|
|
|
unsigned int version : 4;
|
|
|
|
unsigned int ihl : 4;
|
|
|
|
#else
|
|
|
|
#error "Please fix <bits/endian.h>"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(__linux__)
|
|
|
|
#define ip_version version
|
|
|
|
#endif
|
|
|
|
uint8_t tos;
|
|
|
|
uint16_t tot_len;
|
|
|
|
uint16_t id;
|
|
|
|
uint16_t frag_off;
|
|
|
|
uint8_t ttl;
|
|
|
|
uint8_t protocol;
|
|
|
|
uint16_t check;
|
|
|
|
uint32_t saddr;
|
|
|
|
uint32_t daddr;
|
|
|
|
};
|
2018-08-18 03:19:00 +00:00
|
|
|
#else
|
2018-09-27 02:19:34 +00:00
|
|
|
// windows nt
|
2018-08-18 03:19:00 +00:00
|
|
|
#include <winsock2.h>
|
|
|
|
typedef struct ip_hdr
|
|
|
|
{
|
2020-04-07 18:38:56 +00:00
|
|
|
unsigned char ip_header_len : 4; // 4-bit header length (in 32-bit words) normally=5
|
|
|
|
// (Means 20 Bytes may be 24 also)
|
|
|
|
unsigned char version : 4; // 4-bit IPv4 version
|
|
|
|
unsigned char ip_tos; // IP type of service
|
|
|
|
unsigned short ip_total_length; // Total length
|
|
|
|
unsigned short ip_id; // Unique identifier
|
2018-08-18 03:19:00 +00:00
|
|
|
|
2018-08-20 10:52:47 +00:00
|
|
|
unsigned char ip_frag_offset : 5; // Fragment offset field
|
2018-08-18 03:19:00 +00:00
|
|
|
|
2018-08-20 10:52:47 +00:00
|
|
|
unsigned char ip_more_fragment : 1;
|
|
|
|
unsigned char ip_dont_fragment : 1;
|
|
|
|
unsigned char ip_reserved_zero : 1;
|
2018-08-18 03:19:00 +00:00
|
|
|
|
2018-08-20 10:52:47 +00:00
|
|
|
unsigned char ip_frag_offset1; // fragment offset
|
2018-08-18 03:19:00 +00:00
|
|
|
|
2018-08-20 10:52:47 +00:00
|
|
|
unsigned char ip_ttl; // Time to live
|
|
|
|
unsigned char ip_protocol; // Protocol(TCP,UDP etc)
|
|
|
|
unsigned short ip_checksum; // IP checksum
|
|
|
|
unsigned int ip_srcaddr; // Source address
|
|
|
|
unsigned int ip_destaddr; // Source address
|
2018-08-18 03:19:00 +00:00
|
|
|
} IPV4_HDR;
|
2018-12-20 13:56:16 +00:00
|
|
|
#define ip_header IPV4_HDR
|
2018-08-21 18:31:42 +00:00
|
|
|
#define saddr ip_srcaddr
|
|
|
|
#define daddr ip_destaddr
|
2018-08-21 18:33:27 +00:00
|
|
|
#define check ip_checksum
|
2018-08-21 13:02:05 +00:00
|
|
|
#define ihl ip_header_len
|
2018-12-20 13:56:16 +00:00
|
|
|
#define protocol ip_protocol
|
|
|
|
#define frag_off ip_frag_offset
|
2018-09-19 13:24:36 +00:00
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
struct ipv6_header
|
|
|
|
{
|
|
|
|
unsigned char version : 4;
|
|
|
|
unsigned char pad_small : 4;
|
2019-06-11 21:28:55 +00:00
|
|
|
uint8_t pad[3];
|
2019-06-11 18:23:53 +00:00
|
|
|
uint16_t payload_len;
|
|
|
|
uint8_t proto;
|
|
|
|
uint8_t hoplimit;
|
2019-06-11 16:44:05 +00:00
|
|
|
in6_addr srcaddr;
|
|
|
|
in6_addr dstaddr;
|
|
|
|
};
|
|
|
|
|
2018-12-20 13:56:16 +00:00
|
|
|
#include <memory>
|
2019-06-11 16:44:05 +00:00
|
|
|
#include <service/protocol.hpp>
|
2019-07-30 23:42:13 +00:00
|
|
|
#include <utility>
|
2018-08-17 19:49:58 +00:00
|
|
|
|
2019-01-13 22:39:10 +00:00
|
|
|
struct llarp_ev_loop;
|
|
|
|
|
2018-08-17 19:49:58 +00:00
|
|
|
namespace llarp
|
|
|
|
{
|
|
|
|
namespace net
|
|
|
|
{
|
2019-06-11 16:44:05 +00:00
|
|
|
/// an Packet
|
|
|
|
struct IPPacket
|
2019-05-01 13:40:10 +00:00
|
|
|
{
|
2019-06-11 16:44:05 +00:00
|
|
|
static huint128_t
|
|
|
|
In6ToHUInt(in6_addr addr);
|
2019-05-01 13:40:10 +00:00
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
static in6_addr
|
|
|
|
HUIntToIn6(huint128_t x);
|
2019-05-01 13:40:10 +00:00
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
static huint128_t
|
|
|
|
ExpandV4(huint32_t x);
|
2019-05-01 13:40:10 +00:00
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
static huint32_t
|
|
|
|
TruncateV6(huint128_t x);
|
2019-05-01 13:40:10 +00:00
|
|
|
|
2018-08-17 19:49:58 +00:00
|
|
|
static constexpr size_t MaxSize = 1500;
|
2018-08-22 15:52:10 +00:00
|
|
|
llarp_time_t timestamp;
|
|
|
|
size_t sz;
|
|
|
|
byte_t buf[MaxSize];
|
|
|
|
|
2019-10-04 18:10:58 +00:00
|
|
|
ManagedBuffer
|
2018-08-22 15:52:10 +00:00
|
|
|
Buffer();
|
2018-08-20 19:12:12 +00:00
|
|
|
|
2019-10-04 18:10:58 +00:00
|
|
|
ManagedBuffer
|
2018-11-29 21:19:20 +00:00
|
|
|
ConstBuffer() const;
|
|
|
|
|
2018-08-20 19:12:12 +00:00
|
|
|
bool
|
2019-02-01 01:58:06 +00:00
|
|
|
Load(const llarp_buffer_t& buf);
|
2018-08-17 19:49:58 +00:00
|
|
|
|
|
|
|
struct GetTime
|
|
|
|
{
|
|
|
|
llarp_time_t
|
2019-06-11 16:44:05 +00:00
|
|
|
operator()(const IPPacket& pkt) const
|
2018-08-17 19:49:58 +00:00
|
|
|
{
|
2018-08-31 14:41:04 +00:00
|
|
|
return pkt.timestamp;
|
2018-08-17 19:49:58 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct PutTime
|
|
|
|
{
|
2019-04-08 12:01:52 +00:00
|
|
|
llarp_ev_loop_ptr loop;
|
2019-07-30 23:42:13 +00:00
|
|
|
PutTime(llarp_ev_loop_ptr evloop) : loop(std::move(evloop))
|
2018-10-29 16:48:36 +00:00
|
|
|
{
|
|
|
|
}
|
2018-08-17 19:49:58 +00:00
|
|
|
void
|
2019-06-11 16:44:05 +00:00
|
|
|
operator()(IPPacket& pkt) const
|
2018-08-17 19:49:58 +00:00
|
|
|
{
|
2018-10-29 16:48:36 +00:00
|
|
|
pkt.timestamp = llarp_ev_loop_time_now_ms(loop);
|
2018-08-17 19:49:58 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2018-11-15 13:13:19 +00:00
|
|
|
struct GetNow
|
|
|
|
{
|
2019-04-08 12:01:52 +00:00
|
|
|
llarp_ev_loop_ptr loop;
|
2019-07-30 23:42:13 +00:00
|
|
|
GetNow(llarp_ev_loop_ptr evloop) : loop(std::move(evloop))
|
2018-11-15 13:13:19 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
llarp_time_t
|
|
|
|
operator()() const
|
|
|
|
{
|
|
|
|
return llarp_ev_loop_time_now_ms(loop);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2018-11-29 15:45:27 +00:00
|
|
|
struct CompareSize
|
|
|
|
{
|
|
|
|
bool
|
2019-06-11 16:44:05 +00:00
|
|
|
operator()(const IPPacket& left, const IPPacket& right)
|
2018-11-29 15:45:27 +00:00
|
|
|
{
|
|
|
|
return left.sz < right.sz;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2018-08-17 19:49:58 +00:00
|
|
|
struct CompareOrder
|
|
|
|
{
|
|
|
|
bool
|
2019-06-11 16:44:05 +00:00
|
|
|
operator()(const IPPacket& left, const IPPacket& right)
|
2018-08-17 19:49:58 +00:00
|
|
|
{
|
2018-08-31 14:41:04 +00:00
|
|
|
return left.timestamp < right.timestamp;
|
2018-08-17 19:49:58 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2018-10-10 12:06:28 +00:00
|
|
|
inline ip_header*
|
2018-08-17 19:49:58 +00:00
|
|
|
Header()
|
|
|
|
{
|
2018-09-17 20:18:11 +00:00
|
|
|
return (ip_header*)&buf[0];
|
2018-08-17 19:49:58 +00:00
|
|
|
}
|
|
|
|
|
2018-10-10 12:06:28 +00:00
|
|
|
inline const ip_header*
|
2018-08-17 19:49:58 +00:00
|
|
|
Header() const
|
|
|
|
{
|
2018-09-17 20:18:11 +00:00
|
|
|
return (ip_header*)&buf[0];
|
2018-08-17 19:49:58 +00:00
|
|
|
}
|
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
inline ipv6_header*
|
|
|
|
HeaderV6()
|
|
|
|
{
|
|
|
|
return (ipv6_header*)&buf[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
inline const ipv6_header*
|
|
|
|
HeaderV6() const
|
2018-08-17 19:49:58 +00:00
|
|
|
{
|
2019-06-11 16:44:05 +00:00
|
|
|
return (ipv6_header*)&buf[0];
|
2018-08-17 19:49:58 +00:00
|
|
|
}
|
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
inline int
|
|
|
|
Version() const
|
2018-08-17 19:49:58 +00:00
|
|
|
{
|
2019-06-11 16:44:05 +00:00
|
|
|
return Header()->version;
|
2018-08-17 19:49:58 +00:00
|
|
|
}
|
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
inline bool
|
|
|
|
IsV4() const
|
2018-08-17 19:49:58 +00:00
|
|
|
{
|
2019-06-11 16:44:05 +00:00
|
|
|
return Version() == 4;
|
2018-08-17 19:49:58 +00:00
|
|
|
}
|
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
inline bool
|
|
|
|
IsV6() const
|
2018-08-17 19:49:58 +00:00
|
|
|
{
|
2019-06-11 16:44:05 +00:00
|
|
|
return Version() == 6;
|
2018-08-17 19:49:58 +00:00
|
|
|
}
|
|
|
|
|
2019-06-11 16:44:05 +00:00
|
|
|
inline service::ProtocolType
|
|
|
|
ServiceProtocol() const
|
|
|
|
{
|
2020-04-07 18:38:56 +00:00
|
|
|
if (IsV4())
|
2019-06-11 16:44:05 +00:00
|
|
|
return service::eProtocolTrafficV4;
|
2020-04-07 18:38:56 +00:00
|
|
|
if (IsV6())
|
2019-06-11 16:44:05 +00:00
|
|
|
return service::eProtocolTrafficV6;
|
2019-07-30 23:42:13 +00:00
|
|
|
|
|
|
|
return service::eProtocolControl;
|
2019-06-11 16:44:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
huint128_t
|
|
|
|
srcv6() const;
|
|
|
|
|
|
|
|
huint128_t
|
|
|
|
dstv6() const;
|
|
|
|
|
|
|
|
huint32_t
|
|
|
|
srcv4() const;
|
|
|
|
|
|
|
|
huint32_t
|
|
|
|
dstv4() const;
|
|
|
|
|
|
|
|
huint128_t
|
|
|
|
src4to6() const;
|
|
|
|
|
|
|
|
huint128_t
|
|
|
|
dst4to6() const;
|
|
|
|
|
2018-08-20 19:12:12 +00:00
|
|
|
void
|
2019-06-11 20:56:48 +00:00
|
|
|
UpdateIPv4Address(nuint32_t src, nuint32_t dst);
|
2018-10-09 14:09:03 +00:00
|
|
|
|
|
|
|
void
|
2019-06-11 20:56:48 +00:00
|
|
|
UpdateIPv6Address(huint128_t src, huint128_t dst);
|
2018-08-17 19:49:58 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace net
|
|
|
|
} // namespace llarp
|
|
|
|
|
|
|
|
#endif
|