Module Name:    src
Committed By:   is
Date:           Sat Apr  4 17:12:33 UTC 2020

Modified Files:
        src/sys/net: if_spppsubr.c if_spppvar.h

Log Message:
Multilink PPP: sanity check of option values, storage of remote MRRU.


To generate a diff of this commit:
cvs rdiff -u -r1.188 -r1.189 src/sys/net/if_spppsubr.c
cvs rdiff -u -r1.22 -r1.23 src/sys/net/if_spppvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_spppsubr.c
diff -u src/sys/net/if_spppsubr.c:1.188 src/sys/net/if_spppsubr.c:1.189
--- src/sys/net/if_spppsubr.c:1.188	Wed Apr  1 20:24:50 2020
+++ src/sys/net/if_spppsubr.c	Sat Apr  4 17:12:33 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_spppsubr.c,v 1.188 2020/04/01 20:24:50 is Exp $	 */
+/*	$NetBSD: if_spppsubr.c,v 1.189 2020/04/04 17:12:33 is Exp $	 */
 
 /*
  * Synchronous PPP/Cisco link level subroutines.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.188 2020/04/01 20:24:50 is Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.189 2020/04/04 17:12:33 is Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -2383,12 +2383,19 @@ sppp_lcp_RCR(struct sppp *sp, struct lcp
 			break;
 		case LCP_OPT_MP_EID:
 			if (len >= l && l >= 3) {
-				if (debug)
-					addlog(" [rej]");
-				break;
+				switch (p[2]) {
+				case 0: if (l==3+ 0) continue;break;
+				case 2: if (l==3+ 4) continue;break;
+				case 3: if (l==3+ 6) continue;break;
+				case 6: if (l==3+16) continue;break;
+				case 1: /* FALLTHROUGH */
+				case 4: if (l<=3+20) continue;break;
+				case 5: if (l<=3+15) continue;break;
+				/* XXX should it be default: continue;? */
+				}
 			}
 			if (debug)
-				addlog(" [invalid]");
+				addlog(" [invalid class %d len %d]", p[2], l);
 			break;
 		case LCP_OPT_MP_SSNHF:
 			if (len >= 2 && l == 2) {
@@ -2402,15 +2409,7 @@ sppp_lcp_RCR(struct sppp *sp, struct lcp
 		case LCP_OPT_MP_MRRU:
 			/* Multilink maximum received reconstructed unit */
 			/* should be fall through, both are same length */
-			/* for now, check, then reject anyway */
-			if (len >= 4 && l == 4) {
-				if (debug)
-					addlog(" %d [rej]", (p[2] <<8) + p[3]);
-				break;
-			}
-			if (debug)
-				addlog(" [invalid]");
-			break;
+			/* FALLTHROUGH */
 		case LCP_OPT_MRU:
 			/* Maximum receive unit. */
 			if (len >= 4 && l == 4)
@@ -2569,6 +2568,27 @@ sppp_lcp_RCR(struct sppp *sp, struct lcp
 				break;
 			}
 			continue;
+		case LCP_OPT_MP_EID:
+			/*
+			 * Endpoint identification.
+			 * Always agreeable,
+			 * but ignored by now.
+			 */
+			if (debug) {
+				addlog(" type %d", p[2]);
+				sppp_print_bytes(p+3, p[1]-3);
+			}
+			continue;
+		case LCP_OPT_MP_MRRU:
+			/*
+			 * Maximum received reconstructed unit. 
+			 * Always agreeable,
+			 * but ignored by now.
+			 */
+			sp->lcp.their_mrru = p[2] * 256 + p[3];
+			if (debug)
+				addlog(" %ld", sp->lcp.their_mrru);
+			continue;
 		}
 		if (rlen + l > blen) {
 			if (debug)

Index: src/sys/net/if_spppvar.h
diff -u src/sys/net/if_spppvar.h:1.22 src/sys/net/if_spppvar.h:1.23
--- src/sys/net/if_spppvar.h:1.22	Thu Oct 12 09:53:55 2017
+++ src/sys/net/if_spppvar.h	Sat Apr  4 17:12:33 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_spppvar.h,v 1.22 2017/10/12 09:53:55 knakahara Exp $	*/
+/*	$NetBSD: if_spppvar.h,v 1.23 2020/04/04 17:12:33 is Exp $	*/
 
 #ifndef _NET_IF_SPPPVAR_H_
 #define _NET_IF_SPPPVAR_H_
@@ -45,6 +45,9 @@ struct slcp {
 	int	max_terminate;
 	int	max_configure;
 	int	max_failure;
+	/* multilink variables */
+	u_long	mrru;		/* our   max received reconstructed unit */
+	u_long	their_mrru;	/* their max receive dreconstructed unit */
 };
 
 #define IDX_IPCP 1		/* idx into state table */

Reply via email to