Importing all of DRL, including ulogd and all of its files.
[distributedratelimiting.git] / drl / config.h
1 /* See the DRL-LICENSE file for this file's software license. */
2
3 #ifndef _DRL_CONFIG_
4 #define _DRL_CONFIG_
5
6 struct drl_instance;
7
8 /** Enumeration of identity types. */
9 enum ident_types {
10
11     /** Type used by identities that will limit all slivers on the machine. */
12     IDENT_MACHINE = 1,
13
14     /** Type used by identities that will limit only a subset of slivers. */
15     IDENT_SET = 2
16 };
17
18 /** Enumeration of identity member types. */
19 enum member_types {
20
21     /** The member is an identifier (xid) of a single sliver. */
22     MEMBER_XID = 1,
23
24     /** The member is an identifier (guid) of another sliver-set identity. */
25     MEMBER_GUID = 2
26 };
27
28 /**
29  * Linked list node containing address information for one of the identity's
30  * peers.
31  */
32 typedef struct ident_peer {
33     /** The peer's IP address. */
34     in_addr_t ip;
35
36     /** Pointer to the next peer in the list or NULL if this is the last. */
37     struct ident_peer *next;
38 } ident_peer;
39
40 /**
41  * Linked list node containing hierarchy information.  For whole-machine
42  * identities, this is unnecessary.  For sliver-set identities, this specifies
43  * which slivers and other sliver-sets belong in the set.
44  */
45 typedef struct ident_member {
46     /** The numerical xid or guid of the member. */
47     int value;
48
49     /** Specifies whether the value is an xid or guid. */
50     enum member_types type;
51
52     /** Pointer to the next member in the list or NULL if this is the last. */
53     struct ident_member *next;
54 } ident_member;
55
56 /**
57  * Linked list node containing identity information.
58  */
59 typedef struct ident_config {
60     /** The guid of this identity. */
61     int id;
62
63     /** The global DRL limit for this identity. */
64     int limit;
65
66     /** The communication fabric (COMM_MESH or COMM_GOSSIP) for this identity.*/
67     enum commfabrics commfabric;
68
69     /** The gossip branch factor (when commfabric is COMM_GOSSIP). */
70     int branch;
71
72     /** The flow accounting mechanism to be used by this identity. */
73     enum accountings accounting;
74
75     /** The fixed (1-second) ewma weight value for this identity. */
76     double fixed_ewma_weight;
77
78     /** The number of estimate intervals to wait between calls to estimate,
79      * allocate and enforce. */
80     int intervals;
81
82     /** The type of this identity. */
83     enum ident_types type;
84
85     /** List of the identity's peers. */
86     ident_peer *peers;
87
88     /** The number of peers. */
89     int peer_count;
90
91     /** List of the identity's members (type IDENT_SET only). */
92     ident_member *members;
93
94     /** Pointer to the next ident in the list or NULL if this is the last. */
95     struct ident_config *next;
96 } ident_config;
97
98 /**
99  * Structure used to pass two lists after parsing is complete.
100  */
101 typedef struct parsed_configs {
102     /** A list of IDENT_MACHINE type identities. */
103     ident_config *machines;
104
105     /** The number of machine identities. */
106     int machine_count;
107
108     /** A list of IDENT_SET type identities. */
109     ident_config *sets;
110
111     /** The number of set identities. */
112     int set_count;
113
114     /** Pointer to the tail of the machines list. */
115     ident_config *last_machine;
116
117     /** Pointer to the tail of the sets list. */
118     ident_config *last_set;
119 } parsed_configs;
120
121 /**
122  * Frees the specified ident and all of the memory associated with it and its
123  * fields.
124  *
125  * @param ident The ident to free.
126  */
127 void free_ident(ident_config *ident);
128
129 /**
130  * Frees the specified list of identities and all of the memory associated
131  * with them.
132  *
133  * @param list The ident_config list to free.
134  */
135 void free_ident_list(ident_config *list);
136
137 /**
138  * Uses libxml2 to parse a DRL configuration XML file and converts the
139  * information into a linked list of identities.
140  *
141  * @param configfile The path to the XML configuration file.
142  * @param configs A parsed_configs structure to be filled in with linked list
143  * of machine and set configs.
144  *
145  * @returns zero on success, non-zero on error.
146  */
147 int parse_drl_config(const char *configfile, parsed_configs *configs);
148
149 /**
150  * Reads /proc/virtual to get a list of viable xids.  It creates an array of
151  * leaf_t structures and a map that maps xid to the leaf_t in the array with
152  * the xid.
153  *
154  * @param instance The drl_instance_t to be filled in.  This function sets
155  * the instance's leaf_map, leaves, and leaf_count fields.
156  *
157  * @returns zero on success, non-zero on error. (Possibly ENOMEM if memory
158  * allocation fails, or 1 if the cause of the error is unclear. */
159 int get_eligible_leaves(struct drl_instance *instance);
160
161 #endif  /* _DRL_CONFIG_ */