Skip to content

Commit

Permalink
sync: change internal representation of ip addresses for reals from s…
Browse files Browse the repository at this point in the history
…tring to binary
  • Loading branch information
udippant committed Aug 9, 2019
1 parent 04165e7 commit bf7eeca
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 66 deletions.
26 changes: 16 additions & 10 deletions katran/lib/IpHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

#include "IpHelpers.h"

#include <folly/IPAddress.h>
#include <folly/lang/Bits.h>
#include <stdexcept>

Expand All @@ -25,24 +24,27 @@ namespace katran {
constexpr int Uint32_bytes = 4;
constexpr uint8_t V6DADDR = 1;

struct beaddr IpHelpers::parseAddrToBe(
const std::string& addr,
bool bigendian) {
auto ipaddr = folly::IPAddress(addr);
struct beaddr IpHelpers::parseAddrToBe(const std::string &addr,
bool bigendian) {
return parseAddrToBe(folly::IPAddress(addr), bigendian);
}

struct beaddr IpHelpers::parseAddrToBe(const folly::IPAddress &addr,
bool bigendian) {
struct beaddr translated_addr = {};
if (ipaddr.isV4()) {
if (addr.isV4()) {
translated_addr.flags = 0;
if (bigendian) {
translated_addr.daddr = ipaddr.asV4().toLong();
translated_addr.daddr = addr.asV4().toLong();
} else {
translated_addr.daddr = ipaddr.asV4().toLongHBO();
translated_addr.daddr = addr.asV4().toLongHBO();
}
} else {
for (int partition = 0; partition < 4; partition++) {
// bytes() return a ptr to char* array
// so we are doing some ptr arithmetics here
uint32_t addr_part =
*(uint32_t*)(ipaddr.bytes() + Uint32_bytes * partition);
*(uint32_t *)(addr.bytes() + Uint32_bytes * partition);
if (bigendian) {
translated_addr.v6daddr[partition] = addr_part;
} else {
Expand All @@ -54,7 +56,11 @@ struct beaddr IpHelpers::parseAddrToBe(
return translated_addr;
};

struct beaddr IpHelpers::parseAddrToInt(const std::string& addr) {
struct beaddr IpHelpers::parseAddrToInt(const std::string &addr) {
return parseAddrToBe(addr, false);
};

struct beaddr IpHelpers::parseAddrToInt(const folly::IPAddress &addr) {
return parseAddrToBe(addr, false);
};

Expand Down
14 changes: 9 additions & 5 deletions katran/lib/IpHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#pragma once

#include <folly/IPAddress.h>
#include <string>

namespace katran {
Expand All @@ -33,7 +34,7 @@ struct beaddr {
};

class IpHelpers {
public:
public:
/**
* @param const string addr address to translate
* @return struct beaddr representation of given address
Expand All @@ -42,10 +43,13 @@ class IpHelpers {
* of beaddr structure. this function could throw, if given string is not
* an ip address.
*/
static struct beaddr parseAddrToBe(
const std::string& addr,
bool bigendian = true);
static struct beaddr parseAddrToInt(const std::string& addr);
static struct beaddr parseAddrToBe(const std::string &addr,
bool bigendian = true);
static struct beaddr parseAddrToInt(const std::string &addr);

static struct beaddr parseAddrToBe(const folly::IPAddress &addr,
bool bigendian = true);
static struct beaddr parseAddrToInt(const folly::IPAddress &addr);
};

} // namespace katran
Loading

0 comments on commit bf7eeca

Please sign in to comment.