diff options
| author | Sridhar Samudrala <sri@us.ibm.com> | 2003-02-17 18:09:28 -0800 |
|---|---|---|
| committer | Sridhar Samudrala <sri@us.ibm.com> | 2003-02-17 18:09:28 -0800 |
| commit | 9967b51fc01aae6d822ad62ff031ff2d656d5b10 (patch) | |
| tree | e956f79d598e25a7a42faab23d0794ec992c20fa /net/sctp/sm_sideeffect.c | |
| parent | 611f4c044cbd8595d40d09a34981e57aa8aa5f30 (diff) | |
| parent | 13970d8e1ff3451967050309ce14ae2b6160bfd5 (diff) | |
Merge us.ibm.com:/home/sridhar/BK/linux-2.5.62
into us.ibm.com:/home/sridhar/BK/lksctp-2.5.62
Diffstat (limited to 'net/sctp/sm_sideeffect.c')
| -rw-r--r-- | net/sctp/sm_sideeffect.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index 7a79105576de..9fe550bbed78 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c @@ -527,10 +527,8 @@ int sctp_cmd_interpreter(sctp_event_t event_type, sctp_subtype_t subtype, break; case SCTP_CMD_REPORT_DUP: - if (asoc->peer.next_dup_tsn < SCTP_MAX_DUP_TSNS) { - asoc->peer.dup_tsns[asoc->peer.next_dup_tsn++] = - ntohl(command->obj.u32); - } + sctp_tsnmap_mark_dup(&asoc->peer.tsn_map, + ntohl(command->obj.u32)); break; case SCTP_CMD_REPORT_BIGGAP: @@ -598,6 +596,13 @@ int sctp_cmd_interpreter(sctp_event_t event_type, sctp_subtype_t subtype, t->rto_pending = 1; break; + case SCTP_CMD_CHUNK_PD: + /* Send a chunk to the sockets layer. */ + sctp_ulpq_partial_delivery(&asoc->ulpq, + command->obj.ptr, + GFP_ATOMIC); + break; + default: printk(KERN_WARNING "Impossible command: %u, %p\n", command->verb, command->obj.ptr); @@ -737,7 +742,6 @@ int sctp_gen_sack(sctp_association_t *asoc, int force, sctp_cmd_seq_t *commands) asoc->a_rwnd = asoc->rwnd; asoc->peer.sack_needed = 0; - asoc->peer.next_dup_tsn = 0; error = sctp_outq_tail(&asoc->outqueue, sack); @@ -1014,7 +1018,7 @@ static void sctp_do_8_2_transport_strike(sctp_association_t *asoc, static void sctp_cmd_init_failed(sctp_cmd_seq_t *commands, sctp_association_t *asoc) { - sctp_ulpevent_t *event; + struct sctp_ulpevent *event; event = sctp_ulpevent_make_assoc_change(asoc, 0, @@ -1041,7 +1045,7 @@ static void sctp_cmd_assoc_failed(sctp_cmd_seq_t *commands, sctp_subtype_t subtype, sctp_chunk_t *chunk) { - sctp_ulpevent_t *event; + struct sctp_ulpevent *event; __u16 error = 0; switch(event_type) { @@ -1061,12 +1065,11 @@ static void sctp_cmd_assoc_failed(sctp_cmd_seq_t *commands, break; } - event = sctp_ulpevent_make_assoc_change(asoc, - 0, - SCTP_COMM_LOST, - error, 0, 0, - GFP_ATOMIC); + /* Cancel any partial delivery in progress. */ + sctp_ulpq_abort_pd(&asoc->ulpq, GFP_ATOMIC); + event = sctp_ulpevent_make_assoc_change(asoc, 0, SCTP_COMM_LOST, + error, 0, 0, GFP_ATOMIC); if (event) sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(event)); @@ -1141,7 +1144,7 @@ static void sctp_cmd_hb_timers_stop(sctp_cmd_seq_t *cmds, if (del_timer(&t->hb_timer)) sctp_transport_put(t); } -} +} /* Helper function to update the heartbeat timer. */ static void sctp_cmd_hb_timer_update(sctp_cmd_seq_t *cmds, |
