[SCTP] Initialization collision problem

From: Isaula Oscar-QOI000
Date: Wed Apr 04 2007 - 10:35:55 EST


I ran into a problem where LKSCTP is reporting a SCTM_COMM_UP indication
to the User application but is giving back a value of zero for the
assoc_id.

Attached are the SCTP debugs for the period in question.

A couple of things that I would like to note about my setup. One is that
I'm running Kernel version 2.6.10 (I know is old but I can't move to a
newer version due to custom drivers). The second thing is that the link
between the two SCTP node is a very noisy and some messages are getting
lost (i.e. the INIT_ACK from the peer in this particular case).

After analyzing the SCTP code I came out with the following code
changes:

--- sm_statefuns.c.old 2007-04-04 08:58:34.074606000 -0500
+++ sm_statefuns.c.new 2007-04-04 09:03:31.818426000 -0500
@@ -1515,7 +1515,7 @@
*/
/* This case represents an initialization collision. */
static sctp_disposition_t sctp_sf_do_dupcook_b(const struct
sctp_endpoint *ep,
- const struct sctp_association *asoc,
+ struct sctp_association *asoc,
struct sctp_chunk *chunk,
sctp_cmd_seq_t *commands,
struct sctp_association *new_asoc)
@@ -1528,13 +1528,13 @@
* side effects--it is safe to run them here.
*/
peer_init = &chunk->subh.cookie_hdr->c.peer_init[0];
- if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type,
+ if (!sctp_process_init(asoc, chunk->chunk_hdr->type,
sctp_source(chunk), peer_init,
GFP_ATOMIC))
goto nomem;

/* Update the content of current association. */
- sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC,
SCTP_ASOC(new_asoc));
+ sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(asoc));
sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
SCTP_STATE(SCTP_STATE_ESTABLISHED));
SCTP_INC_STATS(SCTP_MIB_CURRESTAB);
@@ -1554,8 +1554,8 @@
* upon reception of a valid COOKIE ECHO chunk.
*/
ev = sctp_ulpevent_make_assoc_change(asoc, 0, SCTP_COMM_UP, 0,
- new_asoc->c.sinit_num_ostreams,
- new_asoc->c.sinit_max_instreams,
+ asoc->c.sinit_num_ostreams,
+ asoc->c.sinit_max_instreams,
GFP_ATOMIC);
if (!ev)
goto nomem_ev;

-----------------------------------------

I can't say that I'm an expert on this area so I'm hoping someone in the
list can provide some feedback. The change has been tested and it fixes
the original problem and we have not detected any side effects so far.

Thanks,
Oscar




Mar 30 19:47:45 localhost kernel: +++sctp_inq_pop+++ chunk cede2460[ABORT], length 8, skb->len 4
Mar 30 19:47:45 localhost kernel: sctp_do_sm prefn: ep d0ede960, EVENT_T_CHUNK, ABORT, asoc ce366000[STATE_ESTABLISHED], sctp_sf_do_9_1_abort
Mar 30 19:47:45 localhost kernel: sctp_do_sm postfn: asoc ce366000, status: DISPOSITION_ABORT
Mar 30 19:47:45 localhost kernel: sm_sideff: event_up: ce6a3338, ulpq: ce36741c.
Mar 30 19:47:45 localhost kernel: sctp_do_sm post sfx: error 0, asoc ce366000[STATE_CLOSED]
Mar 30 19:47:45 localhost kernel: sctp_sendmsg(sk: dfcdf320, msg: d0a19ea0, msg_len: 8)
Mar 30 19:47:45 localhost kernel: Using endpoint: unnamedEndpoint.
Mar 30 19:47:45 localhost kernel: Just memcpy'd. msg_name is 0xa962018:51000.
Mar 30 19:47:45 localhost kernel: msg_len: 8, sinfo_flags: 0x0
Mar 30 19:47:45 localhost kernel: About to look up association.
Mar 30 19:47:45 localhost kernel: There is no association yet.
Mar 30 19:47:45 localhost kernel: myctsnap for unnamedEndpoint INIT as 0xb693faae.
Mar 30 19:47:45 localhost kernel: sctp_v4_get_dst: DST:XX.XX.XX.24, SRC:0.0.0.0 - <7>rt_dst:XX.XX.XX.24, rt_src:XX.XX.XX.109
Mar 30 19:47:45 localhost kernel: sctp_assoc_add_peer:association ce01c000 PMTU set to 512
Mar 30 19:47:45 localhost kernel: sctp_packet_init: packet:d4e81ce4 transport:d4e81c00
Mar 30 19:47:45 localhost kernel: We have a valid association.
Mar 30 19:47:45 localhost kernel: sctp_do_sm prefn: ep d0ede960, EVENT_T_PRIMITIVE, PRIMITIVE_ASSOCIATE, asoc ce01c000[STATE_CLOSED], sctp_sf_do_prm_asoc
Mar 30 19:47:45 localhost kernel: sctp_do_sm postfn: asoc ce01c000, status: DISPOSITION_CONSUME
Mar 30 19:47:45 localhost kernel: sctp_outq_tail(ce01d3d8, cede2460[INIT])
Mar 30 19:47:45 localhost kernel: sctp_packet_config: packet:d4e81ce4 vtag:0x0
Mar 30 19:47:45 localhost kernel: sctp_packet_init: packet:d0a19990 transport:d4e81c00
Mar 30 19:47:45 localhost kernel: sctp_packet_config: packet:d0a19990 vtag:0x0
Mar 30 19:47:45 localhost kernel: sctp_packet_append_chunk: packet:d0a19990 chunk:cede2460
Mar 30 19:47:45 localhost kernel: sctp_packet_transmit: packet:d0a19990
Mar 30 19:47:45 localhost kernel: ***sctp_transmit_packet***
Mar 30 19:47:45 localhost kernel: *** Chunk cede2460[INIT] No TSN 0x0, length 44, chunk->skb->len 44, rtt_in_progress 0
Mar 30 19:47:45 localhost kernel: sctp_v4_get_dst: DST:XX.XX.XX.24, SRC:0.0.0.0 - <7>rt_dst:XX.XX.XX.24, rt_src:XX.XX.XX.109
Mar 30 19:47:45 localhost kernel: sctp_assoc_sync_pmtu: asoc:ce01c000, pmtu:512, frag_point:464
Mar 30 19:47:45 localhost kernel: ***sctp_transmit_packet*** skb len 56
Mar 30 19:47:45 localhost kernel: sctp_v4_xmit: skb:ce615e00, len:56, src:XX.XX.XX.109, dst:XX.XX.XX.24
Mar 30 19:47:45 localhost kernel: sctp_do_sm post sfx: error 0, asoc ce01c000[STATE_CLOSED]
Mar 30 19:47:45 localhost kernel: We associated primitively.
Mar 30 19:47:45 localhost kernel: sctp_do_sm prefn: ep d0ede960, EVENT_T_PRIMITIVE, PRIMITIVE_SEND, asoc ce01c000[STATE_COOKIE_WAIT], sctp_sf_do_prm_send
Mar 30 19:47:45 localhost kernel: sctp_do_sm postfn: asoc ce01c000, status: DISPOSITION_CONSUME
Mar 30 19:47:45 localhost kernel: sctp_outq_tail(ce01d3d8, cede2460[DATA])
Mar 30 19:47:45 localhost kernel: outqueueing (ce01d3d8, cede2460[DATA])
Mar 30 19:47:45 localhost kernel: sctp_do_sm post sfx: error 0, asoc ce01c000[STATE_CLOSED]
Mar 30 19:47:45 localhost kernel: We sent primitively.
Mar 30 19:47:45 localhost kernel: sctp_getsockopt(sk: dfcdf320, ...)
Mar 30 19:47:45 localhost kernel: sctp_recvmsg(sk: dfcdf320, msghdr: d0a19e20, len: 1024, knoblauch: 0, flags: 0x0, addr_len: d0a19cb8)
Mar 30 19:47:45 localhost kernel: Timeout: timeo: 2147483647, MAX: 2147483647.
Mar 30 19:47:45 localhost kernel: sctp_recvmsg(sk: dfcdf320, msghdr: d0a19e20, len: 1024, knoblauch: 0, flags: 0x0, addr_len: d0a19cb8)
Mar 30 19:47:45 localhost kernel: Timeout: timeo: 2147483647, MAX: 2147483647.
Mar 30 19:47:45 localhost kernel: sctp_recvmsg(sk: dfcdf320, msghdr: d0a19e20, len: 1024, knoblauch: 0, flags: 0x0, addr_len: d0a19cb8)
Mar 30 19:47:45 localhost kernel: Timeout: timeo: 2147483647, MAX: 2147483647.
Mar 30 19:47:45 localhost kernel: +++sctp_inq_pop+++ chunk cede23a0[INIT], length 32, skb->len 28
Mar 30 19:47:45 localhost kernel: sctp_do_sm prefn: ep d0ede960, EVENT_T_CHUNK, INIT, asoc ce01c000[STATE_COOKIE_WAIT], sctp_sf_do_5_2_1_siminit
Mar 30 19:47:45 localhost kernel: myctsnap for unnamedEndpoint INIT as 0x3acb4214.
Mar 30 19:47:45 localhost kernel: sctp_v4_get_dst: DST:XX.XX.XX.24, SRC:0.0.0.0 - <7>rt_dst:XX.XX.XX.24, rt_src:XX.XX.XX.109
Mar 30 19:47:45 localhost kernel: sctp_assoc_add_peer:association ceffe000 PMTU set to 512
Mar 30 19:47:45 localhost kernel: sctp_packet_init: packet:d4e81ae4 transport:d4e81a00
Mar 30 19:47:45 localhost kernel: sctp_do_sm postfn: asoc ce01c000, status: DISPOSITION_CONSUME
Mar 30 19:47:45 localhost kernel: sctp_outq_tail(cefff3d8, cede2ee0[INIT_ACK])
Mar 30 19:47:45 localhost kernel: sctp_packet_config: packet:d4e81ce4 vtag:0x4c840a08
Mar 30 19:47:45 localhost kernel: sctp_packet_init: packet:dff95a70 transport:d4e81c00
Mar 30 19:47:45 localhost kernel: sctp_packet_config: packet:dff95a70 vtag:0x4c840a08
Mar 30 19:47:45 localhost kernel: sctp_packet_append_chunk: packet:dff95a70 chunk:cede2ee0
Mar 30 19:47:45 localhost kernel: sctp_packet_transmit: packet:dff95a70
Mar 30 19:47:45 localhost kernel: ***sctp_transmit_packet***
Mar 30 19:47:45 localhost kernel: *** Chunk cede2ee0[INIT_ACK] No TSN 0x0, length 196, chunk->skb->len 196, rtt_in_progress 0
Mar 30 19:47:45 localhost kernel: ***sctp_transmit_packet*** skb len 208
Mar 30 19:47:45 localhost kernel: sctp_v4_xmit: skb:ce615d40, len:208, src:XX.XX.XX.109, dst:XX.XX.XX.24
Mar 30 19:47:45 localhost kernel: sctp_packet_free: packet:d4e81ae4
Mar 30 19:47:45 localhost kernel: sctp_do_sm post sfx: error 0, asoc ce01c000[STATE_CLOSED]
Mar 30 19:47:45 localhost kernel: +++sctp_inq_pop+++ chunk cede23a0[COOKIE_ECHO], length 164, skb->len 248
Mar 30 19:47:45 localhost kernel: sctp_do_sm prefn: ep d0ede960, EVENT_T_CHUNK, COOKIE_ECHO, asoc ce01c000[STATE_COOKIE_WAIT], sctp_sf_do_5_2_4_dupcook
Mar 30 19:47:45 localhost kernel: myctsnap for unnamedEndpoint INIT as 0x3acb0879.
Mar 30 19:47:45 localhost kernel: sctp_v4_get_dst: DST:XX.XX.XX.24, SRC:0.0.0.0 - <7>rt_dst:XX.XX.XX.24, rt_src:XX.XX.XX.109
Mar 30 19:47:45 localhost kernel: sctp_assoc_add_peer:association ceffe000 PMTU set to 512
Mar 30 19:47:45 localhost kernel: sctp_packet_init: packet:cebe44e4 transport:cebe4400
Mar 30 19:47:45 localhost kernel: sctp_sf_do_dupcook_b: assoc:0xce01c000 ev:0xce6a3e78
Mar 30 19:47:45 localhost kernel: sctp_do_sm postfn: asoc ce01c000, status: DISPOSITION_CONSUME
Mar 30 19:47:45 localhost kernel: sctp_outq_tail(ce01d3d8, cede2ee0[COOKIE_ACK])
Mar 30 19:47:45 localhost kernel: sctp_packet_config: packet:d4e81ce4 vtag:0x4c840a08
Mar 30 19:47:45 localhost kernel: sctp_packet_transmit_chunk: packet:d4e81ce4 chunk:cede2ee0
Mar 30 19:47:45 localhost kernel: sctp_packet_append_chunk: packet:d4e81ce4 chunk:cede2ee0
Mar 30 19:47:45 localhost kernel: sctp_outq_flush(ce01d3d8, cede2460[DATA]), <7>TX TSN 0x0 skb->head dfa2b160 skb->users 1.
Mar 30 19:47:45 localhost kernel: sctp_packet_transmit_chunk: packet:d4e81ce4 chunk:cede2460
Mar 30 19:47:45 localhost kernel: sctp_packet_append_chunk: packet:d4e81ce4 chunk:cede2460
Mar 30 19:47:45 localhost kernel: sctp_packet_transmit: packet:d4e81ce4
Mar 30 19:47:45 localhost kernel: ***sctp_transmit_packet***
Mar 30 19:47:45 localhost kernel: *** Chunk cede2ee0[COOKIE_ACK] No TSN 0x0, length 4, chunk->skb->len 4, rtt_in_progress 0
Mar 30 19:47:45 localhost kernel: *** Chunk cede2460[DATA] TSN 0xb693faaf, length 24, chunk->skb->len 24, rtt_in_progress 1
Mar 30 19:47:45 localhost kernel: ***sctp_transmit_packet*** skb len 40
Mar 30 19:47:45 localhost kernel: sctp_v4_xmit: skb:ce6a3900, len:40, src:XX.XX.XX.109, dst:XX.XX.XX.24
Mar 30 19:47:45 localhost kernel: sm_sideff: event_up: ce6a3e78, ulpq: ce01d41c.
Mar 30 19:47:45 localhost kernel: sctp_packet_free: packet:cebe44e4
Mar 30 19:47:45 localhost kernel: sctp_do_sm post sfx: error 0, asoc ce01c000[STATE_CLOSED]
Mar 30 19:47:45 localhost kernel: +++sctp_inq_pop+++ chunk cede23a0[DATA], length 88, skb->len 84
Mar 30 19:47:45 localhost kernel: sctp_do_sm prefn: ep d0ede960, EVENT_T_CHUNK, DATA, asoc ce01c000[STATE_ESTABLISHED], sctp_sf_eat_data_6_2
Mar 30 19:47:45 localhost kernel: eat_data: TSN 0xdf97c21d.
Mar 30 19:47:45 localhost kernel: sctp_do_sm postfn: asoc ce01c000, status: DISPOSITION_CONSUME
Mar 30 19:47:45 localhost kernel: sm_sideff: chunk_up: cede23a0, ulpq: ce01d41c.
Mar 30 19:47:45 localhost kernel: sctp_assoc_rwnd_decrease: asoc ce01c000 rwnd decreased by 72 to (108472, 0)
Mar 30 19:47:45 localhost kernel: sackCTSNAck sent: 0xdf97c21d.
Mar 30 19:47:45 localhost kernel: sctp_outq_tail(ce01d3d8, cede2ee0[SACK])
Mar 30 19:47:45 localhost kernel: sctp_packet_config: packet:d4e81ce4 vtag:0x4c840a08
Mar 30 19:47:45 localhost kernel: sctp_packet_transmit_chunk: packet:d4e81ce4 chunk:cede2ee0
Mar 30 19:47:45 localhost kernel: sctp_packet_append_chunk: packet:d4e81ce4 chunk:cede2ee0
Mar 30 19:47:45 localhost kernel: sctp_packet_transmit: packet:d4e81ce4
Mar 30 19:47:45 localhost kernel: ***sctp_transmit_packet***
Mar 30 19:47:45 localhost kernel: *** Chunk cede2ee0[SACK] No TSN 0x0, length 16, chunk->skb->len 16, rtt_in_progress 0
Mar 30 19:47:45 localhost kernel: ***sctp_transmit_packet*** skb len 28
Mar 30 19:47:45 localhost kernel: sctp_v4_xmit: skb:ce615d40, len:28, src:XX.XX.XX.109, dst:XX.XX.XX.24
Mar 30 19:47:45 localhost kernel: sctp_do_sm post sfx: error 0, asoc ce01c000[STATE_CLOSED]