blob: ccd54bfe659b5acfbd9eaddac464e803b89998da [file] [log] [blame]
#include <functional>
#include <linux/netlink.h>
#include <linux/sock_diag.h>
#include <linux/inet_diag.h>
struct inet_diag_msg;
class SockDiagTest;
class SockDiag {
public:
static const int kBufferSize = 4096;
typedef std::function<int(uint8_t proto, const inet_diag_msg *)> DumpCallback;
struct DestroyRequest {
nlmsghdr nlh;
inet_diag_req_v2 req;
} __attribute__((__packed__));
SockDiag() : mSock(-1), mWriteSock(-1), mSocketsDestroyed(0) {}
bool open();
virtual ~SockDiag() { closeSocks(); }
int sendDumpRequest(uint8_t proto, uint8_t family, const char *addrstr);
int readDiagMsg(uint8_t proto, const DumpCallback& callback);
int sockDestroy(uint8_t proto, const inet_diag_msg *);
int destroySockets(const char *addrstr);
private:
int mSock;
int mWriteSock;
int mSocketsDestroyed;
int destroySockets(uint8_t proto, int family, const char *addrstr);
bool hasSocks() { return mSock != -1 && mWriteSock != -1; }
void closeSocks() { close(mSock); close(mWriteSock); mSock = mWriteSock = -1; }
};