Browse Source

snmpstats Add transport indications to the mib

This commit adds support for the config framework to the snmpstats module.
Olle E. Johansson 12 years ago
parent
commit
244bfd5004

+ 446 - 0
modules/snmpstats/kamailioNetConfig.c

@@ -0,0 +1,446 @@
+/*
+ * SNMPStats Module  - Network Statistics
+ *
+ * Kamailio Server Net objects addition
+ * Copyright (C) 2013 Edvina AB, Sollentuna, Sweden
+ * Written by Olle E. Johansson
+ *
+ * This file is part of Kamailio, a free SIP server.
+ *
+ * Kamailio is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * Kamailio is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ *
+ * History:
+ * --------
+ * 2013-04-01 initial version (oej)
+ * 
+ * Note: this file originally auto-generated by mib2c 
+ *
+ */
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+#include "kamailioNetConfig.h"
+
+#include "snmpstats_globals.h"
+#include "utilities.h"
+#include "../../lib/kcore/statistics.h"
+#include "../../globals.h"
+#include "../../cfg_core.h"
+
+/* Net-snmp version 5.6 defines oid's as const */
+#define CONST
+
+/** Initializes the kamailioNetConfig module */
+void
+init_kamailioNetConfig(void)
+{
+    CONST oid kamailioNetConfUdpTransport_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,1 };
+    CONST oid kamailioNetConfUdpDtlsTransport_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,2 };
+    CONST oid kamailioNetConfTcpTransport_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,3 };
+    CONST oid kamailioNetConfTcpTlsTransport_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,4 };
+    CONST oid kamailioNetConfSctpTransport_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,5 };
+    CONST oid kamailioNetConfSctpTlsTransport_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,6 };
+    CONST oid kamailioNetConfWsTransport_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,7 };
+    CONST oid kamailioNetConfWsTlsTransport_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,8 };
+    CONST oid kamailioNetConfHttpServer_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,9 };
+    CONST oid kamailioNetConfMsrpRelay_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,10 };
+    CONST oid kamailioNetConfStunServer_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,11 };
+    CONST oid kamailioNetConfOutbound_oid[] = { 1,3,6,1,4,1,34352,3,1,3,1,4,4,12 };
+
+  DEBUGMSGTL(("kamailioNetConfig", "Initializing\n"));
+
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfUdpTransport", handle_kamailioNetConfUdpTransport,
+                               kamailioNetConfUdpTransport_oid, OID_LENGTH(kamailioNetConfUdpTransport_oid),
+                               HANDLER_CAN_RONLY
+        ));
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfUdpDtlsTransport", handle_kamailioNetConfUdpDtlsTransport,
+                               kamailioNetConfUdpDtlsTransport_oid, OID_LENGTH(kamailioNetConfUdpDtlsTransport_oid),
+                               HANDLER_CAN_RONLY
+        ));
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfTcpTransport", handle_kamailioNetConfTcpTransport,
+                               kamailioNetConfTcpTransport_oid, OID_LENGTH(kamailioNetConfTcpTransport_oid),
+                               HANDLER_CAN_RONLY
+        ));
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfTcpTlsTransport", handle_kamailioNetConfTcpTlsTransport,
+                               kamailioNetConfTcpTlsTransport_oid, OID_LENGTH(kamailioNetConfTcpTlsTransport_oid),
+                               HANDLER_CAN_RONLY
+        ));
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfSctpTransport", handle_kamailioNetConfSctpTransport,
+                               kamailioNetConfSctpTransport_oid, OID_LENGTH(kamailioNetConfSctpTransport_oid),
+                               HANDLER_CAN_RONLY
+        ));
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfSctpTlsTransport", handle_kamailioNetConfSctpTlsTransport,
+                               kamailioNetConfSctpTlsTransport_oid, OID_LENGTH(kamailioNetConfSctpTlsTransport_oid),
+                               HANDLER_CAN_RONLY
+        ));
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfWsTransport", handle_kamailioNetConfWsTransport,
+                               kamailioNetConfWsTransport_oid, OID_LENGTH(kamailioNetConfWsTransport_oid),
+                               HANDLER_CAN_RONLY
+        ));
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfWsTlsTransport", handle_kamailioNetConfWsTlsTransport,
+                               kamailioNetConfWsTlsTransport_oid, OID_LENGTH(kamailioNetConfWsTlsTransport_oid),
+                               HANDLER_CAN_RONLY
+        ));
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfHttpServer", handle_kamailioNetConfHttpServer,
+                               kamailioNetConfHttpServer_oid, OID_LENGTH(kamailioNetConfHttpServer_oid),
+                               HANDLER_CAN_RONLY
+        ));
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfMsrpRelay", handle_kamailioNetConfMsrpRelay,
+                               kamailioNetConfMsrpRelay_oid, OID_LENGTH(kamailioNetConfMsrpRelay_oid),
+                               HANDLER_CAN_RONLY
+        ));
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfStunServer", handle_kamailioNetConfStunServer,
+                               kamailioNetConfStunServer_oid, OID_LENGTH(kamailioNetConfStunServer_oid),
+                               HANDLER_CAN_RONLY
+        ));
+    netsnmp_register_scalar(
+        netsnmp_create_handler_registration("kamailioNetConfOutbound", handle_kamailioNetConfOutbound,
+                               kamailioNetConfOutbound_oid, OID_LENGTH(kamailioNetConfOutbound_oid),
+                               HANDLER_CAN_RONLY
+        ));
+}
+
+int handle_kamailioNetConfUdpTransport(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+    int value = 1;	/* By default, implemented */
+
+    switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+			(u_char *) &value, sizeof(int));
+            break;
+
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfUdpTransport\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+    }
+
+    return SNMP_ERR_NOERROR;
+}
+
+int handle_kamailioNetConfUdpDtlsTransport(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+
+	/* Note: This transport is not supported in Kamailio. This OID is just a place holder
+		for future work. 
+	*/
+    int value = -1;	/* Not implemented */
+
+    switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+			(u_char *) &value, sizeof(int));
+            break;
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfUdpDtlsTransport\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+    }
+
+    return SNMP_ERR_NOERROR;
+}
+
+int handle_kamailioNetConfTcpTransport(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+    int value = 0;	/* Not implemented */
+
+#ifdef USE_TCP
+	if (!tcp_disable) {
+		value = 1;
+	}
+#endif
+
+    switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &value, sizeof(int));
+            break;
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfTcpTransport\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+    }
+
+    return SNMP_ERR_NOERROR;
+}
+
+int handle_kamailioNetConfTcpTlsTransport(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+    int value = 0;
+
+#ifdef USE_TCP
+	if (!tcp_disable) {
+#ifdef USE_TLS
+		if (module_loaded("tls")) {
+			value = 1;
+		}
+#endif
+		;	/* Empty statement needed here */
+	}
+#endif
+
+    switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &value, sizeof(int));
+            break;
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfTcpTlsTransport\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+    }
+
+    return SNMP_ERR_NOERROR;
+}
+
+int handle_kamailioNetConfSctpTransport(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+    int value = 0;
+	/* At this point I'm lazy and just check if the transport is compiled. */
+#ifdef USE_SCTP
+	value = 1;
+#endif
+
+    switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &value, sizeof(int));
+            break;
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfSctpTransport\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+    }
+
+    return SNMP_ERR_NOERROR;
+}
+
+int handle_kamailioNetConfSctpTlsTransport(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+    int value = -1;	/* Not implemented */
+
+    switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &value, sizeof(int));
+            break;
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfSctpTlsTransport\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+    }
+
+    return SNMP_ERR_NOERROR;
+}
+
+int handle_kamailioNetConfWsTransport(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+    int value = -1;	/* Not implemented */
+    if (module_loaded("tls"))  {
+	value = 1;
+    }
+
+    switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &value, sizeof(int));
+            break;
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfWsTransport\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+    }
+
+    return SNMP_ERR_NOERROR;
+}
+
+int handle_kamailioNetConfWsTlsTransport(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+    	int value = 0;
+	unsigned int type;
+
+	if (module_loaded("websocket")) {
+		value = snmp_cfg_get_int("websocket", "enabled", &type);
+		if (type != CFG_VAR_INT) {
+			value = 0;
+		}
+	}
+
+    switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &value, sizeof(int));
+            break;
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfWsTlsTransport\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+    }
+
+    return SNMP_ERR_NOERROR;
+}
+
+int handle_kamailioNetConfHttpServer(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+    int value = 0;
+    if (module_loaded("xhttp"))  {
+	value = 1;
+    }
+
+    switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &value, sizeof(int));
+            break;
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfHttpServer\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+    }
+
+    return SNMP_ERR_NOERROR;
+}
+
+int handle_kamailioNetConfMsrpRelay(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+    int value = 0;
+    if (module_loaded("msrp"))  {
+	value = 1;
+    }
+
+    switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &value, sizeof(int));
+            break;
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfMsrpRelay\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+    }
+
+    return SNMP_ERR_NOERROR;
+}
+
+int handle_kamailioNetConfStunServer(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+    int value = 0;
+    if (module_loaded("stun"))  {
+	value = 1;
+    }
+
+    switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &value, sizeof(int));
+            break;
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfStunServer\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+    }
+
+    return SNMP_ERR_NOERROR;
+}
+
+int handle_kamailioNetConfOutbound(netsnmp_mib_handler *handler,
+                          netsnmp_handler_registration *reginfo,
+                          netsnmp_agent_request_info   *reqinfo,
+                          netsnmp_request_info         *requests)
+{
+	int value = 0;	/* Not implemented */
+	unsigned int type;
+	
+	if (module_loaded("outbound")) {
+		value = snmp_cfg_get_int("outbound", "outbound_enabled", &type);
+		if (type != CFG_VAR_INT) {
+			value = 0;
+		}
+	}
+
+	switch(reqinfo->mode) {
+
+        case MODE_GET:
+            snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER, (u_char *) &value, sizeof(int));
+            break;
+
+        default:
+            /* we should never get here, so this is a really bad error */
+            snmp_log(LOG_ERR, "unknown mode (%d) in handle_kamailioNetConfOutbound\n", reqinfo->mode );
+            return SNMP_ERR_GENERR;
+	}
+
+	return SNMP_ERR_NOERROR;
+}

+ 23 - 0
modules/snmpstats/kamailioNetConfig.h

@@ -0,0 +1,23 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ *        $
+ */
+#ifndef KAMAILIONETCONFIG_H
+#define KAMAILIONETCONFIG_H
+
+/* function declarations */
+void init_kamailioNetConfig(void);
+Netsnmp_Node_Handler handle_kamailioNetConfUdpTransport;
+Netsnmp_Node_Handler handle_kamailioNetConfUdpDtlsTransport;
+Netsnmp_Node_Handler handle_kamailioNetConfTcpTransport;
+Netsnmp_Node_Handler handle_kamailioNetConfTcpTlsTransport;
+Netsnmp_Node_Handler handle_kamailioNetConfSctpTransport;
+Netsnmp_Node_Handler handle_kamailioNetConfSctpTlsTransport;
+Netsnmp_Node_Handler handle_kamailioNetConfWsTransport;
+Netsnmp_Node_Handler handle_kamailioNetConfWsTlsTransport;
+Netsnmp_Node_Handler handle_kamailioNetConfHttpServer;
+Netsnmp_Node_Handler handle_kamailioNetConfMsrpRelay;
+Netsnmp_Node_Handler handle_kamailioNetConfStunServer;
+Netsnmp_Node_Handler handle_kamailioNetConfOutbound;
+
+#endif /* KAMAILIONETCONFIG_H */

+ 4 - 2
modules/snmpstats/snmpstats.c

@@ -82,7 +82,8 @@
 #include "snmpstats.h"
 #include "snmpstats_globals.h"
 #include "../../timer.h"
-#include "../../cfg/cfg_struct.h"
+#include "../../cfg/cfg_select.h"
+#include "../../cfg/cfg_ctx.h"
 
 #include <net-snmp/net-snmp-config.h>
 #include <net-snmp/net-snmp-includes.h>
@@ -130,7 +131,6 @@ static int  mod_child_init(int rank);
  * log a useful message and kill the AgentX Sub-Agent child process */
 static void mod_destroy(void);
 
-
 static proc_export_t mod_procs[] = {
 	{"SNMP AgentX",  0,  0, agentx_child, 1 },
 	{0,0,0,0,0}
@@ -369,6 +369,8 @@ static int mod_init(void)
 	register_procs(1);
 	/* add child to update local config framework structures */
 	cfg_register_child(1);
+	/* Initialize config framework in utilities.c */
+	config_context_init();
 
 	return 0;
 }

+ 2 - 0
modules/snmpstats/sub_agent.c

@@ -65,6 +65,7 @@
 #include "snmpMIBNotifications.h"
 #include "kamailioServer.h"
 #include "kamailioNet.h"
+#include "kamailioNetConfig.h"
 
 #include "../../dprint.h"
 #include "../../cfg/cfg_struct.h"
@@ -112,6 +113,7 @@ static int initialize_agentx(void)
 	init_kamailioSIPRegUserLookupTable();
 	init_kamailioServer();
 	init_kamailioNet();
+	init_kamailioNetConfig();
 	LM_DBG("Done initializing Kamailio OID's for SNMPD MasterX\n");
 
 	/* In case we recevie a request to stop (kill -TERM or kill -INT) */

+ 47 - 0
modules/snmpstats/utilities.c

@@ -45,9 +45,13 @@
 #include "../../str.h"
 #include "../../locking.h"
 #include "../../mem/mem.h"
+#include "../../cfg/cfg.h"
+#include "../../cfg/cfg_ctx.h"
 
 #include "../../lib/kcore/kstats_wrapper.h"
 
+static cfg_ctx_t  *ctx = NULL;
+
 /*!
  * This function copies an Kamailio "str" datatype into a '\\0' terminated char*
  * string. 
@@ -146,3 +150,46 @@ char * convertTMToSNMPDateAndTime(struct tm *timeStructure)
 
 	return dateAndTime;
 }
+
+/* module initialization function */
+int config_context_init(void)
+{
+	if (cfg_register_ctx(&ctx, NULL)) {
+		LOG(L_ERR, "cfg_rpc: failed to register cfg context\n");
+		return -1;
+	}
+
+	return 0;
+}
+
+/*! \brief Get config framework variable 
+ * type will return cfg_type - CFG_VAR_INT, CFG_VAR_STRING, CFG_VAR_STR
+ * If type is CFG_VAR_UNSET then call failed and return value should be ignored.
+*/
+int snmp_cfg_get_int(char *arg_group, char *arg_name, unsigned int *type)
+{
+	void	*val;
+	unsigned int	val_type;
+	int res;
+
+	str group, name;
+
+	group.s = arg_group;
+	group.len = strlen(arg_group);
+	name.s = arg_name;
+	name.len = strlen(arg_name);
+
+	*type = CFG_VAR_UNSET;
+
+	res = cfg_get_by_name(ctx, &group, NULL, &name, &val, &val_type);
+	if (res < 0) {
+		LM_ERR("Failed to get the variable\n");
+		return -1;
+	} else if (res > 0) {
+		LM_ERR("Variable exists, but it is not readable via RPC interface\n");
+		return -1;
+	}
+	LM_DBG("Config framework variable %s:%s retrieved %d\n", arg_group, arg_name, (int)(long) val);
+	*type = val_type;
+	return (int) (long) val;
+}

+ 10 - 0
modules/snmpstats/utilities.h

@@ -72,4 +72,14 @@ int get_statistic(char *statName);
  * counted on to be around if this function is called again. */
 char * convertTMToSNMPDateAndTime(struct tm *timeStructure);
 
+/*! \brief Get config framework variable 
+ * type will return cfg_type - CFG_VAR_INT, CFG_VAR_STRING, CFG_VAR_STR
+ * If type is CFG_VAR_UNSET then call failed and return value should be ignored.
+*/
+int snmp_cfg_get_int(char *arg_group, char *arg_name, unsigned int *type);
+
+/*! Initialize config framework */
+int config_context_init(void);
+
+
 #endif