summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Shepherd <George.Shepherd@Sun.COM>2010-06-02 11:03:00 -0700
committerGeorge Shepherd <George.Shepherd@Sun.COM>2010-06-02 11:03:00 -0700
commit481845d830b7316f6899f39897e6a09d8dec8613 (patch)
tree7a309bffccd25657eab7e11dea1f1d8b883af67e
parentd88af7610f00512b386cb6ea0907b568db460c51 (diff)
downloadillumos-gate-481845d830b7316f6899f39897e6a09d8dec8613.tar.gz
6922123 under sctp proto-stress testing an ASSERT in sctp_connect() is tripped.
6922175 under sctp proto-stress testing an ASSERT in ip_output_simple_v4() is tripped 6922550 under sctp proto-stress testing an ASSERT in sctp_output() is tripped
-rw-r--r--usr/src/uts/common/inet/sctp/sctp_conn.c6
-rw-r--r--usr/src/uts/common/inet/sctp/sctp_output.c13
-rw-r--r--usr/src/uts/common/inet/sctp/sctp_shutdown.c6
3 files changed, 13 insertions, 12 deletions
diff --git a/usr/src/uts/common/inet/sctp/sctp_conn.c b/usr/src/uts/common/inet/sctp/sctp_conn.c
index 44524907eb..9dc8255f50 100644
--- a/usr/src/uts/common/inet/sctp/sctp_conn.c
+++ b/usr/src/uts/common/inet/sctp/sctp_conn.c
@@ -20,8 +20,7 @@
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <sys/types.h>
@@ -502,9 +501,6 @@ sctp_connect(sctp_t *sctp, const struct sockaddr *dst, uint32_t addrlen,
/* XXX check for attempt to connect to self */
connp->conn_fport = dstport;
- ASSERT(sctp->sctp_iphc);
- ASSERT(sctp->sctp_iphc6);
-
/*
* Don't allow this connection to completely duplicate
* an existing connection.
diff --git a/usr/src/uts/common/inet/sctp/sctp_output.c b/usr/src/uts/common/inet/sctp/sctp_output.c
index 5b739286ac..b1ae0e58f9 100644
--- a/usr/src/uts/common/inet/sctp/sctp_output.c
+++ b/usr/src/uts/common/inet/sctp/sctp_output.c
@@ -1004,6 +1004,7 @@ sctp_output(sctp_t *sctp, uint_t num_pkt)
int error;
boolean_t notsent = B_TRUE;
sctp_stack_t *sctps = sctp->sctp_sctps;
+ uint32_t tsn;
if (sctp->sctp_ftsn == sctp->sctp_lastacked + 1) {
sacklen = 0;
@@ -1171,11 +1172,15 @@ sctp_output(sctp_t *sctp, uint_t num_pkt)
SCTP_CHUNK_SENT(sctp, mp, sdc, fp, chunklen, meta);
mp = mp->b_next;
- /* Use this chunk to measure RTT? */
- if (sctp->sctp_out_time == 0) {
+ /*
+ * Use this chunk to measure RTT?
+ * Must not be a retransmision of an earlier chunk,
+ * ensure the tsn is current.
+ */
+ tsn = ntohl(sdc->sdh_tsn);
+ if (sctp->sctp_out_time == 0 && tsn == (sctp->sctp_ltsn - 1)) {
sctp->sctp_out_time = now;
- sctp->sctp_rtt_tsn = sctp->sctp_ltsn - 1;
- ASSERT(sctp->sctp_rtt_tsn == ntohl(sdc->sdh_tsn));
+ sctp->sctp_rtt_tsn = tsn;
}
if (extra > 0) {
fill = sctp_get_padding(sctp, extra);
diff --git a/usr/src/uts/common/inet/sctp/sctp_shutdown.c b/usr/src/uts/common/inet/sctp/sctp_shutdown.c
index 87a56db9ac..c1b648a4b8 100644
--- a/usr/src/uts/common/inet/sctp/sctp_shutdown.c
+++ b/usr/src/uts/common/inet/sctp/sctp_shutdown.c
@@ -20,8 +20,7 @@
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <sys/types.h>
@@ -297,7 +296,6 @@ sctp_ootb_shutdown_ack(mblk_t *mp, uint_t ip_hdr_len, ip_recv_attr_t *ira,
return;
}
mp1->b_rptr += sctps->sctps_wroff_xtra;
- mp1->b_wptr = mp1->b_rptr + MBLKL(mp);
bcopy(mp->b_rptr, mp1->b_rptr, MBLKL(mp));
freeb(mp);
mp = mp1;
@@ -307,6 +305,8 @@ sctp_ootb_shutdown_ack(mblk_t *mp, uint_t ip_hdr_len, ip_recv_attr_t *ira,
ixas.ixa_pktlen = ip_hdr_len + sizeof (*insctph) + sizeof (*scch);
ixas.ixa_ip_hdr_length = ip_hdr_len;
+ mp->b_wptr = (mp->b_rptr + ixas.ixa_pktlen);
+
/*
* We follow the logic in tcp_xmit_early_reset() in that we skip
* reversing source route (i.e. replace all IP options with EOL).