130 lines
3.7 KiB
C++
130 lines
3.7 KiB
C++
#ifndef PCAPPP_IP_UTILS
|
|
#define PCAPPP_IP_UTILS
|
|
|
|
#include <stdint.h>
|
|
#ifdef LINUX
|
|
#include <in.h>
|
|
#include <arpa/inet.h>
|
|
#endif
|
|
#ifdef MAC_OS_X
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#endif
|
|
#if defined(WIN32) || defined(WINx64) || defined(PCAPPP_MINGW_ENV)
|
|
#include <winsock2.h>
|
|
#include <ws2tcpip.h>
|
|
#endif
|
|
#ifdef FREEBSD
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#endif
|
|
|
|
/// @file
|
|
|
|
#if defined(WIN32) && !defined(_MSC_VER)
|
|
/**
|
|
* Convert a network format address to presentation format.
|
|
* @param[in] af Address family, can be either AF_INET (IPv4) or AF_INET6 (IPv6)
|
|
* @param[in] src Network address structure, can be either in_addr (IPv4) or in6_addr (IPv6)
|
|
* @param[out] dst Network address string representation
|
|
* @param[in] size 'dst' Maximum size
|
|
* @return pointer to presentation format address ('dst'), or NULL (see errno).
|
|
*/
|
|
const char* inet_ntop(int af, const void* src, char* dst, size_t size);
|
|
|
|
/**
|
|
* Convert from presentation format (which usually means ASCII printable)
|
|
* to network format (which is usually some kind of binary format).
|
|
* @param[in] af Address family, can be either AF_INET (IPv4) or AF_INET6 (IPv6)
|
|
* @param[in] src Network address string representation
|
|
* @param[out] dst Network address structure result, can be either in_addr (IPv4) or in6_addr (IPv6)
|
|
* @return
|
|
* 1 if the address was valid for the specified address family;
|
|
* 0 if the address wasn't valid ('dst' is untouched in this case);
|
|
* -1 if some other error occurred ('dst' is untouched in this case, too)
|
|
*/
|
|
int inet_pton(int af, const char* src, void* dst);
|
|
#endif
|
|
|
|
|
|
/**
|
|
* \namespace pcpp
|
|
* \brief The main namespace for the PcapPlusPlus lib
|
|
*/
|
|
namespace pcpp
|
|
{
|
|
|
|
/**
|
|
* Extract IPv4 address from sockaddr
|
|
* @param[in] sa - input sockaddr
|
|
* @return Address in in_addr format
|
|
*/
|
|
in_addr* sockaddr2in_addr(struct sockaddr *sa);
|
|
|
|
/**
|
|
* Extract IPv6 address from sockaddr
|
|
* @param[in] sa - input sockaddr
|
|
* @return Address in in6_addr format
|
|
*/
|
|
in6_addr* sockaddr2in6_addr(struct sockaddr *sa);
|
|
|
|
/**
|
|
* Converts a sockaddr format address to its string representation
|
|
* @param[in] sa Address in sockaddr format
|
|
* @param[out] resultString String representation of the address
|
|
*/
|
|
void sockaddr2string(struct sockaddr *sa, char* resultString);
|
|
|
|
/**
|
|
* Convert a in_addr format address to 32bit representation
|
|
* @param[in] inAddr Address in in_addr format
|
|
* @return Address in 32bit format
|
|
*/
|
|
uint32_t in_addr2int(in_addr inAddr);
|
|
|
|
/**
|
|
* A struct that represent a single buffer
|
|
*/
|
|
template<typename T>
|
|
struct ScalarBuffer
|
|
{
|
|
/**
|
|
* The pointer to the buffer
|
|
*/
|
|
T* buffer;
|
|
|
|
/**
|
|
* Buffer length
|
|
*/
|
|
size_t len;
|
|
};
|
|
|
|
/**
|
|
* Computes the checksum for a vector of buffers
|
|
* @param[in] vec The vector of buffers
|
|
* @param[in] vecSize Number of ScalarBuffers in vector
|
|
* @return The checksum result
|
|
*/
|
|
uint16_t compute_checksum(ScalarBuffer<uint16_t> vec[], size_t vecSize);
|
|
|
|
/**
|
|
* Computes Fowler-Noll-Vo (FNV-1) 32bit hash function on an array of byte buffers. The hash is calculated on each
|
|
* byte in each byte buffer, as if all byte buffers were one long byte buffer
|
|
* @param[in] vec An array of byte buffers (ScalarBuffer of type uint8_t)
|
|
* @param[in] vecSize The length of vec
|
|
* @return The 32bit hash value
|
|
*/
|
|
uint32_t fnv_hash(ScalarBuffer<uint8_t> vec[], size_t vecSize);
|
|
|
|
/**
|
|
* Computes Fowler-Noll-Vo (FNV-1) 32bit hash function on a byte buffer
|
|
* @param[in] buffer The byte buffer
|
|
* @param[in] bufSize The size of the byte buffer
|
|
* @return The 32bit hash value
|
|
*/
|
|
uint32_t fnv_hash(uint8_t* buffer, size_t bufSize);
|
|
|
|
} // namespace pcpp
|
|
#endif
|