Commit d6de3097 authored by Vlad Yasevich's avatar Vlad Yasevich Committed by David S. Miller

[SCTP]: Add the handling of "Set Primary IP Address" parameter to INIT

The ADD-IP "Set Primary IP Address" parameter is allowed in the
INIT/INIT-ACK exchange.  Allow processing of this parameter during
the INIT/INIT-ACK.
Signed-off-by: default avatarVlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 42e30bf3
...@@ -451,6 +451,7 @@ union sctp_params { ...@@ -451,6 +451,7 @@ union sctp_params {
struct sctp_random_param *random; struct sctp_random_param *random;
struct sctp_chunks_param *chunks; struct sctp_chunks_param *chunks;
struct sctp_hmac_algo_param *hmac_algo; struct sctp_hmac_algo_param *hmac_algo;
struct sctp_addip_param *addip;
}; };
/* RFC 2960. Section 3.3.5 Heartbeat. /* RFC 2960. Section 3.3.5 Heartbeat.
......
...@@ -1969,6 +1969,11 @@ static sctp_ierror_t sctp_verify_param(const struct sctp_association *asoc, ...@@ -1969,6 +1969,11 @@ static sctp_ierror_t sctp_verify_param(const struct sctp_association *asoc,
case SCTP_PARAM_SUPPORTED_EXT: case SCTP_PARAM_SUPPORTED_EXT:
break; break;
case SCTP_PARAM_SET_PRIMARY:
if (sctp_addip_enable)
break;
goto fallthrough;
case SCTP_PARAM_HOST_NAME_ADDRESS: case SCTP_PARAM_HOST_NAME_ADDRESS:
/* Tell the peer, we won't support this param. */ /* Tell the peer, we won't support this param. */
sctp_process_hn_param(asoc, param, chunk, err_chunk); sctp_process_hn_param(asoc, param, chunk, err_chunk);
...@@ -2286,6 +2291,8 @@ static int sctp_process_param(struct sctp_association *asoc, ...@@ -2286,6 +2291,8 @@ static int sctp_process_param(struct sctp_association *asoc,
sctp_scope_t scope; sctp_scope_t scope;
time_t stale; time_t stale;
struct sctp_af *af; struct sctp_af *af;
union sctp_addr_param *addr_param;
struct sctp_transport *t;
/* We maintain all INIT parameters in network byte order all the /* We maintain all INIT parameters in network byte order all the
* time. This allows us to not worry about whether the parameters * time. This allows us to not worry about whether the parameters
...@@ -2376,6 +2383,26 @@ static int sctp_process_param(struct sctp_association *asoc, ...@@ -2376,6 +2383,26 @@ static int sctp_process_param(struct sctp_association *asoc,
asoc->peer.adaptation_ind = param.aind->adaptation_ind; asoc->peer.adaptation_ind = param.aind->adaptation_ind;
break; break;
case SCTP_PARAM_SET_PRIMARY:
addr_param = param.v + sizeof(sctp_addip_param_t);
af = sctp_get_af_specific(param_type2af(param.p->type));
af->from_addr_param(&addr, addr_param,
htons(asoc->peer.port), 0);
/* if the address is invalid, we can't process it.
* XXX: see spec for what to do.
*/
if (!af->addr_valid(&addr, NULL, NULL))
break;
t = sctp_assoc_lookup_paddr(asoc, &addr);
if (!t)
break;
sctp_assoc_set_primary(asoc, t);
break;
case SCTP_PARAM_SUPPORTED_EXT: case SCTP_PARAM_SUPPORTED_EXT:
sctp_process_ext_param(asoc, param); sctp_process_ext_param(asoc, param);
break; break;
......
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