blob: ccd54bfe659b5acfbd9eaddac464e803b89998da [file] [log] [blame]
Lorenzo Colittidcce0012016-02-05 00:57:26 +09001#include <functional>
2
3#include <linux/netlink.h>
4#include <linux/sock_diag.h>
5#include <linux/inet_diag.h>
6
7struct inet_diag_msg;
Lorenzo Colitti85542482016-02-15 01:09:14 +09008class SockDiagTest;
Lorenzo Colittidcce0012016-02-05 00:57:26 +09009
10class SockDiag {
11
12 public:
13 static const int kBufferSize = 4096;
14 typedef std::function<int(uint8_t proto, const inet_diag_msg *)> DumpCallback;
15
16 struct DestroyRequest {
17 nlmsghdr nlh;
18 inet_diag_req_v2 req;
19 } __attribute__((__packed__));
20
Lorenzo Colitti85542482016-02-15 01:09:14 +090021 SockDiag() : mSock(-1), mWriteSock(-1), mSocketsDestroyed(0) {}
Lorenzo Colittidcce0012016-02-05 00:57:26 +090022 bool open();
23 virtual ~SockDiag() { closeSocks(); }
24
25 int sendDumpRequest(uint8_t proto, uint8_t family, const char *addrstr);
Chih-Hung Hsiehb22e4d22016-07-28 14:13:11 -070026 int readDiagMsg(uint8_t proto, const DumpCallback& callback);
Lorenzo Colittidcce0012016-02-05 00:57:26 +090027 int sockDestroy(uint8_t proto, const inet_diag_msg *);
Lorenzo Colitti85542482016-02-15 01:09:14 +090028 int destroySockets(const char *addrstr);
Lorenzo Colittidcce0012016-02-05 00:57:26 +090029
30 private:
31 int mSock;
32 int mWriteSock;
Lorenzo Colitti85542482016-02-15 01:09:14 +090033 int mSocketsDestroyed;
34 int destroySockets(uint8_t proto, int family, const char *addrstr);
Lorenzo Colittidcce0012016-02-05 00:57:26 +090035 bool hasSocks() { return mSock != -1 && mWriteSock != -1; }
36 void closeSocks() { close(mSock); close(mWriteSock); mSock = mWriteSock = -1; }
37};