From 9025661751aaf75e7d9bb0e1b8887506e5632d73 Mon Sep 17 00:00:00 2001
From: Jens Hoelsch <jens.hoelscher@fh-muenster.de>
Date: Mon, 21 Dec 2015 20:27:18 +0100
Subject: [PATCH] add sockot SCTP_AUTH_KEY

---
 gtests/net/packetdrill/run_system_call.c | 43 +++++++++++++++++++++++-
 gtests/net/packetdrill/script.c          |  2 +-
 2 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 65b80f65..3aca6257 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -3891,6 +3891,47 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		optval = &authchunk;
 		break;
 #endif
+#ifdef SCTP_AUTH_KEY
+	case EXPR_SCTP_AUTHKEY: {
+		struct sctp_authkey *key;
+		int i = 0, len = 0;
+		struct expression *key_expr;
+		struct expression_list *list;
+
+		if (check_type(val_expression->value.sctp_authkey->sca_key, EXPR_LIST, error)) {
+			return STATUS_ERR;
+		}
+		list = val_expression->value.sctp_authkey->sca_key->value.list;
+		len = expression_list_length(list);
+		key = malloc(sizeof(sctp_assoc_t) + sizeof(u16) + sizeof(u16) + (sizeof(u8) * len));
+
+		if (get_sctp_assoc_t(val_expression->value.sctp_authkey->sca_assoc_id,
+				     &key->sca_assoc_id, error)) {
+			free(key);
+			return STATUS_ERR;
+		}
+		if (get_u16(val_expression->value.sctp_authkey->sca_keynumber,
+			    &key->sca_keynumber, error)) {
+			free(key);
+			return STATUS_ERR;
+		}
+		if (get_u16(val_expression->value.sctp_authkey->sca_keylength,
+			    &key->sca_keylength, error)) {
+			free(key);
+			return STATUS_ERR;
+		}
+		for (i = 0; i < len; i++) {
+			key_expr = get_arg(list, i, error);
+			if (get_u8(key_expr, &(key->sca_key[i]), error)) {
+				free(key);
+				return STATUS_ERR;
+			}
+		}
+		key->sca_keylength = len;
+		optval = key;
+		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,
@@ -3959,7 +4000,7 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 	result = setsockopt(live_fd, level, optname, optval, optlen);
 
 	return end_syscall(state, syscall, CHECK_EXACT, result, error);
-#ifdef SCTP_HMAC_IDENT
+#if defined(SCTP_HMAC_IDENT) || defined(SCTP_AUTH_KEY)
 	free(optval);
 #endif
 }
diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c
index b77b9404..1b78fccf 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -2393,7 +2393,7 @@ static int evaluate_sctp_authkey_expression(struct expression *in,
 	assert(in->value.sctp_authkey);
 	assert(out->type == EXPR_SCTP_AUTHKEY);
 
-	out->value.sctp_setpeerprim = calloc(1, sizeof(struct sctp_setpeerprim_expr));
+	out->value.sctp_authkey = calloc(1, sizeof(struct sctp_authkey_expr));
 
 	in_authkey = in->value.sctp_authkey;
 	out_authkey = out->value.sctp_authkey;
-- 
GitLab