Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts were two cases of simple overlapping changes, nothing serious. In the UDP case, we need to add a hlist_add_tail_rcu() to linux/rculist.h, because we've moved UDP socket handling away from using nulls lists. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -866,8 +866,10 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp)
|
||||
* sender MUST assure that at least one T3-rtx
|
||||
* timer is running.
|
||||
*/
|
||||
if (chunk->chunk_hdr->type == SCTP_CID_FWD_TSN)
|
||||
sctp_transport_reset_timers(transport);
|
||||
if (chunk->chunk_hdr->type == SCTP_CID_FWD_TSN) {
|
||||
sctp_transport_reset_t3_rtx(transport);
|
||||
transport->last_time_sent = jiffies;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -924,8 +926,10 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp)
|
||||
error = sctp_outq_flush_rtx(q, packet,
|
||||
rtx_timeout, &start_timer);
|
||||
|
||||
if (start_timer)
|
||||
sctp_transport_reset_timers(transport);
|
||||
if (start_timer) {
|
||||
sctp_transport_reset_t3_rtx(transport);
|
||||
transport->last_time_sent = jiffies;
|
||||
}
|
||||
|
||||
/* This can happen on COOKIE-ECHO resend. Only
|
||||
* one chunk can get bundled with a COOKIE-ECHO.
|
||||
@@ -1062,7 +1066,8 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp)
|
||||
list_add_tail(&chunk->transmitted_list,
|
||||
&transport->transmitted);
|
||||
|
||||
sctp_transport_reset_timers(transport);
|
||||
sctp_transport_reset_t3_rtx(transport);
|
||||
transport->last_time_sent = jiffies;
|
||||
|
||||
/* Only let one DATA chunk get bundled with a
|
||||
* COOKIE-ECHO chunk.
|
||||
|
@@ -3080,8 +3080,7 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
|
||||
return SCTP_ERROR_RSRC_LOW;
|
||||
|
||||
/* Start the heartbeat timer. */
|
||||
if (!mod_timer(&peer->hb_timer, sctp_transport_timeout(peer)))
|
||||
sctp_transport_hold(peer);
|
||||
sctp_transport_reset_hb_timer(peer);
|
||||
asoc->new_transport = peer;
|
||||
break;
|
||||
case SCTP_PARAM_DEL_IP:
|
||||
|
@@ -69,8 +69,6 @@ static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype,
|
||||
sctp_cmd_seq_t *commands,
|
||||
gfp_t gfp);
|
||||
|
||||
static void sctp_cmd_hb_timer_update(sctp_cmd_seq_t *cmds,
|
||||
struct sctp_transport *t);
|
||||
/********************************************************************
|
||||
* Helper functions
|
||||
********************************************************************/
|
||||
@@ -367,6 +365,7 @@ void sctp_generate_heartbeat_event(unsigned long data)
|
||||
struct sctp_association *asoc = transport->asoc;
|
||||
struct sock *sk = asoc->base.sk;
|
||||
struct net *net = sock_net(sk);
|
||||
u32 elapsed, timeout;
|
||||
|
||||
bh_lock_sock(sk);
|
||||
if (sock_owned_by_user(sk)) {
|
||||
@@ -378,6 +377,16 @@ void sctp_generate_heartbeat_event(unsigned long data)
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* Check if we should still send the heartbeat or reschedule */
|
||||
elapsed = jiffies - transport->last_time_sent;
|
||||
timeout = sctp_transport_timeout(transport);
|
||||
if (elapsed < timeout) {
|
||||
elapsed = timeout - elapsed;
|
||||
if (!mod_timer(&transport->hb_timer, jiffies + elapsed))
|
||||
sctp_transport_hold(transport);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
error = sctp_do_sm(net, SCTP_EVENT_T_TIMEOUT,
|
||||
SCTP_ST_TIMEOUT(SCTP_EVENT_TIMEOUT_HEARTBEAT),
|
||||
asoc->state, asoc->ep, asoc,
|
||||
@@ -507,7 +516,7 @@ static void sctp_do_8_2_transport_strike(sctp_cmd_seq_t *commands,
|
||||
0);
|
||||
|
||||
/* Update the hb timer to resend a heartbeat every rto */
|
||||
sctp_cmd_hb_timer_update(commands, transport);
|
||||
sctp_transport_reset_hb_timer(transport);
|
||||
}
|
||||
|
||||
if (transport->state != SCTP_INACTIVE &&
|
||||
@@ -634,11 +643,8 @@ static void sctp_cmd_hb_timers_start(sctp_cmd_seq_t *cmds,
|
||||
* hold a reference on the transport to make sure none of
|
||||
* the needed data structures go away.
|
||||
*/
|
||||
list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) {
|
||||
|
||||
if (!mod_timer(&t->hb_timer, sctp_transport_timeout(t)))
|
||||
sctp_transport_hold(t);
|
||||
}
|
||||
list_for_each_entry(t, &asoc->peer.transport_addr_list, transports)
|
||||
sctp_transport_reset_hb_timer(t);
|
||||
}
|
||||
|
||||
static void sctp_cmd_hb_timers_stop(sctp_cmd_seq_t *cmds,
|
||||
@@ -669,15 +675,6 @@ static void sctp_cmd_t3_rtx_timers_stop(sctp_cmd_seq_t *cmds,
|
||||
}
|
||||
|
||||
|
||||
/* Helper function to update the heartbeat timer. */
|
||||
static void sctp_cmd_hb_timer_update(sctp_cmd_seq_t *cmds,
|
||||
struct sctp_transport *t)
|
||||
{
|
||||
/* Update the heartbeat timer. */
|
||||
if (!mod_timer(&t->hb_timer, sctp_transport_timeout(t)))
|
||||
sctp_transport_hold(t);
|
||||
}
|
||||
|
||||
/* Helper function to handle the reception of an HEARTBEAT ACK. */
|
||||
static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds,
|
||||
struct sctp_association *asoc,
|
||||
@@ -742,8 +739,7 @@ static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds,
|
||||
sctp_transport_update_rto(t, (jiffies - hbinfo->sent_at));
|
||||
|
||||
/* Update the heartbeat timer. */
|
||||
if (!mod_timer(&t->hb_timer, sctp_transport_timeout(t)))
|
||||
sctp_transport_hold(t);
|
||||
sctp_transport_reset_hb_timer(t);
|
||||
|
||||
if (was_unconfirmed && asoc->peer.transport_count == 1)
|
||||
sctp_transport_immediate_rtx(t);
|
||||
@@ -1616,7 +1612,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
|
||||
|
||||
case SCTP_CMD_HB_TIMER_UPDATE:
|
||||
t = cmd->obj.transport;
|
||||
sctp_cmd_hb_timer_update(commands, t);
|
||||
sctp_transport_reset_hb_timer(t);
|
||||
break;
|
||||
|
||||
case SCTP_CMD_HB_TIMERS_STOP:
|
||||
|
@@ -183,7 +183,7 @@ static void sctp_transport_destroy(struct sctp_transport *transport)
|
||||
/* Start T3_rtx timer if it is not already running and update the heartbeat
|
||||
* timer. This routine is called every time a DATA chunk is sent.
|
||||
*/
|
||||
void sctp_transport_reset_timers(struct sctp_transport *transport)
|
||||
void sctp_transport_reset_t3_rtx(struct sctp_transport *transport)
|
||||
{
|
||||
/* RFC 2960 6.3.2 Retransmission Timer Rules
|
||||
*
|
||||
@@ -197,11 +197,18 @@ void sctp_transport_reset_timers(struct sctp_transport *transport)
|
||||
if (!mod_timer(&transport->T3_rtx_timer,
|
||||
jiffies + transport->rto))
|
||||
sctp_transport_hold(transport);
|
||||
}
|
||||
|
||||
void sctp_transport_reset_hb_timer(struct sctp_transport *transport)
|
||||
{
|
||||
unsigned long expires;
|
||||
|
||||
/* When a data chunk is sent, reset the heartbeat interval. */
|
||||
if (!mod_timer(&transport->hb_timer,
|
||||
sctp_transport_timeout(transport)))
|
||||
sctp_transport_hold(transport);
|
||||
expires = jiffies + sctp_transport_timeout(transport);
|
||||
if (time_before(transport->hb_timer.expires, expires) &&
|
||||
!mod_timer(&transport->hb_timer,
|
||||
expires + prandom_u32_max(transport->rto)))
|
||||
sctp_transport_hold(transport);
|
||||
}
|
||||
|
||||
/* This transport has been assigned to an association.
|
||||
@@ -595,13 +602,13 @@ void sctp_transport_burst_reset(struct sctp_transport *t)
|
||||
unsigned long sctp_transport_timeout(struct sctp_transport *trans)
|
||||
{
|
||||
/* RTO + timer slack +/- 50% of RTO */
|
||||
unsigned long timeout = (trans->rto >> 1) + prandom_u32_max(trans->rto);
|
||||
unsigned long timeout = trans->rto >> 1;
|
||||
|
||||
if (trans->state != SCTP_UNCONFIRMED &&
|
||||
trans->state != SCTP_PF)
|
||||
timeout += trans->hbinterval;
|
||||
|
||||
return timeout + jiffies;
|
||||
return timeout;
|
||||
}
|
||||
|
||||
/* Reset transport variables to their initial values */
|
||||
|
Reference in New Issue
Block a user