Merge branch 'sctp-two-fixes-for-spp_ipv6_flowlabel-and-spp_dscp-sockopts'

Xin Long says:

====================
sctp: two fixes for spp_ipv6_flowlabel and spp_dscp sockopts

This patchset fixes two problems in sctp_apply_peer_addr_params()
when setting spp_ipv6_flowlabel or spp_dscp.
====================

Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2018-09-03 21:57:55 -07:00
commit 6570aa1d10
1 changed files with 19 additions and 15 deletions

View File

@ -2658,20 +2658,23 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params,
} }
if (params->spp_flags & SPP_IPV6_FLOWLABEL) { if (params->spp_flags & SPP_IPV6_FLOWLABEL) {
if (trans && trans->ipaddr.sa.sa_family == AF_INET6) { if (trans) {
trans->flowlabel = params->spp_ipv6_flowlabel & if (trans->ipaddr.sa.sa_family == AF_INET6) {
SCTP_FLOWLABEL_VAL_MASK;
trans->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
} else if (asoc) {
list_for_each_entry(trans,
&asoc->peer.transport_addr_list,
transports) {
if (trans->ipaddr.sa.sa_family != AF_INET6)
continue;
trans->flowlabel = params->spp_ipv6_flowlabel & trans->flowlabel = params->spp_ipv6_flowlabel &
SCTP_FLOWLABEL_VAL_MASK; SCTP_FLOWLABEL_VAL_MASK;
trans->flowlabel |= SCTP_FLOWLABEL_SET_MASK; trans->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
} }
} else if (asoc) {
struct sctp_transport *t;
list_for_each_entry(t, &asoc->peer.transport_addr_list,
transports) {
if (t->ipaddr.sa.sa_family != AF_INET6)
continue;
t->flowlabel = params->spp_ipv6_flowlabel &
SCTP_FLOWLABEL_VAL_MASK;
t->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
}
asoc->flowlabel = params->spp_ipv6_flowlabel & asoc->flowlabel = params->spp_ipv6_flowlabel &
SCTP_FLOWLABEL_VAL_MASK; SCTP_FLOWLABEL_VAL_MASK;
asoc->flowlabel |= SCTP_FLOWLABEL_SET_MASK; asoc->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
@ -2687,12 +2690,13 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params,
trans->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; trans->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK;
trans->dscp |= SCTP_DSCP_SET_MASK; trans->dscp |= SCTP_DSCP_SET_MASK;
} else if (asoc) { } else if (asoc) {
list_for_each_entry(trans, struct sctp_transport *t;
&asoc->peer.transport_addr_list,
list_for_each_entry(t, &asoc->peer.transport_addr_list,
transports) { transports) {
trans->dscp = params->spp_dscp & t->dscp = params->spp_dscp &
SCTP_DSCP_VAL_MASK; SCTP_DSCP_VAL_MASK;
trans->dscp |= SCTP_DSCP_SET_MASK; t->dscp |= SCTP_DSCP_SET_MASK;
} }
asoc->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; asoc->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK;
asoc->dscp |= SCTP_DSCP_SET_MASK; asoc->dscp |= SCTP_DSCP_SET_MASK;