Author: tuexen
Date: Sat Jan 30 16:56:39 2016
New Revision: 295075
URL: https://svnweb.freebsd.org/changeset/base/295075

Log:
  Update the path mtu when turning on/off UDP encapsulation for SCTP.
  
  MFC after: 3 days

Modified:
  head/sys/netinet/sctp_input.c

Modified: head/sys/netinet/sctp_input.c
==============================================================================
--- head/sys/netinet/sctp_input.c       Sat Jan 30 15:53:28 2016        
(r295074)
+++ head/sys/netinet/sctp_input.c       Sat Jan 30 16:56:39 2016        
(r295075)
@@ -5684,11 +5684,18 @@ sctp_common_input_processing(struct mbuf
                        stcb = sctp_findassociation_addr(m, offset, src, dst,
                            sh, ch, &inp, &net, vrf_id);
 #if defined(INET) || defined(INET6)
-                       if ((net != NULL) &&
-                           (ch->chunk_type != SCTP_INITIATION) &&
-                           (port != 0)) {
+                       if ((ch->chunk_type != SCTP_INITIATION) &&
+                           (net != NULL) && (net->port != port)) {
                                if (net->port == 0) {
-                                       sctp_pathmtu_adjustment(stcb, net->mtu 
- sizeof(struct udphdr));
+                                       /* UDP encapsulation turned on. */
+                                       net->mtu -= sizeof(struct udphdr);
+                                       if (stcb->asoc.smallest_mtu > net->mtu) 
{
+                                               sctp_pathmtu_adjustment(stcb, 
net->mtu);
+                                       }
+                               } else if (port == 0) {
+                                       /* UDP encapsulation turned off. */
+                                       net->mtu += sizeof(struct udphdr);
+                                       /* XXX Update smallest_mtu */
                                }
                                net->port = port;
                        }
@@ -5717,11 +5724,18 @@ sctp_common_input_processing(struct mbuf
        stcb = sctp_findassociation_addr(m, offset, src, dst,
            sh, ch, &inp, &net, vrf_id);
 #if defined(INET) || defined(INET6)
-       if ((net != NULL) &&
-           (ch->chunk_type != SCTP_INITIATION) &&
-           (port != 0)) {
+       if ((ch->chunk_type != SCTP_INITIATION) &&
+           (net != NULL) && (net->port != port)) {
                if (net->port == 0) {
-                       sctp_pathmtu_adjustment(stcb, net->mtu - sizeof(struct 
udphdr));
+                       /* UDP encapsulation turned on. */
+                       net->mtu -= sizeof(struct udphdr);
+                       if (stcb->asoc.smallest_mtu > net->mtu) {
+                               sctp_pathmtu_adjustment(stcb, net->mtu);
+                       }
+               } else if (port == 0) {
+                       /* UDP encapsulation turned off. */
+                       net->mtu += sizeof(struct udphdr);
+                       /* XXX Update smallest_mtu */
                }
                net->port = port;
        }
@@ -5831,11 +5845,18 @@ sctp_common_input_processing(struct mbuf
                         */
                        inp = stcb->sctp_ep;
 #if defined(INET) || defined(INET6)
-                       if ((net != NULL) &&
-                           (ch->chunk_type != SCTP_INITIATION) &&
-                           (port != 0)) {
+                       if ((ch->chunk_type != SCTP_INITIATION) &&
+                           (net != NULL) && (net->port != port)) {
                                if (net->port == 0) {
-                                       sctp_pathmtu_adjustment(stcb, net->mtu 
- sizeof(struct udphdr));
+                                       /* UDP encapsulation turned on. */
+                                       net->mtu -= sizeof(struct udphdr);
+                                       if (stcb->asoc.smallest_mtu > net->mtu) 
{
+                                               sctp_pathmtu_adjustment(stcb, 
net->mtu);
+                                       }
+                               } else if (port == 0) {
+                                       /* UDP encapsulation turned off. */
+                                       net->mtu += sizeof(struct udphdr);
+                                       /* XXX Update smallest_mtu */
                                }
                                net->port = port;
                        }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to