diff options
-rw-r--r-- | watchlink/netlink_event.cc | 32 | ||||
-rw-r--r-- | watchlink/netlink_event.hh | 20 | ||||
-rw-r--r-- | watchlink/netlink_listener.cc | 3 | ||||
-rw-r--r-- | watchlink/watchlink.cc | 4 |
4 files changed, 57 insertions, 2 deletions
diff --git a/watchlink/netlink_event.cc b/watchlink/netlink_event.cc index 7db07764..1f8efc7c 100644 --- a/watchlink/netlink_event.cc +++ b/watchlink/netlink_event.cc @@ -301,3 +301,35 @@ std::ostream & operator <<(std::ostream & Stream, const NetlinkEvent & instance) return Stream; } + +/* from quagga prefix.c */ +/* Apply mask to IPv4 prefix. */ +/* Maskbit. */ +static u_char maskbit[] = {0x00, 0x80, 0xc0, 0xe0, 0xf0, + 0xf8, 0xfc, 0xfe, 0xff}; + + +uint32_t +apply_mask_ipv4 (const uint32_t p, const unsigned char m) +{ + uint32_t val(p); + u_char *pnt = (u_char *) &val; + int index; + int offset; + + index = m / 8; + if (index < 4) { + offset = m % 8; + + pnt[index] &= maskbit[offset]; + index++; + + while (index < 4) { + pnt[index++] = 0; + } + } + return val; +} + + + diff --git a/watchlink/netlink_event.hh b/watchlink/netlink_event.hh index 91ab8f33..76ccefa6 100644 --- a/watchlink/netlink_event.hh +++ b/watchlink/netlink_event.hh @@ -19,6 +19,10 @@ #include <ostream> #include <linux/rtnetlink.h> +uint32_t +apply_mask_ipv4 (const uint32_t p, const unsigned char m); + + class Mac { public: @@ -75,7 +79,7 @@ public: this->_addr = 0; return; } - this->_addr = a_val; + this->_addr = apply_mask_ipv4(a_val,_mask_length); } uint32_t @@ -84,6 +88,18 @@ public: char get_mask_length() {return _mask_length;} + bool + contains(IPv4 &addr) { + //check if addr is within specified addr range + return (apply_mask_ipv4(addr.get(),_mask_length) == _addr); + } + + bool + contains(IPv4 addr) { + //check if addr is within specified addr range + return (apply_mask_ipv4(addr.get(),_mask_length) == _addr); + } + std::string str() { @@ -253,4 +269,6 @@ private: //variables }; + + #endif // __NETLINK_EVENT_HH__ diff --git a/watchlink/netlink_listener.cc b/watchlink/netlink_listener.cc index 57f6e00a..ff27a9db 100644 --- a/watchlink/netlink_listener.cc +++ b/watchlink/netlink_listener.cc @@ -129,7 +129,8 @@ NetlinkListener::process(NetlinkEvent &e, multimap<string,IPv4net> filter) multimap<string,IPv4net>::iterator iter = filter.begin(); while (iter != filter.end()) { if (iter->first == e.get_iface()) { //found interface exclusion - if (iter->second.get_mask_length() == 0 || (iter->second.get_addr() == e.get_local_addr().get() && iter->second.get_mask_length() == e.get_mask_len())) { //addr match + if (iter->second.contains(e.get_local_addr())) { + // if (iter->second.get_mask_length() == 0 || (iter->second.get_addr() == e.get_local_addr().get() && iter->second.get_mask_length() == e.get_mask_len())) { //addr match e = NetlinkEvent(); state = false; break; diff --git a/watchlink/watchlink.cc b/watchlink/watchlink.cc index 849e2f20..0cc8f232 100644 --- a/watchlink/watchlink.cc +++ b/watchlink/watchlink.cc @@ -76,6 +76,10 @@ load_exclusion_file(const string &link_dir) while (fgets(str, 1024, fp)) { string line(str); + //strip out comments + int pos = line.find("#"); + line = line.substr(0,pos); + StrProc tokens(line, " "); if (tokens.size() == 1) { string any("0/0"); |