]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Migrated acl/Eui64
authorFrancesco Chemolli <kinkie@squid-cache.org>
Wed, 7 Jan 2015 10:41:24 +0000 (11:41 +0100)
committerFrancesco Chemolli <kinkie@squid-cache.org>
Wed, 7 Jan 2015 10:41:24 +0000 (11:41 +0100)
src/acl/Arp.cc
src/acl/Eui64.cc
src/acl/Eui64.h
src/eui/Eui64.h

index 3a2fd46d1fc31d2d94b28e7e3ae6e2ff2d41c03c..ea41239a2b40050055334ae9572a8821a187f5e2 100644 (file)
@@ -138,7 +138,6 @@ SBufList
 ACLARP::dump() const
 {
     SBufList sl;
-    // we need to sort. This is not performance-critical code
     for (auto i = aclArpData.cbegin(); i != aclArpData.cend(); ++i) {
         char buf[48];
         i->encode(buf,48);
index 14b08d2d88c39b6d60616890a59e761ebdebc533..005bf85fe372ca6c3e97d2ad22dc8a7bdc69b33c 100644 (file)
 #include "globals.h"
 #include "ip/Address.h"
 
-static void aclParseEuiList(Splay<Eui::Eui64 *> **curlist);
-static int aclMatchEui(Splay<Eui::Eui64 *> **dataptr, Ip::Address &c);
-static Splay<Eui::Eui64 *>::SPLAYCMP aclEui64Compare;
-
 ACL *
 ACLEui64::clone() const
 {
     return new ACLEui64(*this);
 }
 
-ACLEui64::ACLEui64 (char const *theClass) : data (NULL), class_ (theClass)
+ACLEui64::ACLEui64 (char const *theClass) : class_ (theClass)
 {}
 
-ACLEui64::ACLEui64 (ACLEui64 const & old) : data (NULL), class_ (old.class_)
+ACLEui64::ACLEui64 (ACLEui64 const & old) : eui64Data(old.eui64Data), class_ (old.class_)
 {
-    /* we don't have copy constructors for the data yet */
-    assert (!old.data);
 }
 
 ACLEui64::~ACLEui64()
 {
-    if (data) {
-        data->destroy();
-        delete data;
-    }
 }
 
 char const *
@@ -56,7 +46,7 @@ ACLEui64::typeString() const
 bool
 ACLEui64::empty () const
 {
-    return data->empty();
+    return eui64Data.empty();
 }
 
 Eui::Eui64 *
@@ -87,23 +77,14 @@ aclParseEuiData(const char *t)
 /*******************/
 void
 ACLEui64::parse()
-{
-    if (!data)
-        data = new Splay<Eui::Eui64 *>();
-    aclParseEuiList(&data);
-}
-
-void
-aclParseEuiList(Splay<Eui::Eui64 *> **curlist)
 {
     char *t = NULL;
-    Eui::Eui64 *q = NULL;
-
+    Eui::Eui64 *q;
     while ((t = strtokFile())) {
         if ((q = aclParseEuiData(t)) == NULL)
             continue;
-
-        (*curlist)->insert(q, aclEui64Compare);
+        eui64Data.insert(*q);
+        safe_free(q);
     }
 }
 
@@ -118,51 +99,27 @@ ACLEui64::match(ACLChecklist *cl)
         return 0;
     }
 
-    return aclMatchEui(&data, checklist->src_addr);
-}
-
-/***************/
-/* aclMatchEui */
-/***************/
-int
-aclMatchEui(Splay<Eui::Eui64 *> **dataptr, Ip::Address &c)
-{
     Eui::Eui64 lookingFor;
-
-    if (lookingFor.lookup(c)) {
-        Eui::Eui64 * const * lookupResult = (*dataptr)->find(&lookingFor, aclEui64Compare);
-        debugs(28, 3, "aclMatchEui: '" << c << "' " << (lookupResult ? "found" : "NOT found"));
-        return (lookupResult != NULL);
+    if (lookingFor.lookup(checklist->src_addr)) {
+        bool found = (eui64Data.find(lookingFor) != eui64Data.end());
+        debugs(28, 3,  checklist->src_addr << "' " << (found ? "found" : "NOT found"));
+        return found;
     }
 
-    /*
-     * Address was not found on any interface
-     */
-    debugs(28, 3, "aclMatchEui: " << c << " NOT found");
+    debugs(28, 3, checklist->src_addr << " NOT found");
     return 0;
 }
 
-static int
-aclEui64Compare(Eui::Eui64 * const &a, Eui::Eui64 * const &b)
-{
-    return memcmp(a, b, sizeof(Eui::Eui64));
-}
-
-struct AclEui64DumpVisitor {
-    SBufList contents;
-    void operator() ( const Eui::Eui64 * v) {
-        static char buf[48];
-        v->encode(buf, 48);
-        contents.push_back(SBuf(buf));
-    }
-};
-
 SBufList
 ACLEui64::dump() const
 {
-    AclEui64DumpVisitor visitor;
-    data->visit(visitor);
-    return visitor.contents;
+    SBufList sl;
+    for (auto i = eui64Data.cbegin(); i != eui64Data.end(); ++i) {
+        char buf[48];
+        i->encode(buf,48);
+        sl.push_back(SBuf(buf));
+    }
+    return sl;
 }
 
 #endif /* USE_SQUID_EUI */
index 4dc4fe1c9447c64a263ca228c4b5c8267e0640e5..d714c6317c5ecfcf34b5661305819d2d8483b81c 100644 (file)
@@ -13,6 +13,8 @@
 #include "acl/Checklist.h"
 #include "splay.h"
 
+#include <set>
+
 namespace Eui
 {
 class Eui64;
@@ -38,7 +40,8 @@ public:
 protected:
     static Prototype RegistryProtoype;
     static ACLEui64 RegistryEntry_;
-    Splay<Eui::Eui64 *> *data;
+    typedef std::set<Eui::Eui64> Eui64Data_t;
+    Eui64Data_t eui64Data;
     char const *class_;
 };
 
index 711331b533351ea62a05008c191306f7172df51c..d08c77c2d7cbc6c8d1bc00744a2f9e47d5b3a56c 100644 (file)
@@ -37,6 +37,9 @@ class Eui64
 public:
     Eui64() { clear(); }
     Eui64(const Eui64 &t) { memcpy(this, &t, sizeof(Eui64)); }
+    Eui64& operator= (const Eui64 &t) {memcpy(this, &t, sizeof(Eui64)); return *this;}
+    bool operator== (const Eui64 &t) const { return (memcmp(eui,t.eui,SZ_EUI64_BUF) == 0); }
+    bool operator< (const Eui64 &t) const { return (memcmp(eui,t.eui,SZ_EUI64_BUF) < 0); }
     ~Eui64() {}
 
     const unsigned char *get(void);