diff options
Diffstat (limited to 'net/sctp/sm_statefuns.c')
-rw-r--r-- | net/sctp/sm_statefuns.c | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 9e28a5d51200..f02ce3dddb7b 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
@@ -1656,7 +1656,6 @@ static sctp_disposition_t sctp_sf_do_dupcook_b(const struct sctp_endpoint *ep, | |||
1656 | struct sctp_association *new_asoc) | 1656 | struct sctp_association *new_asoc) |
1657 | { | 1657 | { |
1658 | sctp_init_chunk_t *peer_init; | 1658 | sctp_init_chunk_t *peer_init; |
1659 | struct sctp_ulpevent *ev; | ||
1660 | struct sctp_chunk *repl; | 1659 | struct sctp_chunk *repl; |
1661 | 1660 | ||
1662 | /* new_asoc is a brand-new association, so these are not yet | 1661 | /* new_asoc is a brand-new association, so these are not yet |
@@ -1687,34 +1686,28 @@ static sctp_disposition_t sctp_sf_do_dupcook_b(const struct sctp_endpoint *ep, | |||
1687 | * D) IMPLEMENTATION NOTE: An implementation may choose to | 1686 | * D) IMPLEMENTATION NOTE: An implementation may choose to |
1688 | * send the Communication Up notification to the SCTP user | 1687 | * send the Communication Up notification to the SCTP user |
1689 | * upon reception of a valid COOKIE ECHO chunk. | 1688 | * upon reception of a valid COOKIE ECHO chunk. |
1689 | * | ||
1690 | * Sadly, this needs to be implemented as a side-effect, because | ||
1691 | * we are not guaranteed to have set the association id of the real | ||
1692 | * association and so these notifications need to be delayed until | ||
1693 | * the association id is allocated. | ||
1690 | */ | 1694 | */ |
1691 | ev = sctp_ulpevent_make_assoc_change(asoc, 0, SCTP_COMM_UP, 0, | ||
1692 | new_asoc->c.sinit_num_ostreams, | ||
1693 | new_asoc->c.sinit_max_instreams, | ||
1694 | NULL, GFP_ATOMIC); | ||
1695 | if (!ev) | ||
1696 | goto nomem_ev; | ||
1697 | 1695 | ||
1698 | sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev)); | 1696 | sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_CHANGE, SCTP_U8(SCTP_COMM_UP)); |
1699 | 1697 | ||
1700 | /* Sockets API Draft Section 5.3.1.6 | 1698 | /* Sockets API Draft Section 5.3.1.6 |
1701 | * When a peer sends a Adaptation Layer Indication parameter , SCTP | 1699 | * When a peer sends a Adaptation Layer Indication parameter , SCTP |
1702 | * delivers this notification to inform the application that of the | 1700 | * delivers this notification to inform the application that of the |
1703 | * peers requested adaptation layer. | 1701 | * peers requested adaptation layer. |
1702 | * | ||
1703 | * This also needs to be done as a side effect for the same reason as | ||
1704 | * above. | ||
1704 | */ | 1705 | */ |
1705 | if (asoc->peer.adaptation_ind) { | 1706 | if (asoc->peer.adaptation_ind) |
1706 | ev = sctp_ulpevent_make_adaptation_indication(asoc, GFP_ATOMIC); | 1707 | sctp_add_cmd_sf(commands, SCTP_CMD_ADAPTATION_IND, SCTP_NULL()); |
1707 | if (!ev) | ||
1708 | goto nomem_ev; | ||
1709 | |||
1710 | sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, | ||
1711 | SCTP_ULPEVENT(ev)); | ||
1712 | } | ||
1713 | 1708 | ||
1714 | return SCTP_DISPOSITION_CONSUME; | 1709 | return SCTP_DISPOSITION_CONSUME; |
1715 | 1710 | ||
1716 | nomem_ev: | ||
1717 | sctp_chunk_free(repl); | ||
1718 | nomem: | 1711 | nomem: |
1719 | return SCTP_DISPOSITION_NOMEM; | 1712 | return SCTP_DISPOSITION_NOMEM; |
1720 | } | 1713 | } |