|
@@ -35,84 +35,69 @@
|
|
|
|
|
|
namespace ZeroTier {
|
|
|
|
|
|
-struct route_entry {
|
|
|
- InetAddress target;
|
|
|
- InetAddress via;
|
|
|
- int if_index;
|
|
|
- char iface[IFNAMSIZ];
|
|
|
-};
|
|
|
-typedef std::vector<route_entry> RouteList;
|
|
|
-
|
|
|
/**
|
|
|
* Interface with Linux's RTNETLINK
|
|
|
*/
|
|
|
class LinuxNetLink
|
|
|
{
|
|
|
private:
|
|
|
- LinuxNetLink();
|
|
|
- ~LinuxNetLink();
|
|
|
+ LinuxNetLink();
|
|
|
+ ~LinuxNetLink();
|
|
|
|
|
|
public:
|
|
|
- static LinuxNetLink& getInstance()
|
|
|
- {
|
|
|
- static LinuxNetLink instance;
|
|
|
- return instance;
|
|
|
- }
|
|
|
+ static LinuxNetLink& getInstance()
|
|
|
+ {
|
|
|
+ static LinuxNetLink instance;
|
|
|
+ return instance;
|
|
|
+ }
|
|
|
|
|
|
- LinuxNetLink(LinuxNetLink const&) = delete;
|
|
|
- void operator=(LinuxNetLink const&) = delete;
|
|
|
+ LinuxNetLink(LinuxNetLink const&) = delete;
|
|
|
+ void operator=(LinuxNetLink const&) = delete;
|
|
|
|
|
|
- void addRoute(const InetAddress &target, const InetAddress &via, const InetAddress &src, const char *ifaceName);
|
|
|
- void delRoute(const InetAddress &target, const InetAddress &via, const InetAddress &src, const char *ifaceName);
|
|
|
- RouteList getIPV4Routes() const;
|
|
|
- RouteList getIPV6Routes() const;
|
|
|
+ void addRoute(const InetAddress &target, const InetAddress &via, const InetAddress &src, const char *ifaceName);
|
|
|
+ void delRoute(const InetAddress &target, const InetAddress &via, const InetAddress &src, const char *ifaceName);
|
|
|
|
|
|
- void addAddress(const InetAddress &addr, const char *iface);
|
|
|
- void removeAddress(const InetAddress &addr, const char *iface);
|
|
|
+ void addAddress(const InetAddress &addr, const char *iface);
|
|
|
+ void removeAddress(const InetAddress &addr, const char *iface);
|
|
|
|
|
|
- void threadMain() throw();
|
|
|
+ void threadMain() throw();
|
|
|
private:
|
|
|
- int _doRecv(int fd);
|
|
|
-
|
|
|
- void _processMessage(struct nlmsghdr *nlp, int nll);
|
|
|
- void _routeAdded(struct nlmsghdr *nlp);
|
|
|
- void _routeDeleted(struct nlmsghdr *nlp);
|
|
|
- void _linkAdded(struct nlmsghdr *nlp);
|
|
|
- void _linkDeleted(struct nlmsghdr *nlp);
|
|
|
- void _ipAddressAdded(struct nlmsghdr *nlp);
|
|
|
- void _ipAddressDeleted(struct nlmsghdr *nlp);
|
|
|
-
|
|
|
- void _requestInterfaceList();
|
|
|
- void _requestIPv4Routes();
|
|
|
- void _requestIPv6Routes();
|
|
|
-
|
|
|
- int _indexForInterface(const char *iface);
|
|
|
-
|
|
|
- void _setSocketTimeout(int fd, int seconds = 1);
|
|
|
-
|
|
|
- Thread _t;
|
|
|
- bool _running;
|
|
|
-
|
|
|
- RouteList _routes_ipv4;
|
|
|
- Mutex _rv4_m;
|
|
|
- RouteList _routes_ipv6;
|
|
|
- Mutex _rv6_m;
|
|
|
-
|
|
|
- uint32_t _seq;
|
|
|
-
|
|
|
- struct iface_entry {
|
|
|
- int index;
|
|
|
- char ifacename[IFNAMSIZ];
|
|
|
- char mac[18];
|
|
|
- char mac_bin[6];
|
|
|
- unsigned int mtu;
|
|
|
- };
|
|
|
- Hashtable<int, iface_entry> _interfaces;
|
|
|
- Mutex _if_m;
|
|
|
-
|
|
|
- // socket communication vars;
|
|
|
- int _fd;
|
|
|
- struct sockaddr_nl _la;
|
|
|
+ int _doRecv(int fd);
|
|
|
+
|
|
|
+ void _processMessage(struct nlmsghdr *nlp, int nll);
|
|
|
+ void _routeAdded(struct nlmsghdr *nlp);
|
|
|
+ void _routeDeleted(struct nlmsghdr *nlp);
|
|
|
+ void _linkAdded(struct nlmsghdr *nlp);
|
|
|
+ void _linkDeleted(struct nlmsghdr *nlp);
|
|
|
+ void _ipAddressAdded(struct nlmsghdr *nlp);
|
|
|
+ void _ipAddressDeleted(struct nlmsghdr *nlp);
|
|
|
+
|
|
|
+ void _requestInterfaceList();
|
|
|
+ void _requestIPv4Routes();
|
|
|
+ void _requestIPv6Routes();
|
|
|
+
|
|
|
+ int _indexForInterface(const char *iface);
|
|
|
+
|
|
|
+ void _setSocketTimeout(int fd, int seconds = 1);
|
|
|
+
|
|
|
+ Thread _t;
|
|
|
+ bool _running;
|
|
|
+
|
|
|
+ uint32_t _seq;
|
|
|
+
|
|
|
+ struct iface_entry {
|
|
|
+ int index;
|
|
|
+ char ifacename[IFNAMSIZ];
|
|
|
+ char mac[18];
|
|
|
+ char mac_bin[6];
|
|
|
+ unsigned int mtu;
|
|
|
+ };
|
|
|
+ Hashtable<int, iface_entry> _interfaces;
|
|
|
+ Mutex _if_m;
|
|
|
+
|
|
|
+ // socket communication vars;
|
|
|
+ int _fd;
|
|
|
+ struct sockaddr_nl _la;
|
|
|
};
|
|
|
|
|
|
}
|