aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/transport.c
diff options
context:
space:
mode:
authorVlad Yasevich <vladislav.yasevich@hp.com>2011-04-26 17:51:31 -0400
committerDavid S. Miller <davem@davemloft.net>2011-04-27 16:14:04 -0400
commit9914ae3ca770389a3bec3114d0a07532a7f235dd (patch)
tree269120740aa1afdb0dd792284341aaee93024f28 /net/sctp/transport.c
parent625034113bd45c71fb9e329f52f25fef9e6993a3 (diff)
sctp: cache the ipv6 source after route lookup
The ipv6 routing lookup does give us a source address, but instead of filling it into the dst, it's stored in the flowi. We can use that instead of going through the entire source address selection again. Also the useless ->dst_saddr member of sctp_pf is removed. And sctp_v6_dst_saddr() is removed, instead by introduce sctp_v6_to_addr(), which can be reused to cleanup some dup code. Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com> Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/transport.c')
-rw-r--r--net/sctp/transport.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/net/sctp/transport.c b/net/sctp/transport.c
index d3ae493d234..2544b9b21f8 100644
--- a/net/sctp/transport.c
+++ b/net/sctp/transport.c
@@ -211,11 +211,15 @@ void sctp_transport_set_owner(struct sctp_transport *transport,
211} 211}
212 212
213/* Initialize the pmtu of a transport. */ 213/* Initialize the pmtu of a transport. */
214void sctp_transport_pmtu(struct sctp_transport *transport) 214void sctp_transport_pmtu(struct sctp_transport *transport, struct sock *sk)
215{ 215{
216 struct dst_entry *dst; 216 struct dst_entry *dst;
217 struct flowi fl;
217 218
218 dst = transport->af_specific->get_dst(NULL, &transport->ipaddr, NULL); 219 dst = transport->af_specific->get_dst(transport->asoc,
220 &transport->ipaddr,
221 &transport->saddr,
222 &fl, sk);
219 223
220 if (dst) { 224 if (dst) {
221 transport->pathmtu = dst_mtu(dst); 225 transport->pathmtu = dst_mtu(dst);
@@ -272,15 +276,16 @@ void sctp_transport_route(struct sctp_transport *transport,
272 struct sctp_af *af = transport->af_specific; 276 struct sctp_af *af = transport->af_specific;
273 union sctp_addr *daddr = &transport->ipaddr; 277 union sctp_addr *daddr = &transport->ipaddr;
274 struct dst_entry *dst; 278 struct dst_entry *dst;
279 struct flowi fl;
275 280
276 dst = af->get_dst(asoc, daddr, saddr); 281 dst = af->get_dst(asoc, daddr, saddr, &fl, sctp_opt2sk(opt));
282 transport->dst = dst;
277 283
278 if (saddr) 284 if (saddr)
279 memcpy(&transport->saddr, saddr, sizeof(union sctp_addr)); 285 memcpy(&transport->saddr, saddr, sizeof(union sctp_addr));
280 else 286 else
281 af->get_saddr(opt, asoc, dst, daddr, &transport->saddr); 287 af->get_saddr(opt, transport, daddr, &fl);
282 288
283 transport->dst = dst;
284 if ((transport->param_flags & SPP_PMTUD_DISABLE) && transport->pathmtu) { 289 if ((transport->param_flags & SPP_PMTUD_DISABLE) && transport->pathmtu) {
285 return; 290 return;
286 } 291 }