/*
 * SNMPv3 View-based Access Control Model
 */

#ifndef _MIBGROUP_VACM_H
#define _MIBGROUP_VACM_H

#include <net-snmp/library/vacm.h>

config_require(util_funcs)
config_require(mibII/vacm_context)
config_add_mib(SNMP-VIEW-BASED-ACM-MIB)
config_add_mib(SNMP-COMMUNITY-MIB)

     void            init_vacm_vars(void);
     void            vacm_free_group(void);
     void            vacm_free_access(void);
     void            vacm_free_view(void);
     void            vacm_parse_group(const char *, char *);
     void            vacm_parse_access(const char *, char *);
     void            vacm_parse_view(const char *, char *);
     void            vacm_parse_simple(const char *, char *);

     SNMPCallback    vacm_in_view_callback;
     SNMPCallback    vacm_warn_if_not_configured;

     int             vacm_in_view(netsnmp_pdu *, oid *, size_t, int);

     extern FindVarMethod var_vacm_sec2group;
     extern FindVarMethod var_vacm_access;
     extern FindVarMethod var_vacm_view;

     WriteMethod     write_vacmGroupName;
     WriteMethod     write_vacmSecurityToGroupStatus;
     WriteMethod     write_vacmSecurityToGroupStorageType;

     WriteMethod     write_vacmAccessContextMatch;
     WriteMethod     write_vacmAccessNotifyViewName;
     WriteMethod     write_vacmAccessReadViewName;
     WriteMethod     write_vacmAccessWriteViewName;
     WriteMethod     write_vacmAccessStatus;
     WriteMethod     write_vacmAccessStorageType;

     WriteMethod     write_vacmViewSpinLock;
     WriteMethod     write_vacmViewMask;
     WriteMethod     write_vacmViewStatus;
     WriteMethod     write_vacmViewStorageType;
     WriteMethod     write_vacmViewType;


     oid            *access_generate_OID(oid * prefix, size_t prefixLen,
                                         struct vacm_accessEntry *aptr,
                                         size_t * length);
     struct vacm_accessEntry *access_parse_accessEntry(oid * name,
                                                       size_t name_len);
     int             access_parse_oid(oid * oidIndex, size_t oidLen,
                                      unsigned char **groupName,
                                      size_t * groupNameLen,
                                      unsigned char **contextPrefix,
                                      size_t * contextPrefixLen,
                                      int *model, int *level);

     oid            *sec2group_generate_OID(oid * prefix, size_t prefixLen,
                                            struct vacm_groupEntry *geptr,
                                            size_t * length);
     int             sec2group_parse_oid(oid * oidIndex, size_t oidLen,
                                         int *model, unsigned char **name,
                                         size_t * nameLen);
     struct vacm_groupEntry *sec2group_parse_groupEntry(oid * name,
                                                        size_t name_len);

     oid            *view_generate_OID(oid * prefix, size_t prefixLen,
                                       struct vacm_viewEntry *vptr,
                                       size_t * length);
     int             view_parse_oid(oid * oidIndex, size_t oidLen,
                                    unsigned char **viewName,
                                    size_t * viewNameLen, oid ** subtree,
                                    size_t * subtreeLen);
     struct vacm_viewEntry *view_parse_viewEntry(oid * name,
                                                 size_t name_len);



#define OID_SNMPVACMMIB		SNMP_OID_SNMPMODULES, 16
#define OID_VACMMIBOBJECTS	OID_SNMPVACMMIB, 1

#define OID_VACMCONTEXTTABLE	OID_VACMMIBOBJECTS, 1
#define OID_VACMCONTEXTENTRY	OID_VACMCONTEXTTABLE, 1

#define OID_VACMGROUPTABLE	OID_VACMMIBOBJECTS, 2
#define OID_VACMGROUPENTRY	OID_VACMGROUPTABLE, 1

#define OID_VACMACCESSTABLE	OID_VACMMIBOBJECTS, 4
#define OID_VACMACCESSENTRY	OID_VACMACCESSTABLE, 1

#define OID_VACMMIBVIEWS	OID_VACMMIBOBJECTS, 5
#define OID_VACMVIEWTABLE	OID_VACMMIBVIEWS, 2
#define OID_VACMVIEWENTRY	OID_VACMVIEWTABLE, 1
#define SEC2GROUP_MIB_LENGTH 11
#define ACCESS_MIB_LENGTH 11
#define VIEW_MIB_LENGTH 12
#define CM_EXACT 1
#define CM_PREFIX 2

#endif                          /* _MIBGROUP_VACM_H */
