mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-24 11:29:10 +00:00
- Take out the broken table-id concept. Panda Routers have a M-VRF
concept that is NOT well thought out for a multi-homed transport protocol. So the useless table-id entries passed around need to be removed. - Add a event timer for the zero copy api. - Fix a bug in sctp_timer.c when searching for an alternate with the largest ssthresh (the compare was wrong).
This commit is contained in:
parent
2775748750
commit
ad21a36485
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=170181
@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$");
|
||||
#define SCTP_COUNT_LIMIT 40
|
||||
|
||||
#define SCTP_ZERO_COPY_TICK_DELAY (((100 * hz) + 999) / 1000)
|
||||
#define SCTP_ZERO_COPY_SENDQ_TICK_DELAY (((100 * hz) + 999) / 1000)
|
||||
|
||||
/* Number of ticks to delay before running
|
||||
* iterator on an address change.
|
||||
@ -545,8 +546,9 @@ __FBSDID("$FreeBSD$");
|
||||
#define SCTP_TIMER_TYPE_ASOCKILL 18
|
||||
#define SCTP_TIMER_TYPE_ADDR_WQ 19
|
||||
#define SCTP_TIMER_TYPE_ZERO_COPY 20
|
||||
#define SCTP_TIMER_TYPE_ZCOPY_SENDQ 21
|
||||
/* add new timers here - and increment LAST */
|
||||
#define SCTP_TIMER_TYPE_LAST 21
|
||||
#define SCTP_TIMER_TYPE_LAST 22
|
||||
|
||||
#define SCTP_IS_TIMER_TYPE_VALID(t) (((t) > SCTP_TIMER_TYPE_NONE) && \
|
||||
((t) < SCTP_TIMER_TYPE_LAST))
|
||||
@ -685,37 +687,37 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
/* SCTP DEBUG Switch parameters */
|
||||
#define SCTP_DEBUG_TIMER1 0x00000001
|
||||
#define SCTP_DEBUG_TIMER2 0x00000002
|
||||
#define SCTP_DEBUG_TIMER3 0x00000004
|
||||
#define SCTP_DEBUG_TIMER2 0x00000002 /* unused */
|
||||
#define SCTP_DEBUG_TIMER3 0x00000004 /* unused */
|
||||
#define SCTP_DEBUG_TIMER4 0x00000008
|
||||
#define SCTP_DEBUG_OUTPUT1 0x00000010
|
||||
#define SCTP_DEBUG_OUTPUT2 0x00000020
|
||||
#define SCTP_DEBUG_OUTPUT3 0x00000040
|
||||
#define SCTP_DEBUG_OUTPUT4 0x00000080
|
||||
#define SCTP_DEBUG_UTIL1 0x00000100
|
||||
#define SCTP_DEBUG_UTIL2 0x00000200
|
||||
#define SCTP_DEBUG_UTIL2 0x00000200 /* unused */
|
||||
#define SCTP_DEBUG_AUTH1 0x00000400
|
||||
#define SCTP_DEBUG_AUTH2 0x00000800
|
||||
#define SCTP_DEBUG_AUTH2 0x00000800 /* unused */
|
||||
#define SCTP_DEBUG_INPUT1 0x00001000
|
||||
#define SCTP_DEBUG_INPUT2 0x00002000
|
||||
#define SCTP_DEBUG_INPUT3 0x00004000
|
||||
#define SCTP_DEBUG_INPUT4 0x00008000
|
||||
#define SCTP_DEBUG_INPUT4 0x00008000 /* unused */
|
||||
#define SCTP_DEBUG_ASCONF1 0x00010000
|
||||
#define SCTP_DEBUG_ASCONF2 0x00020000
|
||||
#define SCTP_DEBUG_OUTPUT5 0x00040000
|
||||
#define SCTP_DEBUG_XXX 0x00080000
|
||||
#define SCTP_DEBUG_OUTPUT5 0x00040000 /* unused */
|
||||
#define SCTP_DEBUG_XXX 0x00080000 /* unused */
|
||||
#define SCTP_DEBUG_PCB1 0x00100000
|
||||
#define SCTP_DEBUG_PCB2 0x00200000
|
||||
#define SCTP_DEBUG_PCB2 0x00200000 /* unused */
|
||||
#define SCTP_DEBUG_PCB3 0x00400000
|
||||
#define SCTP_DEBUG_PCB4 0x00800000
|
||||
#define SCTP_DEBUG_PCB4 0x00800000 /* unused */
|
||||
#define SCTP_DEBUG_INDATA1 0x01000000
|
||||
#define SCTP_DEBUG_INDATA2 0x02000000
|
||||
#define SCTP_DEBUG_INDATA3 0x04000000
|
||||
#define SCTP_DEBUG_INDATA4 0x08000000
|
||||
#define SCTP_DEBUG_USRREQ1 0x10000000
|
||||
#define SCTP_DEBUG_USRREQ2 0x20000000
|
||||
#define SCTP_DEBUG_INDATA2 0x02000000 /* unused */
|
||||
#define SCTP_DEBUG_INDATA3 0x04000000 /* unused */
|
||||
#define SCTP_DEBUG_INDATA4 0x08000000 /* unused */
|
||||
#define SCTP_DEBUG_USRREQ1 0x10000000 /* unused */
|
||||
#define SCTP_DEBUG_USRREQ2 0x20000000 /* unused */
|
||||
#define SCTP_DEBUG_PEEL1 0x40000000
|
||||
#define SCTP_DEBUG_XXXXX 0x80000000
|
||||
#define SCTP_DEBUG_XXXXX 0x80000000 /* unused */
|
||||
#define SCTP_DEBUG_ALL 0x7ff3ffff
|
||||
#define SCTP_DEBUG_NOISY 0x00040000
|
||||
|
||||
|
@ -2597,7 +2597,7 @@ sctp_process_data(struct mbuf **mm, int iphlen, int *offset, int length,
|
||||
}
|
||||
stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_19;
|
||||
sctp_abort_association(inp, stcb, m, iphlen, sh,
|
||||
op_err, 0, 0);
|
||||
op_err, 0);
|
||||
return (2);
|
||||
}
|
||||
#ifdef SCTP_AUDITING_ENABLED
|
||||
@ -2660,7 +2660,7 @@ sctp_process_data(struct mbuf **mm, int iphlen, int *offset, int length,
|
||||
struct mbuf *op_err;
|
||||
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_PROTOCOL_VIOLATION);
|
||||
sctp_abort_association(inp, stcb, m, iphlen, sh, op_err, 0, 0);
|
||||
sctp_abort_association(inp, stcb, m, iphlen, sh, op_err, 0);
|
||||
return (2);
|
||||
}
|
||||
break;
|
||||
|
@ -78,8 +78,7 @@ sctp_stop_all_cookie_timers(struct sctp_tcb *stcb)
|
||||
static void
|
||||
sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh,
|
||||
struct sctp_init_chunk *cp, struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
struct sctp_nets *net, int *abort_no_unlock, uint32_t vrf_id,
|
||||
uint32_t table_id)
|
||||
struct sctp_nets *net, int *abort_no_unlock, uint32_t vrf_id)
|
||||
{
|
||||
struct sctp_init *init;
|
||||
struct mbuf *op_err;
|
||||
@ -99,7 +98,7 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh,
|
||||
* match/restart case?
|
||||
*/
|
||||
sctp_abort_association(inp, stcb, m, iphlen, sh, op_err,
|
||||
vrf_id, table_id);
|
||||
vrf_id);
|
||||
if (stcb)
|
||||
*abort_no_unlock = 1;
|
||||
return;
|
||||
@ -108,7 +107,7 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh,
|
||||
/* Invalid length */
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM);
|
||||
sctp_abort_association(inp, stcb, m, iphlen, sh, op_err,
|
||||
vrf_id, table_id);
|
||||
vrf_id);
|
||||
if (stcb)
|
||||
*abort_no_unlock = 1;
|
||||
return;
|
||||
@ -118,7 +117,7 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh,
|
||||
/* protocol error... send abort */
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM);
|
||||
sctp_abort_association(inp, stcb, m, iphlen, sh, op_err,
|
||||
vrf_id, table_id);
|
||||
vrf_id);
|
||||
if (stcb)
|
||||
*abort_no_unlock = 1;
|
||||
return;
|
||||
@ -127,14 +126,14 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh,
|
||||
/* invalid parameter... send abort */
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM);
|
||||
sctp_abort_association(inp, stcb, m, iphlen, sh, op_err,
|
||||
vrf_id, table_id);
|
||||
vrf_id);
|
||||
return;
|
||||
}
|
||||
if (init->num_inbound_streams == 0) {
|
||||
/* protocol error... send abort */
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM);
|
||||
sctp_abort_association(inp, stcb, m, iphlen, sh, op_err,
|
||||
vrf_id, table_id);
|
||||
vrf_id);
|
||||
if (stcb)
|
||||
*abort_no_unlock = 1;
|
||||
return;
|
||||
@ -143,7 +142,7 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh,
|
||||
/* protocol error... send abort */
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM);
|
||||
sctp_abort_association(inp, stcb, m, iphlen, sh, op_err,
|
||||
vrf_id, table_id);
|
||||
vrf_id);
|
||||
if (stcb)
|
||||
*abort_no_unlock = 1;
|
||||
return;
|
||||
@ -152,16 +151,14 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh,
|
||||
if (sctp_validate_init_auth_params(m, offset + sizeof(*cp),
|
||||
init_limit)) {
|
||||
/* auth parameter(s) error... send abort */
|
||||
sctp_abort_association(inp, stcb, m, iphlen, sh, NULL, vrf_id,
|
||||
table_id);
|
||||
sctp_abort_association(inp, stcb, m, iphlen, sh, NULL, vrf_id);
|
||||
if (stcb)
|
||||
*abort_no_unlock = 1;
|
||||
return;
|
||||
}
|
||||
/* send an INIT-ACK w/cookie */
|
||||
SCTPDBG(SCTP_DEBUG_INPUT3, "sctp_handle_init: sending INIT-ACK\n");
|
||||
sctp_send_initiate_ack(inp, stcb, m, iphlen, offset, sh, cp, vrf_id,
|
||||
table_id);
|
||||
sctp_send_initiate_ack(inp, stcb, m, iphlen, offset, sh, cp, vrf_id);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -306,8 +303,7 @@ sctp_process_init(struct sctp_init_chunk *cp, struct sctp_tcb *stcb,
|
||||
static int
|
||||
sctp_process_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
struct sctphdr *sh, struct sctp_init_ack_chunk *cp, struct sctp_tcb *stcb,
|
||||
struct sctp_nets *net, int *abort_no_unlock, uint32_t vrf_id,
|
||||
uint32_t table_id)
|
||||
struct sctp_nets *net, int *abort_no_unlock, uint32_t vrf_id)
|
||||
{
|
||||
struct sctp_association *asoc;
|
||||
struct mbuf *op_err;
|
||||
@ -343,7 +339,7 @@ sctp_process_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
"Load addresses from INIT causes an abort %d\n",
|
||||
retval);
|
||||
sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh,
|
||||
NULL, 0, 0);
|
||||
NULL, 0);
|
||||
*abort_no_unlock = 1;
|
||||
return (-1);
|
||||
}
|
||||
@ -400,7 +396,7 @@ sctp_process_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
mp->resv = 0;
|
||||
}
|
||||
sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen,
|
||||
sh, op_err, 0, 0);
|
||||
sh, op_err, 0);
|
||||
*abort_no_unlock = 1;
|
||||
}
|
||||
return (retval);
|
||||
@ -859,8 +855,7 @@ sctp_handle_error(struct sctp_chunkhdr *ch,
|
||||
static int
|
||||
sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
struct sctphdr *sh, struct sctp_init_ack_chunk *cp, struct sctp_tcb *stcb,
|
||||
struct sctp_nets *net, int *abort_no_unlock, uint32_t vrf_id,
|
||||
uint32_t table_id)
|
||||
struct sctp_nets *net, int *abort_no_unlock, uint32_t vrf_id)
|
||||
{
|
||||
struct sctp_init_ack *init_ack;
|
||||
int *state;
|
||||
@ -878,7 +873,7 @@ sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
/* Invalid length */
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM);
|
||||
sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh,
|
||||
op_err, 0, 0);
|
||||
op_err, 0);
|
||||
*abort_no_unlock = 1;
|
||||
return (-1);
|
||||
}
|
||||
@ -888,7 +883,7 @@ sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
/* protocol error... send an abort */
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM);
|
||||
sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh,
|
||||
op_err, 0, 0);
|
||||
op_err, 0);
|
||||
*abort_no_unlock = 1;
|
||||
return (-1);
|
||||
}
|
||||
@ -896,7 +891,7 @@ sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
/* protocol error... send an abort */
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM);
|
||||
sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh,
|
||||
op_err, 0, 0);
|
||||
op_err, 0);
|
||||
*abort_no_unlock = 1;
|
||||
return (-1);
|
||||
}
|
||||
@ -904,7 +899,7 @@ sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
/* protocol error... send an abort */
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM);
|
||||
sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh,
|
||||
op_err, 0, 0);
|
||||
op_err, 0);
|
||||
*abort_no_unlock = 1;
|
||||
return (-1);
|
||||
}
|
||||
@ -912,7 +907,7 @@ sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
/* protocol error... send an abort */
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_INVALID_PARAM);
|
||||
sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, sh,
|
||||
op_err, 0, 0);
|
||||
op_err, 0);
|
||||
*abort_no_unlock = 1;
|
||||
return (-1);
|
||||
}
|
||||
@ -936,8 +931,7 @@ sctp_handle_init_ack(struct mbuf *m, int iphlen, int offset,
|
||||
stcb, 0, (void *)stcb->asoc.primary_destination);
|
||||
}
|
||||
if (sctp_process_init_ack(m, iphlen, offset, sh, cp, stcb,
|
||||
net, abort_no_unlock, vrf_id,
|
||||
table_id) < 0) {
|
||||
net, abort_no_unlock, vrf_id) < 0) {
|
||||
/* error in parsing parameters */
|
||||
return (-1);
|
||||
}
|
||||
@ -996,7 +990,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset,
|
||||
struct sctphdr *sh, struct sctp_state_cookie *cookie, int cookie_len,
|
||||
struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net,
|
||||
struct sockaddr *init_src, int *notification, sctp_assoc_t * sac_assoc_id,
|
||||
uint32_t vrf_id, uint32_t table_id)
|
||||
uint32_t vrf_id)
|
||||
{
|
||||
struct sctp_association *asoc;
|
||||
struct sctp_init_chunk *init_cp, init_buf;
|
||||
@ -1038,7 +1032,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphlen, int offset,
|
||||
ph->param_type = htons(SCTP_CAUSE_COOKIE_IN_SHUTDOWN);
|
||||
ph->param_length = htons(sizeof(struct sctp_paramhdr));
|
||||
sctp_send_operr_to(m, iphlen, op_err, cookie->peers_vtag,
|
||||
vrf_id, table_id);
|
||||
vrf_id);
|
||||
if (how_indx < sizeof(asoc->cookie_how))
|
||||
asoc->cookie_how[how_indx] = 2;
|
||||
return (NULL);
|
||||
@ -1473,7 +1467,7 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset,
|
||||
struct sctp_inpcb *inp, struct sctp_nets **netp,
|
||||
struct sockaddr *init_src, int *notification,
|
||||
int auth_skipped, uint32_t auth_offset, uint32_t auth_len,
|
||||
uint32_t vrf_id, uint32_t table_id)
|
||||
uint32_t vrf_id)
|
||||
{
|
||||
struct sctp_tcb *stcb;
|
||||
struct sctp_init_chunk *init_cp, init_buf;
|
||||
@ -1550,7 +1544,7 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset,
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_OUT_OF_RESC);
|
||||
|
||||
sctp_abort_association(inp, (struct sctp_tcb *)NULL, m, iphlen,
|
||||
sh, op_err, vrf_id, table_id);
|
||||
sh, op_err, vrf_id);
|
||||
return (NULL);
|
||||
}
|
||||
/* get the correct sctp_nets */
|
||||
@ -1558,8 +1552,6 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset,
|
||||
*netp = sctp_findnet(stcb, init_src);
|
||||
|
||||
asoc = &stcb->asoc;
|
||||
/* save the table id (vrf_id is done in aloc_assoc) */
|
||||
asoc->table_id = table_id;
|
||||
/* get scope variables out of cookie */
|
||||
asoc->ipv4_local_scope = cookie->ipv4_scope;
|
||||
asoc->site_scope = cookie->site_scope;
|
||||
@ -1578,7 +1570,7 @@ sctp_process_cookie_new(struct mbuf *m, int iphlen, int offset,
|
||||
atomic_add_int(&stcb->asoc.refcnt, 1);
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_OUT_OF_RESC);
|
||||
sctp_abort_association(inp, (struct sctp_tcb *)NULL, m, iphlen,
|
||||
sh, op_err, vrf_id, table_id);
|
||||
sh, op_err, vrf_id);
|
||||
atomic_add_int(&stcb->asoc.refcnt, -1);
|
||||
return (NULL);
|
||||
}
|
||||
@ -1743,7 +1735,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset,
|
||||
struct sctphdr *sh, struct sctp_cookie_echo_chunk *cp,
|
||||
struct sctp_inpcb **inp_p, struct sctp_tcb **stcb, struct sctp_nets **netp,
|
||||
int auth_skipped, uint32_t auth_offset, uint32_t auth_len,
|
||||
struct sctp_tcb **locked_tcb, uint32_t vrf_id, uint32_t table_id)
|
||||
struct sctp_tcb **locked_tcb, uint32_t vrf_id)
|
||||
{
|
||||
struct sctp_state_cookie *cookie;
|
||||
struct sockaddr_in6 sin6;
|
||||
@ -1950,7 +1942,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset,
|
||||
tim = now.tv_usec - cookie->time_entered.tv_usec;
|
||||
scm->time_usec = htonl(tim);
|
||||
sctp_send_operr_to(m, iphlen, op_err, cookie->peers_vtag,
|
||||
vrf_id, table_id);
|
||||
vrf_id);
|
||||
return (NULL);
|
||||
}
|
||||
/*
|
||||
@ -2030,13 +2022,13 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset,
|
||||
/* this is the "normal" case... get a new TCB */
|
||||
*stcb = sctp_process_cookie_new(m, iphlen, offset, sh, cookie,
|
||||
cookie_len, *inp_p, netp, to, ¬ification,
|
||||
auth_skipped, auth_offset, auth_len, vrf_id, table_id);
|
||||
auth_skipped, auth_offset, auth_len, vrf_id);
|
||||
} else {
|
||||
/* this is abnormal... cookie-echo on existing TCB */
|
||||
had_a_existing_tcb = 1;
|
||||
*stcb = sctp_process_cookie_existing(m, iphlen, offset, sh,
|
||||
cookie, cookie_len, *inp_p, *stcb, *netp, to, ¬ification,
|
||||
&sac_restart_id, vrf_id, table_id);
|
||||
cookie, cookie_len, *inp_p, *stcb, *netp, to,
|
||||
¬ification, &sac_restart_id, vrf_id);
|
||||
}
|
||||
|
||||
if (*stcb == NULL) {
|
||||
@ -2111,8 +2103,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset,
|
||||
SCTPDBG(SCTP_DEBUG_INPUT1, "process_cookie_new: no room for another socket!\n");
|
||||
op_err = sctp_generate_invmanparam(SCTP_CAUSE_OUT_OF_RESC);
|
||||
sctp_abort_association(*inp_p, NULL, m, iphlen,
|
||||
sh, op_err, vrf_id,
|
||||
table_id);
|
||||
sh, op_err, vrf_id);
|
||||
sctp_free_assoc(*inp_p, *stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_20);
|
||||
return (NULL);
|
||||
}
|
||||
@ -3452,7 +3443,7 @@ __attribute__((noinline))
|
||||
sctp_process_control(struct mbuf *m, int iphlen, int *offset, int length,
|
||||
struct sctphdr *sh, struct sctp_chunkhdr *ch, struct sctp_inpcb *inp,
|
||||
struct sctp_tcb *stcb, struct sctp_nets **netp, int *fwd_tsn_seen,
|
||||
uint32_t vrf_id, uint32_t table_id)
|
||||
uint32_t vrf_id)
|
||||
{
|
||||
struct sctp_association *asoc;
|
||||
uint32_t vtag_in;
|
||||
@ -3583,7 +3574,7 @@ __attribute__((noinline))
|
||||
if (stcb == NULL) {
|
||||
/* no association, so it's out of the blue... */
|
||||
sctp_handle_ootb(m, iphlen, *offset, sh, inp, NULL,
|
||||
vrf_id, table_id);
|
||||
vrf_id);
|
||||
*offset = length;
|
||||
if (locked_tcb) {
|
||||
SCTP_TCB_UNLOCK(locked_tcb);
|
||||
@ -3620,7 +3611,7 @@ __attribute__((noinline))
|
||||
SCTP_TCB_UNLOCK(locked_tcb);
|
||||
}
|
||||
sctp_handle_ootb(m, iphlen, *offset, sh, inp,
|
||||
NULL, vrf_id, table_id);
|
||||
NULL, vrf_id);
|
||||
return (NULL);
|
||||
}
|
||||
} else {
|
||||
@ -3812,7 +3803,7 @@ __attribute__((noinline))
|
||||
if (netp) {
|
||||
sctp_handle_init(m, iphlen, *offset, sh,
|
||||
(struct sctp_init_chunk *)ch, inp,
|
||||
stcb, *netp, &abort_no_unlock, vrf_id, table_id);
|
||||
stcb, *netp, &abort_no_unlock, vrf_id);
|
||||
}
|
||||
if (abort_no_unlock)
|
||||
return (NULL);
|
||||
@ -3851,7 +3842,7 @@ __attribute__((noinline))
|
||||
}
|
||||
if ((netp) && (*netp)) {
|
||||
ret = sctp_handle_init_ack(m, iphlen, *offset, sh,
|
||||
(struct sctp_init_ack_chunk *)ch, stcb, *netp, &abort_no_unlock, vrf_id, table_id);
|
||||
(struct sctp_init_ack_chunk *)ch, stcb, *netp, &abort_no_unlock, vrf_id);
|
||||
} else {
|
||||
ret = -1;
|
||||
}
|
||||
@ -4028,8 +4019,7 @@ __attribute__((noinline))
|
||||
goto process_cookie_anyway;
|
||||
}
|
||||
sctp_abort_association(inp, stcb, m, iphlen,
|
||||
sh, NULL, vrf_id,
|
||||
table_id);
|
||||
sh, NULL, vrf_id);
|
||||
*offset = length;
|
||||
return (NULL);
|
||||
} else if (inp->sctp_socket->so_qlimit) {
|
||||
@ -4055,7 +4045,7 @@ __attribute__((noinline))
|
||||
htons(sizeof(struct sctp_paramhdr));
|
||||
}
|
||||
sctp_abort_association(inp, stcb, m,
|
||||
iphlen, sh, oper, vrf_id, table_id);
|
||||
iphlen, sh, oper, vrf_id);
|
||||
}
|
||||
*offset = length;
|
||||
return (NULL);
|
||||
@ -4085,8 +4075,7 @@ __attribute__((noinline))
|
||||
auth_offset,
|
||||
auth_len,
|
||||
&locked_tcb,
|
||||
vrf_id,
|
||||
table_id);
|
||||
vrf_id);
|
||||
} else {
|
||||
ret_buf = NULL;
|
||||
}
|
||||
@ -4483,7 +4472,7 @@ void
|
||||
sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset,
|
||||
int length, struct sctphdr *sh, struct sctp_chunkhdr *ch,
|
||||
struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net,
|
||||
uint8_t ecn_bits, uint32_t vrf_id, uint32_t table_id)
|
||||
uint8_t ecn_bits, uint32_t vrf_id)
|
||||
{
|
||||
/*
|
||||
* Control chunk processing
|
||||
@ -4512,7 +4501,7 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset,
|
||||
/* process the control portion of the SCTP packet */
|
||||
/* sa_ignore NO_NULL_CHK */
|
||||
stcb = sctp_process_control(m, iphlen, &offset, length, sh, ch,
|
||||
inp, stcb, &net, &fwd_tsn_seen, vrf_id, table_id);
|
||||
inp, stcb, &net, &fwd_tsn_seen, vrf_id);
|
||||
if (stcb) {
|
||||
/*
|
||||
* This covers us if the cookie-echo was there and
|
||||
@ -4542,7 +4531,7 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset,
|
||||
if (stcb == NULL) {
|
||||
/* out of the blue DATA chunk */
|
||||
sctp_handle_ootb(m, iphlen, offset, sh, inp, NULL,
|
||||
vrf_id, table_id);
|
||||
vrf_id);
|
||||
return;
|
||||
}
|
||||
if (stcb->asoc.my_vtag != ntohl(sh->v_tag)) {
|
||||
@ -4603,7 +4592,7 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset,
|
||||
* We consider OOTB any data sent during asoc setup.
|
||||
*/
|
||||
sctp_handle_ootb(m, iphlen, offset, sh, inp, NULL,
|
||||
vrf_id, table_id);
|
||||
vrf_id);
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
return;
|
||||
break;
|
||||
@ -4705,7 +4694,7 @@ sctp_input(i_pak, off)
|
||||
#endif
|
||||
struct mbuf *m;
|
||||
int iphlen;
|
||||
uint32_t vrf_id = 0, table_id = 0;
|
||||
uint32_t vrf_id = 0;
|
||||
uint8_t ecn_bits;
|
||||
struct ip *ip;
|
||||
struct sctphdr *sh;
|
||||
@ -4723,10 +4712,6 @@ sctp_input(i_pak, off)
|
||||
SCTP_RELEASE_PKT(i_pak);
|
||||
return;
|
||||
}
|
||||
if (SCTP_GET_PKT_TABLEID(i_pak, table_id)) {
|
||||
SCTP_RELEASE_PKT(i_pak);
|
||||
return;
|
||||
}
|
||||
mlen = SCTP_HEADER_LEN(i_pak);
|
||||
iphlen = off;
|
||||
m = SCTP_HEADER_TO_CHAIN(i_pak);
|
||||
@ -4865,16 +4850,14 @@ sctp_input(i_pak, off)
|
||||
sh->v_tag = init_chk->init.initiate_tag;
|
||||
}
|
||||
if (ch->chunk_type == SCTP_SHUTDOWN_ACK) {
|
||||
sctp_send_shutdown_complete2(m, iphlen, sh, vrf_id,
|
||||
table_id);
|
||||
sctp_send_shutdown_complete2(m, iphlen, sh, vrf_id);
|
||||
goto bad;
|
||||
}
|
||||
if (ch->chunk_type == SCTP_SHUTDOWN_COMPLETE) {
|
||||
goto bad;
|
||||
}
|
||||
if (ch->chunk_type != SCTP_ABORT_ASSOCIATION)
|
||||
sctp_send_abort(m, iphlen, sh, 0, NULL, vrf_id,
|
||||
table_id);
|
||||
sctp_send_abort(m, iphlen, sh, 0, NULL, vrf_id);
|
||||
goto bad;
|
||||
} else if (stcb == NULL) {
|
||||
refcount_up = 1;
|
||||
@ -4902,8 +4885,7 @@ sctp_input(i_pak, off)
|
||||
|
||||
/* sa_ignore NO_NULL_CHK */
|
||||
sctp_common_input_processing(&m, iphlen, offset, length, sh, ch,
|
||||
inp, stcb, net, ecn_bits, vrf_id,
|
||||
table_id);
|
||||
inp, stcb, net, ecn_bits, vrf_id);
|
||||
/* inp's ref-count reduced && stcb unlocked */
|
||||
if (m) {
|
||||
sctp_m_freem(m);
|
||||
|
@ -40,8 +40,7 @@ __FBSDID("$FreeBSD$");
|
||||
void
|
||||
sctp_common_input_processing(struct mbuf **, int, int, int,
|
||||
struct sctphdr *, struct sctp_chunkhdr *, struct sctp_inpcb *,
|
||||
struct sctp_tcb *, struct sctp_nets *, uint8_t, uint32_t, uint32_t);
|
||||
|
||||
struct sctp_tcb *, struct sctp_nets *, uint8_t, uint32_t);
|
||||
|
||||
struct sctp_stream_reset_out_request *
|
||||
sctp_find_stream_reset(struct sctp_tcb *stcb, uint32_t seq,
|
||||
@ -51,6 +50,5 @@ void
|
||||
sctp_reset_in_stream(struct sctp_tcb *stcb, int number_entries,
|
||||
uint16_t * list);
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
@ -272,7 +272,7 @@ typedef struct callout sctp_os_timer_t;
|
||||
/*************************/
|
||||
/* MTU */
|
||||
/*************************/
|
||||
#define SCTP_GATHER_MTU_FROM_IFN_INFO(ifn, ifn_index) ((struct ifnet *)ifn)->if_mtu
|
||||
#define SCTP_GATHER_MTU_FROM_IFN_INFO(ifn, ifn_index, af) ((struct ifnet *)ifn)->if_mtu
|
||||
#define SCTP_GATHER_MTU_FROM_ROUTE(sctp_ifa, sa, rt) ((rt != NULL) ? rt->rt_rmx.rmx_mtu : 0)
|
||||
#define SCTP_GATHER_MTU_FROM_INTFC(sctp_ifn) ((sctp_ifn->ifn_p != NULL) ? ((struct ifnet *)(sctp_ifn->ifn_p))->if_mtu : 0)
|
||||
#define SCTP_SET_MTU_OF_ROUTE(sa, rt, mtu) do { \
|
||||
@ -281,8 +281,8 @@ typedef struct callout sctp_os_timer_t;
|
||||
} while(0)
|
||||
|
||||
/* (de-)register interface event notifications */
|
||||
#define SCTP_REGISTER_INTERFACE(ifhandle, ifname)
|
||||
#define SCTP_DEREGISTER_INTERFACE(ifhandle, ifname)
|
||||
#define SCTP_REGISTER_INTERFACE(ifhandle, af)
|
||||
#define SCTP_DEREGISTER_INTERFACE(ifhandle, af)
|
||||
|
||||
/*************************/
|
||||
/* These are for logging */
|
||||
@ -314,12 +314,6 @@ SCTP_GET_PKT_VRFID(void *m, uint32_t vrf_id)
|
||||
vrf_id = SCTP_DEFAULT_VRFID;
|
||||
return (0);
|
||||
}
|
||||
static inline int
|
||||
SCTP_GET_PKT_TABLEID(void *m, uint32_t table_id)
|
||||
{
|
||||
table_id = SCTP_DEFAULT_TABLEID;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Attach the chain of data into the sendable packet. */
|
||||
#define SCTP_ATTACH_CHAIN(pak, m, packet_length) do { \
|
||||
@ -371,15 +365,17 @@ SCTP_GET_PKT_TABLEID(void *m, uint32_t table_id)
|
||||
typedef struct route sctp_route_t;
|
||||
typedef struct rtentry sctp_rtentry_t;
|
||||
|
||||
#define SCTP_RTALLOC(ro, vrf_id, table_id) rtalloc_ign((struct route *)ro, 0UL)
|
||||
#define SCTP_RTALLOC(ro, vrf_id) rtalloc_ign((struct route *)ro, 0UL)
|
||||
|
||||
/* Future zero copy wakeup/send function */
|
||||
#define SCTP_ZERO_COPY_EVENT(inp, so)
|
||||
/* This is re-pulse ourselves for sendbuf */
|
||||
#define SCTP_ZERO_COPY_SENDQ_EVENT(inp, so)
|
||||
|
||||
/*
|
||||
* IP output routines
|
||||
*/
|
||||
#define SCTP_IP_OUTPUT(result, o_pak, ro, stcb, vrf_id, table_id) \
|
||||
#define SCTP_IP_OUTPUT(result, o_pak, ro, stcb, vrf_id) \
|
||||
{ \
|
||||
int o_flgs = 0; \
|
||||
if (stcb && stcb->sctp_ep && stcb->sctp_ep->sctp_socket) { \
|
||||
@ -390,7 +386,7 @@ typedef struct rtentry sctp_rtentry_t;
|
||||
result = ip_output(o_pak, NULL, ro, o_flgs, 0, NULL); \
|
||||
}
|
||||
|
||||
#define SCTP_IP6_OUTPUT(result, o_pak, ro, ifp, stcb, vrf_id, table_id) \
|
||||
#define SCTP_IP6_OUTPUT(result, o_pak, ro, ifp, stcb, vrf_id) \
|
||||
{ \
|
||||
if (stcb && stcb->sctp_ep) \
|
||||
result = ip6_output(o_pak, \
|
||||
|
@ -2949,17 +2949,10 @@ sctp_source_address_selection(struct sctp_inpcb *inp,
|
||||
* we must use rotation amongst the bound addresses..
|
||||
*/
|
||||
if (ro->ro_rt == NULL) {
|
||||
uint32_t table_id = 0;
|
||||
|
||||
/*
|
||||
* Need a route to cache.
|
||||
*/
|
||||
if (stcb) {
|
||||
table_id = stcb->asoc.table_id;
|
||||
} else {
|
||||
table_id = SCTP_VRF_DEFAULT_TABLEID(vrf_id);
|
||||
}
|
||||
SCTP_RTALLOC(ro, vrf_id, table_id);
|
||||
SCTP_RTALLOC(ro, vrf_id);
|
||||
}
|
||||
if (ro->ro_rt == NULL) {
|
||||
return (NULL);
|
||||
@ -3469,7 +3462,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp,
|
||||
SCTP_ATTACH_CHAIN(o_pak, m, packet_length);
|
||||
|
||||
/* send it out. table id is taken from stcb */
|
||||
SCTP_IP_OUTPUT(ret, o_pak, ro, stcb, vrf_id, 0);
|
||||
SCTP_IP_OUTPUT(ret, o_pak, ro, stcb, vrf_id);
|
||||
|
||||
SCTP_STAT_INCR(sctps_sendpackets);
|
||||
SCTP_STAT_INCR_COUNTER64(sctps_outpackets);
|
||||
@ -3686,7 +3679,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp,
|
||||
|
||||
/* send it out. table id is taken from stcb */
|
||||
SCTP_IP6_OUTPUT(ret, o_pak, (struct route_in6 *)ro, &ifp,
|
||||
stcb, vrf_id, 0);
|
||||
stcb, vrf_id);
|
||||
|
||||
if (net) {
|
||||
/* for link local this must be done */
|
||||
@ -4483,7 +4476,7 @@ sctp_are_there_new_addresses(struct sctp_association *asoc,
|
||||
void
|
||||
sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
struct mbuf *init_pkt, int iphlen, int offset, struct sctphdr *sh,
|
||||
struct sctp_init_chunk *init_chk, uint32_t vrf_id, uint32_t table_id)
|
||||
struct sctp_init_chunk *init_chk, uint32_t vrf_id)
|
||||
{
|
||||
struct sctp_association *asoc;
|
||||
struct mbuf *m, *m_at, *m_tmp, *m_cookie, *op_err, *mp_last;
|
||||
@ -4521,8 +4514,7 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
* though we even set the T bit and copy in the 0 tag.. this
|
||||
* looks no different than if no listener was present.
|
||||
*/
|
||||
sctp_send_abort(init_pkt, iphlen, sh, 0, NULL, vrf_id,
|
||||
table_id);
|
||||
sctp_send_abort(init_pkt, iphlen, sh, 0, NULL, vrf_id);
|
||||
return;
|
||||
}
|
||||
abort_flag = 0;
|
||||
@ -4531,8 +4523,7 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
&abort_flag, (struct sctp_chunkhdr *)init_chk);
|
||||
if (abort_flag) {
|
||||
sctp_send_abort(init_pkt, iphlen, sh,
|
||||
init_chk->init.initiate_tag, op_err, vrf_id,
|
||||
table_id);
|
||||
init_chk->init.initiate_tag, op_err, vrf_id);
|
||||
return;
|
||||
}
|
||||
m = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_DONTWAIT, 1, MT_DATA);
|
||||
@ -9252,7 +9243,7 @@ sctp_send_shutdown_complete(struct sctp_tcb *stcb,
|
||||
|
||||
void
|
||||
sctp_send_shutdown_complete2(struct mbuf *m, int iphlen, struct sctphdr *sh,
|
||||
uint32_t vrf_id, uint32_t table_id)
|
||||
uint32_t vrf_id)
|
||||
{
|
||||
/* formulate and SEND a SHUTDOWN-COMPLETE */
|
||||
struct mbuf *o_pak;
|
||||
@ -9355,7 +9346,7 @@ sctp_send_shutdown_complete2(struct mbuf *m, int iphlen, struct sctphdr *sh,
|
||||
SCTP_ATTACH_CHAIN(o_pak, mout, mlen);
|
||||
|
||||
/* out it goes */
|
||||
SCTP_IP_OUTPUT(ret, o_pak, &ro, stcb, vrf_id, table_id);
|
||||
SCTP_IP_OUTPUT(ret, o_pak, &ro, stcb, vrf_id);
|
||||
|
||||
/* Free the route if we got one back */
|
||||
if (ro.ro_rt)
|
||||
@ -9372,7 +9363,7 @@ sctp_send_shutdown_complete2(struct mbuf *m, int iphlen, struct sctphdr *sh,
|
||||
sctp_packet_log(mout, mlen);
|
||||
#endif
|
||||
SCTP_ATTACH_CHAIN(o_pak, mout, mlen);
|
||||
SCTP_IP6_OUTPUT(ret, o_pak, &ro, &ifp, stcb, vrf_id, table_id);
|
||||
SCTP_IP6_OUTPUT(ret, o_pak, &ro, &ifp, stcb, vrf_id);
|
||||
|
||||
/* Free the route if we got one back */
|
||||
if (ro.ro_rt)
|
||||
@ -10091,7 +10082,7 @@ sctp_send_str_reset_req(struct sctp_tcb *stcb,
|
||||
|
||||
void
|
||||
sctp_send_abort(struct mbuf *m, int iphlen, struct sctphdr *sh, uint32_t vtag,
|
||||
struct mbuf *err_cause, uint32_t vrf_id, uint32_t table_id)
|
||||
struct mbuf *err_cause, uint32_t vrf_id)
|
||||
{
|
||||
/*-
|
||||
* Formulate the abort message, and send it back down.
|
||||
@ -10224,7 +10215,7 @@ sctp_send_abort(struct mbuf *m, int iphlen, struct sctphdr *sh, uint32_t vtag,
|
||||
sctp_packet_log(mout, len);
|
||||
#endif
|
||||
SCTP_ATTACH_CHAIN(o_pak, mout, len);
|
||||
SCTP_IP_OUTPUT(ret, o_pak, &ro, stcb, vrf_id, table_id);
|
||||
SCTP_IP_OUTPUT(ret, o_pak, &ro, stcb, vrf_id);
|
||||
|
||||
/* Free the route if we got one back */
|
||||
if (ro.ro_rt)
|
||||
@ -10244,7 +10235,7 @@ sctp_send_abort(struct mbuf *m, int iphlen, struct sctphdr *sh, uint32_t vtag,
|
||||
sctp_packet_log(mout, len);
|
||||
#endif
|
||||
SCTP_ATTACH_CHAIN(o_pak, mout, len);
|
||||
SCTP_IP6_OUTPUT(ret, o_pak, &ro, &ifp, stcb, vrf_id, table_id);
|
||||
SCTP_IP6_OUTPUT(ret, o_pak, &ro, &ifp, stcb, vrf_id);
|
||||
|
||||
/* Free the route if we got one back */
|
||||
if (ro.ro_rt)
|
||||
@ -10256,7 +10247,7 @@ sctp_send_abort(struct mbuf *m, int iphlen, struct sctphdr *sh, uint32_t vtag,
|
||||
|
||||
void
|
||||
sctp_send_operr_to(struct mbuf *m, int iphlen, struct mbuf *scm, uint32_t vtag,
|
||||
uint32_t vrf_id, uint32_t table_id)
|
||||
uint32_t vrf_id)
|
||||
{
|
||||
struct mbuf *o_pak;
|
||||
struct sctphdr *ihdr;
|
||||
@ -10349,7 +10340,7 @@ sctp_send_operr_to(struct mbuf *m, int iphlen, struct mbuf *scm, uint32_t vtag,
|
||||
#endif
|
||||
SCTP_ATTACH_CHAIN(o_pak, mout, len);
|
||||
|
||||
SCTP_IP_OUTPUT(retcode, o_pak, &ro, stcb, vrf_id, table_id);
|
||||
SCTP_IP_OUTPUT(retcode, o_pak, &ro, stcb, vrf_id);
|
||||
|
||||
SCTP_STAT_INCR(sctps_sendpackets);
|
||||
SCTP_STAT_INCR_COUNTER64(sctps_outpackets);
|
||||
@ -10396,7 +10387,7 @@ sctp_send_operr_to(struct mbuf *m, int iphlen, struct mbuf *scm, uint32_t vtag,
|
||||
sctp_packet_log(mout, len);
|
||||
#endif
|
||||
SCTP_ATTACH_CHAIN(o_pak, mout, len);
|
||||
SCTP_IP6_OUTPUT(ret, o_pak, &ro, &ifp, stcb, vrf_id, table_id);
|
||||
SCTP_IP6_OUTPUT(ret, o_pak, &ro, &ifp, stcb, vrf_id);
|
||||
|
||||
SCTP_STAT_INCR(sctps_sendpackets);
|
||||
SCTP_STAT_INCR_COUNTER64(sctps_outpackets);
|
||||
|
@ -76,7 +76,7 @@ void sctp_send_initiate(struct sctp_inpcb *, struct sctp_tcb *);
|
||||
void
|
||||
sctp_send_initiate_ack(struct sctp_inpcb *, struct sctp_tcb *,
|
||||
struct mbuf *, int, int, struct sctphdr *, struct sctp_init_chunk *,
|
||||
uint32_t, uint32_t);
|
||||
uint32_t);
|
||||
|
||||
struct mbuf *
|
||||
sctp_arethere_unrecognized_parameters(struct mbuf *, int, int *,
|
||||
@ -102,7 +102,7 @@ void sctp_send_shutdown_complete(struct sctp_tcb *, struct sctp_nets *);
|
||||
|
||||
void
|
||||
sctp_send_shutdown_complete2(struct mbuf *, int, struct sctphdr *,
|
||||
uint32_t, uint32_t);
|
||||
uint32_t);
|
||||
|
||||
void sctp_send_asconf(struct sctp_tcb *, struct sctp_nets *);
|
||||
|
||||
@ -179,11 +179,9 @@ sctp_send_str_reset_req(struct sctp_tcb *stcb,
|
||||
|
||||
void
|
||||
sctp_send_abort(struct mbuf *, int, struct sctphdr *, uint32_t,
|
||||
struct mbuf *, uint32_t, uint32_t);
|
||||
struct mbuf *, uint32_t);
|
||||
|
||||
void
|
||||
sctp_send_operr_to(struct mbuf *, int, struct mbuf *, uint32_t, uint32_t,
|
||||
uint32_t);
|
||||
void sctp_send_operr_to(struct mbuf *, int, struct mbuf *, uint32_t, uint32_t);
|
||||
|
||||
int
|
||||
sctp_sosend(struct socket *so,
|
||||
|
@ -281,6 +281,8 @@ sctp_delete_ifn(struct sctp_ifn *sctp_ifnp, int hold_addr_lock)
|
||||
SCTP_IPI_ADDR_LOCK();
|
||||
LIST_REMOVE(sctp_ifnp, next_bucket);
|
||||
LIST_REMOVE(sctp_ifnp, next_ifn);
|
||||
SCTP_DEREGISTER_INTERFACE(sctp_ifnp->ifn_index,
|
||||
sctp_ifnp->registered_af);
|
||||
if (hold_addr_lock == 0)
|
||||
SCTP_IPI_ADDR_UNLOCK();
|
||||
/* Take away the reference, and possibly free it */
|
||||
@ -300,6 +302,7 @@ sctp_add_addr_to_vrf(uint32_t vrf_id, void *ifn, uint32_t ifn_index,
|
||||
struct sctp_ifalist *hash_addr_head;
|
||||
struct sctp_ifnlist *hash_ifn_head;
|
||||
uint32_t hash_of_addr;
|
||||
int new_ifn_af = 0;
|
||||
|
||||
/* How granular do we need the locks to be here? */
|
||||
SCTP_IPI_ADDR_LOCK();
|
||||
@ -331,7 +334,7 @@ sctp_add_addr_to_vrf(uint32_t vrf_id, void *ifn, uint32_t ifn_index,
|
||||
sctp_ifnp->ifa_count = 0;
|
||||
sctp_ifnp->refcount = 1;
|
||||
sctp_ifnp->vrf = vrf;
|
||||
sctp_ifnp->ifn_mtu = SCTP_GATHER_MTU_FROM_IFN_INFO(ifn, ifn_index);
|
||||
sctp_ifnp->ifn_mtu = SCTP_GATHER_MTU_FROM_IFN_INFO(ifn, ifn_index, addr->sa_family);
|
||||
if (if_name != NULL) {
|
||||
memcpy(sctp_ifnp->ifn_name, if_name, SCTP_IFNAMSIZ);
|
||||
} else {
|
||||
@ -343,6 +346,7 @@ sctp_add_addr_to_vrf(uint32_t vrf_id, void *ifn, uint32_t ifn_index,
|
||||
LIST_INSERT_HEAD(hash_ifn_head, sctp_ifnp, next_bucket);
|
||||
LIST_INSERT_HEAD(&vrf->ifnlist, sctp_ifnp, next_ifn);
|
||||
atomic_add_int(&sctppcbinfo.ipi_count_ifns, 1);
|
||||
new_ifn_af = 1;
|
||||
}
|
||||
sctp_ifap = sctp_find_ifa_by_addr(addr, vrf->vrf_id, 1);
|
||||
if (sctp_ifap) {
|
||||
@ -403,6 +407,9 @@ sctp_add_addr_to_vrf(uint32_t vrf_id, void *ifn, uint32_t ifn_index,
|
||||
if ((IN4_ISPRIVATE_ADDRESS(&sin->sin_addr))) {
|
||||
sctp_ifap->src_is_priv = 1;
|
||||
}
|
||||
sctp_ifnp->num_v4++;
|
||||
if (new_ifn_af)
|
||||
new_ifn_af = AF_INET;
|
||||
} else if (sctp_ifap->address.sa.sa_family == AF_INET6) {
|
||||
/* ok to use deprecated addresses? */
|
||||
struct sockaddr_in6 *sin6;
|
||||
@ -415,6 +422,11 @@ sctp_add_addr_to_vrf(uint32_t vrf_id, void *ifn, uint32_t ifn_index,
|
||||
if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
|
||||
sctp_ifap->src_is_priv = 1;
|
||||
}
|
||||
sctp_ifnp->num_v6++;
|
||||
if (new_ifn_af)
|
||||
new_ifn_af = AF_INET6;
|
||||
} else {
|
||||
new_ifn_af = 0;
|
||||
}
|
||||
hash_of_addr = sctp_get_ifa_hash_val(&sctp_ifap->address.sa);
|
||||
|
||||
@ -430,6 +442,10 @@ sctp_add_addr_to_vrf(uint32_t vrf_id, void *ifn, uint32_t ifn_index,
|
||||
sctp_ifnp->ifa_count++;
|
||||
vrf->total_ifa_count++;
|
||||
atomic_add_int(&sctppcbinfo.ipi_count_ifas, 1);
|
||||
if (new_ifn_af) {
|
||||
SCTP_REGISTER_INTERFACE(ifn_index, new_ifn_af);
|
||||
sctp_ifnp->registered_af = new_ifn_af;
|
||||
}
|
||||
SCTP_IPI_ADDR_UNLOCK();
|
||||
if (dynamic_add) {
|
||||
/*
|
||||
@ -496,8 +512,28 @@ sctp_del_addr_from_vrf(uint32_t vrf_id, struct sockaddr *addr,
|
||||
LIST_REMOVE(sctp_ifap, next_ifa);
|
||||
if (sctp_ifap->ifn_p) {
|
||||
sctp_ifap->ifn_p->ifa_count--;
|
||||
if (sctp_ifap->address.sa.sa_family == AF_INET6)
|
||||
sctp_ifap->ifn_p->num_v6--;
|
||||
else if (sctp_ifap->address.sa.sa_family == AF_INET)
|
||||
sctp_ifap->ifn_p->num_v4--;
|
||||
if (SCTP_LIST_EMPTY(&sctp_ifap->ifn_p->ifalist)) {
|
||||
sctp_delete_ifn(sctp_ifap->ifn_p, 1);
|
||||
} else {
|
||||
if ((sctp_ifap->ifn_p->num_v6 == 0) &&
|
||||
(sctp_ifap->ifn_p->registered_af == AF_INET6)) {
|
||||
SCTP_DEREGISTER_INTERFACE(ifn_index,
|
||||
AF_INET6);
|
||||
SCTP_REGISTER_INTERFACE(ifn_index,
|
||||
AF_INET);
|
||||
sctp_ifap->ifn_p->registered_af = AF_INET;
|
||||
} else if ((sctp_ifap->ifn_p->num_v4 == 0) &&
|
||||
(sctp_ifap->ifn_p->registered_af == AF_INET)) {
|
||||
SCTP_DEREGISTER_INTERFACE(ifn_index,
|
||||
AF_INET);
|
||||
SCTP_REGISTER_INTERFACE(ifn_index,
|
||||
AF_INET6);
|
||||
sctp_ifap->ifn_p->registered_af = AF_INET6;
|
||||
}
|
||||
}
|
||||
sctp_free_ifn(sctp_ifap->ifn_p);
|
||||
sctp_ifap->ifn_p = NULL;
|
||||
@ -1793,7 +1829,6 @@ sctp_inpcb_alloc(struct socket *so)
|
||||
return (ENOBUFS);
|
||||
}
|
||||
inp->def_vrf_id = SCTP_DEFAULT_VRFID;
|
||||
inp->def_table_id = SCTP_DEFAULT_TABLEID;
|
||||
|
||||
SCTP_INP_INFO_WLOCK();
|
||||
SCTP_INP_LOCK_INIT(inp);
|
||||
@ -3068,8 +3103,7 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr,
|
||||
(void)sa6_embedscope(sin6, ip6_use_defzone);
|
||||
sin6->sin6_scope_id = 0;
|
||||
}
|
||||
SCTP_RTALLOC((sctp_route_t *) & net->ro, stcb->asoc.vrf_id,
|
||||
stcb->asoc.table_id);
|
||||
SCTP_RTALLOC((sctp_route_t *) & net->ro, stcb->asoc.vrf_id);
|
||||
|
||||
if (newaddr->sa_family == AF_INET6) {
|
||||
struct sockaddr_in6 *sin6;
|
||||
|
@ -79,6 +79,9 @@ struct sctp_ifn {
|
||||
uint32_t refcount; /* number of reference held should be >=
|
||||
* ifa_count */
|
||||
uint32_t ifa_count; /* IFA's we hold (in our list - ifalist) */
|
||||
uint32_t num_v6; /* number of v6 addresses */
|
||||
uint32_t num_v4; /* number of v4 addresses */
|
||||
uint32_t registered_af; /* registered address family for i/f events */
|
||||
char ifn_name[SCTP_IFNAMSIZ];
|
||||
};
|
||||
|
||||
@ -109,7 +112,6 @@ struct sctp_ifa {
|
||||
uint8_t src_is_priv;
|
||||
uint8_t src_is_glob;
|
||||
uint8_t resv;
|
||||
|
||||
};
|
||||
|
||||
struct sctp_laddr {
|
||||
@ -281,6 +283,8 @@ struct sctp_pcb {
|
||||
|
||||
/* Zero copy full buffer timer */
|
||||
struct sctp_timer zero_copy_timer;
|
||||
/* Zero copy app to transport (sendq) read repulse timer */
|
||||
struct sctp_timer zero_copy_sendq_timer;
|
||||
int def_cookie_life;
|
||||
/* defaults to 0 */
|
||||
int auto_close_time;
|
||||
@ -364,7 +368,6 @@ struct sctp_inpcb {
|
||||
struct mtx inp_rdata_mtx;
|
||||
int32_t refcount;
|
||||
uint32_t def_vrf_id;
|
||||
uint32_t def_table_id;
|
||||
uint32_t total_sends;
|
||||
uint32_t total_recvs;
|
||||
uint32_t last_abort_code;
|
||||
|
@ -598,7 +598,6 @@ struct sctp_association {
|
||||
struct sctp_readhead pending_reply_queue;
|
||||
|
||||
uint32_t vrf_id;
|
||||
uint32_t table_id;
|
||||
|
||||
uint32_t cookie_preserve_req;
|
||||
/* ASCONF next seq I am sending out, inits at init-tsn */
|
||||
|
@ -291,7 +291,7 @@ sctp_find_alternate_net(struct sctp_tcb *stcb,
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
if (val > mnet->ssthresh) {
|
||||
if (val < mnet->ssthresh) {
|
||||
hthresh = mnet;
|
||||
val = mnet->ssthresh;
|
||||
} else if (val == mnet->ssthresh) {
|
||||
@ -644,6 +644,9 @@ sctp_mark_all_for_resend(struct sctp_tcb *stcb,
|
||||
chk->rec.data.fast_retran_tsn = (TAILQ_FIRST(&stcb->asoc.send_queue))->rec.data.TSN_seq;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* CMT: Do not allow FRs on retransmitted TSNs.
|
||||
*/
|
||||
if (sctp_cmt_on_off == 1) {
|
||||
chk->no_fr_allowed = 1;
|
||||
}
|
||||
|
@ -955,8 +955,6 @@ sctp_init_asoc(struct sctp_inpcb *m, struct sctp_tcb *stcb,
|
||||
asoc->my_vtag_nonce = sctp_select_a_tag(m);
|
||||
asoc->peer_vtag_nonce = sctp_select_a_tag(m);
|
||||
asoc->vrf_id = vrf_id;
|
||||
/* Save the table id as well from the inp */
|
||||
asoc->table_id = m->def_table_id;
|
||||
|
||||
if (sctp_is_feature_on(m, SCTP_PCB_FLAGS_DONOT_HEARTBEAT))
|
||||
asoc->hb_is_disabled = 1;
|
||||
@ -1466,6 +1464,11 @@ sctp_timeout_handler(void *t)
|
||||
SCTP_ZERO_COPY_EVENT(inp, inp->sctp_socket);
|
||||
}
|
||||
break;
|
||||
case SCTP_TIMER_TYPE_ZCOPY_SENDQ:
|
||||
if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_ZERO_COPY_ACTIVE)) {
|
||||
SCTP_ZERO_COPY_SENDQ_EVENT(inp, inp->sctp_socket);
|
||||
}
|
||||
break;
|
||||
case SCTP_TIMER_TYPE_ADDR_WQ:
|
||||
sctp_handle_addr_wq();
|
||||
break;
|
||||
@ -1788,6 +1791,10 @@ sctp_timer_start(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
tmr = &inp->sctp_ep.zero_copy_timer;
|
||||
to_ticks = SCTP_ZERO_COPY_TICK_DELAY;
|
||||
break;
|
||||
case SCTP_TIMER_TYPE_ZCOPY_SENDQ:
|
||||
tmr = &inp->sctp_ep.zero_copy_sendq_timer;
|
||||
to_ticks = SCTP_ZERO_COPY_SENDQ_TICK_DELAY;
|
||||
break;
|
||||
case SCTP_TIMER_TYPE_ADDR_WQ:
|
||||
/* Only 1 tick away :-) */
|
||||
tmr = &sctppcbinfo.addr_wq_timer;
|
||||
@ -2137,7 +2144,9 @@ sctp_timer_stop(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
case SCTP_TIMER_TYPE_ZERO_COPY:
|
||||
tmr = &inp->sctp_ep.zero_copy_timer;
|
||||
break;
|
||||
|
||||
case SCTP_TIMER_TYPE_ZCOPY_SENDQ:
|
||||
tmr = &inp->sctp_ep.zero_copy_sendq_timer;
|
||||
break;
|
||||
case SCTP_TIMER_TYPE_ADDR_WQ:
|
||||
tmr = &sctppcbinfo.addr_wq_timer;
|
||||
break;
|
||||
@ -3559,7 +3568,7 @@ sctp_abort_notification(struct sctp_tcb *stcb, int error)
|
||||
void
|
||||
sctp_abort_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
struct mbuf *m, int iphlen, struct sctphdr *sh, struct mbuf *op_err,
|
||||
uint32_t vrf_id, uint32_t table_id)
|
||||
uint32_t vrf_id)
|
||||
{
|
||||
uint32_t vtag;
|
||||
|
||||
@ -3570,9 +3579,8 @@ sctp_abort_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
sctp_abort_notification(stcb, 0);
|
||||
/* get the assoc vrf id and table id */
|
||||
vrf_id = stcb->asoc.vrf_id;
|
||||
table_id = stcb->asoc.table_id;
|
||||
}
|
||||
sctp_send_abort(m, iphlen, sh, vtag, op_err, vrf_id, table_id);
|
||||
sctp_send_abort(m, iphlen, sh, vtag, op_err, vrf_id);
|
||||
if (stcb != NULL) {
|
||||
/* Ok, now lets free it */
|
||||
sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTPUTIL + SCTP_LOC_4);
|
||||
@ -3684,8 +3692,7 @@ sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
|
||||
|
||||
void
|
||||
sctp_handle_ootb(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh,
|
||||
struct sctp_inpcb *inp, struct mbuf *op_err, uint32_t vrf_id,
|
||||
uint32_t table_id)
|
||||
struct sctp_inpcb *inp, struct mbuf *op_err, uint32_t vrf_id)
|
||||
{
|
||||
struct sctp_chunkhdr *ch, chunk_buf;
|
||||
unsigned int chk_length;
|
||||
@ -3720,8 +3727,7 @@ sctp_handle_ootb(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh,
|
||||
*/
|
||||
return;
|
||||
case SCTP_SHUTDOWN_ACK:
|
||||
sctp_send_shutdown_complete2(m, iphlen, sh, vrf_id,
|
||||
table_id);
|
||||
sctp_send_shutdown_complete2(m, iphlen, sh, vrf_id);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
@ -3730,7 +3736,7 @@ sctp_handle_ootb(struct mbuf *m, int iphlen, int offset, struct sctphdr *sh,
|
||||
ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset,
|
||||
sizeof(*ch), (uint8_t *) & chunk_buf);
|
||||
}
|
||||
sctp_send_abort(m, iphlen, sh, 0, op_err, vrf_id, table_id);
|
||||
sctp_send_abort(m, iphlen, sh, 0, op_err, vrf_id);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -207,7 +207,7 @@ void sctp_abort_notification(struct sctp_tcb *, int);
|
||||
/* We abort responding to an IP packet for some reason */
|
||||
void
|
||||
sctp_abort_association(struct sctp_inpcb *, struct sctp_tcb *,
|
||||
struct mbuf *, int, struct sctphdr *, struct mbuf *, uint32_t, uint32_t);
|
||||
struct mbuf *, int, struct sctphdr *, struct mbuf *, uint32_t);
|
||||
|
||||
|
||||
/* We choose to abort via user input */
|
||||
@ -217,7 +217,7 @@ sctp_abort_an_association(struct sctp_inpcb *, struct sctp_tcb *, int,
|
||||
|
||||
void
|
||||
sctp_handle_ootb(struct mbuf *, int, int, struct sctphdr *,
|
||||
struct sctp_inpcb *, struct mbuf *, uint32_t, uint32_t);
|
||||
struct sctp_inpcb *, struct mbuf *, uint32_t);
|
||||
|
||||
int
|
||||
sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr,
|
||||
|
@ -71,7 +71,7 @@ sctp6_input(i_pak, offp, proto)
|
||||
struct sctp_nets *net;
|
||||
int refcount_up = 0;
|
||||
uint32_t check, calc_check;
|
||||
uint32_t vrf_id = 0, table_id = 0;
|
||||
uint32_t vrf_id = 0;
|
||||
struct inpcb *in6p_ip;
|
||||
struct sctp_chunkhdr *ch;
|
||||
int length, mlen, offset, iphlen;
|
||||
@ -85,10 +85,6 @@ sctp6_input(i_pak, offp, proto)
|
||||
SCTP_RELEASE_PKT(*i_pak);
|
||||
return (-1);
|
||||
}
|
||||
if (SCTP_GET_PKT_TABLEID(*i_pak, table_id)) {
|
||||
SCTP_RELEASE_PKT(*i_pak);
|
||||
return (-1);
|
||||
}
|
||||
m = SCTP_HEADER_TO_CHAIN(*i_pak);
|
||||
pkt_len = SCTP_HEADER_LEN((*i_pak));
|
||||
|
||||
@ -189,16 +185,14 @@ sctp6_input(i_pak, offp, proto)
|
||||
sh->v_tag = 0;
|
||||
}
|
||||
if (ch->chunk_type == SCTP_SHUTDOWN_ACK) {
|
||||
sctp_send_shutdown_complete2(m, iphlen, sh, vrf_id,
|
||||
table_id);
|
||||
sctp_send_shutdown_complete2(m, iphlen, sh, vrf_id);
|
||||
goto bad;
|
||||
}
|
||||
if (ch->chunk_type == SCTP_SHUTDOWN_COMPLETE) {
|
||||
goto bad;
|
||||
}
|
||||
if (ch->chunk_type != SCTP_ABORT_ASSOCIATION)
|
||||
sctp_send_abort(m, iphlen, sh, 0, NULL, vrf_id,
|
||||
table_id);
|
||||
sctp_send_abort(m, iphlen, sh, 0, NULL, vrf_id);
|
||||
goto bad;
|
||||
} else if (stcb == NULL) {
|
||||
refcount_up = 1;
|
||||
@ -226,7 +220,7 @@ sctp6_input(i_pak, offp, proto)
|
||||
|
||||
/* sa_ignore NO_NULL_CHK */
|
||||
sctp_common_input_processing(&m, iphlen, offset, length, sh, ch,
|
||||
in6p, stcb, net, ecn_bits, vrf_id, table_id);
|
||||
in6p, stcb, net, ecn_bits, vrf_id);
|
||||
/* inp's ref-count reduced && stcb unlocked */
|
||||
/* XXX this stuff below gets moved to appropriate parts later... */
|
||||
if (m)
|
||||
|
Loading…
Reference in New Issue
Block a user