From 24d6fd4b0a03a5f1db705007923f7829aa5ff9fa Mon Sep 17 00:00:00 2001
From: hoelscher <jens.hoelscher@fh-muenster.de>
Date: Tue, 20 Oct 2015 20:24:23 +0200
Subject: [PATCH] check of sac_info in sctp_assoc_change

---
 gtests/net/packetdrill/parser.y               | 13 +++--
 gtests/net/packetdrill/run_system_call.c      | 47 +++++++++++++++++++
 gtests/net/packetdrill/symbols_freebsd.c      |  6 ++-
 .../notifications/sctp_assoc_change_event.pkt |  6 ++-
 4 files changed, 65 insertions(+), 7 deletions(-)

diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index 8855fb81..a224bc49 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -549,7 +549,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %token <reserved> RECVV_RCVINFO RECVV_NXTINFO
 %token <reserved> SSE_TYPE SSE_FLAGS SSE_LENGTH
 %token <reserved> SENDER_DRY_TYPE SENDER_DRY_FLAGS SENDER_DRY_LENGTH SENDER_DRY_ASSOC_ID
-%token <rexerved> _SCTP_DATA_IO_EVENT_ _SCTP_ASSOCIATION_EVENT_ _SCTP_ADDRESS_EVENT_
+%token <reserved> _SCTP_DATA_IO_EVENT_ _SCTP_ASSOCIATION_EVENT_ _SCTP_ADDRESS_EVENT_
 %token <reserved> _SCTP_SEND_FAILURE_EVENT_ _SCTP_PEER_ERROR_EVENT_ _SCTP_SHUTDOWN_EVENT_
 %token <reserved> _SCTP_PARTIAL_DELIVERY_EVENT_ _SCTP_ADAPTATION_LAYER_EVENT_
 %token <reserved> _SCTP_AUTHENTICATION_EVENT_ _SCTP_SENDER_DRY_EVENT_
@@ -615,7 +615,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %type <expression> sctp_sender_dry_event sender_dry_type sender_dry_flags sender_dry_length sender_dry_assoc_id
 %type <expression> sctp_event_subscribe
 %type <expression> sctp_assoc_change sac_type sac_flags sac_length sac_state sac_error sac_outbound_streams
-%type <expression> sac_inbound_streams sac_assoc_id
+%type <expression> sac_inbound_streams sac_assoc_id sac_info
 %type <expression> sctp_send_failed_event ssfe_type ssfe_flags ssfe_length ssfe_error ssfe_assoc_id
 %type <errno_info> opt_errno
 %type <chunk_list> sctp_chunk_list_spec
@@ -3793,9 +3793,14 @@ sac_assoc_id
 | SAC_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
 
+sac_info
+: SAC_INFO '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+| SAC_INFO '=' array { $$ = $3; }
+;
+
 sctp_assoc_change
 : '{' sac_type ',' sac_flags ',' sac_length ',' sac_state ',' sac_error ',' sac_outbound_streams ','
-sac_inbound_streams ',' sac_assoc_id ',' SAC_INFO '=' ELLIPSIS '}' {
+sac_inbound_streams ',' sac_assoc_id ',' sac_info '}' {
 	$$ = new_expression(EXPR_SCTP_ASSOC_CHANGE);
 	$$->value.sctp_assoc_change = calloc(1, sizeof(struct sctp_assoc_change_expr));
 	$$->value.sctp_assoc_change->sac_type = $2;
@@ -3806,7 +3811,7 @@ sac_inbound_streams ',' sac_assoc_id ',' SAC_INFO '=' ELLIPSIS '}' {
 	$$->value.sctp_assoc_change->sac_outbound_streams = $12;
 	$$->value.sctp_assoc_change->sac_inbound_streams = $14;
 	$$->value.sctp_assoc_change->sac_assoc_id = $16;
-	$$->value.sctp_assoc_change->sac_info = new_expression(EXPR_ELLIPSIS);
+	$$->value.sctp_assoc_change->sac_info = $18;
 }
 ;
 
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 664d0a8a..bb38680c 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -3367,7 +3367,54 @@ static int check_sctp_assoc_change(struct sctp_assoc_change_expr *expr,
 	if (check_u32_expr(expr->sac_assoc_id, sctp_event->sac_assoc_id,
 			   "sctp_assoc_change.sac_assoc_id", error))
 		return STATUS_ERR;
+	if ( expr->sac_info->type != EXPR_ELLIPSIS) {
+		size_t infolen = 0;
+		struct expression *info_expr = NULL;
+		int i;
+		infolen = sizeof(sctp_event->sac_type);
+		infolen += sizeof(sctp_event->sac_flags);
+		infolen += sizeof(sctp_event->sac_length);
+		infolen += sizeof(sctp_event->sac_state);
+		infolen += sizeof(sctp_event->sac_error);
+		infolen += sizeof(sctp_event->sac_outbound_streams); 
+		infolen += sizeof(sctp_event->sac_inbound_streams); 
+		infolen += sizeof(sctp_event->sac_assoc_id); 
+		infolen = sctp_event->sac_length - infolen + 1;
+		switch(expr->sac_info->type) {
+		case EXPR_LIST:
+			if (infolen != expression_list_length(expr->sac_info->value.list)) {
+				asprintf(error, "sctp_assoc_change. sac_list length unequal to sac_lenth expected: %u actual %u",
+					 expression_list_length(expr->sac_info->value.list), infolen);
+				return STATUS_ERR;
+			}
+			for (i = 0; i < infolen; i++) {
+				info_expr = get_arg(expr->sac_info->value.list, i, error);
+				if (info_expr->type != EXPR_ELLIPSIS) {
+					u8 script_val;
+
+					if (get_u8(info_expr, &script_val, error)) {
+						return STATUS_ERR;
+					}
+					if (script_val != sctp_event->sac_info[i]) {
+						asprintf(error, "sctp_assoc_change.sac_info. byte %d: expected: %hhu actual: %hhu",
+							i, script_val, sctp_event->sac_info[i]);
+						return STATUS_ERR;
+					}
+				}
 
+				/*if (info_expr->type != EXPR_ELLIPSIS) {
+					
+					if (check_u8_expr(info_expr, sctp_event->sac_info[i],
+						   "sctp_assoc_change.sac_info", error))
+					return STATUS_ERR;
+				}
+		*/	}
+			break;
+		default: asprintf(error, "Bad expressiontype for sac_info");
+			return STATUS_ERR;
+			break;
+		}
+	}
 	return STATUS_OK;
 }
 #endif
diff --git a/gtests/net/packetdrill/symbols_freebsd.c b/gtests/net/packetdrill/symbols_freebsd.c
index 798a5675..a1aceb96 100644
--- a/gtests/net/packetdrill/symbols_freebsd.c
+++ b/gtests/net/packetdrill/symbols_freebsd.c
@@ -211,7 +211,11 @@ struct int_symbol platform_symbols_table[] = {
 	{ SCTP_COMM_LOST,                   "SCTP_COMM_LOST"                  },
 	{ SCTP_RESTART,                     "SCTP_RESTART"                    },
 	{ SCTP_SHUTDOWN_COMP,               "SCTP_SHUTDOWN_COMP"              },
-	{ SCTP_CANT_STR_ASSOC,              "SCTP_CANT_STR_ASSOC"             },
+	{ SCTP_ASSOC_SUPPORTS_PR,           "SCTP_ASSOC_SUPPORTS_PR"          },
+	{ SCTP_ASSOC_SUPPORTS_AUTH,         "SCTP_ASSOC_SUPPORTS_AUTH"        },
+	{ SCTP_ASSOC_SUPPORTS_ASCONF,       "SCTP_ASSOC_SUPPORTS_ASCONF"      },
+	{ SCTP_ASSOC_SUPPORTS_MULTIBUF,     "SCTP_ASSOC_SUPPORTS_MULTIBUF"    },
+
 	/* /usr/include/netinet/tcp.h */
 	{ TCP_NODELAY,                      "TCP_NODELAY"                     },
 	{ TCP_MAXSEG,                       "TCP_MAXSEG"                      },
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt
index 00f14982..721e3b6e 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_assoc_change_event.pkt
@@ -10,12 +10,14 @@
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
 +0.1 < sctp: COOKIE_ACK[flgs=0]
 +0.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE, sac_flags=0, sac_length=21, sac_state=SCTP_COMM_UP, sac_error=0, sac_outbound_streams=1, 
-sac_inbound_streams=1, sac_assoc_id=3, sac_info=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21
+sac_inbound_streams=1, sac_assoc_id=3, sac_info=[SCTP_ASSOC_SUPPORTS_MULTIBUF, 0x01]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], 
+[MSG_NOTIFICATION|MSG_EOR]) 
+= 21
 
 +0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
 +0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
 *    > sctp: SHUTDOWN_ACK[flgs=0]
 +0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
 +0.0 sctp_recvv(3, [{iov_base={sac_type=SCTP_ASSOC_CHANGE, sac_flags=0, sac_length=20, sac_state=SCTP_SHUTDOWN_COMP, sac_error=0, sac_outbound_streams=1, 
-sac_inbound_streams=1, sac_assoc_id=3, sac_info=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20
+sac_inbound_streams=1, sac_assoc_id=3, sac_info=[0]}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20
 
-- 
GitLab