summaryrefslogtreecommitdiffstats
path: root/sys/netinet/sctp_pcb.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet/sctp_pcb.h')
-rw-r--r--sys/netinet/sctp_pcb.h141
1 files changed, 116 insertions, 25 deletions
diff --git a/sys/netinet/sctp_pcb.h b/sys/netinet/sctp_pcb.h
index e822d41..8c0be0c 100644
--- a/sys/netinet/sctp_pcb.h
+++ b/sys/netinet/sctp_pcb.h
@@ -44,12 +44,16 @@ LIST_HEAD(sctppcbhead, sctp_inpcb);
LIST_HEAD(sctpasochead, sctp_tcb);
LIST_HEAD(sctpladdr, sctp_laddr);
LIST_HEAD(sctpvtaghead, sctp_tagblock);
+LIST_HEAD(sctp_vrflist, sctp_vrf);
+LIST_HEAD(sctp_ifnlist, sctp_ifn);
+LIST_HEAD(sctp_ifalist, sctp_ifa);
TAILQ_HEAD(sctp_readhead, sctp_queued_to_read);
TAILQ_HEAD(sctp_streamhead, sctp_stream_queue_pending);
#include <netinet/sctp_structs.h>
#include <netinet/sctp_uio.h>
#include <netinet/sctp_auth.h>
+#include <netinet/sctp_bsd_addr.h>
/*
* PCB flags (in sctp_flags bitmask)
@@ -106,10 +110,60 @@ TAILQ_HEAD(sctp_streamhead, sctp_stream_queue_pending);
#define SCTP_PCBHASH_ALLADDR(port, mask) (port & mask)
#define SCTP_PCBHASH_ASOC(tag, mask) (tag & mask)
+struct sctp_vrf {
+ LIST_ENTRY(sctp_vrf) next_vrf;
+ struct sctp_ifnlist ifnlist;
+ uint32_t vrf_id;
+ uint32_t total_ifa_count;
+};
+
+struct sctp_ifn {
+ struct sctp_ifalist ifalist;
+ struct sctp_vrf *vrf;
+ LIST_ENTRY(sctp_ifn) next_ifn;
+ void *ifn_p; /* never access without appropriate lock */
+ uint32_t ifn_type;
+ uint32_t ifn_index; /* shorthand way to look at ifn for reference */
+ uint32_t refcount; /* number of reference held should be >=
+ * ifa_count */
+ uint32_t ifa_count; /* IFA's we hold (in our list - ifalist) */
+ char ifn_name[SCTP_IFNAMSIZ];
+};
+
+/* SCTP local IFA flags */
+#define SCTP_ADDR_VALID 0x00000001 /* its up and active */
+#define SCTP_BEING_DELETED 0x00000002 /* being deleted, when
+ * refcount = 0. Note that it
+ * is pulled from the ifn list
+ * and ifa_p is nulled right
+ * away but it cannot be freed
+ * until the last *net
+ * pointing to it is deleted. */
+#define SCTP_ADDR_DEFER_USE 0x00000004 /* Hold off using this one */
+#define SCTP_ADDR_IFA_UNUSEABLE 0x00000008
+
+struct sctp_ifa {
+ LIST_ENTRY(sctp_ifa) next_ifa;
+ struct sctp_ifn *ifn_p; /* back pointer to parent ifn */
+ void *ifa; /* pointer to ifa, needed for flag update for
+ * that we MUST lock appropriate locks. This
+ * is for V6. */
+ union sctp_sockstore address;
+ uint32_t refcount; /* number of folks refering to this */
+ uint32_t flags;
+ uint32_t localifa_flags;
+ uint8_t src_is_loop;
+ uint8_t src_is_priv;
+ uint8_t src_is_glob;
+ uint8_t resv;
+};
+
struct sctp_laddr {
LIST_ENTRY(sctp_laddr) sctp_nxt_addr; /* next in list */
- struct ifaddr *ifa;
- int action; /* Only used in delayed asconf stuff */
+ struct sctp_ifa *ifa;
+ uint32_t action; /* Used during asconf and adding if no-zero
+ * src-addr selection will not consider this
+ * address. */
};
struct sctp_block_entry {
@@ -126,7 +180,6 @@ struct sctp_tagblock {
struct sctp_timewait vtag_block[SCTP_NUMBER_IN_VTAG_BLOCK];
};
-
struct sctp_epinfo {
struct sctpasochead *sctp_asochash;
u_long hashasocmark;
@@ -153,6 +206,9 @@ struct sctp_epinfo {
u_long hashtcpmark;
uint32_t hashtblsize;
+ struct sctp_vrflist *sctp_vrfhash;
+ u_long hashvrfmark;
+
struct sctppcbhead listhead;
struct sctpladdr addr_wq;
@@ -169,8 +225,8 @@ struct sctp_epinfo {
struct mtx ipi_ep_mtx;
struct mtx it_mtx;
+ struct mtx ipi_iterator_wq_mtx;
struct mtx ipi_addr_mtx;
- struct mtx timer_mtx;
uint32_t ipi_count_ep;
/* assoc/tcb zone info */
@@ -197,12 +253,15 @@ struct sctp_epinfo {
struct sctpvtaghead vtag_timewait[SCTP_STACK_VTAG_HASH_SIZE];
+ /* address work queue handling */
+#if defined(SCTP_USE_THREAD_BASED_ITERATOR)
+ uint32_t iterator_running;
+ SCTP_PROCESS_STRUCT thread_proc;
+#endif
struct sctp_timer addr_wq_timer;
};
-extern struct sctpstat sctpstat;
-
/*
* Here we have all the relevant information for each SCTP entity created. We
* will need to modify this as approprate. We also need to figure out how to
@@ -218,9 +277,9 @@ struct sctp_pcb {
unsigned int sctp_minrto;
unsigned int sctp_maxrto;
unsigned int initial_rto;
-
int initial_init_rto_max;
+ unsigned int sctp_sack_freq;
uint32_t sctp_sws_sender;
uint32_t sctp_sws_receiver;
@@ -294,11 +353,15 @@ struct sctp_inpcb {
LIST_ENTRY(sctp_inpcb) sctp_hash;
/* count of local addresses bound, 0 if bound all */
int laddr_count;
- /* list of addrs in use by the EP */
+
+ /* list of addrs in use by the EP, NULL if bound-all */
struct sctpladdr sctp_addr_list;
- /* used for source address selection rotation */
+ /*
+ * used for source address selection rotation when we are subset
+ * bound
+ */
struct sctp_laddr *next_addr_touse;
- struct ifnet *next_ifn_touse;
+
/* back pointer to our socket */
struct socket *sctp_socket;
uint32_t sctp_flags; /* INP state flag set */
@@ -329,6 +392,7 @@ struct sctp_inpcb {
struct mtx inp_create_mtx;
struct mtx inp_rdata_mtx;
int32_t refcount;
+ uint32_t def_vrf_id;
uint32_t total_sends;
uint32_t total_recvs;
uint32_t last_abort_code;
@@ -371,15 +435,36 @@ struct sctp_tcb {
#if defined(_KERNEL)
extern struct sctp_epinfo sctppcbinfo;
-extern int sctp_auto_asconf;
int SCTP6_ARE_ADDR_EQUAL(struct in6_addr *a, struct in6_addr *b);
void sctp_fill_pcbinfo(struct sctp_pcbinfo *);
+struct sctp_ifn *
+ sctp_find_ifn(struct sctp_vrf *vrf, void *ifn, uint32_t ifn_index);
+
+struct sctp_vrf *sctp_allocate_vrf(int vrfid);
+
+struct sctp_vrf *sctp_find_vrf(uint32_t vrfid);
+
+struct sctp_ifa *
+sctp_add_addr_to_vrf(uint32_t vrfid,
+ void *ifn, uint32_t ifn_index, uint32_t ifn_type,
+ const char *if_name,
+ void *ifa, struct sockaddr *addr, uint32_t ifa_flags);
+
+void sctp_free_ifa(struct sctp_ifa *sctp_ifap);
+
+struct sctp_ifa *
+sctp_del_addr_from_vrf(uint32_t vrfid, struct sockaddr *addr,
+ uint32_t ifn_index);
+
+
+
+
struct sctp_nets *sctp_findnet(struct sctp_tcb *, struct sockaddr *);
-struct sctp_inpcb *sctp_pcb_findep(struct sockaddr *, int, int);
+struct sctp_inpcb *sctp_pcb_findep(struct sockaddr *, int, int, uint32_t);
int sctp_inpcb_bind(struct socket *, struct sockaddr *, struct thread *);
@@ -391,7 +476,7 @@ sctp_findassociation_addr(struct mbuf *, int, int,
struct sctp_tcb *
sctp_findassociation_addr_sa(struct sockaddr *,
- struct sockaddr *, struct sctp_inpcb **, struct sctp_nets **, int);
+ struct sockaddr *, struct sctp_inpcb **, struct sctp_nets **, int, uint32_t);
void
sctp_move_pcb_and_assoc(struct sctp_inpcb *, struct sctp_inpcb *,
@@ -418,28 +503,29 @@ sctp_findassociation_ep_asconf(struct mbuf *, int, int,
int sctp_inpcb_alloc(struct socket *);
-int sctp_is_address_on_local_host(struct sockaddr *addr);
+int sctp_is_address_on_local_host(struct sockaddr *addr, uint32_t vrf_id);
void sctp_inpcb_free(struct sctp_inpcb *, int, int);
struct sctp_tcb *
sctp_aloc_assoc(struct sctp_inpcb *, struct sockaddr *,
- int, int *, uint32_t);
+ int, int *, uint32_t, uint32_t);
int sctp_free_assoc(struct sctp_inpcb *, struct sctp_tcb *, int, int);
void
sctp_add_vtag_to_timewait(struct sctp_inpcb *, uint32_t, uint32_t);
-int sctp_add_local_addr_ep(struct sctp_inpcb *, struct ifaddr *);
+int sctp_add_local_addr_ep(struct sctp_inpcb *, struct sctp_ifa *, uint32_t);
-int sctp_insert_laddr(struct sctpladdr *, struct ifaddr *);
+int sctp_insert_laddr(struct sctpladdr *, struct sctp_ifa *, uint32_t);
void sctp_remove_laddr(struct sctp_laddr *);
-int sctp_del_local_addr_ep(struct sctp_inpcb *, struct ifaddr *);
+int sctp_del_local_addr_ep(struct sctp_inpcb *, struct sctp_ifa *);
+
+void sctp_set_initial_cc_param(struct sctp_tcb *, struct sctp_nets *net);
-int sctp_del_local_addr_ep_sa(struct sctp_inpcb *, struct sockaddr *);
int sctp_add_remote_addr(struct sctp_tcb *, struct sockaddr *, int, int);
@@ -449,11 +535,9 @@ int sctp_del_remote_addr(struct sctp_tcb *, struct sockaddr *);
void sctp_pcb_init(void);
-int sctp_add_local_addr_assoc(struct sctp_tcb *, struct ifaddr *);
-
-int sctp_del_local_addr_assoc(struct sctp_tcb *, struct ifaddr *);
+int sctp_add_local_addr_assoc(struct sctp_tcb *, struct sctp_ifa *, int);
-int sctp_del_local_addr_assoc_sa(struct sctp_tcb *, struct sockaddr *);
+int sctp_del_local_addr_assoc(struct sctp_tcb *, struct sctp_ifa *);
int
sctp_load_addresses_from_init(struct sctp_tcb *, struct mbuf *, int, int,
@@ -474,8 +558,15 @@ int sctp_destination_is_reachable(struct sctp_tcb *, struct sockaddr *);
* indicates run on ONLY assoc's of the specified endpoint.
*/
int
-sctp_initiate_iterator(inp_func inpf, asoc_func af, uint32_t, uint32_t,
- uint32_t, void *, uint32_t, end_func ef, struct sctp_inpcb *, uint8_t co_off);
+sctp_initiate_iterator(inp_func inpf,
+ asoc_func af,
+ inp_func inpe,
+ uint32_t, uint32_t,
+ uint32_t, void *,
+ uint32_t,
+ end_func ef,
+ struct sctp_inpcb *,
+ uint8_t co_off);
#endif /* _KERNEL */
OpenPOWER on IntegriCloud