Importing all of DRL, including ulogd and all of its files.
[distributedratelimiting.git] / drl / config.h
diff --git a/drl/config.h b/drl/config.h
new file mode 100644 (file)
index 0000000..e1a436f
--- /dev/null
@@ -0,0 +1,161 @@
+/* See the DRL-LICENSE file for this file's software license. */
+
+#ifndef _DRL_CONFIG_
+#define _DRL_CONFIG_
+
+struct drl_instance;
+
+/** Enumeration of identity types. */
+enum ident_types {
+
+    /** Type used by identities that will limit all slivers on the machine. */
+    IDENT_MACHINE = 1,
+
+    /** Type used by identities that will limit only a subset of slivers. */
+    IDENT_SET = 2
+};
+
+/** Enumeration of identity member types. */
+enum member_types {
+
+    /** The member is an identifier (xid) of a single sliver. */
+    MEMBER_XID = 1,
+
+    /** The member is an identifier (guid) of another sliver-set identity. */
+    MEMBER_GUID = 2
+};
+
+/**
+ * Linked list node containing address information for one of the identity's
+ * peers.
+ */
+typedef struct ident_peer {
+    /** The peer's IP address. */
+    in_addr_t ip;
+
+    /** Pointer to the next peer in the list or NULL if this is the last. */
+    struct ident_peer *next;
+} ident_peer;
+
+/**
+ * Linked list node containing hierarchy information.  For whole-machine
+ * identities, this is unnecessary.  For sliver-set identities, this specifies
+ * which slivers and other sliver-sets belong in the set.
+ */
+typedef struct ident_member {
+    /** The numerical xid or guid of the member. */
+    int value;
+
+    /** Specifies whether the value is an xid or guid. */
+    enum member_types type;
+
+    /** Pointer to the next member in the list or NULL if this is the last. */
+    struct ident_member *next;
+} ident_member;
+
+/**
+ * Linked list node containing identity information.
+ */
+typedef struct ident_config {
+    /** The guid of this identity. */
+    int id;
+
+    /** The global DRL limit for this identity. */
+    int limit;
+
+    /** The communication fabric (COMM_MESH or COMM_GOSSIP) for this identity.*/
+    enum commfabrics commfabric;
+
+    /** The gossip branch factor (when commfabric is COMM_GOSSIP). */
+    int branch;
+
+    /** The flow accounting mechanism to be used by this identity. */
+    enum accountings accounting;
+
+    /** The fixed (1-second) ewma weight value for this identity. */
+    double fixed_ewma_weight;
+
+    /** The number of estimate intervals to wait between calls to estimate,
+     * allocate and enforce. */
+    int intervals;
+
+    /** The type of this identity. */
+    enum ident_types type;
+
+    /** List of the identity's peers. */
+    ident_peer *peers;
+
+    /** The number of peers. */
+    int peer_count;
+
+    /** List of the identity's members (type IDENT_SET only). */
+    ident_member *members;
+
+    /** Pointer to the next ident in the list or NULL if this is the last. */
+    struct ident_config *next;
+} ident_config;
+
+/**
+ * Structure used to pass two lists after parsing is complete.
+ */
+typedef struct parsed_configs {
+    /** A list of IDENT_MACHINE type identities. */
+    ident_config *machines;
+
+    /** The number of machine identities. */
+    int machine_count;
+
+    /** A list of IDENT_SET type identities. */
+    ident_config *sets;
+
+    /** The number of set identities. */
+    int set_count;
+
+    /** Pointer to the tail of the machines list. */
+    ident_config *last_machine;
+
+    /** Pointer to the tail of the sets list. */
+    ident_config *last_set;
+} parsed_configs;
+
+/**
+ * Frees the specified ident and all of the memory associated with it and its
+ * fields.
+ *
+ * @param ident The ident to free.
+ */
+void free_ident(ident_config *ident);
+
+/**
+ * Frees the specified list of identities and all of the memory associated
+ * with them.
+ *
+ * @param list The ident_config list to free.
+ */
+void free_ident_list(ident_config *list);
+
+/**
+ * Uses libxml2 to parse a DRL configuration XML file and converts the
+ * information into a linked list of identities.
+ *
+ * @param configfile The path to the XML configuration file.
+ * @param configs A parsed_configs structure to be filled in with linked list
+ * of machine and set configs.
+ *
+ * @returns zero on success, non-zero on error.
+ */
+int parse_drl_config(const char *configfile, parsed_configs *configs);
+
+/**
+ * Reads /proc/virtual to get a list of viable xids.  It creates an array of
+ * leaf_t structures and a map that maps xid to the leaf_t in the array with
+ * the xid.
+ *
+ * @param instance The drl_instance_t to be filled in.  This function sets
+ * the instance's leaf_map, leaves, and leaf_count fields.
+ *
+ * @returns zero on success, non-zero on error. (Possibly ENOMEM if memory
+ * allocation fails, or 1 if the cause of the error is unclear. */
+int get_eligible_leaves(struct drl_instance *instance);
+
+#endif  /* _DRL_CONFIG_ */