From d728e16971a62542c22b15219eb88b5a33415a3f Mon Sep 17 00:00:00 2001
From: root <root@linux.fritz.box>
Date: Tue, 17 Nov 2015 15:26:29 +0100
Subject: [PATCH] switch syntax for sctp_connectx

---
 gtests/net/packetdrill/run_system_call.c                | 7 +++++++
 gtests/net/packetdrill/tests/bsd/sctp/sctp_active_x.pkt | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 84a6a847..de752955 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -3923,6 +3923,7 @@ static int parse_expression_to_sctp_sendv_spa(struct expression *expr, struct sc
 }
 #endif
 
+#if defined(__FreeBSD__)
 static int get_sockaddr_from_list(struct expression *expr, size_t *addr_size, struct sockaddr **addrs, char **error) {
 	if (expr->type == EXPR_LIST) {
 		struct expression_list *addrs_expr_list = (struct expression_list *)expr->value.list;
@@ -3969,6 +3970,7 @@ static int get_sockaddr_from_list(struct expression *expr, size_t *addr_size, st
 		return STATUS_ERR;
 	}	
 }
+#endif
 
 static int syscall_sctp_sendv(struct state *state, struct syscall_spec *syscall,
 			      struct expression_list *args,
@@ -4792,6 +4794,11 @@ static int syscall_sctp_connectx(struct state *state, struct syscall_spec *sysca
 		return STATUS_ERR;
 
 	assoc_expr = get_arg(args, 3, error);
+	if (check_type(assoc_expr, EXPR_LIST, error))
+		return STATUS_ERR;
+	if (check_arg_count(assoc_expr->value.list, 1, error))
+		return STATUS_ERR;
+	assoc_expr = get_arg(assoc_expr->value.list, 0, error);
 	if (check_u32_expr(assoc_expr, (u32)live_associd,
 			   "sctp_connectx assoc_id", error))
 		return STATUS_ERR;
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_active_x.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_active_x.pkt
index 15af1333..e8927bda 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_active_x.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_active_x.pkt
@@ -5,7 +5,7 @@
 +0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0
 
 // Check the handshake with an empty(!) cookie
-+0.1 sctp_connectx(3, [...], 1, 3) = 0
++0.1 sctp_connectx(3, [...], 1, [3]) = 0
 +0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
 +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
 +0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
-- 
GitLab