#ifndef _INET_OPTCOM_H
#define _INET_OPTCOM_H
#ifdef __cplusplus
extern "C" {
#endif
#if defined(_KERNEL) && defined(__STDC__)
#include <inet/ipclassifier.h>
typedef struct opdes_s {
t_uscalar_t opdes_name;
t_uscalar_t opdes_level;
int opdes_access_nopriv;
int opdes_access_priv;
int opdes_access_req_priv;
int opdes_props;
t_uscalar_t opdes_size;
union {
#define OPDES_DEFSZ_MAX 64
int64_t opdes_def_int64;
char opdes_def_charbuf[OPDES_DEFSZ_MAX];
} opdes_def;
} opdes_t;
#define opdes_default opdes_def.opdes_def_int64
#define opdes_defbuf opdes_def.opdes_def_charbuf
#define OA_R 0x1
#define OA_W 0x2
#define OA_X 0x4
#define OA_RW (OA_R|OA_W)
#define OA_WX (OA_W|OA_X)
#define OA_RX (OA_R|OA_X)
#define OA_RWX (OA_R|OA_W|OA_X)
#define OA_ANY_ACCESS(x) ((x)->opdes_access_nopriv|(x)->opdes_access_priv)
#define OA_R_NOPRIV(x) ((x)->opdes_access_nopriv & OA_R)
#define OA_R_ANYPRIV(x) (OA_ANY_ACCESS(x) & OA_R)
#define OA_W_NOPRIV(x) ((x)->opdes_access_nopriv & OA_W)
#define OA_X_ANYPRIV(x) (OA_ANY_ACCESS(x) & OA_X)
#define OA_X_NOPRIV(x) ((x)->opdes_access_nopriv & OA_X)
#define OA_W_ANYPRIV(x) (OA_ANY_ACCESS(x) & OA_W)
#define OA_WX_NOPRIV(x) ((x)->opdes_access_nopriv & OA_WX)
#define OA_WX_ANYPRIV(x) (OA_ANY_ACCESS(x) & OA_WX)
#define OA_RWX_ANYPRIV(x) (OA_ANY_ACCESS(x) & OA_RWX)
#define OA_RONLY_NOPRIV(x) (((x)->opdes_access_nopriv & OA_RWX) == OA_R)
#define OA_RONLY_ANYPRIV(x) ((OA_ANY_ACCESS(x) & OA_RWX) == OA_R)
#define OP_NP (-1)
#define OP_CONFIG (0)
#define OP_RAW (1)
#define OP_PRIVPORT (2)
#define OA_POLICY_OK(x, c) \
(secpolicy_ip((c), (x)->opdes_access_req_priv, B_FALSE) == 0)
#define OA_POLICY_ONLY_OK(x, c) \
(secpolicy_ip((c), (x)->opdes_access_req_priv, B_TRUE) == 0)
#define OA_MATCHED_PRIV(x, c) ((x)->opdes_access_req_priv != OP_NP && \
OA_POLICY_ONLY_OK((x), (c)))
#define OA_READ_PERMISSION(x, c) (OA_R_NOPRIV(x) || \
(OA_R_ANYPRIV(x) && OA_POLICY_OK((x), (c))))
#define OA_WRITE_OR_EXECUTE(x, c) (OA_WX_NOPRIV(x) || \
(OA_WX_ANYPRIV(x) && OA_POLICY_OK((x), (c))))
#define OA_READONLY_PERMISSION(x, c) (OA_RONLY_NOPRIV(x) || \
(OA_RONLY_ANYPRIV(x) && OA_POLICY_OK((x), (c))))
#define OA_WRITE_PERMISSION(x, c) (OA_W_NOPRIV(x) || \
(OA_W_ANYPRIV(x) && OA_POLICY_ONLY_OK((x), (c))))
#define OA_EXECUTE_PERMISSION(x, c) (OA_X_NOPRIV(x) || \
(OA_X_ANYPRIV(x) && OA_POLICY_ONLY_OK((x), (c))))
#define OA_NO_PERMISSION(x, c) (OA_MATCHED_PRIV((x), (c)) ? \
((x)->opdes_access_priv == 0) : ((x)->opdes_access_nopriv == 0))
#define OP_VARLEN 0x1
#define OP_NOT_ABSREQ 0x2
#define OP_NODEFAULT 0x4
#define OP_DEF_FN 0x8
typedef t_uscalar_t optlevel_t;
typedef int (*opt_def_fn)(queue_t *, int, int, uchar_t *);
typedef int (*opt_get_fn)(queue_t *, int, int, uchar_t *);
typedef int (*opt_set_fn)(queue_t *, uint_t, int, int, uint_t, uchar_t *,
uint_t *, uchar_t *, void *, cred_t *);
typedef struct optdb_obj {
opt_def_fn odb_deffn;
opt_get_fn odb_getfn;
opt_set_fn odb_setfn;
uint_t odb_opt_arr_cnt;
opdes_t *odb_opt_des_arr;
uint_t odb_valid_levels_arr_cnt;
optlevel_t *odb_valid_levels_arr;
} optdb_obj_t;
#define SETFN_OPTCOM_CHECKONLY 1
#define SETFN_OPTCOM_NEGOTIATE 2
#define SETFN_UD_NEGOTIATE 3
#define SETFN_CONN_NEGOTIATE 4
extern void optcom_err_ack(queue_t *, mblk_t *, t_scalar_t, int);
extern void svr4_optcom_req(queue_t *, mblk_t *, cred_t *, optdb_obj_t *);
extern void tpi_optcom_req(queue_t *, mblk_t *, cred_t *, optdb_obj_t *);
extern int tpi_optcom_buf(queue_t *, mblk_t *, t_scalar_t *, t_scalar_t,
cred_t *, optdb_obj_t *, void *, int *);
extern t_uscalar_t optcom_max_optsize(opdes_t *, uint_t);
extern int optcom_pkt_set(uchar_t *, uint_t, uchar_t **, uint_t *);
extern int process_auxiliary_options(conn_t *, void *, t_uscalar_t,
void *, optdb_obj_t *, int (*)(conn_t *, uint_t, int, int, uint_t,
uchar_t *, uint_t *, uchar_t *, void *, cred_t *), cred_t *);
#endif
#ifdef __cplusplus
}
#endif
#endif