sctp: add SCTP_ADDR_ADDED event
A helper sctp_ulpevent_nofity_peer_addr_change() will be extracted to make peer_addr_change event and enqueue it, and the helper will be called in sctp_assoc_add_peer() to send SCTP_ADDR_ADDED event. This event is described in rfc6458#section-6.1.2: SCTP_ADDR_ADDED: The address is now part of the association. Signed-off-by: Xin Long <lucien.xin@gmail.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
This commit is contained in:
parent
7579262478
commit
4b7740324e
@ -80,13 +80,8 @@ struct sctp_ulpevent *sctp_ulpevent_make_assoc_change(
|
|||||||
struct sctp_chunk *chunk,
|
struct sctp_chunk *chunk,
|
||||||
gfp_t gfp);
|
gfp_t gfp);
|
||||||
|
|
||||||
struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change(
|
void sctp_ulpevent_nofity_peer_addr_change(struct sctp_transport *transport,
|
||||||
const struct sctp_association *asoc,
|
int state, int error);
|
||||||
const struct sockaddr_storage *aaddr,
|
|
||||||
int flags,
|
|
||||||
int state,
|
|
||||||
int error,
|
|
||||||
gfp_t gfp);
|
|
||||||
|
|
||||||
struct sctp_ulpevent *sctp_ulpevent_make_remote_error(
|
struct sctp_ulpevent *sctp_ulpevent_make_remote_error(
|
||||||
const struct sctp_association *asoc,
|
const struct sctp_association *asoc,
|
||||||
|
@ -707,6 +707,8 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
|
|||||||
list_add_tail_rcu(&peer->transports, &asoc->peer.transport_addr_list);
|
list_add_tail_rcu(&peer->transports, &asoc->peer.transport_addr_list);
|
||||||
asoc->peer.transport_count++;
|
asoc->peer.transport_count++;
|
||||||
|
|
||||||
|
sctp_ulpevent_nofity_peer_addr_change(peer, SCTP_ADDR_ADDED, 0);
|
||||||
|
|
||||||
/* If we do not yet have a primary path, set one. */
|
/* If we do not yet have a primary path, set one. */
|
||||||
if (!asoc->peer.primary_path) {
|
if (!asoc->peer.primary_path) {
|
||||||
sctp_assoc_set_primary(asoc, peer);
|
sctp_assoc_set_primary(asoc, peer);
|
||||||
@ -781,10 +783,8 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
|
|||||||
enum sctp_transport_cmd command,
|
enum sctp_transport_cmd command,
|
||||||
sctp_sn_error_t error)
|
sctp_sn_error_t error)
|
||||||
{
|
{
|
||||||
struct sctp_ulpevent *event;
|
|
||||||
struct sockaddr_storage addr;
|
|
||||||
int spc_state = 0;
|
|
||||||
bool ulp_notify = true;
|
bool ulp_notify = true;
|
||||||
|
int spc_state = 0;
|
||||||
|
|
||||||
/* Record the transition on the transport. */
|
/* Record the transition on the transport. */
|
||||||
switch (command) {
|
switch (command) {
|
||||||
@ -836,16 +836,9 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
|
|||||||
/* Generate and send a SCTP_PEER_ADDR_CHANGE notification
|
/* Generate and send a SCTP_PEER_ADDR_CHANGE notification
|
||||||
* to the user.
|
* to the user.
|
||||||
*/
|
*/
|
||||||
if (ulp_notify) {
|
if (ulp_notify)
|
||||||
memset(&addr, 0, sizeof(struct sockaddr_storage));
|
sctp_ulpevent_nofity_peer_addr_change(transport,
|
||||||
memcpy(&addr, &transport->ipaddr,
|
spc_state, error);
|
||||||
transport->af_specific->sockaddr_len);
|
|
||||||
|
|
||||||
event = sctp_ulpevent_make_peer_addr_change(asoc, &addr,
|
|
||||||
0, spc_state, error, GFP_ATOMIC);
|
|
||||||
if (event)
|
|
||||||
asoc->stream.si->enqueue_event(&asoc->ulpq, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Select new active and retran paths. */
|
/* Select new active and retran paths. */
|
||||||
sctp_select_active_and_retran_path(asoc);
|
sctp_select_active_and_retran_path(asoc);
|
||||||
|
@ -238,7 +238,7 @@ fail:
|
|||||||
* When a destination address on a multi-homed peer encounters a change
|
* When a destination address on a multi-homed peer encounters a change
|
||||||
* an interface details event is sent.
|
* an interface details event is sent.
|
||||||
*/
|
*/
|
||||||
struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change(
|
static struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change(
|
||||||
const struct sctp_association *asoc,
|
const struct sctp_association *asoc,
|
||||||
const struct sockaddr_storage *aaddr,
|
const struct sockaddr_storage *aaddr,
|
||||||
int flags, int state, int error, gfp_t gfp)
|
int flags, int state, int error, gfp_t gfp)
|
||||||
@ -336,6 +336,22 @@ fail:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sctp_ulpevent_nofity_peer_addr_change(struct sctp_transport *transport,
|
||||||
|
int state, int error)
|
||||||
|
{
|
||||||
|
struct sctp_association *asoc = transport->asoc;
|
||||||
|
struct sockaddr_storage addr;
|
||||||
|
struct sctp_ulpevent *event;
|
||||||
|
|
||||||
|
memset(&addr, 0, sizeof(struct sockaddr_storage));
|
||||||
|
memcpy(&addr, &transport->ipaddr, transport->af_specific->sockaddr_len);
|
||||||
|
|
||||||
|
event = sctp_ulpevent_make_peer_addr_change(asoc, &addr, 0, state,
|
||||||
|
error, GFP_ATOMIC);
|
||||||
|
if (event)
|
||||||
|
asoc->stream.si->enqueue_event(&asoc->ulpq, event);
|
||||||
|
}
|
||||||
|
|
||||||
/* Create and initialize an SCTP_REMOTE_ERROR notification.
|
/* Create and initialize an SCTP_REMOTE_ERROR notification.
|
||||||
*
|
*
|
||||||
* Note: This assumes that the chunk->skb->data already points to the
|
* Note: This assumes that the chunk->skb->data already points to the
|
||||||
|
Loading…
Reference in New Issue
Block a user