Lots of changes. In no particular order:
[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 limiter intervals to wait between calls to estimate,
79      * allocate and enforce. */
80     int mainloop_intervals;
81
82     /** The number of limiter intervals to wait between communication. */
83     int communication_intervals;
84
85     /** The type of this identity. */
86     enum ident_types type;
87
88     /** List of the identity's peers. */
89     ident_peer *peers;
90
91     /** The number of peers. */
92     int peer_count;
93
94     /** List of the identity's members (type IDENT_SET only). */
95     ident_member *members;
96
97     /** Pointer to the next ident in the list or NULL if this is the last. */
98     struct ident_config *next;
99 } ident_config;
100
101 /**
102  * Structure used to pass two lists after parsing is complete.
103  */
104 typedef struct parsed_configs {
105     /** A list of IDENT_MACHINE type identities. */
106     ident_config *machines;
107
108     /** The number of machine identities. */
109     int machine_count;
110
111     /** A list of IDENT_SET type identities. */
112     ident_config *sets;
113
114     /** The number of set identities. */
115     int set_count;
116
117     /** Pointer to the tail of the machines list. */
118     ident_config *last_machine;
119
120     /** Pointer to the tail of the sets list. */
121     ident_config *last_set;
122 } parsed_configs;
123
124 /**
125  * Frees the specified ident and all of the memory associated with it and its
126  * fields.
127  *
128  * @param ident The ident to free.
129  */
130 void free_ident(ident_config *ident);
131
132 /**
133  * Frees the specified list of identities and all of the memory associated
134  * with them.
135  *
136  * @param list The ident_config list to free.
137  */
138 void free_ident_list(ident_config *list);
139
140 /**
141  * Uses libxml2 to parse a DRL configuration XML file and converts the
142  * information into a linked list of identities.
143  *
144  * @param configfile The path to the XML configuration file.
145  * @param configs A parsed_configs structure to be filled in with linked list
146  * of machine and set configs.
147  *
148  * @returns zero on success, non-zero on error.
149  */
150 int parse_drl_config(const char *configfile, parsed_configs *configs);
151
152 /**
153  * Reads /proc/virtual to get a list of viable xids.  It creates an array of
154  * leaf_t structures and a map that maps xid to the leaf_t in the array with
155  * the xid.
156  *
157  * @param instance The drl_instance_t to be filled in.  This function sets
158  * the instance's leaf_map, leaves, and leaf_count fields.
159  *
160  * @returns zero on success, non-zero on error. (Possibly ENOMEM if memory
161  * allocation fails, or 1 if the cause of the error is unclear. */
162 int get_eligible_leaves(struct drl_instance *instance);
163
164 #endif  /* _DRL_CONFIG_ */