llarp/net/net_int.hpp

Namespaces

Name
llarp
[crypto.hpp]
llarp::net
std
STL namespace.

Classes

Name
struct llarp::huint_t
struct llarp::nuint_t
struct std::hash< llarp::nuint_t< UInt_t > >
struct std::hash< llarp::huint_t< UInt_t > >
struct std::hash< llarp::net::ipv4addr_t >
struct std::hash< llarp::net::ipaddr_t >

Source code

#pragma once

// for addrinfo
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

#include "net.h"

#include <cstdlib>  // for itoa
#include <iostream>
#include <vector>

#include <llarp/util/formattable.hpp>
#include <oxenc/variant.h>

#include "uint128.hpp"

namespace llarp
{
  template <typename UInt_t>
  struct huint_t
  {
    UInt_t h;

    constexpr huint_t
    operator&(huint_t x) const
    {
      return huint_t{UInt_t{h & x.h}};
    }

    constexpr huint_t
    operator|(huint_t x) const
    {
      return huint_t{UInt_t{h | x.h}};
    }

    constexpr huint_t
    operator-(huint_t x) const
    {
      return huint_t{UInt_t{h - x.h}};
    }

    constexpr huint_t
    operator+(huint_t x) const
    {
      return huint_t{UInt_t{h + x.h}};
    }

    constexpr huint_t
    operator^(huint_t x) const
    {
      return huint_t{UInt_t{h ^ x.h}};
    }

    constexpr huint_t
    operator~() const
    {
      return huint_t{UInt_t{~h}};
    }

    constexpr huint_t
    operator<<(int n) const
    {
      UInt_t v{h};
      v <<= n;
      return huint_t{v};
    }

    inline huint_t
    operator++()
    {
      ++h;
      return *this;
    }

    inline huint_t
    operator--()
    {
      --h;
      return *this;
    }

    constexpr bool
    operator<(huint_t x) const
    {
      return h < x.h;
    }

    constexpr bool
    operator!=(huint_t x) const
    {
      return h != x.h;
    }

    constexpr bool
    operator==(huint_t x) const
    {
      return h == x.h;
    }

    using V6Container = std::vector<uint8_t>;
    [[deprecated]] void
    ToV6(V6Container& c);

    std::string
    ToString() const;

    bool
    FromString(const std::string&);
  };

  using huint32_t = huint_t<uint32_t>;
  using huint16_t = huint_t<uint16_t>;
  using huint128_t = huint_t<llarp::uint128_t>;

  template <typename UInt_t>
  struct nuint_t
  {
    UInt_t n = 0;

    constexpr nuint_t
    operator&(nuint_t x) const
    {
      return nuint_t{UInt_t(n & x.n)};
    }

    constexpr nuint_t
    operator|(nuint_t x) const
    {
      return nuint_t{UInt_t(n | x.n)};
    }

    constexpr nuint_t
    operator^(nuint_t x) const
    {
      return nuint_t{UInt_t(n ^ x.n)};
    }

    constexpr nuint_t
    operator~() const
    {
      return nuint_t{UInt_t(~n)};
    }

    constexpr bool
    operator!=(nuint_t x) const
    {
      return n != x.n;
    }

    constexpr bool
    operator==(nuint_t x) const
    {
      return n == x.n;
    }

    using V6Container = std::vector<uint8_t>;
    [[deprecated]] void
    ToV6(V6Container& c);

    std::string
    ToString() const;

    bool
    FromString(const std::string& data)
    {
      huint_t<UInt_t> x;
      if (not x.FromString(data))
        return false;
      *this = ToNet(x);
      return true;
    }

    inline static nuint_t<UInt_t>
    from_string(const std::string& str)
    {
      nuint_t<UInt_t> x{};
      if (not x.FromString(str))
        throw std::invalid_argument{fmt::format("{} is not a valid value", str)};
      return x;
    }

    template <typename... Args_t>
    inline static nuint_t<UInt_t>
    from_host(Args_t&&... args)
    {
      return ToNet(huint_t<UInt_t>{std::forward<Args_t>(args)...});
    }
  };

  namespace net
  {
    namespace
    {
      using n_uint16_t = llarp::nuint_t<uint16_t>;
      using n_uint32_t = llarp::nuint_t<uint32_t>;
      using n_uint128_t = llarp::nuint_t<llarp::uint128_t>;
    }  // namespace

    using port_t = n_uint16_t;
    using ipv4addr_t = n_uint32_t;
    using flowlabel_t = n_uint32_t;
    using ipv6addr_t = n_uint128_t;
    using ipaddr_t = std::variant<ipv4addr_t, ipv6addr_t>;

    std::string
    ToString(const ipaddr_t& ip);

    huint16_t ToHost(port_t);
    huint32_t ToHost(ipv4addr_t);
    huint128_t ToHost(ipv6addr_t);

    port_t ToNet(huint16_t);
    ipv4addr_t ToNet(huint32_t);
    ipv6addr_t ToNet(huint128_t);

    ipv6addr_t ExpandV4(ipv4addr_t);

  }  // namespace net

  template <>
  inline constexpr bool IsToStringFormattable<huint128_t> = true;
  template <>
  inline constexpr bool IsToStringFormattable<huint32_t> = true;
  template <>
  inline constexpr bool IsToStringFormattable<huint16_t> = true;
  template <>
  inline constexpr bool IsToStringFormattable<net::ipv6addr_t> = true;
  template <>
  inline constexpr bool IsToStringFormattable<net::ipv4addr_t> = true;
  template <>
  inline constexpr bool IsToStringFormattable<net::port_t> = true;

  using nuint16_t [[deprecated("use llarp::net::port_t instead")]] = llarp::net::port_t;
  using nuint32_t [[deprecated("use llarp::net::ipv4addr_t instead")]] = llarp::net::ipv4addr_t;
  using nuint128_t [[deprecated("use llarp::net::ipv6addr_t instead")]] = llarp::net::ipv6addr_t;

  template <typename UInt_t>
  [[deprecated("use llarp::net::ToNet instead")]] inline llarp::nuint_t<UInt_t>
  ToNet(llarp::huint_t<UInt_t> x)
  {
    return llarp::net::ToNet(x);
  }

  template <typename UInt_t>
  [[deprecated("use llarp::net::ToHost instead")]] inline llarp::huint_t<UInt_t>
  ToHost(llarp::nuint_t<UInt_t> x)
  {
    return llarp::net::ToHost(x);
  }

  [[deprecated("use llarp::net::ToHost instead")]] inline net::ipv4addr_t
  xhtonl(huint32_t x)
  {
    return ToNet(x);
  }
}  // namespace llarp

namespace std
{
  template <typename UInt_t>
  struct hash<llarp::nuint_t<UInt_t>>
  {
    size_t
    operator()(const llarp::nuint_t<UInt_t>& x) const
    {
      return std::hash<UInt_t>{}(x.n);
    }
  };

  template <typename UInt_t>
  struct hash<llarp::huint_t<UInt_t>>
  {
    size_t
    operator()(const llarp::huint_t<UInt_t>& x) const
    {
      return std::hash<UInt_t>{}(x.h);
    }
  };

  template <>
  struct hash<llarp::net::ipv4addr_t>
  {
    size_t
    operator()(const llarp::net::ipv4addr_t& ip) const
    {
      const auto v6 = llarp::net::ExpandV4(ip);
      return std::hash<llarp::net::ipv6addr_t>{}(v6);
    }
  };

  template <>
  struct hash<llarp::net::ipaddr_t>
  {
    size_t
    operator()(const llarp::net::ipaddr_t& ip) const
    {
      return std::visit(
          [](auto&& x) -> size_t { return std::hash<std::remove_cvref_t<decltype(x)>>{}(x); }, ip);
    }
  };

}  // namespace std

Updated on 2026-01-10 at 22:49:45 +0000