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 33 of file RawSocket.cpp.

33 : _writeMode(isWrite), _iFace(std::move(iface))
34{
35 // Prepare socket address
36 memset(static_cast<void *>(&_addr), 0, sizeof(sockaddr_ll));
37 _addr.sll_family = AF_PACKET;
38 _addr.sll_protocol = htons(ETH_P_ALL);
39 _addr.sll_ifindex = static_cast<int>(if_nametoindex(_iFace.c_str()));
40 if (_addr.sll_ifindex == 0)
41 {
42 throw std::ios_base::failure(std::string("Can't find interface: ") + getErrnoString(errno));
43 }
44
45 // Interface request
46 ifreq ifr{};
47 memset(static_cast<void *>(&ifr), 0, sizeof(ifreq));
48 const auto maxIfaceNameLen = static_cast<size_t>(IFNAMSIZ - 1);
49 const size_t ifaceNameLen = _iFace.size() < maxIfaceNameLen ? _iFace.size() : maxIfaceNameLen;
50 auto *const ifaceNameBegin = std::begin(ifr.ifr_name);
51 std::copy_n(_iFace.begin(), ifaceNameLen, ifaceNameBegin);
52 *std::next(ifaceNameBegin, static_cast<std::ptrdiff_t>(ifaceNameLen)) = '\0';
53
54 if (isWrite)
55 {
56 init(PF_PACKET, SOCK_RAW, IPPROTO_RAW);
57 if (setsockopt(_sockFd, SOL_SOCKET, SO_BINDTODEVICE, static_cast<void *>(&ifr), sizeof(ifr)) < 0)
58 {
59 throw std::ios_base::failure(std::string("Can't set socket options: ") + getErrnoString(errno));
60 }
61 }
62 else
63 {
64 init(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
65 }
66 _isReady = true;
67}
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:20
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 123 of file RawSocket.cpp.

123{ 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 112 of file RawSocket.cpp.

113{
114 if (resetInternalStats)
115 {
116 RawSocketStats buffer = _stats;
117 _stats = {.sentBytes = 0, .receivedBytes = 0, .processingTime = 0.0};
118 return buffer;
119 }
120 return _stats;
121}
RawSocketStats _stats
Internal structure for statistics.
Definition RawSocket.hpp:36

◆ init()

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

Definition at line 20 of file RawSocket.cpp.

21{
22 _sockFd = socket(domain, type, protocol); // Init socket
23 if (_sockFd < 0)
24 {
25 throw std::ios_base::failure(getErrnoString(errno));
26 }
27 if (bind(_sockFd, std::bit_cast<sockaddr *>(&_addr), sizeof(_addr)) < 0)
28 {
29 throw std::ios_base::failure(std::string("Bind failed: ") + getErrnoString(errno));
30 }
31}
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 89 of file RawSocket.cpp.

90{
91 if (!_isReady || _writeMode)
92 {
93 return -EPERM;
94 }
95 // NOLINTNEXTLINE(cppcoreguidelines-init-variables)
96 socklen_t socketLen = sizeof(_addr);
97
98 auto startTime = std::chrono::high_resolution_clock::now();
99 const auto retval =
100 static_cast<int>(recvfrom(_sockFd, data, dataLen, 0, std::bit_cast<sockaddr *>(&_addr), &socketLen));
101
102 // Update stats
103 _stats.processingTime += static_cast<double>((std::chrono::high_resolution_clock::now() - startTime).count());
104 if (retval > 0)
105 {
106 _stats.receivedBytes += static_cast<size_t>(retval);
107 }
108
109 return retval;
110}

◆ 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 69 of file RawSocket.cpp.

70{
71 if (!_isReady || !_writeMode)
72 {
73 return -EPERM;
74 }
75
76 auto startTime = std::chrono::high_resolution_clock::now();
77 const auto retval = static_cast<int>(write(_sockFd, data, dataLen));
78
79 // Update stats
80 _stats.processingTime += static_cast<double>((std::chrono::high_resolution_clock::now() - startTime).count());
81 if (retval > 0)
82 {
83 _stats.sentBytes += static_cast<size_t>(retval);
84 }
85
86 return retval;
87}

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: