#ifndef PCAPPP_LINUX_NIC_INFORMATION_SOCKET
#define PCAPPP_LINUX_NIC_INFORMATION_SOCKET
struct ifreq;
/**
* \namespace pcpp
* \brief The main namespace for the PcapPlusPlus lib
*/
namespace pcpp
{
/**
* @class LinuxNicInformationSocket
* Simple wrapper over Linux socket for making the information
* requests about NICs or making some changes in NICs setup.
* All possible requests are described in
* netdevice(7).
* The instance of this class handles underlying socket during its lifetime
* and takes an appropriate actions to close socket on destruction.
* The user must call LinuxNicInformationSocket#makeRequest method with
* known ioctl type and properly filled ifreq structure for this ioctl type.
* Filling of ifr_name may be omitted as it will be done automatically from
* provided NIC name.
* @note Usage of this class requires the inclusion of and Linux headers
*/
class LinuxNicInformationSocket
{
public:
/**
* Simple type rename for convenience
*/
typedef int LinuxSocket;
/**
* Simple type rename for convenience
*/
typedef unsigned long IoctlType;
/**
* Tries to open handled socket on construction.
* If fails prints the debug message
*/
LinuxNicInformationSocket();
/**
* Closes handled socket on destruction.
* If no socket was opened prints the debug message
*/
~LinuxNicInformationSocket();
/**
* @brief Makes request to socket.
* Firstly tries to open socket if it is not opened.
* Then makes an ioctl(2) request to handled socket with provided request structure.
* See: netdevice(7)
* for description of possible values of ioctlType and content of request.
* @note User have no need to fill ifr_name field of request. It will be filled
* automatically from provided nicName argument.
* @param[in] nicName Name of internet controller as displayed by Linux
* @param[in] ioctlType Value of ioctl to make
* @param[in,out] request Pointer to ifreq structure that contains some information
* or will be used for obtaining the information (depends on ioctlType)
* @return false if request was not made or socket can't be opened otherwise true
* @warning For some types of requests to succeed You need to be a root
* or have the CAP_NET_ADMIN capability.
*/
bool makeRequest(const char* nicName, const IoctlType ioctlType, ifreq* request);
private:
/* Hidden copy constructor. This structure is not copyable */
LinuxNicInformationSocket(const LinuxNicInformationSocket&);
/* Hidden copy assignment operator. This structure is not copyable */
LinuxNicInformationSocket operator=(const LinuxNicInformationSocket&);
LinuxSocket m_Socket;
};
} // namespace pcpp
#endif /* PCAPPP_LINUX_NIC_INFORMATION_SOCKET */