@@ -110,6 +110,7 @@ static fnet_return_t _fnet_tcp_setsockopt( fnet_socket_if_t *sk, fnet_protocol_t
110110static fnet_return_t _fnet_tcp_getsockopt ( fnet_socket_if_t * sk , fnet_protocol_t level , fnet_socket_options_t optname , void * optval , fnet_size_t * optlen );
111111static fnet_return_t _fnet_tcp_listen ( fnet_socket_if_t * sk , fnet_size_t backlog );
112112static void _fnet_tcp_drain ( void );
113+ static void _fnet_tcp_initial_seq_number_update ( void );
113114
114115#if FNET_CFG_DEBUG_TRACE_TCP && FNET_CFG_DEBUG_TRACE
115116 void _fnet_tcp_trace (fnet_uint8_t * str , fnet_tcp_header_t * tcp_hdr );
@@ -127,8 +128,8 @@ static void _fnet_tcp_drain( void );
127128/* Initial Sequence Number
128129 * tcpcb_isntime is changed by STEPISN every 0.5 sec.
129130 * Additionaly, each time a connection is established,
130- * tcpcb_isntime is also incremented by FNET_TCP_INITIAL_SEQ_NUMBER_STEP */
131- static fnet_uint32_t _fnet_tcp_initial_seq_number = 1u ;
131+ * tcpcb_isntime is also incremented by FNET_TCP_INITIAL_SEQ_NUMBER_STEP + random value */
132+ static fnet_uint32_t _fnet_tcp_initial_seq_number ;
132133
133134/* Timers.*/
134135static fnet_timer_desc_t fnet_tcp_fasttimer ;
@@ -174,15 +175,15 @@ fnet_prot_if_t fnet_tcp_prot_if =
174175*************************************************************************/
175176static fnet_return_t _fnet_tcp_init ( void )
176177{
177- /* Create the slow timer.*/
178+ /* Create the fast timer.*/
178179 fnet_tcp_fasttimer = _fnet_timer_new (FNET_TCP_FAST_TIMER_PERIOD_MS , _fnet_tcp_fasttimo , 0u );
179180
180181 if (!fnet_tcp_fasttimer )
181182 {
182183 return FNET_ERR ;
183184 }
184185
185- /* Create the fast timer.*/
186+ /* Create the slow timer.*/
186187 fnet_tcp_slowtimer = _fnet_timer_new (FNET_TCP_SLOW_TIMER_PERIOD_MS , _fnet_tcp_slowtimo , 0u );
187188
188189 if (!fnet_tcp_slowtimer )
@@ -192,6 +193,9 @@ static fnet_return_t _fnet_tcp_init( void )
192193 return FNET_ERR ;
193194 }
194195
196+ /* Initialize ISN */
197+ _fnet_tcp_initial_seq_number_update ();
198+
195199 return FNET_OK ;
196200}
197201
@@ -437,6 +441,14 @@ static fnet_return_t _fnet_tcp_attach( fnet_socket_if_t *sk )
437441 return FNET_OK ;
438442}
439443
444+ /************************************************************************
445+ * DESCRIPTION: This function updates TCP ISN.
446+ *************************************************************************/
447+ static void _fnet_tcp_initial_seq_number_update ( void )
448+ {
449+ /* Increase Initial Sequence Number. */
450+ _fnet_tcp_initial_seq_number += FNET_TCP_INITIAL_SEQ_NUMBER_STEP + fnet_rand () & 0xFF ;
451+ }
440452/************************************************************************
441453* DESCRIPTION: This function performs the connection termination.
442454*
@@ -591,7 +603,7 @@ static fnet_return_t _fnet_tcp_connect( fnet_socket_if_t *sk, struct fnet_sockad
591603 sk -> state = SS_CONNECTING ;
592604
593605 /* Increase Initial Sequence Number.*/
594- _fnet_tcp_initial_seq_number += FNET_TCP_INITIAL_SEQ_NUMBER_STEP ;
606+ _fnet_tcp_initial_seq_number_update () ;
595607
596608 /* Initialize Abort Timer.*/
597609 cb -> tcpcb_timers .retransmission = cb -> tcpcb_rto ;
@@ -1790,7 +1802,7 @@ static fnet_bool_t _fnet_tcp_inputsk( fnet_socket_if_t *sk, fnet_netbuf_t *inseg
17901802 _fnet_tcp_send_headseg (psk , FNET_TCP_SGT_SYN | FNET_TCP_SGT_ACK , options , optionlen );
17911803
17921804 /* Increase ISN (Initial Sequence Number).*/
1793- _fnet_tcp_initial_seq_number += FNET_TCP_INITIAL_SEQ_NUMBER_STEP ;
1805+ _fnet_tcp_initial_seq_number_update () ;
17941806
17951807 /* Initialization the connection timer.*/
17961808 pcb -> tcpcb_timers .connection = FNET_TCP_ABORT_INTERVAL_CON ;
@@ -2745,7 +2757,7 @@ static void _fnet_tcp_slowtimo(fnet_uint32_t cookie)
27452757 sk = nextsk ;
27462758 }
27472759
2748- _fnet_tcp_initial_seq_number += FNET_TCP_INITIAL_SEQ_NUMBER_STEP ;
2760+ _fnet_tcp_initial_seq_number_update () ;
27492761
27502762 fnet_isr_unlock ();
27512763}
0 commit comments