From 6562cd8242eabdba52909d1ac43c0edd91322acd Mon Sep 17 00:00:00 2001
From: hoelscher <jens.hoelscher@fh-muenster.de>
Date: Mon, 19 Oct 2015 21:38:46 +0200
Subject: [PATCH] finish testcases

---
 gtests/net/packetdrill/parser.y               | 16 +++----
 gtests/net/packetdrill/run_system_call.c      | 47 +++++++++++++------
 gtests/net/packetdrill/script.c               |  4 ++
 .../packetdrill/tests/bsd/sctp/sctp_recvv.pkt | 39 ++++++++++-----
 4 files changed, 72 insertions(+), 34 deletions(-)

diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index 634e6487..35c278a3 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -3300,11 +3300,11 @@ rcv_flags
 ;
 
 rcv_ppid
-: RCV_PPID '=' INTEGER {
-	if (!is_valid_u32($3)) {
-		semantic_error("sinfo_cumtsn out of range");
+: RCV_PPID '=' _HTONL_ '(' INTEGER ')' {
+	if (!is_valid_u32($5)) {
+		semantic_error("rcv_ppid out of range");
 	}
-	$$ = new_integer_expression($3, "%u");
+	$$ = new_integer_expression(htonl($5), "%u");
 }
 | RCV_PPID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
@@ -3421,11 +3421,11 @@ nxt_flags
 ;
 
 nxt_ppid
-: NXT_PPID '=' INTEGER {
-	if (!is_valid_u32($3)) {
+: NXT_PPID '=' _HTONL_ '(' INTEGER ')' {
+	if (!is_valid_u32($5)) {
 		semantic_error("nxt_ppid out of range");
 	}
-	$$ = new_integer_expression($3, "%u");
+	$$ = new_integer_expression(htonl((u32)$5), "%u");
 }
 | NXT_PPID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
 ;
@@ -3452,7 +3452,7 @@ sctp_nxtinfo
 ;
 
 sctp_recvv_rn
-: '{' RECVV_RCVINFO '=' sctp_rcvinfo ',' RECVV_NXTINFO '=' sctp_nxtinfo '}' {
+: '{' RECVV_RCVINFO '=' expression ',' RECVV_NXTINFO '=' expression '}' {
 	$$ = new_expression(EXPR_SCTP_RECVV_RN);
 	$$->value.sctp_sendv_spa = calloc(1, sizeof(struct sctp_recvv_rn_expr));
 	$$->value.sctp_recvv_rn->recvv_rcvinfo = $4;
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 05feed47..3b4a8106 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -3505,7 +3505,7 @@ static int syscall_sctp_sendv(struct state *state, struct syscall_spec *syscall,
 #endif
 }
 
-#ifdef SCTP_RECVV_RCVINFO
+#if defined(__FreeBSD__)
 static int check_sctp_rcvinfo(struct sctp_rcvinfo_expr *expr,
 			      struct sctp_rcvinfo *sctp_rcvinfo,
 			      char **error)
@@ -3598,7 +3598,7 @@ static int check_sctp_rcvinfo(struct sctp_rcvinfo_expr *expr,
 }
 #endif
 
-#ifdef SCTP_RECVV_NXTINFO
+#if defined(__FreeBSD__)
 static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr,
 			      struct sctp_nxtinfo *sctp_nxtinfo,
 			      char **error)
@@ -3635,7 +3635,7 @@ static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr,
 		}
 		if (sctp_nxtinfo->nxt_ppid != nxt_ppid) {
 			asprintf(error, "sctp_nxtinfo.nxt_ppid: expected: %u actual: %u",
-				 nxt_ppid, sctp_nxtinfo->nxt_ppid);
+				 htonl(nxt_ppid), htonl(sctp_nxtinfo->nxt_ppid));
 			return STATUS_ERR;
 		}
 	}
@@ -3655,17 +3655,23 @@ static int check_sctp_nxtinfo(struct sctp_nxtinfo_expr *expr,
 }
 #endif
 
-#ifdef SCTP_RECVV_RN
+#if defined(__FreeBSD__)
 static int check_sctp_recvv_rn(struct sctp_recvv_rn_expr *expr,
 			       struct sctp_recvv_rn *sctp_recvv_rn,
 			       char **error)
 {
 	if (expr->recvv_rcvinfo->type != EXPR_ELLIPSIS) {
-		if (check_sctp_rcvinfo((struct sctp_rcvinfo_expr *)expr->recvv_rcvinfo,
-				       &sctp_recvv_rn->recvv_rcvinfo, error))
+		if (check_type(expr->recvv_rcvinfo, EXPR_SCTP_RCVINFO, error))
+			return STATUS_ERR;
+		if (check_sctp_rcvinfo(expr->recvv_rcvinfo->value.sctp_rcvinfo,
+				       &(sctp_recvv_rn->recvv_rcvinfo), error))
 			return STATUS_ERR;
-		if (check_sctp_nxtinfo((struct sctp_nxtinfo_expr *)expr->recvv_nxtinfo,
-				       &sctp_recvv_rn->recvv_nxtinfo, error))
+	}
+	if (expr->recvv_nxtinfo->type != EXPR_ELLIPSIS) {
+		if (check_type(expr->recvv_nxtinfo, EXPR_SCTP_NXTINFO, error))
+			return STATUS_ERR;
+		if (check_sctp_nxtinfo(expr->recvv_nxtinfo->value.sctp_nxtinfo,
+				       &(sctp_recvv_rn->recvv_nxtinfo), error))
 			return STATUS_ERR;
 	}
 	return STATUS_OK;
@@ -3687,6 +3693,7 @@ static int syscall_sctp_recvv(struct state *state, struct syscall_spec *syscall,
 	begin_syscall(state, syscall);
 	struct expression *iovec_expr_list, *iovcnt_expr, *addr_expr, *fromlen_expr;
 	struct expression *infolen_expr, *info_expr, *infotype_expr, *flags_expr;
+	struct expression *infolen_list_expr, *infotype_list_expr, *flags_list_expr;
 	struct sctp_recvv_rn recvv_rn;
 	struct sctp_rcvinfo rcvinfo;
 	struct sctp_nxtinfo nxtinfo;
@@ -3718,7 +3725,13 @@ static int syscall_sctp_recvv(struct state *state, struct syscall_spec *syscall,
 	} else {
 		return STATUS_ERR;
 	}
-	infolen_expr = get_arg(args, 6, error);
+	infolen_list_expr = get_arg(args, 6, error);
+	if (infolen_list_expr->type == EXPR_LIST) {
+		if (check_arg_count(infolen_list_expr->value.list, 1, error)) {
+			return STATUS_ERR;
+		}
+	}
+	infolen_expr = get_arg(infolen_list_expr->value.list, 0, error);
 	if (get_u32(infolen_expr, &infolen, error))
 		return STATUS_ERR;
 	infotype = 0;
@@ -3747,8 +3760,12 @@ static int syscall_sctp_recvv(struct state *state, struct syscall_spec *syscall,
 		}
 	}
 	free(from);
-	infotype_expr = get_arg(args, 7, error);
-	if (infotype_expr->type != EXPR_ELLIPSIS) {
+	infotype_list_expr = get_arg(args, 7, error);
+	if (infotype_list_expr->type != EXPR_ELLIPSIS) {
+		if (check_arg_count(infotype_list_expr->value.list, 1, error)) {
+			return STATUS_ERR;
+		}
+		infotype_expr = get_arg(infotype_list_expr->value.list, 0, error);
 		s32 script_infotype;
 
 		if (get_s32(infotype_expr, &script_infotype, error)) {
@@ -3760,7 +3777,6 @@ static int syscall_sctp_recvv(struct state *state, struct syscall_spec *syscall,
 			return STATUS_ERR;
 		}
 	}
-//check info
 	switch(infotype){
 	case SCTP_RECVV_NOINFO:
 		if (infolen != 0){
@@ -3796,8 +3812,11 @@ static int syscall_sctp_recvv(struct state *state, struct syscall_spec *syscall,
 		result = STATUS_ERR;
 		break;
 	}
-	flags_expr = get_arg(args, 8, error);
-	if (flags_expr->type != EXPR_ELLIPSIS) {
+	flags_list_expr = get_arg(args, 8, error);
+	if (flags_list_expr->type != EXPR_ELLIPSIS) {
+		if (check_arg_count(flags_list_expr->value.list, 1, error))
+			return STATUS_ERR;
+		flags_expr = get_arg(flags_list_expr->value.list, 0, error);
 		s32 script_flags;
 		if (get_s32(flags_expr, &script_flags, error)) {
 			asprintf(error, "sctp_recvv flags bad return value. expected %d, actual %d",
diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c
index 21d3a1c9..82f724ae 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -1260,6 +1260,10 @@ static int evaluate_sctp_recvv_rn_expression(struct expression *in,
 		     &out_rn->recvv_rcvinfo,
 		     error))
 		return STATUS_ERR;
+        if (evaluate(in_rn->recvv_nxtinfo,
+		     &out_rn->recvv_nxtinfo,
+		     error))
+		return STATUS_ERR;
 
 	return STATUS_OK;
 }
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt
index 7b177617..f454604c 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_recvv.pkt
@@ -16,45 +16,60 @@
 //base test
 +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
 *    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
-+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 20, NULL, 0, SCTP_RECVV_NOINFO, 0) = 1000
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [0]) = 1000
 
 //base test with sockaddr
 +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=0]
 *    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
 +0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
-16, NULL, 0, SCTP_RECVV_NOINFO, 0) = 1000
+16, NULL, [0], [SCTP_RECVV_NOINFO], [0]) = 1000
 
 //base test with NULL sockaddr
 +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=2, ppid=0]
 *    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
-+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, NULL, 0, NULL, 0, SCTP_RECVV_NOINFO, 0) = 1000
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, NULL, 0, NULL, [0], [SCTP_RECVV_NOINFO], [0]) = 1000
 
 //base SCTP_RECVV_RCVINFO
 +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
 +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
 +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=4, sid=0, ssn=3, ppid=0]
 *    > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]]
-+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {rcv_sid=0, rcv_ssn=3, rcv_flags=0, rcv_ppid=0, rcv_tsn=4, rcv_cumtsn=4, rcv_context=0},
-28, SCTP_RECVV_RCVINFO, 0) = 1000
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {rcv_sid=0, rcv_ssn=3, rcv_flags=0, rcv_ppid=htonl(0), rcv_tsn=4, rcv_cumtsn=4, rcv_context=0},
+[28], [SCTP_RECVV_RCVINFO], [0]) = 1000
 
 //base SCTP_RECVV_NXTINFO
 +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
 +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
 +0.0 < sctp: DATA[flgs=BE, len=1016, tsn=5, sid=0, ssn=4, ppid=0]
 *    > sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=..., gaps=[], dups=[]]
-+0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16,
-{nxt_sid=0, nxt_flags=0, nxt_ppid=0, nxt_length=0}, 16, SCTP_RECVV_NXTINFO, 0) = 1000
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=6, sid=0, ssn=5, ppid=10]
+*    > sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000}, [16], [SCTP_RECVV_NXTINFO], [0]) = 1000
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL, [0], [0], [0]) = 1000
 
 //base SCTP_RECVV_RN
 +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
 +0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
-+0.0 < sctp: DATA[flgs=BE, len=1016, tsn=6, sid=0, ssn=5, ppid=0]
-*    > sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=7, sid=0, ssn=6, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=7, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=8, sid=0, ssn=7, ppid=10]
+*    > sctp: SACK[flgs=0, cum_tsn=8, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {
+recvv_rcvinfo={rcv_sid=0, rcv_ssn=6, rcv_flags=0, rcv_ppid=htonl(0), rcv_tsn=7, rcv_cumtsn=8, rcv_context=0},
+recvv_nxtinfo={nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000}}, [44], [SCTP_RECVV_RN], [0]) = 1000
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=9, sid=0, ssn=8, ppid=11]
+*    > sctp: SACK[flgs=0, cum_tsn=9, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {
+recvv_rcvinfo={rcv_sid=0, rcv_ssn=7, rcv_flags=0, rcv_ppid=htonl(10), rcv_tsn=8, rcv_cumtsn=9, rcv_context=0}, recvv_nxtinfo=...}, [44], [SCTP_RECVV_RN], [0]) = 1000
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=10, sid=0, ssn=9, ppid=10]
+*    > sctp: SACK[flgs=0, cum_tsn=10, a_rwnd=..., gaps=[], dups=[]]
 +0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, {
-recvv_rcvinfo={rcv_sid=0, rcv_ssn=0, rcv_flags=0, rcv_ppid=0, rcv_tsn=0, rcv_cumtsn=0, rcv_context=0},
-recvv_nxtinfo={nxt_sid=0, nxt_flags=0, nxt_ppid=0, nxt_length=0}}, 44, SCTP_RECVV_RN, 0) = 1000
+recvv_rcvinfo=..., recvv_nxtinfo={nxt_sid=0, nxt_flags=32, nxt_ppid=htonl(10), nxt_length=1000}}, [44], [SCTP_RECVV_RN], [0]) = 1000
++0.0 sctp_recvv(3, [{iov_base=..., iov_len=1000}], 1, ..., 16, NULL, [0], [SCTP_RECVV_NOINFO], [0]) = 1000
 
 +0.0 close(3) = 0
-+0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=6]
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=10]
 +0.1 < sctp: SHUTDOWN_ACK[flgs=0]
 +0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
-- 
GitLab