diff options
Diffstat (limited to 'net/sctp/transport.c')
-rw-r--r-- | net/sctp/transport.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index c97472b248a2..953c21e4af97 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c | |||
@@ -59,7 +59,8 @@ | |||
59 | /* 1st Level Abstractions. */ | 59 | /* 1st Level Abstractions. */ |
60 | 60 | ||
61 | /* Initialize a new transport from provided memory. */ | 61 | /* Initialize a new transport from provided memory. */ |
62 | static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, | 62 | static struct sctp_transport *sctp_transport_init(struct net *net, |
63 | struct sctp_transport *peer, | ||
63 | const union sctp_addr *addr, | 64 | const union sctp_addr *addr, |
64 | gfp_t gfp) | 65 | gfp_t gfp) |
65 | { | 66 | { |
@@ -76,7 +77,7 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, | |||
76 | * given destination transport address, set RTO to the protocol | 77 | * given destination transport address, set RTO to the protocol |
77 | * parameter 'RTO.Initial'. | 78 | * parameter 'RTO.Initial'. |
78 | */ | 79 | */ |
79 | peer->rto = msecs_to_jiffies(sctp_rto_initial); | 80 | peer->rto = msecs_to_jiffies(net->sctp.rto_initial); |
80 | 81 | ||
81 | peer->last_time_heard = jiffies; | 82 | peer->last_time_heard = jiffies; |
82 | peer->last_time_ecne_reduced = jiffies; | 83 | peer->last_time_ecne_reduced = jiffies; |
@@ -86,8 +87,8 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, | |||
86 | SPP_SACKDELAY_ENABLE; | 87 | SPP_SACKDELAY_ENABLE; |
87 | 88 | ||
88 | /* Initialize the default path max_retrans. */ | 89 | /* Initialize the default path max_retrans. */ |
89 | peer->pathmaxrxt = sctp_max_retrans_path; | 90 | peer->pathmaxrxt = net->sctp.max_retrans_path; |
90 | peer->pf_retrans = sctp_pf_retrans; | 91 | peer->pf_retrans = net->sctp.pf_retrans; |
91 | 92 | ||
92 | INIT_LIST_HEAD(&peer->transmitted); | 93 | INIT_LIST_HEAD(&peer->transmitted); |
93 | INIT_LIST_HEAD(&peer->send_ready); | 94 | INIT_LIST_HEAD(&peer->send_ready); |
@@ -109,7 +110,8 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, | |||
109 | } | 110 | } |
110 | 111 | ||
111 | /* Allocate and initialize a new transport. */ | 112 | /* Allocate and initialize a new transport. */ |
112 | struct sctp_transport *sctp_transport_new(const union sctp_addr *addr, | 113 | struct sctp_transport *sctp_transport_new(struct net *net, |
114 | const union sctp_addr *addr, | ||
113 | gfp_t gfp) | 115 | gfp_t gfp) |
114 | { | 116 | { |
115 | struct sctp_transport *transport; | 117 | struct sctp_transport *transport; |
@@ -118,7 +120,7 @@ struct sctp_transport *sctp_transport_new(const union sctp_addr *addr, | |||
118 | if (!transport) | 120 | if (!transport) |
119 | goto fail; | 121 | goto fail; |
120 | 122 | ||
121 | if (!sctp_transport_init(transport, addr, gfp)) | 123 | if (!sctp_transport_init(net, transport, addr, gfp)) |
122 | goto fail_init; | 124 | goto fail_init; |
123 | 125 | ||
124 | transport->malloced = 1; | 126 | transport->malloced = 1; |
@@ -316,6 +318,7 @@ void sctp_transport_update_rto(struct sctp_transport *tp, __u32 rtt) | |||
316 | SCTP_ASSERT(tp->rto_pending, "rto_pending not set", return); | 318 | SCTP_ASSERT(tp->rto_pending, "rto_pending not set", return); |
317 | 319 | ||
318 | if (tp->rttvar || tp->srtt) { | 320 | if (tp->rttvar || tp->srtt) { |
321 | struct net *net = sock_net(tp->asoc->base.sk); | ||
319 | /* 6.3.1 C3) When a new RTT measurement R' is made, set | 322 | /* 6.3.1 C3) When a new RTT measurement R' is made, set |
320 | * RTTVAR <- (1 - RTO.Beta) * RTTVAR + RTO.Beta * |SRTT - R'| | 323 | * RTTVAR <- (1 - RTO.Beta) * RTTVAR + RTO.Beta * |SRTT - R'| |
321 | * SRTT <- (1 - RTO.Alpha) * SRTT + RTO.Alpha * R' | 324 | * SRTT <- (1 - RTO.Alpha) * SRTT + RTO.Alpha * R' |
@@ -327,10 +330,10 @@ void sctp_transport_update_rto(struct sctp_transport *tp, __u32 rtt) | |||
327 | * For example, assuming the default value of RTO.Alpha of | 330 | * For example, assuming the default value of RTO.Alpha of |
328 | * 1/8, rto_alpha would be expressed as 3. | 331 | * 1/8, rto_alpha would be expressed as 3. |
329 | */ | 332 | */ |
330 | tp->rttvar = tp->rttvar - (tp->rttvar >> sctp_rto_beta) | 333 | tp->rttvar = tp->rttvar - (tp->rttvar >> net->sctp.rto_beta) |
331 | + ((abs(tp->srtt - rtt)) >> sctp_rto_beta); | 334 | + ((abs(tp->srtt - rtt)) >> net->sctp.rto_beta); |
332 | tp->srtt = tp->srtt - (tp->srtt >> sctp_rto_alpha) | 335 | tp->srtt = tp->srtt - (tp->srtt >> net->sctp.rto_alpha) |
333 | + (rtt >> sctp_rto_alpha); | 336 | + (rtt >> net->sctp.rto_alpha); |
334 | } else { | 337 | } else { |
335 | /* 6.3.1 C2) When the first RTT measurement R is made, set | 338 | /* 6.3.1 C2) When the first RTT measurement R is made, set |
336 | * SRTT <- R, RTTVAR <- R/2. | 339 | * SRTT <- R, RTTVAR <- R/2. |