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

#ifndef _MIBGROUP_VACM_H
#define _MIBGROUP_VACM_H

#include "vacm.h"

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

void init_vacm_vars (void);
void vacm_free_security (void);
void vacm_free_group (void);
void vacm_free_access (void);
void vacm_free_view (void);
void vacm_parse_security (const char *, char *);
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;

int vacm_in_view (struct snmp_pdu *, oid *, size_t);

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 */
