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