summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--watchlink/netlink_event.cc32
-rw-r--r--watchlink/netlink_event.hh20
-rw-r--r--watchlink/netlink_listener.cc3
-rw-r--r--watchlink/watchlink.cc4
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");