sctp: fix SCTP_PEER_ADDR_PARAMS socket option
Ignore spp_pathmtu if it is 0, when setting the IPPROTO_SCTP level socket option SCTP_PEER_ADDR_PARAMS as required by RFC 6458. MFC after: 1 week
This commit is contained in:
parent
388c0cde10
commit
eb79855920
@ -5327,6 +5327,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
}
|
}
|
||||||
if ((paddrp->spp_flags & SPP_PMTUD_DISABLE) &&
|
if ((paddrp->spp_flags & SPP_PMTUD_DISABLE) &&
|
||||||
|
(paddrp->spp_pathmtu > 0) &&
|
||||||
((paddrp->spp_pathmtu < SCTP_SMALLEST_PMTU) ||
|
((paddrp->spp_pathmtu < SCTP_SMALLEST_PMTU) ||
|
||||||
(paddrp->spp_pathmtu > SCTP_LARGEST_PMTU))) {
|
(paddrp->spp_pathmtu > SCTP_LARGEST_PMTU))) {
|
||||||
if (stcb)
|
if (stcb)
|
||||||
@ -5371,6 +5372,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
SCTP_FROM_SCTP_USRREQ + SCTP_LOC_11);
|
SCTP_FROM_SCTP_USRREQ + SCTP_LOC_11);
|
||||||
}
|
}
|
||||||
net->dest_state |= SCTP_ADDR_NO_PMTUD;
|
net->dest_state |= SCTP_ADDR_NO_PMTUD;
|
||||||
|
if (paddrp->spp_pathmtu > 0) {
|
||||||
net->mtu = paddrp->spp_pathmtu;
|
net->mtu = paddrp->spp_pathmtu;
|
||||||
switch (net->ro._l_addr.sa.sa_family) {
|
switch (net->ro._l_addr.sa.sa_family) {
|
||||||
#ifdef INET
|
#ifdef INET
|
||||||
@ -5390,13 +5392,14 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
sctp_pathmtu_adjustment(stcb, net->mtu);
|
sctp_pathmtu_adjustment(stcb, net->mtu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (paddrp->spp_flags & SPP_PMTUD_ENABLE) {
|
if (paddrp->spp_flags & SPP_PMTUD_ENABLE) {
|
||||||
if (!SCTP_OS_TIMER_PENDING(&net->pmtu_timer.timer)) {
|
if (!SCTP_OS_TIMER_PENDING(&net->pmtu_timer.timer)) {
|
||||||
sctp_timer_start(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net);
|
sctp_timer_start(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net);
|
||||||
}
|
}
|
||||||
net->dest_state &= ~SCTP_ADDR_NO_PMTUD;
|
net->dest_state &= ~SCTP_ADDR_NO_PMTUD;
|
||||||
}
|
}
|
||||||
if (paddrp->spp_pathmaxrxt) {
|
if (paddrp->spp_pathmaxrxt > 0) {
|
||||||
if (net->dest_state & SCTP_ADDR_PF) {
|
if (net->dest_state & SCTP_ADDR_PF) {
|
||||||
if (net->error_count > paddrp->spp_pathmaxrxt) {
|
if (net->error_count > paddrp->spp_pathmaxrxt) {
|
||||||
net->dest_state &= ~SCTP_ADDR_PF;
|
net->dest_state &= ~SCTP_ADDR_PF;
|
||||||
@ -5439,7 +5442,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
/************************ASSOC ONLY -- NO NET SPECIFIC SET ******************/
|
/************************ASSOC ONLY -- NO NET SPECIFIC SET ******************/
|
||||||
if (paddrp->spp_pathmaxrxt != 0) {
|
if (paddrp->spp_pathmaxrxt > 0) {
|
||||||
stcb->asoc.def_net_failure = paddrp->spp_pathmaxrxt;
|
stcb->asoc.def_net_failure = paddrp->spp_pathmaxrxt;
|
||||||
TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
|
TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
|
||||||
if (net->dest_state & SCTP_ADDR_PF) {
|
if (net->dest_state & SCTP_ADDR_PF) {
|
||||||
@ -5471,7 +5474,6 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
net->failure_threshold = paddrp->spp_pathmaxrxt;
|
net->failure_threshold = paddrp->spp_pathmaxrxt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (paddrp->spp_flags & SPP_HB_ENABLE) {
|
if (paddrp->spp_flags & SPP_HB_ENABLE) {
|
||||||
if (paddrp->spp_hbinterval != 0) {
|
if (paddrp->spp_hbinterval != 0) {
|
||||||
stcb->asoc.heart_beat_delay = paddrp->spp_hbinterval;
|
stcb->asoc.heart_beat_delay = paddrp->spp_hbinterval;
|
||||||
@ -5514,6 +5516,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
SCTP_FROM_SCTP_USRREQ + SCTP_LOC_16);
|
SCTP_FROM_SCTP_USRREQ + SCTP_LOC_16);
|
||||||
}
|
}
|
||||||
net->dest_state |= SCTP_ADDR_NO_PMTUD;
|
net->dest_state |= SCTP_ADDR_NO_PMTUD;
|
||||||
|
if (paddrp->spp_pathmtu > 0) {
|
||||||
net->mtu = paddrp->spp_pathmtu;
|
net->mtu = paddrp->spp_pathmtu;
|
||||||
switch (net->ro._l_addr.sa.sa_family) {
|
switch (net->ro._l_addr.sa.sa_family) {
|
||||||
#ifdef INET
|
#ifdef INET
|
||||||
@ -5533,7 +5536,10 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
sctp_pathmtu_adjustment(stcb, net->mtu);
|
sctp_pathmtu_adjustment(stcb, net->mtu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (paddrp->spp_pathmtu > 0) {
|
||||||
stcb->asoc.default_mtu = paddrp->spp_pathmtu;
|
stcb->asoc.default_mtu = paddrp->spp_pathmtu;
|
||||||
|
}
|
||||||
sctp_stcb_feature_on(inp, stcb, SCTP_PCB_FLAGS_DO_NOT_PMTUD);
|
sctp_stcb_feature_on(inp, stcb, SCTP_PCB_FLAGS_DO_NOT_PMTUD);
|
||||||
}
|
}
|
||||||
if (paddrp->spp_flags & SPP_PMTUD_ENABLE) {
|
if (paddrp->spp_flags & SPP_PMTUD_ENABLE) {
|
||||||
@ -5580,7 +5586,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
* set it with the options on the
|
* set it with the options on the
|
||||||
* socket
|
* socket
|
||||||
*/
|
*/
|
||||||
if (paddrp->spp_pathmaxrxt != 0) {
|
if (paddrp->spp_pathmaxrxt > 0) {
|
||||||
inp->sctp_ep.def_net_failure = paddrp->spp_pathmaxrxt;
|
inp->sctp_ep.def_net_failure = paddrp->spp_pathmaxrxt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5606,7 +5612,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
inp->sctp_ep.default_mtu = 0;
|
inp->sctp_ep.default_mtu = 0;
|
||||||
sctp_feature_off(inp, SCTP_PCB_FLAGS_DO_NOT_PMTUD);
|
sctp_feature_off(inp, SCTP_PCB_FLAGS_DO_NOT_PMTUD);
|
||||||
} else if (paddrp->spp_flags & SPP_PMTUD_DISABLE) {
|
} else if (paddrp->spp_flags & SPP_PMTUD_DISABLE) {
|
||||||
|
if (paddrp->spp_pathmtu > 0) {
|
||||||
inp->sctp_ep.default_mtu = paddrp->spp_pathmtu;
|
inp->sctp_ep.default_mtu = paddrp->spp_pathmtu;
|
||||||
|
}
|
||||||
sctp_feature_on(inp, SCTP_PCB_FLAGS_DO_NOT_PMTUD);
|
sctp_feature_on(inp, SCTP_PCB_FLAGS_DO_NOT_PMTUD);
|
||||||
}
|
}
|
||||||
if (paddrp->spp_flags & SPP_DSCP) {
|
if (paddrp->spp_flags & SPP_DSCP) {
|
||||||
|
Loading…
Reference in New Issue
Block a user