/*
 * Smux module authored by Rohit Dube.
 * Rewritten by Nick Amato <naamato@merit.net>.
 */

#ifndef NETSNMP_TRANSPORT_IPV4BASE_DOMAIN
config_error(smux/smux depends on the IPv4Base transport domain)
#endif

config_belongs_in(agent_module)

#define SMUXPORT 199

#define SMUXMAXPKTSIZE 1500
#define SMUXMAXSTRLEN  1024
#define SMUXMAXPEERS   10

#define SMUX_OPEN 	(ASN_APPLICATION | ASN_CONSTRUCTOR | 0)
#define SMUX_CLOSE      (ASN_APPLICATION | ASN_PRIMITIVE | 1)
#define SMUX_RREQ       (ASN_APPLICATION | ASN_CONSTRUCTOR | 2)
#define SMUX_RRSP       (ASN_APPLICATION | ASN_PRIMITIVE | 3)
#define SMUX_SOUT       (ASN_APPLICATION | ASN_PRIMITIVE | 4)

#define SMUX_GET        (ASN_CONTEXT | ASN_CONSTRUCTOR | 0)
#define SMUX_GETNEXT    (ASN_CONTEXT | ASN_CONSTRUCTOR | 1)
#define SMUX_GETRSP     (ASN_CONTEXT | ASN_CONSTRUCTOR | 2)
#define SMUX_SET	(ASN_CONTEXT | ASN_CONSTRUCTOR | 3)
#define SMUX_TRAP	(ASN_CONTEXT | ASN_CONSTRUCTOR | 4)

#define SMUXC_GOINGDOWN                    0
#define SMUXC_UNSUPPORTEDVERSION           1
#define SMUXC_PACKETFORMAT                 2
#define SMUXC_PROTOCOLERROR                3
#define SMUXC_INTERNALERROR                4
#define SMUXC_AUTHENTICATIONFAILURE        5

#define SMUX_MAX_PEERS          10
#define SMUX_MAX_PRIORITY       2147483647

#define SMUX_REGOP_DELETE		0
#define SMUX_REGOP_REGISTER_RO		1
#define SMUX_REGOP_REGISTER_RW		2

/*
 * Authorized peers read from the config file
 */
typedef struct _smux_peer_auth {
    oid             sa_oid[MAX_OID_LEN];        /* name of peer                 */
    size_t          sa_oid_len; /* length of peer name          */
    char            sa_passwd[SMUXMAXSTRLEN];   /* configured passwd            */
    int             sa_active_fd;       /* the peer using this auth     */
} smux_peer_auth;

/*
 * Registrations
 */
typedef struct _smux_reg {
    oid             sr_name[MAX_OID_LEN];       /* name of subtree              */
    size_t          sr_name_len;        /* length of subtree name       */
    int             sr_priority;        /* priority of registration     */
    int             sr_fd;      /* descriptor of owner          */
    struct _smux_reg *sr_next;  /* next one                     */
    netsnmp_handler_registration *reginfo;
} smux_reg;

extern void     init_smux(void);
extern void     real_init_smux(void);
extern int      smux_accept(int);
extern u_char  *smux_snmp_process(int, oid *, size_t *, size_t *, u_char *,
                                  int);
extern int      smux_process(int);
extern void     smux_parse_peer_auth(const char *, char *);
extern void     smux_free_peer_auth(void);

/* Add socket-fd to list */
int smux_snmp_select_list_add(int sd);

/* Remove socket-fd from list */
int smux_snmp_select_list_del(int sd);

/* Returns the count of added socket-fd's in the list */
int smux_snmp_select_list_get_length(void);

/* Returns the socket-fd number from the position of the list */
int smux_snmp_select_list_get_SD_from_List(int pos);

