#ifndef _SCTP_ADDR_H
#define _SCTP_ADDR_H
#include <sys/list.h>
#include <sys/zone.h>
#include <inet/ip.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct sctp_ipif_s {
list_node_t sctp_ipifs;
struct sctp_ill_s *sctp_ipif_ill;
uint_t sctp_ipif_id;
in6_addr_t sctp_ipif_saddr;
int sctp_ipif_state;
uint32_t sctp_ipif_refcnt;
zoneid_t sctp_ipif_zoneid;
krwlock_t sctp_ipif_lock;
boolean_t sctp_ipif_isv6;
uint64_t sctp_ipif_flags;
} sctp_ipif_t;
#define SCTP_IPIFS_CONDEMNED -1
#define SCTP_IPIFS_INVALID -2
#define SCTP_IPIFS_DOWN 1
#define SCTP_IPIFS_UP 2
typedef struct sctp_saddrs_ipif_s {
list_node_t saddr_ipif;
sctp_ipif_t *saddr_ipifp;
uint32_t saddr_ipif_dontsrc : 1,
saddr_ipif_delete_pending : 1,
saddr_ipif_unconfirmed : 1,
pad : 29;
} sctp_saddr_ipif_t;
#define SCTP_DONT_SRC(sctp_saddr) \
((sctp_saddr)->saddr_ipif_dontsrc || \
(sctp_saddr)->saddr_ipif_unconfirmed)
typedef struct sctp_ill_s {
list_node_t sctp_ills;
int sctp_ill_name_length;
char *sctp_ill_name;
int sctp_ill_state;
uint32_t sctp_ill_ipifcnt;
uint_t sctp_ill_index;
uint64_t sctp_ill_flags;
boolean_t sctp_ill_isv6;
netstack_t *sctp_ill_netstack;
} sctp_ill_t;
#define SCTP_ILLS_CONDEMNED -1
#define SCTP_ILL_HASH 16
typedef struct sctp_ill_hash_s {
list_t sctp_ill_list;
int ill_count;
} sctp_ill_hash_t;
#define SCTP_IPIF_REFHOLD(sctp_ipif) { \
rw_enter(&(sctp_ipif)->sctp_ipif_lock, RW_WRITER); \
(sctp_ipif)->sctp_ipif_refcnt++; \
rw_exit(&(sctp_ipif)->sctp_ipif_lock); \
}
#define SCTP_IPIF_REFRELE(sctp_ipif) { \
rw_enter(&(sctp_ipif)->sctp_ipif_lock, RW_WRITER); \
ASSERT((sctp_ipif)->sctp_ipif_refcnt != 0); \
if (--(sctp_ipif)->sctp_ipif_refcnt == 0 && \
(sctp_ipif)->sctp_ipif_state == SCTP_IPIFS_CONDEMNED) { \
rw_exit(&(sctp_ipif)->sctp_ipif_lock); \
sctp_ipif_inactive(sctp_ipif); \
} else { \
rw_exit(&(sctp_ipif)->sctp_ipif_lock); \
} \
}
#define SCTP_ADDR_EQUAL 1
#define SCTP_ADDR_SUBSET 2
#define SCTP_ADDR_OVERLAP 3
#define SCTP_ADDR_DISJOINT 4
extern int sctp_valid_addr_list(sctp_t *, const void *, uint32_t,
uchar_t *, size_t);
extern int sctp_dup_saddrs(sctp_t *, sctp_t *, int);
extern int sctp_compare_saddrs(sctp_t *, sctp_t *);
extern sctp_saddr_ipif_t *sctp_saddr_lookup(sctp_t *, in6_addr_t *,
uint_t);
extern in6_addr_t sctp_get_valid_addr(sctp_t *, boolean_t, boolean_t *);
extern size_t sctp_saddr_info(sctp_t *, int, uchar_t *, boolean_t);
extern void sctp_del_saddr_list(sctp_t *, const void *, int,
boolean_t);
extern void sctp_del_saddr(sctp_t *, sctp_saddr_ipif_t *);
extern void sctp_free_saddrs(sctp_t *);
extern void sctp_saddr_init(sctp_stack_t *);
extern void sctp_saddr_fini(sctp_stack_t *);
extern int sctp_getmyaddrs(void *, void *, int *);
extern int sctp_saddr_add_addr(sctp_t *, in6_addr_t *, uint_t);
extern void sctp_check_saddr(sctp_t *, int, boolean_t,
in6_addr_t *);
#ifdef __cplusplus
}
#endif
#endif