From bc674b52f9d3d699be24dbe7699499cb6bbc988f Mon Sep 17 00:00:00 2001
From: Michael Tuexen <tuexen@fh-muenster.de>
Date: Sat, 3 Oct 2015 14:42:57 +0200
Subject: [PATCH] Improve the sctp_paddrparams support on Linux.

---
 gtests/net/packetdrill/run_system_call.c | 25 +++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 8a8ca10b..b84a4b3b 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -2225,6 +2225,10 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 	struct sctp_stream_value stream_value;
 #endif
 	struct sctp_paddrparams paddrparams;
+#ifdef linux
+	u32 spp_ipv6_flowlabel;
+	u8 spp_dscp;
+#endif
 
 	if (check_arg_count(args, 5, error))
 		return STATUS_ERR;
@@ -2355,17 +2359,32 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		            &paddrparams.spp_flags, error)) {
 			return STATUS_ERR;
 		}
-#ifdef SPP_IPV6_FLOWLABEL
+#ifdef __FreeBSD__
 		if (get_u32(val_expression->value.sctp_paddrparams->spp_ipv6_flowlabel,
 		            &paddrparams.spp_ipv6_flowlabel, error)) {
 			return STATUS_ERR;
 		}
-#endif
-#ifdef SPP_DSCP
 		if (get_u8(val_expression->value.sctp_paddrparams->spp_dscp,
 		           &paddrparams.spp_dscp, error)) {
 			return STATUS_ERR;
 		}
+#endif
+#ifdef linux
+		if (get_u32(val_expression->value.sctp_paddrparams->spp_ipv6_flowlabel,
+		            &spp_ipv6_flowlabel, error)) {
+			return STATUS_ERR;
+		} else if (spp_ipv6_flowlabel != 0) {
+			asprintf(error, "Bad setsockopt, Linux doesn't support paddrparams.spp_ipv6_flowlabel");
+			return STATUS_ERR;
+		}
+		if (get_u8(val_expression->value.sctp_paddrparams->spp_dscp,
+		           &spp_dscp, error)) {
+			return STATUS_ERR;
+		} else if (spp_dscp != 0) {
+			asprintf(error, "Bad setsockopt, Linux doesn't support paddrparams.spp_dscp");
+			return STATUS_ERR;
+		}
+		paddrparams.spp_sackdelay = 0;
 #endif
 		optval = &paddrparams;
 		break;
-- 
GitLab