sctp: introduce sctp_assoc_update_frag_point
and avoid the open-coded versions of it. Now sctp_datamsg_from_user can just re-use asoc->frag_point as it will always be updated. 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
							
								
									feddd6c1af
								
							
						
					
					
						commit
						2f5e3c9df6
					
				| @ -428,26 +428,6 @@ static inline int sctp_list_single_entry(struct list_head *head) | |||||||
| 	return (head->next != head) && (head->next == head->prev); | 	return (head->next != head) && (head->next == head->prev); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Break down data chunks at this point.  */ |  | ||||||
| static inline int sctp_frag_point(const struct sctp_association *asoc, int pmtu) |  | ||||||
| { |  | ||||||
| 	struct sctp_sock *sp = sctp_sk(asoc->base.sk); |  | ||||||
| 	struct sctp_af *af = sp->pf->af; |  | ||||||
| 	int frag = pmtu; |  | ||||||
| 
 |  | ||||||
| 	frag -= af->ip_options_len(asoc->base.sk); |  | ||||||
| 	frag -= af->net_header_len; |  | ||||||
| 	frag -= sizeof(struct sctphdr) + sctp_datachk_len(&asoc->stream); |  | ||||||
| 
 |  | ||||||
| 	if (asoc->user_frag) |  | ||||||
| 		frag = min_t(int, frag, asoc->user_frag); |  | ||||||
| 
 |  | ||||||
| 	frag = SCTP_TRUNC4(min_t(int, frag, SCTP_MAX_CHUNK_LEN - |  | ||||||
| 					    sctp_datachk_len(&asoc->stream))); |  | ||||||
| 
 |  | ||||||
| 	return frag; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static inline void sctp_assoc_pending_pmtu(struct sctp_association *asoc) | static inline void sctp_assoc_pending_pmtu(struct sctp_association *asoc) | ||||||
| { | { | ||||||
| 	sctp_assoc_sync_pmtu(asoc); | 	sctp_assoc_sync_pmtu(asoc); | ||||||
|  | |||||||
| @ -2097,6 +2097,7 @@ int sctp_assoc_update(struct sctp_association *old, | |||||||
| 
 | 
 | ||||||
| __u32 sctp_association_get_next_tsn(struct sctp_association *); | __u32 sctp_association_get_next_tsn(struct sctp_association *); | ||||||
| 
 | 
 | ||||||
|  | void sctp_assoc_update_frag_point(struct sctp_association *asoc); | ||||||
| void sctp_assoc_set_pmtu(struct sctp_association *asoc, __u32 pmtu); | void sctp_assoc_set_pmtu(struct sctp_association *asoc, __u32 pmtu); | ||||||
| void sctp_assoc_sync_pmtu(struct sctp_association *asoc); | void sctp_assoc_sync_pmtu(struct sctp_association *asoc); | ||||||
| void sctp_assoc_rwnd_increase(struct sctp_association *, unsigned int); | void sctp_assoc_rwnd_increase(struct sctp_association *, unsigned int); | ||||||
|  | |||||||
| @ -666,8 +666,6 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, | |||||||
| 
 | 
 | ||||||
| 	peer->pmtu_pending = 0; | 	peer->pmtu_pending = 0; | ||||||
| 
 | 
 | ||||||
| 	asoc->frag_point = sctp_frag_point(asoc, asoc->pathmtu); |  | ||||||
| 
 |  | ||||||
| 	/* The asoc->peer.port might not be meaningful yet, but
 | 	/* The asoc->peer.port might not be meaningful yet, but
 | ||||||
| 	 * initialize the packet structure anyway. | 	 * initialize the packet structure anyway. | ||||||
| 	 */ | 	 */ | ||||||
| @ -1370,10 +1368,26 @@ sctp_assoc_choose_alter_transport(struct sctp_association *asoc, | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void sctp_assoc_update_frag_point(struct sctp_association *asoc) | ||||||
|  | { | ||||||
|  | 	int frag = sctp_mtu_payload(sctp_sk(asoc->base.sk), asoc->pathmtu, | ||||||
|  | 				    sctp_datachk_len(&asoc->stream)); | ||||||
|  | 
 | ||||||
|  | 	if (asoc->user_frag) | ||||||
|  | 		frag = min_t(int, frag, asoc->user_frag); | ||||||
|  | 
 | ||||||
|  | 	frag = min_t(int, frag, SCTP_MAX_CHUNK_LEN - | ||||||
|  | 				sctp_datachk_len(&asoc->stream)); | ||||||
|  | 
 | ||||||
|  | 	asoc->frag_point = SCTP_TRUNC4(frag); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void sctp_assoc_set_pmtu(struct sctp_association *asoc, __u32 pmtu) | void sctp_assoc_set_pmtu(struct sctp_association *asoc, __u32 pmtu) | ||||||
| { | { | ||||||
| 	if (asoc->pathmtu != pmtu) | 	if (asoc->pathmtu != pmtu) { | ||||||
| 		asoc->pathmtu = pmtu; | 		asoc->pathmtu = pmtu; | ||||||
|  | 		sctp_assoc_update_frag_point(asoc); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	pr_debug("%s: asoc:%p, pmtu:%d, frag_point:%d\n", __func__, asoc, | 	pr_debug("%s: asoc:%p, pmtu:%d, frag_point:%d\n", __func__, asoc, | ||||||
| 		 asoc->pathmtu, asoc->frag_point); | 		 asoc->pathmtu, asoc->frag_point); | ||||||
| @ -1403,10 +1417,6 @@ void sctp_assoc_sync_pmtu(struct sctp_association *asoc) | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	sctp_assoc_set_pmtu(asoc, pmtu); | 	sctp_assoc_set_pmtu(asoc, pmtu); | ||||||
| 	asoc->frag_point = sctp_frag_point(asoc, pmtu); |  | ||||||
| 
 |  | ||||||
| 	pr_debug("%s: asoc:%p, pmtu:%d, frag_point:%d\n", __func__, asoc, |  | ||||||
| 		 asoc->pathmtu, asoc->frag_point); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Should we send a SACK to update our peer? */ | /* Should we send a SACK to update our peer? */ | ||||||
|  | |||||||
| @ -172,8 +172,6 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, | |||||||
| 	struct list_head *pos, *temp; | 	struct list_head *pos, *temp; | ||||||
| 	struct sctp_chunk *chunk; | 	struct sctp_chunk *chunk; | ||||||
| 	struct sctp_datamsg *msg; | 	struct sctp_datamsg *msg; | ||||||
| 	struct sctp_sock *sp; |  | ||||||
| 	struct sctp_af *af; |  | ||||||
| 	int err; | 	int err; | ||||||
| 
 | 
 | ||||||
| 	msg = sctp_datamsg_new(GFP_KERNEL); | 	msg = sctp_datamsg_new(GFP_KERNEL); | ||||||
| @ -192,12 +190,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, | |||||||
| 	/* This is the biggest possible DATA chunk that can fit into
 | 	/* This is the biggest possible DATA chunk that can fit into
 | ||||||
| 	 * the packet | 	 * the packet | ||||||
| 	 */ | 	 */ | ||||||
| 	sp = sctp_sk(asoc->base.sk); | 	max_data = asoc->frag_point; | ||||||
| 	af = sp->pf->af; |  | ||||||
| 	max_data = asoc->pathmtu - af->net_header_len - |  | ||||||
| 		   sizeof(struct sctphdr) - sctp_datachk_len(&asoc->stream) - |  | ||||||
| 		   af->ip_options_len(asoc->base.sk); |  | ||||||
| 	max_data = SCTP_TRUNC4(max_data); |  | ||||||
| 
 | 
 | ||||||
| 	/* If the the peer requested that we authenticate DATA chunks
 | 	/* If the the peer requested that we authenticate DATA chunks
 | ||||||
| 	 * we need to account for bundling of the AUTH chunks along with | 	 * we need to account for bundling of the AUTH chunks along with | ||||||
| @ -222,9 +215,6 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Check what's our max considering the above */ |  | ||||||
| 	max_data = min_t(size_t, max_data, asoc->frag_point); |  | ||||||
| 
 |  | ||||||
| 	/* Set first_len and then account for possible bundles on first frag */ | 	/* Set first_len and then account for possible bundles on first frag */ | ||||||
| 	first_len = max_data; | 	first_len = max_data; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3251,7 +3251,7 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned | |||||||
| 			       sctp_datachk_len(&asoc->stream); | 			       sctp_datachk_len(&asoc->stream); | ||||||
| 		} | 		} | ||||||
| 		asoc->user_frag = val; | 		asoc->user_frag = val; | ||||||
| 		asoc->frag_point = sctp_frag_point(asoc, asoc->pathmtu); | 		sctp_assoc_update_frag_point(asoc); | ||||||
| 	} else { | 	} else { | ||||||
| 		if (params.assoc_id && sctp_style(sk, UDP)) | 		if (params.assoc_id && sctp_style(sk, UDP)) | ||||||
| 			return -EINVAL; | 			return -EINVAL; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user