From 8fa3f492da2ace8a602f286d008c692368cea47f Mon Sep 17 00:00:00 2001
From: Charlie Root <root@BSD10.2>
Date: Mon, 21 Dec 2015 19:20:34 +0100
Subject: [PATCH] add support for sctp_auth_chunk socketoption

---
 gtests/net/packetdrill/run_system_call.c         | 16 ++++++++++++++--
 .../api_tests/getsockopt/sctp_auth_chunk.pkt     |  2 ++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 954b0c5b..65b80f65 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -764,7 +764,7 @@ static int check_u16array_expr(struct expression *expr_list, u16 *data, int data
 		switch(expr_list->type) {
 		case EXPR_LIST:
 			if (data_len != expression_list_length(expr_list->value.list)) {
-				asprintf(error, "%s length: expected: %u actual %zu",
+				asprintf(error, "%s length: expected: %u actual %d",
 					 val_name, expression_list_length(expr_list->value.list), data_len);
 				return STATUS_ERR;
 			}
@@ -3516,6 +3516,9 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #ifdef SCTP_SET_PEER_PRIMARY_ADDR
 	struct sctp_setpeerprim setpeerprim;
 #endif
+#ifdef SCTP_AUTH_CHUNK
+	struct sctp_authchunk authchunk;
+#endif
 #ifdef SCTP_PEER_ADDR_PARAMS
 	struct sctp_paddrparams paddrparams;
 #ifdef linux
@@ -3879,6 +3882,15 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		optval = &setpeerprim;
 		break;
 #endif
+#ifdef SCTP_AUTH_CHUNK
+	case EXPR_SCTP_AUTHCHUNK:
+		if (get_u8(val_expression->value.sctp_authchunk->sauth_chunk,
+			    &authchunk.sauth_chunk, error)) {
+			return STATUS_ERR;
+		}		
+		optval = &authchunk;
+		break;
+#endif
 #ifdef SCTP_PEER_ADDR_PARAMS
 	case EXPR_SCTP_PEER_ADDR_PARAMS:
 		if (get_sctp_assoc_t(val_expression->value.sctp_paddrparams->spp_assoc_id,
@@ -4608,7 +4620,7 @@ static int syscall_sctp_sendx(struct state *state, struct syscall_spec *syscall,
 	if (ellipsis_arg(args, 1, error))
 		return STATUS_ERR;
 	len_expr = get_arg(args, 2, error);
-	if (get_u32(len_expr, &len, error)) {
+	if (get_size_t(len_expr, &len, error)) {
 		 return STATUS_ERR;
 	}
 	addrs_expr = get_arg(args, 3, error);
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt
index d31aba1d..0a023a16 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt
@@ -11,5 +11,7 @@
 +0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
 
 +0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=0}, 1) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=1}, 1) = -1
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=4}, 1) = 0
 
 +0 close(3) = 0
-- 
GitLab