Commit 4b774032 authored by Xin Long's avatar Xin Long Committed by Jakub Kicinski

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: default avatarXin Long <lucien.xin@gmail.com>
Acked-by: default avatarNeil Horman <nhorman@tuxdriver.com>
Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
parent 75792624
...@@ -80,13 +80,8 @@ struct sctp_ulpevent *sctp_ulpevent_make_assoc_change( ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 @@ struct sctp_ulpevent *sctp_ulpevent_make_assoc_change( ...@@ -238,7 +238,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_assoc_change(
* 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 @@ struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change( ...@@ -336,6 +336,22 @@ struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change(
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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment