From 3bb64180d3d37614aecb4abaa9d3dffc87f38caa Mon Sep 17 00:00:00 2001
From: hoelscher <jens.hoelscher@fh-muenster.de>
Date: Thu, 26 Nov 2015 19:19:48 +0100
Subject: [PATCH] add sse_assoc_id in shutdown_event

---
 gtests/net/packetdrill/lexer.l                  |  1 +
 gtests/net/packetdrill/parser.y                 | 17 ++++++++++++++---
 gtests/net/packetdrill/run_system_call.c        |  3 +++
 gtests/net/packetdrill/script.c                 |  5 +++++
 gtests/net/packetdrill/script.h                 |  1 +
 .../sctp/notifications/sctp_shutdown_event.pkt  |  6 +++++-
 6 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l
index 530db0f4..9e191c23 100644
--- a/gtests/net/packetdrill/lexer.l
+++ b/gtests/net/packetdrill/lexer.l
@@ -313,6 +313,7 @@ recvv_nxtinfo                   return RECVV_NXTINFO;
 sse_type                        return SSE_TYPE;
 sse_flags                       return SSE_FLAGS;
 sse_length                      return SSE_LENGTH;
+sse_assoc_id                    return SSE_ASSOC_ID;
 sac_type                        return SAC_TYPE;
 sac_flags                       return SAC_FLAGS;
 sac_length                      return SAC_LENGTH;
diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index b459a755..ff640f28 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -548,7 +548,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %token <reserved> RCV_SID RCV_SSN RCV_FLAGS RCV_PPID RCV_TSN RCV_CUMTSN RCV_CONTEXT RCV_ASSOC_ID
 %token <reserved> NXT_SID NXT_FLAGS NXT_PPID NXT_LENGTH NXT_ASSOC_ID
 %token <reserved> RECVV_RCVINFO RECVV_NXTINFO
-%token <reserved> SSE_TYPE SSE_FLAGS SSE_LENGTH
+%token <reserved> SSE_TYPE SSE_FLAGS SSE_LENGTH SSE_ASSOC_ID
 %token <reserved> SENDER_DRY_TYPE SENDER_DRY_FLAGS SENDER_DRY_LENGTH SENDER_DRY_ASSOC_ID
 %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_
@@ -621,7 +621,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %type <expression> sctp_prinfo sctp_authinfo pr_policy sctp_sendv_spa
 %type <expression> sctp_rcvinfo rcv_sid rcv_ssn rcv_flags rcv_ppid rcv_tsn rcv_cumtsn rcv_context rcv_assoc_id
 %type <expression> sctp_nxtinfo nxt_sid nxt_flags nxt_ppid nxt_length nxt_assoc_id sctp_recvv_rn
-%type <expression> sctp_shutdown_event sse_type sse_flags sse_length
+%type <expression> sctp_shutdown_event sse_type sse_flags sse_length sse_assoc_id
 %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
@@ -3734,6 +3734,16 @@ sctp_recvv_rn
 }
 ;
 
+sse_assoc_id
+: SSE_ASSOC_ID '=' INTEGER {
+	if (!is_valid_u32($3)) {
+		semantic_error("sse_assoc_id out of range");
+	}
+	$$ = new_integer_expression($3, "%u");
+}
+| SSE_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
+;
+
 sse_type
 : SSE_TYPE '=' INTEGER {
 	if (!is_valid_u16($3)) {
@@ -3769,12 +3779,13 @@ sse_length
 ;
 
 sctp_shutdown_event
-: '{' sse_type ',' sse_flags ',' sse_length '}' {
+: '{' sse_type ',' sse_flags ',' sse_length ',' sse_assoc_id '}' {
 	$$ = new_expression(EXPR_SCTP_SHUTDOWN_EVENT);
 	$$->value.sctp_shutdown_event = calloc(1, sizeof(struct sctp_shutdown_event_expr));
 	$$->value.sctp_shutdown_event->sse_type = $2;
 	$$->value.sctp_shutdown_event->sse_flags = $4;
 	$$->value.sctp_shutdown_event->sse_length = $6;
+	$$->value.sctp_shutdown_event->sse_assoc_id = $8;
 };
 
 pdapi_type
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 2ad5a7f3..139d71f9 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -4453,6 +4453,9 @@ static int check_sctp_shutdown_event(struct sctp_shutdown_event_expr *expr,
 	if (check_u32_expr(expr->sse_length, sctp_event->sse_length,
 			   "sctp_shutdown_event.sse_length", error))
 		return STATUS_ERR;
+	if (check_u32_expr(expr->sse_assoc_id, sctp_event->sse_assoc_id,
+			   "sctp_shutdown_event.sse_assoc_id", error))
+		return STATUS_ERR;
 
 	return STATUS_OK;
 }
diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c
index c32024a1..49579d9a 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -488,6 +488,7 @@ void free_expression(struct expression *expression)
 		free_expression(expression->value.sctp_shutdown_event->sse_type);
 		free_expression(expression->value.sctp_shutdown_event->sse_flags);
 		free_expression(expression->value.sctp_shutdown_event->sse_length);
+		free_expression(expression->value.sctp_shutdown_event->sse_assoc_id);
 		break;
 	case EXPR_SCTP_ADAPTATION_EVENT:
 		free_expression(expression->value.sctp_adaptation_event->sai_type);
@@ -1742,6 +1743,10 @@ static int evaluate_sctp_shutdown_event_expression(struct expression *in,
 		     &out_event->sse_length,
 		     error))
 		return STATUS_ERR;
+	if (evaluate(in_event->sse_assoc_id,
+		     &out_event->sse_assoc_id,
+		     error))
+		return STATUS_ERR;
 
 	return STATUS_OK;
 }
diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h
index d61168d7..b7fbf882 100644
--- a/gtests/net/packetdrill/script.h
+++ b/gtests/net/packetdrill/script.h
@@ -406,6 +406,7 @@ struct sctp_shutdown_event_expr {
 	struct expression *sse_type;
 	struct expression *sse_flags;
 	struct expression *sse_length;
+	struct expression *sse_assoc_id;
 };
 
 /* Parse tree for sctp_adaptation_event for notifications. */
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt
index 54880967..01793f13 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/notifications/sctp_shutdown_event.pkt
@@ -16,7 +16,11 @@
 *    > sctp: SHUTDOWN_ACK[flgs=0]
 +0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
 +0.0 recvmsg(3, {msg_name(...)=..., 
-		 msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=0, sse_length=12}, iov_len=1000}],
+		 msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT,
+					sse_flags=0,
+					sse_length=12,
+					sse_assoc_id=3}, iov_len=1000}],
+		 msg_control(0)=[],
 		 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12
 //+0.0 sctp_recvv(3, [{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=1, sse_length=12}, iov_len=1000}], 1,
 //..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
-- 
GitLab