mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	sctp: re-use sctp_transport_pmtu in sctp_transport_route
sctp_transport_route currently is very similar to sctp_transport_pmtu plus a few other bits. This patch reuses sctp_transport_pmtu in sctp_transport_route and removes the duplicated code. Also, as all calls to sctp_transport_route were forcing the dst release before calling it, let's just include such release too. Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									22d7be267e
								
							
						
					
					
						commit
						6e91b578bf
					
				
					 2 changed files with 19 additions and 22 deletions
				
			
		| 
						 | 
					@ -644,16 +644,15 @@ static int sctp_send_asconf_add_ip(struct sock		*sk,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			list_for_each_entry(trans,
 | 
								list_for_each_entry(trans,
 | 
				
			||||||
			    &asoc->peer.transport_addr_list, transports) {
 | 
								    &asoc->peer.transport_addr_list, transports) {
 | 
				
			||||||
				/* Clear the source and route cache */
 | 
					 | 
				
			||||||
				sctp_transport_dst_release(trans);
 | 
					 | 
				
			||||||
				trans->cwnd = min(4*asoc->pathmtu, max_t(__u32,
 | 
									trans->cwnd = min(4*asoc->pathmtu, max_t(__u32,
 | 
				
			||||||
				    2*asoc->pathmtu, 4380));
 | 
									    2*asoc->pathmtu, 4380));
 | 
				
			||||||
				trans->ssthresh = asoc->peer.i.a_rwnd;
 | 
									trans->ssthresh = asoc->peer.i.a_rwnd;
 | 
				
			||||||
				trans->rto = asoc->rto_initial;
 | 
									trans->rto = asoc->rto_initial;
 | 
				
			||||||
				sctp_max_rto(asoc, trans);
 | 
									sctp_max_rto(asoc, trans);
 | 
				
			||||||
				trans->rtt = trans->srtt = trans->rttvar = 0;
 | 
									trans->rtt = trans->srtt = trans->rttvar = 0;
 | 
				
			||||||
 | 
									/* Clear the source and route cache */
 | 
				
			||||||
				sctp_transport_route(trans, NULL,
 | 
									sctp_transport_route(trans, NULL,
 | 
				
			||||||
				    sctp_sk(asoc->base.sk));
 | 
											     sctp_sk(asoc->base.sk));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		retval = sctp_send_asconf(asoc, chunk);
 | 
							retval = sctp_send_asconf(asoc, chunk);
 | 
				
			||||||
| 
						 | 
					@ -896,7 +895,6 @@ static int sctp_send_asconf_del_ip(struct sock		*sk,
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		list_for_each_entry(transport, &asoc->peer.transport_addr_list,
 | 
							list_for_each_entry(transport, &asoc->peer.transport_addr_list,
 | 
				
			||||||
					transports) {
 | 
										transports) {
 | 
				
			||||||
			sctp_transport_dst_release(transport);
 | 
					 | 
				
			||||||
			sctp_transport_route(transport, NULL,
 | 
								sctp_transport_route(transport, NULL,
 | 
				
			||||||
					     sctp_sk(asoc->base.sk));
 | 
										     sctp_sk(asoc->base.sk));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -242,6 +242,15 @@ void sctp_transport_pmtu(struct sctp_transport *transport, struct sock *sk)
 | 
				
			||||||
						&transport->fl, sk);
 | 
											&transport->fl, sk);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (transport->param_flags & SPP_PMTUD_DISABLE) {
 | 
				
			||||||
 | 
							struct sctp_association *asoc = transport->asoc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!transport->pathmtu && asoc && asoc->pathmtu)
 | 
				
			||||||
 | 
								transport->pathmtu = asoc->pathmtu;
 | 
				
			||||||
 | 
							if (transport->pathmtu)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (transport->dst)
 | 
						if (transport->dst)
 | 
				
			||||||
		transport->pathmtu = sctp_dst_mtu(transport->dst);
 | 
							transport->pathmtu = sctp_dst_mtu(transport->dst);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
| 
						 | 
					@ -290,6 +299,7 @@ void sctp_transport_route(struct sctp_transport *transport,
 | 
				
			||||||
	struct sctp_association *asoc = transport->asoc;
 | 
						struct sctp_association *asoc = transport->asoc;
 | 
				
			||||||
	struct sctp_af *af = transport->af_specific;
 | 
						struct sctp_af *af = transport->af_specific;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sctp_transport_dst_release(transport);
 | 
				
			||||||
	af->get_dst(transport, saddr, &transport->fl, sctp_opt2sk(opt));
 | 
						af->get_dst(transport, saddr, &transport->fl, sctp_opt2sk(opt));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (saddr)
 | 
						if (saddr)
 | 
				
			||||||
| 
						 | 
					@ -297,25 +307,14 @@ void sctp_transport_route(struct sctp_transport *transport,
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		af->get_saddr(opt, transport, &transport->fl);
 | 
							af->get_saddr(opt, transport, &transport->fl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((transport->param_flags & SPP_PMTUD_DISABLE) && transport->pathmtu) {
 | 
						sctp_transport_pmtu(transport, sctp_opt2sk(opt));
 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (transport->dst) {
 | 
					 | 
				
			||||||
		transport->pathmtu = SCTP_TRUNC4(dst_mtu(transport->dst));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Initialize sk->sk_rcv_saddr, if the transport is the
 | 
						/* Initialize sk->sk_rcv_saddr, if the transport is the
 | 
				
			||||||
		 * association's active path for getsockname().
 | 
						 * association's active path for getsockname().
 | 
				
			||||||
		 */
 | 
						 */
 | 
				
			||||||
		if (asoc && (!asoc->peer.primary_path ||
 | 
						if (transport->dst && asoc &&
 | 
				
			||||||
			     (transport == asoc->peer.active_path)))
 | 
						    (!asoc->peer.primary_path || transport == asoc->peer.active_path))
 | 
				
			||||||
			opt->pf->to_sk_saddr(&transport->saddr,
 | 
							opt->pf->to_sk_saddr(&transport->saddr, asoc->base.sk);
 | 
				
			||||||
					     asoc->base.sk);
 | 
					 | 
				
			||||||
	} else if ((transport->param_flags & SPP_PMTUD_DISABLE) &&
 | 
					 | 
				
			||||||
		   asoc && asoc->pathmtu) {
 | 
					 | 
				
			||||||
		transport->pathmtu = asoc->pathmtu;
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Hold a reference to a transport.  */
 | 
					/* Hold a reference to a transport.  */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue