The branch stable/13 has been updated by tuexen:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=4e71474ed97a39aa8f0c6fcfa9136555dde89d64

commit 4e71474ed97a39aa8f0c6fcfa9136555dde89d64
Author:     Michael Tuexen <[email protected]>
AuthorDate: 2021-04-30 10:27:47 +0000
Commit:     Michael Tuexen <[email protected]>
CommitDate: 2021-06-02 21:44:46 +0000

    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.
    
    (cherry picked from commit eb79855920ffa33d6c096221eac9cc9a6d7a484b)
---
 sys/netinet/sctp_usrreq.c | 72 ++++++++++++++++++++++++++---------------------
 1 file changed, 40 insertions(+), 32 deletions(-)

diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c
index fb3e398c2878..238c20c0e368 100644
--- a/sys/netinet/sctp_usrreq.c
+++ b/sys/netinet/sctp_usrreq.c
@@ -5325,6 +5325,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, 
size_t optsize,
                                return (EINVAL);
                        }
                        if ((paddrp->spp_flags & SPP_PMTUD_DISABLE) &&
+                           (paddrp->spp_pathmtu > 0) &&
                            ((paddrp->spp_pathmtu < SCTP_SMALLEST_PMTU) ||
                            (paddrp->spp_pathmtu > SCTP_LARGEST_PMTU))) {
                                if (stcb)
@@ -5369,23 +5370,25 @@ sctp_setopt(struct socket *so, int optname, void 
*optval, size_t optsize,
                                                            
SCTP_FROM_SCTP_USRREQ + SCTP_LOC_11);
                                                }
                                                net->dest_state |= 
SCTP_ADDR_NO_PMTUD;
-                                               net->mtu = paddrp->spp_pathmtu;
-                                               switch 
(net->ro._l_addr.sa.sa_family) {
+                                               if (paddrp->spp_pathmtu > 0) {
+                                                       net->mtu = 
paddrp->spp_pathmtu;
+                                                       switch 
(net->ro._l_addr.sa.sa_family) {
 #ifdef INET
-                                               case AF_INET:
-                                                       net->mtu += 
SCTP_MIN_V4_OVERHEAD;
-                                                       break;
+                                                       case AF_INET:
+                                                               net->mtu += 
SCTP_MIN_V4_OVERHEAD;
+                                                               break;
 #endif
 #ifdef INET6
-                                               case AF_INET6:
-                                                       net->mtu += 
SCTP_MIN_OVERHEAD;
-                                                       break;
+                                                       case AF_INET6:
+                                                               net->mtu += 
SCTP_MIN_OVERHEAD;
+                                                               break;
 #endif
-                                               default:
-                                                       break;
-                                               }
-                                               if (net->mtu < 
stcb->asoc.smallest_mtu) {
-                                                       
sctp_pathmtu_adjustment(stcb, net->mtu);
+                                                       default:
+                                                               break;
+                                                       }
+                                                       if (net->mtu < 
stcb->asoc.smallest_mtu) {
+                                                               
sctp_pathmtu_adjustment(stcb, net->mtu);
+                                                       }
                                                }
                                        }
                                        if (paddrp->spp_flags & 
SPP_PMTUD_ENABLE) {
@@ -5394,7 +5397,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, 
size_t optsize,
                                                }
                                                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->error_count > 
paddrp->spp_pathmaxrxt) {
                                                                net->dest_state 
&= ~SCTP_ADDR_PF;
@@ -5437,7 +5440,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, 
size_t optsize,
 #endif
                                } else {
                                        /************************ASSOC ONLY -- 
NO NET SPECIFIC SET ******************/
-                                       if (paddrp->spp_pathmaxrxt != 0) {
+                                       if (paddrp->spp_pathmaxrxt > 0) {
                                                stcb->asoc.def_net_failure = 
paddrp->spp_pathmaxrxt;
                                                TAILQ_FOREACH(net, 
&stcb->asoc.nets, sctp_next) {
                                                        if (net->dest_state & 
SCTP_ADDR_PF) {
@@ -5469,7 +5472,6 @@ sctp_setopt(struct socket *so, int optname, void *optval, 
size_t optsize,
                                                        net->failure_threshold 
= paddrp->spp_pathmaxrxt;
                                                }
                                        }
-
                                        if (paddrp->spp_flags & SPP_HB_ENABLE) {
                                                if (paddrp->spp_hbinterval != 
0) {
                                                        
stcb->asoc.heart_beat_delay = paddrp->spp_hbinterval;
@@ -5512,26 +5514,30 @@ sctp_setopt(struct socket *so, int optname, void 
*optval, size_t optsize,
                                                                    
SCTP_FROM_SCTP_USRREQ + SCTP_LOC_16);
                                                        }
                                                        net->dest_state |= 
SCTP_ADDR_NO_PMTUD;
-                                                       net->mtu = 
paddrp->spp_pathmtu;
-                                                       switch 
(net->ro._l_addr.sa.sa_family) {
+                                                       if (paddrp->spp_pathmtu 
> 0) {
+                                                               net->mtu = 
paddrp->spp_pathmtu;
+                                                               switch 
(net->ro._l_addr.sa.sa_family) {
 #ifdef INET
-                                                       case AF_INET:
-                                                               net->mtu += 
SCTP_MIN_V4_OVERHEAD;
-                                                               break;
+                                                               case AF_INET:
+                                                                       
net->mtu += SCTP_MIN_V4_OVERHEAD;
+                                                                       break;
 #endif
 #ifdef INET6
-                                                       case AF_INET6:
-                                                               net->mtu += 
SCTP_MIN_OVERHEAD;
-                                                               break;
+                                                               case AF_INET6:
+                                                                       
net->mtu += SCTP_MIN_OVERHEAD;
+                                                                       break;
 #endif
-                                                       default:
-                                                               break;
-                                                       }
-                                                       if (net->mtu < 
stcb->asoc.smallest_mtu) {
-                                                               
sctp_pathmtu_adjustment(stcb, net->mtu);
+                                                               default:
+                                                                       break;
+                                                               }
+                                                               if (net->mtu < 
stcb->asoc.smallest_mtu) {
+                                                                       
sctp_pathmtu_adjustment(stcb, net->mtu);
+                                                               }
                                                        }
                                                }
-                                               stcb->asoc.default_mtu = 
paddrp->spp_pathmtu;
+                                               if (paddrp->spp_pathmtu > 0) {
+                                                       stcb->asoc.default_mtu 
= paddrp->spp_pathmtu;
+                                               }
                                                sctp_stcb_feature_on(inp, stcb, 
SCTP_PCB_FLAGS_DO_NOT_PMTUD);
                                        }
                                        if (paddrp->spp_flags & 
SPP_PMTUD_ENABLE) {
@@ -5578,7 +5584,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, 
size_t optsize,
                                         * set it with the options on the
                                         * socket
                                         */
-                                       if (paddrp->spp_pathmaxrxt != 0) {
+                                       if (paddrp->spp_pathmaxrxt > 0) {
                                                inp->sctp_ep.def_net_failure = 
paddrp->spp_pathmaxrxt;
                                        }
 
@@ -5604,7 +5610,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, 
size_t optsize,
                                                inp->sctp_ep.default_mtu = 0;
                                                sctp_feature_off(inp, 
SCTP_PCB_FLAGS_DO_NOT_PMTUD);
                                        } else if (paddrp->spp_flags & 
SPP_PMTUD_DISABLE) {
-                                               inp->sctp_ep.default_mtu = 
paddrp->spp_pathmtu;
+                                               if (paddrp->spp_pathmtu > 0) {
+                                                       
inp->sctp_ep.default_mtu = paddrp->spp_pathmtu;
+                                               }
                                                sctp_feature_on(inp, 
SCTP_PCB_FLAGS_DO_NOT_PMTUD);
                                        }
                                        if (paddrp->spp_flags & SPP_DSCP) {
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to