From eda59ca8c8193386a3064cd05c607c7b1625691a Mon Sep 17 00:00:00 2001
From: Michael Tuexen <tuexen@fh-muenster.de>
Date: Sat, 19 Sep 2015 05:18:46 +0200
Subject: [PATCH] Add support for SCTP_INTERLEAVING_SUPPORTED socket option.

This is untested, since the kernel doesn't support it yet...
---
 gtests/net/packetdrill/parser.y          | 2 +-
 gtests/net/packetdrill/run_system_call.c | 2 +-
 gtests/net/packetdrill/script.c          | 6 +++---
 gtests/net/packetdrill/script.h          | 4 ++--
 gtests/net/packetdrill/symbols_freebsd.c | 3 +++
 gtests/net/packetdrill/symbols_linux.c   | 3 +++
 6 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index 551dd66a..bf8fee59 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -2517,7 +2517,7 @@ sctp_initmsg
 
 sctp_assocval
 : '{' ASSOC_VALUE '=' INTEGER '}' {
-#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST)
+#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
 	$$ = new_expression(EXPR_SCTP_ASSOCVAL);
 	if (!is_valid_u32($4)) {
 		semantic_error("assoc_value out of range");
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index a60b0662..77d7aeb4 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -1645,7 +1645,7 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 	} else if (val_expression->type == EXPR_SCTP_INITMSG) {
 		optval = &val_expression->value.sctp_initmsg;
 #endif
-#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST)
+#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
 	} else if (val_expression->type == EXPR_SCTP_ASSOCVAL) {
 		optval = &val_expression->value.sctp_assoc_value;
 #endif
diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c
index c4fdb4b2..96e53b80 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -71,7 +71,7 @@ struct expression_type_entry expression_type_table[] = {
 #ifdef SCTP_INITMSG
 	{ EXPR_SCTP_INITMSG,         "sctp_initmsg"},
 #endif
-#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST)
+#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
 	{ EXPR_SCTP_ASSOCVAL,        "sctp_assocvalue"},
 #endif
 #ifdef SCTP_DELAYED_SACK
@@ -292,7 +292,7 @@ void free_expression(struct expression *expression)
 #ifdef SCTP_INITMSG
 	case EXPR_SCTP_INITMSG:
 #endif
-#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST)
+#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
 	case EXPR_SCTP_ASSOCVAL:
 #endif
 #ifdef SCTP_DELAYED_SACK
@@ -522,7 +522,7 @@ static int evaluate(struct expression *in,
 		       sizeof(in->value.sctp_initmsg));
 		break;
 #endif
-#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST)
+#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
 	case EXPR_SCTP_ASSOCVAL:	/* copy as-is */
 		memcpy(&out->value.sctp_assoc_value,
 		       &in->value.sctp_assoc_value,
diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h
index a2b2e46b..62fa122a 100644
--- a/gtests/net/packetdrill/script.h
+++ b/gtests/net/packetdrill/script.h
@@ -51,7 +51,7 @@ enum expression_t {
 #ifdef SCTP_INITMSG
 	EXPR_SCTP_INITMSG,	  /* struct sctp_initmsg for SCTP_INITMSG */
 #endif
-#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST)
+#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
 	EXPR_SCTP_ASSOCVAL,	  /* struct sctp_assoc_value */
 #endif
 #ifdef SCTP_DELAYED_SACK
@@ -86,7 +86,7 @@ struct expression {
 #ifdef SCTP_INITMSG
 		struct sctp_initmsg sctp_initmsg;
 #endif
-#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST)
+#if defined(SCTP_MAXSEG) || defined(SCTP_MAX_BURST) || defined(SCTP_INTERLEAVING_SUPPORTED)
 		struct sctp_assoc_value sctp_assoc_value;
 #endif
 #ifdef SCTP_DELAYED_SACK
diff --git a/gtests/net/packetdrill/symbols_freebsd.c b/gtests/net/packetdrill/symbols_freebsd.c
index 9e4e8093..87796ca9 100644
--- a/gtests/net/packetdrill/symbols_freebsd.c
+++ b/gtests/net/packetdrill/symbols_freebsd.c
@@ -86,6 +86,9 @@ struct int_symbol platform_symbols_table[] = {
 	{ SCTP_DELAYED_SACK,                "SCTP_DELAYED_SACK"               },
 	{ SCTP_MAX_BURST,                   "SCTP_MAX_BURST"                  },
 	{ SCTP_STATUS,                      "SCTP_STATUS"                     },
+#if defined(SCTP_INTERLEAVING_SUPPORTED)
+	{ SCTP_INTERLEAVING_SUPPORTED,      "SCTP_INTERLEAVING_SUPPORTED"     },
+#endif
 	{ SCTP_CLOSED,                      "SCTP_CLOSED"                     },
 	{ SCTP_BOUND,                       "SCTP_BOUND"                      },
 	{ SCTP_LISTEN,                      "SCTP_LISTEN"                     },
diff --git a/gtests/net/packetdrill/symbols_linux.c b/gtests/net/packetdrill/symbols_linux.c
index 33b7797c..c79051eb 100644
--- a/gtests/net/packetdrill/symbols_linux.c
+++ b/gtests/net/packetdrill/symbols_linux.c
@@ -120,6 +120,9 @@ struct int_symbol platform_symbols_table[] = {
 #endif
 #ifdef SCTP_STATUS
 	{ SCTP_STATUS,                      "SCTP_STATUS"                     },
+#endif
+#if defined(SCTP_INTERLEAVING_SUPPORTED)
+	{ SCTP_INTERLEAVING_SUPPORTED,      "SCTP_INTERLEAVING_SUPPORTED"     },
 #endif
 	{ SCTP_CLOSED,                      "SCTP_CLOSED"                     },
 #if 0
-- 
GitLab