File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / dhcp / includes / tree.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 9 09:06:54 2012 UTC (11 years, 10 months ago) by misho
Branches: dhcp, MAIN
CVS tags: v4_1_R7p0, v4_1_R7, v4_1_R4, HEAD
dhcp 4.1 r7

    1: /* tree.h
    2: 
    3:    Definitions for address trees... */
    4: 
    5: /*
    6:  * Copyright (c) 2011 by Internet Systems Consortium, Inc. ("ISC")
    7:  * Copyright (c) 2004,2007-2009 by Internet Systems Consortium, Inc. ("ISC")
    8:  * Copyright (c) 1996-2003 by Internet Software Consortium
    9:  *
   10:  * Permission to use, copy, modify, and distribute this software for any
   11:  * purpose with or without fee is hereby granted, provided that the above
   12:  * copyright notice and this permission notice appear in all copies.
   13:  *
   14:  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
   15:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   16:  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
   17:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   18:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   19:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
   20:  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   21:  *
   22:  *   Internet Systems Consortium, Inc.
   23:  *   950 Charter Street
   24:  *   Redwood City, CA 94063
   25:  *   <info@isc.org>
   26:  *   https://www.isc.org/
   27:  *
   28:  * This software has been written for Internet Systems Consortium
   29:  * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
   30:  * To learn more about Internet Systems Consortium, see
   31:  * ``https://www.isc.org/''.  To learn more about Vixie Enterprises,
   32:  * see ``http://www.vix.com''.   To learn more about Nominum, Inc., see
   33:  * ``http://www.nominum.com''.
   34:  */
   35: 
   36: /* A pair of pointers, suitable for making a linked list. */
   37: typedef struct _pair {
   38: 	caddr_t car;
   39: 	struct _pair *cdr;
   40: } *pair;
   41: 
   42: struct option_chain_head {
   43: 	int refcnt;
   44: 	pair first;
   45: };
   46: 
   47: struct enumeration_value {
   48: 	const char *name;
   49: 	u_int8_t value;
   50: };
   51: 
   52: struct enumeration {
   53: 	struct enumeration *next;
   54: 	const char *name;
   55: 	unsigned width;
   56: 	struct enumeration_value *values;
   57: };	
   58: 
   59: /* Tree node types... */
   60: #define TREE_CONCAT		1
   61: #define TREE_HOST_LOOKUP	2
   62: #define TREE_CONST		3
   63: #define TREE_LIMIT		4
   64: #define TREE_DATA_EXPR		5
   65: 
   66: /* A data buffer with a reference count. */
   67: struct buffer {
   68: 	int refcnt;
   69: 	unsigned char data [1];
   70: };
   71: 
   72: /* XXX The mechanism by which data strings are returned is currently
   73:    XXX broken: rather than returning an ephemeral pointer, we create
   74:    XXX a reference to the data in the caller's space, which the caller
   75:    XXX then has to dereference - instead, the reference should be
   76:    XXX ephemeral by default and be made a persistent reference explicitly. */
   77: /* XXX on the other hand, it seems to work pretty nicely, so maybe the
   78:    XXX above comment is meshuggenah. */
   79: /* XXX I think the above comment tries to say this: 
   80:    XXX    http://tinyurl.com/2tjqre */
   81: 
   82: /* A string of data bytes, possibly accompanied by a larger buffer. */
   83: struct data_string {
   84: 	struct buffer *buffer;
   85: 	const unsigned char *data;
   86: 	unsigned len;	/* Does not include NUL terminator, if any. */
   87: 	int terminated;
   88: };
   89: 
   90: enum expression_context {
   91: 	context_any, /* indefinite */
   92: 	context_boolean,
   93: 	context_data,
   94: 	context_numeric,
   95: 	context_dns,
   96: 	context_data_or_numeric, /* indefinite */
   97: 	context_function
   98: };
   99: 
  100: struct fundef {
  101: 	int refcnt;
  102: 	struct string_list *args;
  103: 	struct executable_statement *statements;
  104: };
  105: 
  106: struct binding_value {
  107: 	int refcnt;
  108: 	enum {
  109: 		binding_boolean,
  110: 		binding_data,
  111: 		binding_numeric,
  112: 		binding_dns,
  113: 		binding_function
  114: 	} type;
  115: 	union value {
  116: 		struct data_string data;
  117: 		unsigned long intval;
  118: 		int boolean;
  119: #if defined (NSUPDATE)
  120: 		ns_updrec *dns;
  121: #endif
  122: 		struct fundef *fundef;
  123: 		struct binding_value *bv;
  124: 	} value;
  125: };
  126: 
  127: struct binding {
  128: 	struct binding *next;
  129: 	char *name;
  130: 	struct binding_value *value;
  131: };
  132: 
  133: struct binding_scope {
  134: 	int refcnt;
  135: 	struct binding_scope *outer;
  136: 	struct binding *bindings;
  137: };
  138: 
  139: /* Expression tree structure. */
  140: 
  141: enum expr_op {
  142: 	expr_none,
  143: 	expr_match,
  144: 	expr_check,
  145: 	expr_equal,
  146: 	expr_substring,
  147: 	expr_suffix,
  148: 	expr_concat,
  149: 	expr_host_lookup,
  150: 	expr_and,
  151: 	expr_or,
  152: 	expr_not,
  153: 	expr_option,
  154: 	expr_hardware,
  155: 	expr_packet,
  156: 	expr_const_data,
  157: 	expr_extract_int8,
  158: 	expr_extract_int16,
  159: 	expr_extract_int32,
  160: 	expr_encode_int8,
  161: 	expr_encode_int16,
  162: 	expr_encode_int32,
  163: 	expr_const_int,
  164: 	expr_exists,
  165: 	expr_encapsulate,
  166: 	expr_known,
  167: 	expr_reverse,
  168: 	expr_leased_address,
  169: 	expr_binary_to_ascii,
  170: 	expr_config_option,
  171: 	expr_host_decl_name,
  172: 	expr_pick_first_value,
  173:  	expr_lease_time,
  174:  	expr_dns_transaction,
  175: 	expr_static,
  176: 	expr_ns_add,
  177:  	expr_ns_delete,
  178:  	expr_ns_exists,
  179:  	expr_ns_not_exists,
  180: 	expr_not_equal,
  181: 	expr_null,
  182: 	expr_variable_exists,
  183: 	expr_variable_reference,
  184: 	expr_filename,
  185:  	expr_sname,
  186: 	expr_arg,
  187: 	expr_funcall,
  188: 	expr_function,
  189: 	expr_add,
  190: 	expr_subtract,
  191: 	expr_multiply,
  192: 	expr_divide,
  193: 	expr_remainder,
  194: 	expr_binary_and,
  195: 	expr_binary_or,
  196: 	expr_binary_xor,
  197: 	expr_client_state,
  198: 	expr_ucase,
  199: 	expr_lcase,
  200: 	expr_regex_match,
  201: 	expr_iregex_match
  202: };
  203: 
  204: struct expression {
  205: 	int refcnt;
  206: 	enum expr_op op;
  207: 	union expr_union {
  208: 		struct {
  209: 			struct expression *expr;
  210: 			struct expression *offset;
  211: 			struct expression *len;
  212: 		} substring;
  213: 		struct expression *equal [2];
  214: 		struct expression *and [2];
  215: 		struct expression *or [2];
  216: 		struct expression *not;
  217: 		struct expression *add;
  218: 		struct expression *subtract;
  219: 		struct expression *multiply;
  220: 		struct expression *divide;
  221: 		struct expression *remainder;
  222: 		struct collection *check;
  223: 		struct {
  224: 			struct expression *expr;
  225: 			struct expression *len;
  226: 		} suffix;
  227: 		struct expression *lcase;
  228: 		struct expression *ucase;
  229: 		struct option *option;
  230: 		struct option *config_option;
  231: 		struct {
  232: 			struct expression *offset;
  233: 			struct expression *len;
  234: 		} packet;
  235: 		struct data_string const_data;
  236: 		struct expression *extract_int;
  237: 		struct expression *encode_int;
  238: 		unsigned long const_int;
  239: 		struct expression *concat [2];
  240: 		struct dns_host_entry *host_lookup;
  241: 		struct option *exists;
  242: 		struct data_string encapsulate;
  243: 		struct {
  244: 			struct expression *base;
  245: 			struct expression *width;
  246: 			struct expression *separator;
  247: 			struct expression *buffer;
  248: 		} b2a;
  249: 		struct {
  250: 			struct expression *width;
  251: 			struct expression *buffer;
  252: 		} reverse;
  253: 		struct {
  254: 			struct expression *car;
  255: 			struct expression *cdr;
  256: 		} pick_first_value;
  257: 		struct {
  258: 			struct expression *car;
  259: 			struct expression *cdr;
  260: 		} dns_transaction;
  261:  		struct {
  262: 			unsigned rrclass;
  263: 			unsigned rrtype;
  264:  			struct expression *rrname;
  265:  			struct expression *rrdata;
  266:  			struct expression *ttl;
  267:  		} ns_add;
  268:  		struct {
  269: 			unsigned rrclass;
  270: 			unsigned rrtype;
  271:  			struct expression *rrname;
  272:  			struct expression *rrdata;
  273:  		} ns_delete, ns_exists, ns_not_exists;
  274: 		char *variable;
  275: 		struct {
  276: 			struct expression *val;
  277: 			struct expression *next;
  278: 		} arg;
  279: 		struct {
  280: 			char *name;
  281: 			struct expression *arglist;
  282: 		} funcall;
  283: 		struct fundef *func;
  284: 	} data;
  285: 	int flags;
  286: #	define EXPR_EPHEMERAL	1
  287: };		
  288: 
  289: /* DNS host entry structure... */
  290: struct dns_host_entry {
  291: 	int refcnt;
  292: 	TIME timeout;
  293: 	struct data_string data;
  294: 	char hostname [1];
  295: };
  296: 
  297: struct option_cache; /* forward */
  298: struct packet; /* forward */
  299: struct option_state; /* forward */
  300: struct decoded_option_state; /* forward */
  301: struct lease; /* forward */
  302: struct client_state; /* forward */
  303: 
  304: struct universe {
  305: 	const char *name;
  306: 	struct option_cache *(*lookup_func) (struct universe *,
  307: 					     struct option_state *,
  308: 					     unsigned);
  309: 	void (*save_func) (struct universe *, struct option_state *,
  310: 			   struct option_cache *, isc_boolean_t);
  311: 	void (*foreach) (struct packet *,
  312: 			 struct lease *, struct client_state *,
  313: 			 struct option_state *, struct option_state *,
  314: 			 struct binding_scope **, struct universe *, void *,
  315: 			 void (*) (struct option_cache *, struct packet *,
  316: 				   struct lease *, struct client_state *,
  317: 				   struct option_state *,
  318: 				   struct option_state *,
  319: 				   struct binding_scope **,
  320: 				   struct universe *, void *));
  321: 	void (*delete_func) (struct universe *universe,
  322: 			     struct option_state *, int);
  323: 	int (*option_state_dereference) (struct universe *,
  324: 					 struct option_state *,
  325: 					 const char *, int);
  326: 	int (*decode) (struct option_state *,
  327: 		       const unsigned char *, unsigned, struct universe *);
  328: 	int (*encapsulate) (struct data_string *, struct packet *,
  329: 			    struct lease *, struct client_state *,
  330: 			    struct option_state *, struct option_state *,
  331: 			    struct binding_scope **,
  332: 			    struct universe *);
  333: 	u_int32_t (*get_tag) (const unsigned char *);
  334: 	void (*store_tag) (unsigned char *, u_int32_t);
  335: 	u_int32_t (*get_length) (const unsigned char *);
  336: 	void (*store_length) (unsigned char *, u_int32_t);
  337: 	int tag_size, length_size;
  338: 	unsigned site_code_min, end;
  339: 	option_name_hash_t *name_hash;
  340: 	option_code_hash_t *code_hash;
  341: 	struct option *enc_opt;
  342: 	int index;
  343: 
  344: 	/* Flags should probably become condensed. */
  345: 	int concat_duplicates;
  346: };
  347: 
  348: struct option {
  349: 	const char *name;
  350: 	const char *format;
  351: 	struct universe *universe;
  352: 	unsigned code;
  353: 	int refcnt;
  354: };

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>