On Mon, Oct 24, 2016 at 01:01:09AM +0800, Xin Long wrote:
> Commit 7303a1475008 ("sctp: identify chunks that need to be fragmented
> at IP level") made the chunk be fragmented at IP level in the next round
> if it's size exceed PMTU.
> 
> But there still is another case, PMTU can be updated if transport's dst
> expires and transport's pmtu_pending is set in sctp_packet_transmit. If
> the new PMTU is less than the chunk, the same issue with that commit can
> be triggered.
> 
> So we should drop this packet and let it retransmit in another round
> where it would be fragmented at IP level.
> 
> This patch is to fix it by checking the chunk size after PMTU may be
> updated and dropping this packet if it's size exceed PMTU.
> 
> Fixes: 90017accff61 ("sctp: Add GSO support")
> Signed-off-by: Xin Long <lucien....@gmail.com>
> ---
>  net/sctp/output.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/net/sctp/output.c b/net/sctp/output.c
> index 2a5c189..6cb0df8 100644
> --- a/net/sctp/output.c
> +++ b/net/sctp/output.c
> @@ -418,6 +418,7 @@ int sctp_packet_transmit(struct sctp_packet *packet, 
> gfp_t gfp)
>       __u8 has_data = 0;
>       int gso = 0;
>       int pktcount = 0;
> +     int auth_len = 0;
>       struct dst_entry *dst;
>       unsigned char *auth = NULL;     /* pointer to auth in skb data */
>  
> @@ -510,7 +511,12 @@ int sctp_packet_transmit(struct sctp_packet *packet, 
> gfp_t gfp)
>                       list_for_each_entry(chunk, &packet->chunk_list, list) {
>                               int padded = SCTP_PAD4(chunk->skb->len);
>  
> -                             if (pkt_size + padded > tp->pathmtu)
> +                             if (chunk == packet->auth)
> +                                     auth_len = padded;
> +                             else if (auth_len + padded + packet->overhead >
> +                                      tp->pathmtu)
> +                                     goto nomem;
> +                             else if (pkt_size + padded > tp->pathmtu)
>                                       break;
>                               pkt_size += padded;
>                       }
> -- 
> 2.1.0
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-sctp" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
Acked-by: Neil Horman <nhor...@txudriver.com>

Reply via email to