Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 57724
b: refs/heads/master
c: 8a47949
h: refs/heads/master
v: v3
  • Loading branch information
Vlad Yasevich authored and Vladislav Yasevich committed Jun 13, 2007
1 parent b4295bd commit e341a55
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c910b47e1811b3f8b184108c48de3d7af3e2999b
refs/heads/master: 8a4794914f9cf2681235ec2311e189fe307c28c7
7 changes: 7 additions & 0 deletions trunk/include/net/sctp/sctp.h
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,13 @@ static inline int sctp_frag_point(const struct sctp_sock *sp, int pmtu)
return frag;
}

static inline void sctp_assoc_pending_pmtu(struct sctp_association *asoc)
{

sctp_assoc_sync_pmtu(asoc);
asoc->pmtu_pending = 0;
}

/* Walk through a list of TLV parameters. Don't trust the
* individual parameter lengths and instead depend on
* the chunk length to indicate when to stop. Make sure
Expand Down
6 changes: 6 additions & 0 deletions trunk/include/net/sctp/structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -912,6 +912,9 @@ struct sctp_transport {
*/
__u16 pathmaxrxt;

/* is the Path MTU update pending on this tranport */
__u8 pmtu_pending;

/* PMTU : The current known path MTU. */
__u32 pathmtu;

Expand Down Expand Up @@ -1566,6 +1569,9 @@ struct sctp_association {
*/
__u16 pathmaxrxt;

/* Flag that path mtu update is pending */
__u8 pmtu_pending;

/* Association : The smallest PMTU discovered for all of the
* PMTU : peer's transport addresses.
*/
Expand Down
4 changes: 4 additions & 0 deletions trunk/net/sctp/associola.c
Original file line number Diff line number Diff line change
Expand Up @@ -1231,6 +1231,10 @@ void sctp_assoc_sync_pmtu(struct sctp_association *asoc)
/* Get the lowest pmtu of all the transports. */
list_for_each(pos, &asoc->peer.transport_addr_list) {
t = list_entry(pos, struct sctp_transport, transports);
if (t->pmtu_pending && t->dst) {
sctp_transport_update_pmtu(t, dst_mtu(t->dst));
t->pmtu_pending = 0;
}
if (!pmtu || (t->pathmtu < pmtu))
pmtu = t->pathmtu;
}
Expand Down
8 changes: 7 additions & 1 deletion trunk/net/sctp/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -367,9 +367,15 @@ static void sctp_add_backlog(struct sock *sk, struct sk_buff *skb)
void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc,
struct sctp_transport *t, __u32 pmtu)
{
if (sock_owned_by_user(sk) || !t || (t->pathmtu == pmtu))
if (!t || (t->pathmtu == pmtu))
return;

if (sock_owned_by_user(sk)) {
asoc->pmtu_pending = 1;
t->pmtu_pending = 1;
return;
}

if (t->param_flags & SPP_PMTUD_ENABLE) {
/* Update transports view of the MTU */
sctp_transport_update_pmtu(t, pmtu);
Expand Down
3 changes: 3 additions & 0 deletions trunk/net/sctp/socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -1662,6 +1662,9 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
goto out_free;
}

if (asoc->pmtu_pending)
sctp_assoc_pending_pmtu(asoc);

/* If fragmentation is disabled and the message length exceeds the
* association fragmentation point, return EMSGSIZE. The I-D
* does not specify what this error is, but this looks like
Expand Down

0 comments on commit e341a55

Please sign in to comment.