lokinet/llarp/ip.hpp

200 lines
4.1 KiB
C++
Raw Normal View History

#ifndef LLARP_IP_HPP
#define LLARP_IP_HPP
#include <buffer.h>
#include <ev.h>
#include <net.hpp>
#include <time.hpp>
2018-09-19 13:24:36 +00:00
#ifndef _WIN32
// unix, linux
2018-09-21 14:36:06 +00:00
#include <sys/types.h> // FreeBSD needs this for uchar for ip.h
#include <netinet/in.h>
#include <netinet/ip.h>
#else
// windows nt
#include <winsock2.h>
typedef struct ip_hdr
{
2018-08-20 10:52:47 +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)
2018-09-07 20:56:30 +00:00
unsigned char ip_version : 4; // 4-bit IPv4 version
2018-08-20 10:52:47 +00:00
unsigned char ip_tos; // IP type of service
unsigned short ip_total_length; // Total length
unsigned short ip_id; // Unique identifier
2018-08-20 10:52:47 +00:00
unsigned char ip_frag_offset : 5; // Fragment offset field
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-20 10:52:47 +00:00
unsigned char ip_frag_offset1; // fragment offset
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
} IPV4_HDR;
#define iphdr 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
#define ip_version version
#endif
2018-09-19 13:24:36 +00:00
#include <memory>
2018-09-19 13:24:36 +00:00
// anything not win32
2018-09-17 20:18:11 +00:00
struct ip_header
2018-09-17 18:59:12 +00:00
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
2018-09-21 14:36:06 +00:00
unsigned int ihl : 4;
unsigned int version : 4;
2018-09-17 18:59:12 +00:00
#elif __BYTE_ORDER == __BIG_ENDIAN
2018-09-21 14:36:06 +00:00
unsigned int version : 4;
unsigned int ihl : 4;
2018-09-17 18:59:12 +00:00
#else
2018-09-21 14:36:06 +00:00
#error "Please fix <bits/endian.h>"
2018-09-19 13:24:36 +00:00
#endif
#if defined(__linux__)
#define ip_version version
#endif
2018-09-21 14:36:06 +00:00
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-09-17 18:59:12 +00:00
};
namespace llarp
{
namespace net
{
struct IPv4Packet
{
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];
llarp_buffer_t
Buffer();
2018-08-20 19:12:12 +00:00
2018-11-29 21:19:20 +00:00
llarp_buffer_t
ConstBuffer() const;
2018-08-20 19:12:12 +00:00
bool
Load(llarp_buffer_t buf);
struct GetTime
{
llarp_time_t
2018-08-31 14:41:04 +00:00
operator()(const IPv4Packet& pkt) const
{
2018-08-31 14:41:04 +00:00
return pkt.timestamp;
}
};
struct PutTime
{
2018-10-29 16:48:36 +00:00
llarp_ev_loop* loop;
PutTime(llarp_ev_loop* evloop) : loop(evloop)
{
}
void
2018-08-31 14:41:04 +00:00
operator()(IPv4Packet& pkt) const
{
2018-10-29 16:48:36 +00:00
pkt.timestamp = llarp_ev_loop_time_now_ms(loop);
}
};
struct GetNow
{
llarp_ev_loop* loop;
GetNow(llarp_ev_loop* evloop) : loop(evloop)
{
}
llarp_time_t
operator()() const
{
return llarp_ev_loop_time_now_ms(loop);
}
};
struct CompareSize
{
bool
operator()(const IPv4Packet& left, const IPv4Packet& right)
{
return left.sz < right.sz;
}
};
struct CompareOrder
{
bool
2018-08-31 14:41:04 +00:00
operator()(const IPv4Packet& left, const IPv4Packet& right)
{
2018-08-31 14:41:04 +00:00
return left.timestamp < right.timestamp;
}
};
2018-10-10 12:06:28 +00:00
inline ip_header*
Header()
{
2018-09-17 20:18:11 +00:00
return (ip_header*)&buf[0];
}
2018-10-10 12:06:28 +00:00
inline const ip_header*
Header() const
{
2018-09-17 20:18:11 +00:00
return (ip_header*)&buf[0];
}
2018-10-10 15:14:45 +00:00
inline huint32_t
src()
{
2018-10-10 15:14:45 +00:00
return huint32_t{ntohl(Header()->saddr)};
}
2018-10-10 15:14:45 +00:00
inline huint32_t
dst()
{
2018-10-10 15:14:45 +00:00
return huint32_t{ntohl(Header()->daddr)};
}
2018-10-10 12:06:28 +00:00
inline void
2018-10-10 15:14:45 +00:00
src(huint32_t ip)
{
2018-10-10 15:14:45 +00:00
Header()->saddr = htonl(ip.h);
}
2018-10-10 12:06:28 +00:00
inline void
2018-10-10 15:14:45 +00:00
dst(huint32_t ip)
{
2018-10-10 15:14:45 +00:00
Header()->daddr = htonl(ip.h);
}
// update ip packet (after packet gets out of network)
2018-08-20 19:12:12 +00:00
void
UpdateIPv4PacketOnDst(huint32_t newSrcIP, huint32_t newDstIP);
2018-10-09 14:09:03 +00:00
// update ip packet (before packet gets inserted into network)
2018-10-09 14:09:03 +00:00
void
UpdateIPv4PacketOnSrc();
};
} // namespace net
} // namespace llarp
#endif