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

30 : _writeMode(isWrite), _iFace(std::move(iface))
31{
32 // Prepare socket address
33 memset(static_cast<void *>(&_addr), 0, sizeof(sockaddr_ll));
34 _addr.sll_family = AF_PACKET;
35 _addr.sll_protocol = htons(ETH_P_ALL);
36 _addr.sll_ifindex = static_cast<int>(if_nametoindex(_iFace.c_str()));
37 if (_addr.sll_ifindex == 0)
38 {
39 throw std::ios_base::failure(std::string("Can't find interface: ") + getErrnoString(errno));
40 }
41
42 // Interface request
43 ifreq ifr{};
44 memset(static_cast<void *>(&ifr), 0, sizeof(ifreq));
45 memcpy(std::addressof(ifr.ifr_name), _iFace.c_str(),
46 _iFace.size()); // Size should be sufficient because if_nametoindex not failed
47
48 if (isWrite)
49 {
50 init(PF_PACKET, SOCK_RAW, IPPROTO_RAW);
51 if (setsockopt(_sockFd, SOL_SOCKET, SO_BINDTODEVICE, static_cast<void *>(&ifr), sizeof(ifr)) < 0)
52 {
53 throw std::ios_base::failure(std::string("Can't set socket options: ") + getErrnoString(errno));
54 }
55 }
56 else
57 {
58 init(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
59 }
60 _isReady = true;
61}
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:17
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:

◆ RawSocket() [2/3]

RawSocket::RawSocket ( const RawSocket & )
delete

Copy constructor.

◆ RawSocket() [3/3]

RawSocket::RawSocket ( RawSocket && )
delete

Move constructor.

◆ ~RawSocket()

RawSocket::~RawSocket ( )

Destroy the RawSocket object

Definition at line 111 of file RawSocket.cpp.

111{ 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 100 of file RawSocket.cpp.

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

◆ init()

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

Definition at line 17 of file RawSocket.cpp.

18{
19 _sockFd = socket(domain, type, protocol); // Init socket
20 if (_sockFd < 0)
21 {
22 throw std::ios_base::failure(getErrnoString(errno));
23 }
24 if (bind(_sockFd, reinterpret_cast<sockaddr *>(&_addr), sizeof(_addr)) < 0)
25 {
26 throw std::ios_base::failure(std::string("Bind failed: ") + getErrnoString(errno));
27 }
28}
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.

◆ operator=() [2/2]

RawSocket & RawSocket::operator= ( RawSocket )
delete

Copy assignment operator.

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

81{
82 if (!_isReady || _writeMode)
83 {
84 return -EPERM;
85 }
86 // NOLINTNEXTLINE(cppcoreguidelines-init-variables)
87 socklen_t socketLen = sizeof(_addr);
88
89 auto startTime = std::chrono::high_resolution_clock::now();
90 const auto retval =
91 static_cast<int>(recvfrom(_sockFd, data, dataLen, 0, reinterpret_cast<sockaddr *>(&_addr), &socketLen));
92
93 // Update stats
94 _stats.processingTime += static_cast<double>((std::chrono::high_resolution_clock::now() - startTime).count());
95 _stats.receivedBytes += dataLen;
96
97 return retval;
98}
size_t receivedBytes
Number of bytes read from socket.
Definition RawSocket.hpp:14
double processingTime
Total execution time in nanoseconds.
Definition RawSocket.hpp:16

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

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

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: