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(Splay
<Eui::Eui64
*> **curlist
);
24 static int aclMatchEui(Splay
<Eui::Eui64
*> **dataptr
, Ip::Address
&c
);
25 static SplayNode
<Eui::Eui64
*>::SPLAYCMP aclEui64Compare
;
28 ACLEui64::clone() const
30 return new ACLEui64(*this);
33 ACLEui64::ACLEui64 (char const *theClass
) : data (NULL
), class_ (theClass
)
36 ACLEui64::ACLEui64 (ACLEui64
const & old
) : data (NULL
), class_ (old
.class_
)
38 /* we don't have copy constructors for the data yet */
49 ACLEui64::typeString() const
55 ACLEui64::empty () const
61 aclParseEuiData(const char *t
)
64 Eui::Eui64
*q
= new Eui::Eui64
;
65 debugs(28, 5, "aclParseEuiData: " << t
);
67 if (sscanf(t
, "%[0-9a-fA-F:]", buf
) != 1) {
68 debugs(28, DBG_CRITICAL
, "aclParseEuiData: Bad EUI-64 address: '" << t
<< "'");
73 if (!q
->decode(buf
)) {
74 debugs(28, DBG_CRITICAL
, "" << cfg_filename
<< " line " << config_lineno
<< ": " << config_input_line
);
75 debugs(28, DBG_CRITICAL
, "aclParseEuiData: Ignoring invalid EUI-64 acl entry: can't parse '" << buf
<< "'");
89 aclParseEuiList(&data
);
93 aclParseEuiList(Splay
<Eui::Eui64
*> **curlist
)
98 while ((t
= strtokFile())) {
99 if ((q
= aclParseEuiData(t
)) == NULL
)
102 (*curlist
)->insert(q
, aclEui64Compare
);
107 ACLEui64::match(ACLChecklist
*cl
)
109 ACLFilledChecklist
*checklist
= Filled(cl
);
111 /* IPv4 does not do EUI-64 (yet) */
112 if (!checklist
->src_addr
.isIPv6()) {
113 debugs(14, 3, "ACLEui64::match: IPv6 Required for EUI-64 Lookups. Skipping " << checklist
->src_addr
);
117 return aclMatchEui(&data
, checklist
->src_addr
);
124 aclMatchEui(Splay
<Eui::Eui64
*> **dataptr
, Ip::Address
&c
)
126 Eui::Eui64 lookingFor
;
128 if (lookingFor
.lookup(c
)) {
129 Eui::Eui64
* const * lookupResult
= (*dataptr
)->find(&lookingFor
, aclEui64Compare
);
130 debugs(28, 3, "aclMatchEui: '" << c
<< "' " << (lookupResult
? "found" : "NOT found"));
131 return (lookupResult
!= NULL
);
135 * Address was not found on any interface
137 debugs(28, 3, "aclMatchEui: " << c
<< " NOT found");
142 aclEui64Compare(Eui::Eui64
* const &a
, Eui::Eui64
* const &b
)
144 return memcmp(a
, b
, sizeof(Eui::Eui64
));
147 struct AclEui64DumpVisitor
{
149 void operator() ( const Eui::Eui64
* v
) {
152 contents
.push_back(SBuf(buf
));
157 ACLEui64::dump() const
159 AclEui64DumpVisitor visitor
;
160 data
->visit(visitor
);
161 return visitor
.contents
;
164 #endif /* USE_SQUID_EUI */