Files
2026-07-30 11:19:44 +05:30

715 lines
21 KiB
C

/* ipcom_sysvar.h - IPCOM system variable library */
/*
******************************************************************************
* INTERPEAK API HEADER FILE
*
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipcom_sysvar.h,v $ $Revision: 1.32.10.2 $
* $Source: /home/interpeak/CVSRoot/ipcom/include/ipcom_sysvar.h,v $
* $Author: jren $ $Date: 2013-04-07 07:25:01 $
* $State: Exp $ $Locker: $
*
* INTERPEAK_COPYRIGHT_STRING
* Design and implementation by Lennart Bang <lob@interpeak.se>
******************************************************************************
*/
#ifndef IPCOM_SYSVAR_H
#define IPCOM_SYSVAR_H
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
*/
/*
DESCRIPTION
This library contains the public API for IPCOM system variables.
INCLUDE FILES: ipcom_cmd.h, ipcom_cstyle.h, ipcom_type.h
*/
/*
****************************************************************************
* 2 CONFIGURATION
****************************************************************************
*/
#include "ipcom_config.h"
/*
****************************************************************************
* 3 INCLUDE FILES
****************************************************************************
*/
#include <ipcom_cmd.h>
#include <ipcom_cstyle.h>
#include <ipcom_hash.h>
#include <ipcom_observer.h>
#include <ipcom_type.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
****************************************************************************
* 4 DEFINES
****************************************************************************
*/
#if (!defined(IPCOM_KERNEL) && defined(IPCOM_USRLIB)) || defined(IPCOM_USE_REMOTE_SYSVAR)
#define ipcom_sysvar_get ipcom_sysvar_get_usr
#define ipcom_sysvar_set ipcom_sysvar_set_usr
#define ipcom_sysvar_unset ipcom_sysvar_unset_usr
#define ipcom_sysvar_for_each ipcom_sysvar_for_each_usr
#endif
#if defined(IP_WB_BUILD)
#define IP_SYSVAR(name, value, cdf_define) { name, cdf_define }
#else
#define IP_SYSVAR(name, value, cdf_define) { name, value }
#endif
/*
****************************************************************************
* 5 TYPES
****************************************************************************
*/
typedef struct Ipcom_sysvar_struct
{
IP_CONST char *name;
IP_CONST char *value;
}
Ipcom_sysvar;
typedef struct Ipcom_sysvar_entry_struct
{
int flags;
int refcount;
const char *name;
const char *value;
/* Memory for 'name' and 'value' follows. */
}
Ipcom_sysvar_entry;
typedef struct Ipcom_sysvar_tree_struct
{
Ipcom_hash *sysvars; /* Hash table containing all system
variable for all VR:s */
Ip_u16 vr; /* Virtual router this sysvar tree
belongs to */
int referenced; /* Reference count of this tree */
Ip_bool modified; /* Has this tree been modified since it
was last synchronized with persistent
storage */
Ip_fd fd_lock; /* Used by LAS for file locking */
} Ipcom_sysvar_tree;
typedef int (*Ipcom_sysvar_for_each)(const char *name, const char *value, int flags, void *cookie);
#ifdef IPCOM_USE_SYSVAR_EXT
/*
* Traditionally, for each component, there are two types of system global
* variables (sysvar) supported by the stack:
* 1) sysvar that applies globally to all interfaces
* 2) sysvar that can be configured on a per-interface basis
*
* Although the Ipcom_sysvar_struct supports both type of sysvar
* configurations, it does not provide an easy mechanism to configure the
* interface specific sysvar especially when multiple interfaces are involved.
* Let say, to configure the radvd's 'MinRtrAdvInterval' for differnt
* interfaces, user must explicitly list the desirable 'MinRtrAdvInterval'
* value for each interface as follows:
*
* {"ipnet.inet6.radvd.eth0.MinRtrAdvInterval", "10000"}
* {"ipnet.inet6.radvd.eth1.MinRtrAdvInterval", "20000"}
*
* Ipcom_sysvar_ext_struct is an extension to Ipcom_sysvar_struct created
* specifically to handle any interface specific sysvar. User would provide
* a list of values associated with interface(s) for a given sysvar in the
* <param> field. The <param> field must be in the form of
* "<ifparam>=<value>" with a '=' separated the <ifparam> and <value>. Each
* pair of "<ifparam>=<value>" is semicolon separated. The general syntax is
* as follows:
*
* {"<sysvar name>, <sysvar ext name>,
* "<ifparam1>=<value1>;<ifparam2>=<value2>;..."}
*
* Using the 'MinRtrAdvInterval' example, user would then specify the value
* of the 'MinRtrAdvInterval' for each interface as follows:
*
* {"ipnet.inet6.radvd","MinRtrAdvInterval", "eth0=10000;eth1=20000"}
*
*/
typedef struct Ipcom_sysvar_ext_struct
{
IP_CONST char *name1; /* sysvar name, if exist */
IP_CONST char *name2; /* sysvar name, if exist */
IP_CONST char *param; /* parameter(s) to configure for the sysvar */
}
Ipcom_sysvar_ext;
#endif /* IPCOM_USE_SYSVAR_EXT */
/*
*===========================================================================
* Ipnet_neigh_observer_action
*===========================================================================
* Description: This function will be called when the sysvar database
* changes.
* NOTE: the observer action hook is called with the sysvar
* database lock held so the hook is NOT allowed to
* make calls to any of the ipcom_sysvar_xxx() functions.
* Parameters: name - name of the sysvar
* value - the new value (for set operation) or IP_NULL for
* unset operation.
* observer_ctx - user defined context specific data
* Returns:
*
*/
typedef void (*Ipcom_sysvar_observer_action) (const char *name,
const char *value,
void *observer_ctx);
/*
****************************************************************************
* 6 FUNCTIONS
****************************************************************************
*/
IP_GLOBAL void ipcom_sysvar_add_observer(Ipcom_observer *observer,
void *observer_ctx,
Ipcom_sysvar_observer_action action);
IP_GLOBAL void ipcom_sysvar_remove_observer(Ipcom_observer *observer);
IP_GLOBAL Ip_err ipcom_sysvar_set_tree(const char *name, const char *value, int flags, Ipcom_sysvar_tree *tree);
/*******************************************************************************
*
* ipcom_sysvar_get - get a system variable
*
* DESCRIPTION
* This routine gets a system variable.
*
* Parameters:
* \is
* \i <name>
* The name of the system variable to fetch.
* \i <value>
* Buffer to store the system variable in. If NULL, a buffer will be allocated
* that must be freed by the caller. If the provided buffer is too small,
* NULL will be returned and <value_size> will be updated to the length of the
* system variable.
* \i <value_size>
* Size of the value buffer
* \ie
*
* RETURNS: The string value stored under <name>, or NULL.
*
* ERRNO:
*/
IP_PUBLIC char * ipcom_sysvar_get(
const char *name,
char *value,
Ip_size_t *value_size
);
/*******************************************************************************
*
* ipcom_sysvar_getvr - get a system variable
*
* DESCRIPTION
* This routine gets a system variable.
*
* Parameters:
* \is
* \i <name>
* The name of the system variable to fetch.
* \i <value>
* Buffer to store the system variable in. If NULL, a buffer will be allocated
* that must be freed by the caller. If the provided buffer is too small,
* NULL will be returned and <value_size> will be updated to the length of the
* system variable.
* \i <value_size>
* Size of the value buffer
* \i <vr>
* Virtual router, -1 will resolve current.
* \ie
*
* RETURNS: The string value stored under <name> in the virtual router <vr>, or NULL.
*
* ERRNO:
*/
IP_PUBLIC char * ipcom_sysvar_getvr
(
const char *name,
char *value,
Ip_size_t *value_size,
int vr
);
/*******************************************************************************
*
* ipcom_sysvar_get_as_int - get a system variable as an integer
*
* DESCRIPTION
* This routine gets a system variable as an integer.
*
* Parameters:
* \is
* \i <name>
* The name of the system variable to fetch.
* \i <default_value>
* Default value returned in case the system variable is not set.
* \ie
*
* RETURNS: Integer value stored under <name> or <default_value> if not found.
*
* ERRNO:
*/
IP_PUBLIC int ipcom_sysvar_get_as_int(
const char *name,
int default_value
);
/*******************************************************************************
*
* ipcom_sysvar_get_as_int_vr - get a special VR system variable as an integer
*
* DESCRIPTION
* This routine gets a VR system variable as an integer.
*
* Parameters:
* \is
* \i <name>
* The name of the system variable to fetch.
* \i <default_value>
* Default value returned in case the system variable is not set.
* \i <vr>
* The VR number of the system variable belongs to.
* \ie
*
* RETURNS: Integer value stored under <name> or <default_value> if not found.
*
* ERRNO:
*/
IP_PUBLIC int ipcom_sysvar_get_as_int_vr(
const char *name,
int default_value,
int vr
);
/*
*===========================================================================
* ipcom_sysvar_get_conf
*===========================================================================
* Description: Tries to get <name> configuration in three places:
* 1) if <username) -> ipcom.users.<username>.<name>
* 2) if <ifname> -> ipcom.if.<ifname>.<name>
* 3) <name>
* Parameters:
* Returns:
*/
IP_PUBLIC char *
ipcom_sysvar_get_conf(const char *name, char *value, Ip_size_t *value_size,
const char *username, const char *ifname);
/*
*===========================================================================
* ipcom_sysvar_get_conf_as_int
*===========================================================================
* Description:
* Parameters:
* Returns: Integer config value stored under 'name' or -1 if not found.
*/
IP_PUBLIC int
ipcom_sysvar_get_conf_as_int(const char *name,
const char *username, const char *ifname);
/*******************************************************************************
*
* ipcom_sysvar_set - set a system variable
*
* DESCRIPTION
* This routine sets a system variable.
*
* Parameters:
* \is
* \i <name>
* The name of the system variable to set.
* \i <value>
* New value for the system variable specified by <name>.
* \i <flags>
* The following flags are defined:
* \is
* \i IPCOM_SYSVAR_FLAG_OVERWRITE
* OK to overwrite sysvar.
* \i IPCOM_SYSVAR_FLAG_READONLY
* Sysvar cannot be changed.
* \i IPCOM_SYSVAR_FLAG_NOCREATE
* Not OK to create new sysvar.
* \i IPCOM_SYSVAR_FLAG_TMP
* Temporary sysvar.
* \ie
* \ie
*
* RETURNS:
* \is
* \i IPCOM_SUCCESS
* Variable was successfully updated.
* \i IPCOM_ERR_DUPLICATE
* Variable exists and IPCOM_SYSVAR_FLAG_OVERWRITE is not set.
* \i IPCOM_ERR_NO_MEMORY
* Not enough memory is available in the system to complete the operation.
* \i IPCOM_ERR_READONLY
* Variable has this flag set.
* \i IPCOM_ERR_FAILED
* Variable does not exist and IPCOM_SYSVAR_FLAG_NOCREATE flag is set.
* \ie
*
* ERRNO:
*/
IP_PUBLIC Ip_err ipcom_sysvar_set(
const char *name,
const char *value,
int flags
);
/*******************************************************************************
*
* ipcom_sysvar_setvr - set a system variable
*
* DESCRIPTION
* This routine sets a system variable.
*
* Parameters:
* \is
* \i <name>
* The name of the system variable to set.
* \i <value>
* New value for the system variable specified by <name>.
* \i <flags>
* The following flags are defined:
* \i <vr>
* Virtual router to operate in, -1 will resolve current.
* \is
* \i IPCOM_SYSVAR_FLAG_OVERWRITE
* OK to overwrite sysvar.
* \i IPCOM_SYSVAR_FLAG_READONLY
* Sysvar cannot be changed.
* \i IPCOM_SYSVAR_FLAG_NOCREATE
* Not OK to create new sysvar.
* \i IPCOM_SYSVAR_FLAG_TMP
* Temporary sysvar.
* \ie
* \ie
*
* RETURNS:
* \is
* \i IPCOM_SUCCESS
* Variable was successfully updated.
* \i IPCOM_ERR_DUPLICATE
* Variable exists and IPCOM_SYSVAR_FLAG_OVERWRITE is not set.
* \i IPCOM_ERR_NO_MEMORY
* Not enough memory is available in the system to complete the operation.
* \i IPCOM_ERR_READONLY
* Variable has this flag set.
* \i IPCOM_ERR_FAILED
* Variable does not exist and IPCOM_SYSVAR_FLAG_NOCREATE flag is set.
* \ie
*
* ERRNO:
*/
IP_PUBLIC Ip_err ipcom_sysvar_setvr
(
const char *name,
const char *value,
int flags,
int vr
);
#define IPCOM_SYSVAR_FLAG_OVERWRITE 0x01 /* Ok to overwrite sysvar */
#define IPCOM_SYSVAR_FLAG_READONLY 0x02 /* Sysvar can not be changed */
#define IPCOM_SYSVAR_FLAG_NOCREATE 0x04 /* Not ok to create new sysvar */
#define IPCOM_SYSVAR_FLAG_TMP 0x08 /* Temporary sysvar. */
#define IPCOM_SYSVAR_FLAG_MODIFIED 0x10 /* Sysvar has been modified. */
#define IPCOM_SYSVAR_FLAG_KERNEL 0x20 /* LKM sysvar */
#define IPCOM_SYSVAR_FLAG_INIT 0x40 /* Added by INIT */
/*******************************************************************************
*
* ipcom_sysvar_set0 - set a system variable
*
* DESCRIPTION
* This routine sets a system variable explicitly in vr0
*
* Parameters:
* \is
* \i <name>
* The name of the system variable to set.
* \i <value>
* New value for the system variable specified by <name>.
* \i <flags>
* The following flags are defined:
* \is
* \i IPCOM_SYSVAR_FLAG_OVERWRITE
* OK to overwrite sysvar.
* \i IPCOM_SYSVAR_FLAG_READONLY
* Sysvar cannot be changed.
* \i IPCOM_SYSVAR_FLAG_NOCREATE
* Not OK to create new sysvar.
* \i IPCOM_SYSVAR_FLAG_TMP
* Temporary sysvar.
* \ie
* \ie
*
* RETURNS:
* \is
* \i IPCOM_SUCCESS
* Variable was successfully updated.
* \i IPCOM_ERR_DUPLICATE
* Variable exists and IPCOM_SYSVAR_FLAG_OVERWRITE is not set.
* \i IPCOM_ERR_NO_MEMORY
* Not enough memory is available in the system to complete the operation.
* \i IPCOM_ERR_READONLY
* Variable has this flag set.
* \i IPCOM_ERR_FAILED
* Variable does not exist and IPCOM_SYSVAR_FLAG_NOCREATE flag is set.
* \ie
*
* ERRNO:
*/
IP_PUBLIC Ip_err ipcom_sysvar_set0(
const char *name,
const char *value,
int flags
);
/*******************************************************************************
*
* ipcom_sysvar_setv - set an array of values
*
* DESCRIPTION
* This routine sets an array of values.
*
* Parameters:
* \is
* \i <entries>
* Array of name/value pairs. Ends with an element where both name and value are IP_NULL.
* \i <flags>
* 'IPCOM_SYSVAR_FLAG_'<xxx> flags, which applies to all elements.
* \ie
*
* RETURNS:
* \is
* \i IPCOM_SUCCESS
* Variable was successfully updated.
* \i IPCOM_ERR_DUPLICATE
* Variable exists and IPCOM_SYSVAR_FLAG_OVERWRITE is not set.
* \i IPCOM_ERR_NO_MEMORY
* Not enough memory is available in the system to complete the operation.
* \i IPCOM_ERR_READONLY
* Variable has this flag set.
* \i IPCOM_ERR_FAILED
* Variable does not exist and IPCOM_SYSVAR_FLAG_NOCREATE flag is set.
* \ie
*
* ERRNO:
*/
IP_PUBLIC Ip_err ipcom_sysvar_setv(
const Ipcom_sysvar entries[],
int flags
);
#ifdef IPCOM_USE_SYSVAR_EXT
/*
*===========================================================================
* ipcom_sysvar_ext_setv
*===========================================================================
* Description: Atomically sets an array of values for interface-specific
* parameters.
* Parameters: entries - Array of name/ext_name/value pairs. Ends with a
* element where both name and vaulue is IP_NULL.
* flags - IPCOM_SYSVAR_FLAG_xxx flags, applies to all elements.
* Returns:
*/
IP_PUBLIC Ip_err
ipcom_sysvar_ext_setv(const Ipcom_sysvar_ext entries[], int flags);
#endif /* IPCOM_USE_SYSVAR_EXT */
/*
*===========================================================================
* ipcom_sysvar_set_conf
*===========================================================================
* Description:
* Parameters:
* Returns:
*/
IP_PUBLIC Ip_err
ipcom_sysvar_set_conf(const char *name, const char *value, int flags,
const char *username, const char *ifname);
/*******************************************************************************
*
* ipcom_sysvar_unset - delete a system variable or range of variables
*
* DESCRIPTION
* This routine deletes a system variable or range of variables.
*
* Parameter:
* \is
* \i <name>
* Name of the system variable to delete. If the last character in the name
* is '*', all systems variables starting with <name> will be deleted.
* \ie
*
* RETURNS:
* \is
* \i IPCOM_SUCCESS
* System variable was successfully deleted.
* \i IPCOM_ERR_NOT_FOUND
* System variable does not exist.
* \i IPCOM_ERR_READONLY
* System variable is read-only.
* \i IPCOM_ERR_NO_MEMORY
* Insufficient memory available to complete the operation.
* \ie
*
* ERRNO:
*/
IP_PUBLIC Ip_err ipcom_sysvar_unset(
const char *name
);
/*******************************************************************************
*
* ipcom_sysvar_for_each - invoke callback function on system variables
*
* DESCRIPTION
* This routine calls the callback function for all matching system variables.
*
* Parameters:
* \is
* \i <name>
* Defines a filter used to determine matching system variables. All system
* variables starting with <name> will be called.
* \i <cb_func>
* The callback function to call.
* \i <cookie>
* Argument provided in callback function in addition to matching system variable.
* \ie
*
* RETURNS:
* \is
* \i IPCOM_SUCCESS
* Variable was successfully updated.
* \i IPCOM_ERR_DUPLICATE
* Variable exists and IPCOM_SYSVAR_FLAG_OVERWRITE is not set.
* \i IPCOM_ERR_NO_MEMORY
* Not enough memory is available in the system to complete the operation.
* \i IPCOM_ERR_READONLY
* Variable has this flag set.
* \i IPCOM_ERR_FAILED
* Variable does not exist and IPCOM_SYSVAR_FLAG_NOCREATE flag is set.
* \ie
*
* ERRNO:
*/
IP_PUBLIC Ip_err ipcom_sysvar_for_each(
const char *name,
Ipcom_sysvar_for_each cb_func,
void *cookie
);
/*
****************************************************************************
* 7 VR0 FUNCTIONS
****************************************************************************
*/
IP_PUBLIC char *
ipcom_sysvar_get0(const char *name, char *value, Ip_size_t *value_size);
IP_PUBLIC int
ipcom_sysvar_get_as_int0(const char *name, int default_value);
/*
*===========================================================================
* ipcom_sysvar_get_descriptive_int0
*===========================================================================
* Description:
* Parameters: name - name of the sysvar to get.
* default_value - will be put into 'value' if something goes
* with the variable lookup.
* value - pointer to where the integer will be stored.
* map - IP_NULL or a pointer to a string to int map.
* Returns: 0 = specified sysvar was found and successfully converted to int.
* <0 = sysvar not found
* >0 = sysvar found but was not found in the map (if map != IP_NULL),
the value was interpreted as a integer string representation
*/
IP_PUBLIC int
ipcom_sysvar_get_descriptive_int0(const char *name,
int default_value,
int *value,
const Ipcom_cmd_int_str_map *map);
/*
*===========================================================================
* ipcom_sysvar_get_descriptive_int_vr
*===========================================================================
* Description: Returns the value of a specific sysvar in a vr as an integer.
* Parameters: name - name of the sysvar
* default_value - the value that will be loaded into "value"
* if sysvar "name" does not exists.
* value - points to the location where the integer will be
* stored
* map - mapping from a name to an integer value or IP_NULL
* vr - the vr this sysvar belongs to
* Returns: -1 = sysvar "name" does not exist
* 0 = value was given by mapping name to integer via "map"
* 1 = value was given by transforming the string value to
* its corresponding integer value via ipcom_atoi().
*/
IP_PUBLIC int
ipcom_sysvar_get_descriptive_int_vr(const char *name,
int default_value,
int *value,
const Ipcom_cmd_int_str_map *map,
int vr);
#ifdef __cplusplus
}
#endif
#endif
/*
****************************************************************************
* END OF FILE
****************************************************************************
*/