Repo-Init
 
Loading...
Searching...
No Matches
RawSocket Class Reference

#include <RawSocket.hpp>

Collaboration diagram for RawSocket:

Public Member Functions

 RawSocket (std::string iface, bool isWrite=false)
 
 RawSocket (const RawSocket &)=delete
 Copy constructor.
 
 RawSocket (RawSocket &&)=delete
 Move constructor.
 
RawSocketoperator= (RawSocket)=delete
 Copy assignment operator.
 
RawSocketoperator= (RawSocket &&)=delete
 Move assignment operator.
 
const std::string & getInterfaceName () const
 
int writeData (const unsigned char *data, size_t dataLen)
 
int readData (unsigned char *data, size_t dataLen)
 
RawSocketStats getStats (bool resetInternalStats=false)
 
 ~RawSocket ()
 

Private Member Functions

void init (int domain, int type, int protocol)
 

Private Attributes

bool _isReady {false}
 Ready flag.
 
bool _writeMode {false}
 Mode indicator. True = Write, False = Read.
 
int _sockFd {-1}
 Socket descriptor.
 
std::string _iFace
 Currently used ethernet interface.
 
sockaddr_ll _addr {}
 Socket structure.
 
RawSocketStats _stats {}
 Internal structure for statistics.
 

Detailed Description

Raw socket reads and writes binary data to the provided interface. Write operations do not modify any field (MAC, IP, etc.). They only write the full data directly, similar to file write operations.

Definition at line 23 of file RawSocket.hpp.

Constructor & Destructor Documentation

◆ RawSocket() [1/3]

RawSocket::RawSocket ( std::string iface,
bool isWrite = false )
explicit

Construct a new RawSocket object

Parameters
[in]ifaceEthernet interface
[in]isWriteTrue if write mode, false if read mode is requested

Definition at line 31 of file RawSocket.cpp.

31 : _writeMode(isWrite), _iFace(std::move(iface))
32{
33 // Prepare socket address
34 memset(static_cast<void *>(&_addr), 0, sizeof(sockaddr_ll));
35 _addr.sll_family = AF_PACKET;
36 _addr.sll_protocol = htons(ETH_P_ALL);
37 _addr.sll_ifindex = static_cast<int>(if_nametoindex(_iFace.c_str()));
38 if (_addr.sll_ifindex == 0)
39 {
40 throw std::ios_base::failure(std::string("Can't find interface: ") + getErrnoString(errno));
41 }
42
43 // Interface request
44 ifreq ifr{};
45 memset(static_cast<void *>(&ifr), 0, sizeof(ifreq));
46 memcpy(std::addressof(ifr.ifr_name), _iFace.c_str(),
47 _iFace.size()); // Size should be sufficient because if_nametoindex not failed
48
49 if (isWrite)
50 {
51 init(PF_PACKET, SOCK_RAW, IPPROTO_RAW);
52 if (setsockopt(_sockFd, SOL_SOCKET, SO_BINDTODEVICE, static_cast<void *>(&ifr), sizeof(ifr)) < 0)
53 {
54 throw std::ios_base::failure(std::string("Can't set socket options: ") + getErrnoString(errno));
55 }
56 }
57 else
58 {
59 init(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
60 }
61 _isReady = true;
62}
std::string getErrnoString(int errVal)
int _sockFd
Socket descriptor.
Definition RawSocket.hpp:30
bool _writeMode
Mode indicator. True = Write, False = Read.
Definition RawSocket.hpp:28
bool _isReady
Ready flag.
Definition RawSocket.hpp:26
void init(int domain, int type, int protocol)
Definition RawSocket.cpp:18
std::string _iFace
Currently used ethernet interface.
Definition RawSocket.hpp:32
sockaddr_ll _addr
Socket structure.
Definition RawSocket.hpp:34
Here is the call graph for this function:
Here is the caller graph for this function:

◆ RawSocket() [2/3]

RawSocket::RawSocket ( const RawSocket & )
delete

Copy constructor.

Here is the call graph for this function:

◆ RawSocket() [3/3]

RawSocket::RawSocket ( RawSocket && )
delete

Move constructor.

Here is the call graph for this function:

◆ ~RawSocket()

RawSocket::~RawSocket ( )

Destroy the RawSocket object

Definition at line 112 of file RawSocket.cpp.

112{ close(_sockFd); }

Member Function Documentation

◆ getInterfaceName()

const std::string & RawSocket::getInterfaceName ( ) const
inlinenodiscard

Returns the binded ethernet interface

Returns
std::string Name of the interface

Definition at line 64 of file RawSocket.hpp.

64{ return _iFace; }

◆ getStats()

RawSocketStats RawSocket::getStats ( bool resetInternalStats = false)

Get the statistics of the class

Parameters
[in]resetInternalStatsWhether the internal statistics structure should be reset after being returned
Returns
RawSocketStats Produced statistics

Definition at line 101 of file RawSocket.cpp.

102{
103 if (resetInternalStats)
104 {
105 RawSocketStats buffer = _stats;
106 _stats = {.sentBytes = 0, .receivedBytes = 0, .processingTime = 0.0};
107 return buffer;
108 }
109 return _stats;
110}
RawSocketStats _stats
Internal structure for statistics.
Definition RawSocket.hpp:36

◆ init()

void RawSocket::init ( int domain,
int type,
int protocol )
private

Definition at line 18 of file RawSocket.cpp.

19{
20 _sockFd = socket(domain, type, protocol); // Init socket
21 if (_sockFd < 0)
22 {
23 throw std::ios_base::failure(getErrnoString(errno));
24 }
25 if (bind(_sockFd, std::bit_cast<sockaddr *>(&_addr), sizeof(_addr)) < 0)
26 {
27 throw std::ios_base::failure(std::string("Bind failed: ") + getErrnoString(errno));
28 }
29}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator=() [1/2]

RawSocket & RawSocket::operator= ( RawSocket && )
delete

Move assignment operator.

Here is the call graph for this function:

◆ operator=() [2/2]

RawSocket & RawSocket::operator= ( RawSocket )
delete

Copy assignment operator.

Here is the call graph for this function:

◆ readData()

int RawSocket::readData ( unsigned char * data,
size_t dataLen )

Reads data from the interface

Parameters
[out]dataUser-allocated data
[out]dataLenLength of the data
Returns
int Status of the operation. Returns the number of read bytes, negative on errors.

Definition at line 81 of file RawSocket.cpp.

82{
83 if (!_isReady || _writeMode)
84 {
85 return -EPERM;
86 }
87 // NOLINTNEXTLINE(cppcoreguidelines-init-variables)
88 socklen_t socketLen = sizeof(_addr);
89
90 auto startTime = std::chrono::high_resolution_clock::now();
91 const auto retval =
92 static_cast<int>(recvfrom(_sockFd, data, dataLen, 0, std::bit_cast<sockaddr *>(&_addr), &socketLen));
93
94 // Update stats
95 _stats.processingTime += static_cast<double>((std::chrono::high_resolution_clock::now() - startTime).count());
96 _stats.receivedBytes += dataLen;
97
98 return retval;
99}

◆ writeData()

int RawSocket::writeData ( const unsigned char * data,
size_t dataLen )

Writes data to the interface

Parameters
[in]dataFull payload data to write
[in]dataLenLength of the data
Returns
int Status of the operation. Returns the number of written bytes, negative on errors.

Definition at line 64 of file RawSocket.cpp.

65{
66 if (!_isReady || !_writeMode)
67 {
68 return -EPERM;
69 }
70
71 auto startTime = std::chrono::high_resolution_clock::now();
72 const auto retval = static_cast<int>(write(_sockFd, data, dataLen));
73
74 // Update stats
75 _stats.processingTime += static_cast<double>((std::chrono::high_resolution_clock::now() - startTime).count());
76 _stats.sentBytes += dataLen;
77
78 return retval;
79}

Member Data Documentation

◆ _addr

sockaddr_ll RawSocket::_addr {}
private

Socket structure.

Definition at line 34 of file RawSocket.hpp.

34{};

◆ _iFace

std::string RawSocket::_iFace
private

Currently used ethernet interface.

Definition at line 32 of file RawSocket.hpp.

◆ _isReady

bool RawSocket::_isReady {false}
private

Ready flag.

Definition at line 26 of file RawSocket.hpp.

26{false};

◆ _sockFd

int RawSocket::_sockFd {-1}
private

Socket descriptor.

Definition at line 30 of file RawSocket.hpp.

30{-1};

◆ _stats

RawSocketStats RawSocket::_stats {}
private

Internal structure for statistics.

Definition at line 36 of file RawSocket.hpp.

36{};

◆ _writeMode

bool RawSocket::_writeMode {false}
private

Mode indicator. True = Write, False = Read.

Definition at line 28 of file RawSocket.hpp.

28{false};

The documentation for this class was generated from the following files: