Click
Loading...
Searching...
No Matches
nameinfo.hh
Go to the documentation of this file.
1// -*- c-basic-offset: 4; related-file-name: "../../lib/nameinfo.cc" -*-
2#ifndef CLICK_NAMEINFO_HH
3#define CLICK_NAMEINFO_HH
4#include <click/args.hh>
5#include <click/straccum.hh>
6CLICK_DECLS
7class Element;
8class NameDB;
9class ErrorHandler;
10
11class NameInfo { public:
12
16 NameInfo();
17
23 ~NameInfo();
24
29 static void static_initialize();
30
35 static void static_cleanup();
36
38 enum DBType {
39 T_NONE = 0,
40 T_SCHEDULEINFO = 0x00000001,
41 T_ANNOTATION = 0x00000002,
42 T_SCRIPT_INSN = 0x00000003,
43 T_SIGNO = 0x00000004,
44 T_SPINLOCK = 0x00000005,
45 T_ETHERNET_ADDR = 0x01000001,
46 T_IP_ADDR = 0x04000001,
47 T_IP_PREFIX = 0x04000002,
48 T_IP_PROTO = 0x04000003,
49 T_IPFILTER_TYPE = 0x04000004,
50 T_TCP_OPT = 0x04000005,
51 T_IPREWRITER_PATTERN = 0x04000006,
52 T_ICMP_TYPE = 0x04010000,
53 T_ICMP_CODE = 0x04010100,
54 T_IP_PORT = 0x04020000,
55 T_TCP_PORT = 0x04020006,
56 T_UDP_PORT = 0x04020011,
57 T_IP_FIELDNAME = 0x04030000,
58 T_ICMP_FIELDNAME = 0x04030001,
59 T_TCP_FIELDNAME = 0x04030006,
60 T_UDP_FIELDNAME = 0x04030011,
61 T_IP6_ADDR = 0x06000001,
62 T_IP6_PREFIX = 0x06000002
63 };
64
85 static NameDB *getdb(uint32_t type, const Element *context,
86 size_t value_size, bool create);
87
104 static void installdb(NameDB *db, const Element *context);
105
112 static void uninstalldb(NameDB *db);
113
127 static bool query(uint32_t type, const Element *context,
128 const String &name, void *value_store, size_t value_size);
129
147 static bool query_int(uint32_t type, const Element *context,
148 const String &name, int32_t *value_store);
149
151 static bool query_int(uint32_t type, const Element *context,
152 const String &name, uint32_t *value_store);
153
167 static String revquery(uint32_t type, const Element *context,
168 const void *value, size_t value_size);
169
182 static inline String revquery_int(uint32_t type, const Element *context,
183 int32_t value);
184
202 static inline bool define(uint32_t type, const Element *context,
203 const String &name, const void *value, size_t value_size);
204
220 static inline bool define_int(uint32_t type, const Element *context,
221 const String &name, int32_t value);
222
223#if CLICK_NAMEDB_CHECK
225 void check(ErrorHandler *);
226 static void check(const Element *, ErrorHandler *);
228#endif
229
230 private:
231
232 Vector<NameDB *> _namedb_roots;
233 Vector<NameDB *> _namedbs;
234
235 inline NameDB *install_dynamic_sentinel() { return (NameDB *) this; }
236 NameDB *namedb(uint32_t type, size_t size, const String &prefix, NameDB *installer);
237
238#if CLICK_NAMEDB_CHECK
239 uintptr_t _check_generation;
240 void checkdb(NameDB *db, NameDB *parent, ErrorHandler *errh);
241#endif
242
243};
244
245class NameDB { public:
246
253 inline NameDB(uint32_t type, const String &context, size_t value_size);
254
259 virtual ~NameDB() {
261 }
262
264 uint32_t type() const {
265 return _type;
266 }
267
269 const String &context() const {
270 return _context;
271 }
272
280 return _context_parent;
281 }
282
284 size_t value_size() const {
285 return _value_size;
286 }
287
295 virtual bool query(const String &name, void *value, size_t value_size) = 0;
296
305 virtual String revquery(const void *value, size_t value_size);
306
315 virtual bool define(const String &name, const void *value, size_t value_size);
316
324 inline bool define_int(const String &name, int32_t value);
325
326#if CLICK_NAMEDB_CHECK
328 virtual void check(ErrorHandler *);
330#endif
331
332 private:
333
334 uint32_t _type;
335 String _context;
336 size_t _value_size;
337 NameDB *_context_parent;
338 NameDB *_context_sibling;
339 NameDB *_context_child;
340 NameInfo *_installed;
341
342#if CLICK_NAMEDB_CHECK
343 uintptr_t _check_generation;
344#endif
345
346 friend class NameInfo;
347
348};
349
350class StaticNameDB : public NameDB { public:
351
352 struct Entry {
353 const char *name;
354 uint32_t value;
355 };
356
369 inline StaticNameDB(uint32_t type, const String &context,
370 const Entry *entry, size_t nentry);
371
379 bool query(const String &name, void *value, size_t value_size);
380
388 String revquery(const void *value, size_t value_size);
389
390#if CLICK_NAMEDB_CHECK
392 void check(ErrorHandler *);
394#endif
395
396 private:
397
398 const Entry *_entries;
399 size_t _nentries;
400
401};
402
403class DynamicNameDB : public NameDB { public:
404
412 inline DynamicNameDB(uint32_t type, const String &context, size_t value_size);
413
421 bool query(const String &name, void *value, size_t value_size);
422
430 String revquery(const void *value, size_t value_size);
431
439 bool define(const String &name, const void *value, size_t value_size);
440
441#if CLICK_NAMEDB_CHECK
443 void check(ErrorHandler *);
445#endif
446
447 private:
448
449 Vector<String> _names;
450 StringAccum _values;
451 int _sorted;
452
453 void *find(const String &name, bool create);
454 void sort();
455
456};
457
458
459inline
460NameDB::NameDB(uint32_t type, const String &context, size_t vsize)
461 : _type(type), _context(context), _value_size(vsize),
462 _context_parent(0), _context_sibling(0), _context_child(0), _installed(0)
463{
464#if CLICK_NAMEDB_CHECK
465 _check_generation = 0;
466#endif
467 assert(_value_size > 0);
468}
469
470inline
471StaticNameDB::StaticNameDB(uint32_t type, const String &context, const Entry *entry, size_t nentry)
472 : NameDB(type, context, sizeof(entry->value)), _entries(entry), _nentries(nentry)
473{
474}
475
476inline
477DynamicNameDB::DynamicNameDB(uint32_t type, const String &context, size_t vsize)
478 : NameDB(type, context, vsize), _sorted(0)
479{
480}
481
482inline String
483NameInfo::revquery_int(uint32_t type, const Element *e, int32_t value)
484{
485 return revquery(type, e, &value, sizeof(value));
486}
487
488inline bool
489NameInfo::define(uint32_t type, const Element *e, const String &name, const void *value, size_t vsize)
490{
491 if (NameDB *db = getdb(type, e, vsize, true))
492 return db->define(name, value, vsize);
493 else
494 return false;
495}
496
497inline bool
498NameInfo::define_int(uint32_t type, const Element *e, const String &name, const int32_t value)
499{
500 if (NameDB *db = getdb(type, e, sizeof(value), true))
501 return db->define(name, &value, sizeof(value));
502 else
503 return false;
504}
505
506inline bool
507NameDB::define_int(const String &name, const int32_t value)
508{
509 return define(name, &value, sizeof(value));
510}
511
512
516 NamedIntArg(uint32_t type)
517 : _type(type) {
518 }
519 bool parse(const String &str, int &value, const ArgContext &args) {
520 return NameInfo::query(_type, args.context(), str,
521 &value, sizeof(value))
522 || IntArg().parse(str, value, args);
523 }
524 int _type;
525};
526
527CLICK_ENDDECLS
528#endif
Argument context class.
Definition args.hh:31
const Element * context() const
Return the element context.
Definition args.hh:51
A modifiable database mapping names to arbitrary values.
Definition nameinfo.hh:403
DynamicNameDB(uint32_t type, const String &context, size_t value_size)
Construct a dynamic name database.
Definition nameinfo.hh:477
String revquery(const void *value, size_t value_size)
Query this database for a given value.
Definition nameinfo.cc:284
bool query(const String &name, void *value, size_t value_size)
Query this database for a given name.
Definition nameinfo.cc:261
bool define(const String &name, const void *value, size_t value_size)
Define a name in this database to a given value.
Definition nameinfo.cc:272
Base class for Click elements.
Definition element.hh:42
Error reporting class.
Definition error.hh:90
Parser class for integers.
Definition args.hh:1130
Superclass for databases mapping names to values.
Definition nameinfo.hh:245
bool define_int(const String &name, int32_t value)
Define a name in this database to a 32-bit integer value.
Definition nameinfo.hh:507
NameDB * context_parent() const
Return the contextual parent database, if any.
Definition nameinfo.hh:279
virtual bool query(const String &name, void *value, size_t value_size)=0
Query this database for a given name.
uint32_t type() const
Return the database type.
Definition nameinfo.hh:264
NameDB(uint32_t type, const String &context, size_t value_size)
Construct a database.
Definition nameinfo.hh:460
virtual String revquery(const void *value, size_t value_size)
Query this database for a given value.
Definition nameinfo.cc:150
size_t value_size() const
Return the database's value size.
Definition nameinfo.hh:284
virtual bool define(const String &name, const void *value, size_t value_size)
Define a name in this database to a given value.
Definition nameinfo.cc:144
virtual ~NameDB()
Destroy a database.
Definition nameinfo.hh:259
const String & context() const
Return the database's compound element context as a string.
Definition nameinfo.hh:269
Manages Click name databases.
Definition nameinfo.hh:11
static bool query_int(uint32_t type, const Element *context, const String &name, int32_t *value_store)
Query installed databases for name, returning a 32-bit integer value.
Definition nameinfo.cc:516
NameInfo()
Construct a NameInfo element.
Definition nameinfo.cc:294
static bool define(uint32_t type, const Element *context, const String &name, const void *value, size_t value_size)
Define name to equal value in the installed databases.
Definition nameinfo.hh:489
static bool define_int(uint32_t type, const Element *context, const String &name, int32_t value)
Define name to equal 32-bit integer value in the installed databases.
Definition nameinfo.hh:498
static NameDB * getdb(uint32_t type, const Element *context, size_t value_size, bool create)
Find or create a name database.
Definition nameinfo.cc:416
static void uninstalldb(NameDB *db)
Uninstall a name database.
Definition nameinfo.cc:456
static bool query(uint32_t type, const Element *context, const String &name, void *value_store, size_t value_size)
Query installed databases for name.
Definition nameinfo.cc:500
DBType
Known name database types.
Definition nameinfo.hh:38
@ T_SCHEDULEINFO
ScheduleInfo database.
Definition nameinfo.hh:40
@ T_ICMP_CODE
ICMP code names database.
Definition nameinfo.hh:53
@ T_TCP_OPT
TCP option names database.
Definition nameinfo.hh:50
@ T_SCRIPT_INSN
Script instruction names database.
Definition nameinfo.hh:42
@ T_UDP_FIELDNAME
UDP field names database.
Definition nameinfo.hh:60
@ T_IP_ADDR
IP address names database.
Definition nameinfo.hh:46
@ T_SIGNO
User-level signal names database.
Definition nameinfo.hh:43
@ T_IP_PREFIX
IP prefix names database.
Definition nameinfo.hh:47
@ T_IP_FIELDNAME
Starting point for IP per-protocol field names databases.
Definition nameinfo.hh:57
@ T_NONE
Nonexistent names database.
Definition nameinfo.hh:39
@ T_IP6_PREFIX
IPv6 prefix names database.
Definition nameinfo.hh:62
@ T_IP6_ADDR
IPv6 address names database.
Definition nameinfo.hh:61
@ T_TCP_FIELDNAME
TCP field names database.
Definition nameinfo.hh:59
@ T_ICMP_TYPE
ICMP type names database.
Definition nameinfo.hh:52
@ T_SPINLOCK
Spinlock names database.
Definition nameinfo.hh:44
@ T_IP_PROTO
IP protocol names database.
Definition nameinfo.hh:48
@ T_IPREWRITER_PATTERN
IPRewriterPattern database.
Definition nameinfo.hh:51
@ T_ETHERNET_ADDR
Ethernet address names database.
Definition nameinfo.hh:45
@ T_UDP_PORT
UDP port names database.
Definition nameinfo.hh:56
@ T_ANNOTATION
Packet annotation database.
Definition nameinfo.hh:41
@ T_IPFILTER_TYPE
IPFilter instruction names database.
Definition nameinfo.hh:49
@ T_ICMP_FIELDNAME
ICMP field names database.
Definition nameinfo.hh:58
@ T_IP_PORT
Starting point for IP per-protocol port names databases.
Definition nameinfo.hh:54
@ T_TCP_PORT
TCP port names database.
Definition nameinfo.hh:55
static void static_initialize()
Static initialization for NameInfo.
Definition nameinfo.cc:310
static void static_cleanup()
Static cleanup for NameInfo.
Definition nameinfo.cc:318
~NameInfo()
Destroy a NameInfo object.
Definition nameinfo.cc:301
static void installdb(NameDB *db, const Element *context)
Install a name database.
Definition nameinfo.cc:435
static String revquery(uint32_t type, const Element *context, const void *value, size_t value_size)
Query installed databases for value.
Definition nameinfo.cc:528
static String revquery_int(uint32_t type, const Element *context, int32_t value)
Query installed databases for a 32-bit integer value.
Definition nameinfo.hh:483
A fixed database mapping names to 4-byte integer values.
Definition nameinfo.hh:350
bool query(const String &name, void *value, size_t value_size)
Query this database for a given name.
Definition nameinfo.cc:156
String revquery(const void *value, size_t value_size)
Query this database for a given value.
Definition nameinfo.cc:179
StaticNameDB(uint32_t type, const String &context, const Entry *entry, size_t nentry)
Construct a static name database.
Definition nameinfo.hh:471
Efficiently build up Strings from pieces.
Definition straccum.hh:28
A string of characters.
Definition string.hh:22
Vector template.
Definition vector.hh:111
Click's StringAccum class, used to construct Strings efficiently from pieces.
Parser class for named integers.
Definition nameinfo.hh:515