libflute
Namespaces | Classes | Enumerations | Functions
LibFlute Namespace Reference

Namespaces

 IpSec
 

Classes

class  AlcPacket
 A class for parsing and creating ALC packets. More...
 
class  EncodingSymbol
 A class for handling FEC encoding symbols. More...
 
class  File
 Represents a file being transmitted or received. More...
 
class  FileDeliveryTable
 A class for parsing and creating FLUTE FDTs (File Delivery Tables). More...
 
struct  FecOti
 OTI values struct. More...
 
class  Receiver
 FLUTE receiver class. More...
 
class  Transmitter
 FLUTE transmitter class. More...
 

Enumerations

enum class  ContentEncoding { NONE , ZLIB , DEFLATE , GZIP }
 Content Encodings. More...
 
enum class  FecScheme { CompactNoCode }
 Error correction schemes. More...
 

Functions

static void create_udp_pkt (char *udp_buffer, const boost::asio::ip::udp::endpoint &endpoint, const char *data, size_t data_len, const boost::asio::ip::address &local_address)
 
static void create_ip_hdr (char *ip_buffer, const boost::asio::ip::udp::endpoint &endpoint, size_t pkt_size, const boost::asio::ip::address &local_address)
 
static uint16_t calculate_sum (uint16_t *buffer, size_t len)
 
static const Transmitter::FileDescription::date_time_type_get_ntp_epoch ()
 

Enumeration Type Documentation

◆ ContentEncoding

Content Encodings.

Enumerator
NONE 
ZLIB 
DEFLATE 
GZIP 

Definition at line 34 of file flute_types.h.

◆ FecScheme

enum LibFlute::FecScheme
strong

Error correction schemes.

Enumerator
CompactNoCode 

Definition at line 44 of file flute_types.h.

44  {
46  };

Function Documentation

◆ _get_ntp_epoch()

static const Transmitter::FileDescription::date_time_type& LibFlute::_get_ntp_epoch ( )
static

Definition at line 334 of file Transmitter.cpp.

335 {
336  static bool is_set = false;
337  static Transmitter::FileDescription::date_time_type ntp_epoch;
338  if (!is_set) {
339  std::tm ntp_epoch_tm = {.tm_mday=1, .tm_mon=0, .tm_year=0};
340  ntp_epoch = std::chrono::system_clock::from_time_t(std::mktime(&ntp_epoch_tm));
341  is_set = true;
342  }
343  return ntp_epoch;
344 }

◆ calculate_sum()

static uint16_t LibFlute::calculate_sum ( uint16_t *  buffer,
size_t  len 
)
static

Definition at line 876 of file Transmitter.cpp.

877 {
878  uint32_t cksum = 0;
879 
880  while (len > 1) {
881  cksum += ntohs(*buffer);
882  len -= 2;
883  buffer++;
884  }
885  if (len > 0) {
886  cksum += (*reinterpret_cast<uint8_t*>(buffer)) << 8;
887  }
888 
889  while (cksum >> 16) {
890  cksum = (cksum & 0xFFFF) + (cksum >> 16);
891  }
892 
893  uint16_t result = htons(static_cast<uint16_t>(~cksum));
894 
895  return result;
896 }

◆ create_ip_hdr()

static void LibFlute::create_ip_hdr ( char *  ip_buffer,
const boost::asio::ip::udp::endpoint &  endpoint,
size_t  pkt_size,
const boost::asio::ip::address &  local_address 
)
static

Definition at line 857 of file Transmitter.cpp.

858 {
859  struct iphdr *ip_hdr = reinterpret_cast<struct iphdr*>(ip_buffer);
860 
861  ip_hdr->version = IPVERSION;
862  ip_hdr->ihl = 5; // 20 bytes
863  ip_hdr->tos = 0;
864  ip_hdr->tot_len = htons(pkt_size);
865  ip_hdr->id = 0;
866  ip_hdr->frag_off = 0; // not fragmenting
867  ip_hdr->ttl = 63; // TTL 63 hops
868  ip_hdr->protocol = endpoint.protocol().protocol();
869  ip_hdr->check = 0;
870  ip_hdr->saddr = htonl(local_address.to_v4().to_uint());
871  ip_hdr->daddr = htonl(endpoint.address().to_v4().to_uint());
872 
873  ip_hdr->check = calculate_sum(reinterpret_cast<uint16_t*>(ip_hdr), 20);
874 }
static uint16_t calculate_sum(uint16_t *buffer, size_t len)

◆ create_udp_pkt()

static void LibFlute::create_udp_pkt ( char *  udp_buffer,
const boost::asio::ip::udp::endpoint &  endpoint,
const char *  data,
size_t  data_len,
const boost::asio::ip::address &  local_address 
)
static

Definition at line 831 of file Transmitter.cpp.

832 {
833  struct udp_pseudo_hdr {
834  in_addr_t source;
835  in_addr_t dest;
836  uint8_t reserved;
837  uint8_t protocol;
838  uint16_t length;
839  } *pseudo_hdr = reinterpret_cast<struct udp_pseudo_hdr*>(udp_buffer - sizeof(*pseudo_hdr));
840  struct udphdr *udp_hdr = reinterpret_cast<struct udphdr*>(udp_buffer);
841 
842  pseudo_hdr->source = htonl(local_address.to_v4().to_uint());
843  pseudo_hdr->dest = htonl(endpoint.address().to_v4().to_uint());
844  pseudo_hdr->reserved = 0;
845  pseudo_hdr->protocol = endpoint.protocol().protocol();
846  pseudo_hdr->length = htons(data_len + 8);
847 
848  udp_hdr->uh_sport = htons(endpoint.port());
849  udp_hdr->uh_dport = udp_hdr->uh_sport;
850  udp_hdr->uh_ulen = pseudo_hdr->length;
851  udp_hdr->uh_sum = 0;
852  memcpy(udp_buffer+8, data, data_len);
853 
854  udp_hdr->uh_sum = calculate_sum(reinterpret_cast<uint16_t*>(pseudo_hdr), data_len + 8 + 12);
855 }