2 * Copyright (C) 1996-2014 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 28 Access Control */
15 #include "acl/Eui64.h"
16 #include "acl/FilledChecklist.h"
19 #include "eui/Eui64.h"
21 #include "ip/Address.h"
23 static void aclParseEuiList(SplayNode
<Eui::Eui64
*> **curlist
);
24 static int aclMatchEui(SplayNode
<Eui::Eui64
*> **dataptr
, Ip::Address
&c
);
25 static SplayNode
<Eui::Eui64
*>::SPLAYCMP aclEui64Compare
;
26 static SplayNode
<Eui::Eui64
*>::SPLAYWALKEE aclDumpEuiListWalkee
;
29 ACLEui64::clone() const
31 return new ACLEui64(*this);
34 ACLEui64::ACLEui64 (char const *theClass
) : data (NULL
), class_ (theClass
)
37 ACLEui64::ACLEui64 (ACLEui64
const & old
) : data (NULL
), class_ (old
.class_
)
39 /* we don't have copy constructors for the data yet */
46 data
->destroy(SplayNode
<Eui::Eui64
*>::DefaultFree
);
50 ACLEui64::typeString() const
56 ACLEui64::empty () const
62 aclParseEuiData(const char *t
)
65 Eui::Eui64
*q
= new Eui::Eui64
;
66 debugs(28, 5, "aclParseEuiData: " << t
);
68 if (sscanf(t
, "%[0-9a-fA-F:]", buf
) != 1) {
69 debugs(28, DBG_CRITICAL
, "aclParseEuiData: Bad EUI-64 address: '" << t
<< "'");
74 if (!q
->decode(buf
)) {
75 debugs(28, DBG_CRITICAL
, "" << cfg_filename
<< " line " << config_lineno
<< ": " << config_input_line
);
76 debugs(28, DBG_CRITICAL
, "aclParseEuiData: Ignoring invalid EUI-64 acl entry: can't parse '" << buf
<< "'");
90 aclParseEuiList(&data
);
94 aclParseEuiList(SplayNode
<Eui::Eui64
*> **curlist
)
97 SplayNode
<Eui::Eui64
*> **Top
= curlist
;
100 while ((t
= strtokFile())) {
101 if ((q
= aclParseEuiData(t
)) == NULL
)
104 *Top
= (*Top
)->insert(q
, aclEui64Compare
);
109 ACLEui64::match(ACLChecklist
*cl
)
111 ACLFilledChecklist
*checklist
= Filled(cl
);
113 /* IPv4 does not do EUI-64 (yet) */
114 if (!checklist
->src_addr
.isIPv6()) {
115 debugs(14, 3, "ACLEui64::match: IPv6 Required for EUI-64 Lookups. Skipping " << checklist
->src_addr
);
119 return aclMatchEui(&data
, checklist
->src_addr
);
126 aclMatchEui(SplayNode
<Eui::Eui64
*> **dataptr
, Ip::Address
&c
)
129 SplayNode
<Eui::Eui64
*> **Top
= dataptr
;
131 if (result
.lookup(c
)) {
132 /* Do ACL match lookup */
133 *Top
= (*Top
)->splay(&result
, aclEui64Compare
);
134 debugs(28, 3, "aclMatchEui: '" << c
<< "' " << (splayLastResult
? "NOT found" : "found"));
135 return (0 == splayLastResult
);
139 * Address was not found on any interface
141 debugs(28, 3, "aclMatchEui: " << c
<< " NOT found");
146 aclEui64Compare(Eui::Eui64
* const &a
, Eui::Eui64
* const &b
)
148 return memcmp(a
, b
, sizeof(Eui::Eui64
));
152 aclDumpEuiListWalkee(Eui::Eui64
* const &node
, void *state
)
155 node
->encode(buf
, 48);
156 static_cast<SBufList
*>(state
)->push_back(SBuf(buf
));
160 ACLEui64::dump() const
163 data
->walk(aclDumpEuiListWalkee
, &w
);
167 #endif /* USE_SQUID_EUI */