From 1e1a0ebcb4abdc0364f93cb4218367cfab1efb0b Mon Sep 17 00:00:00 2001
From: Michael Tuexen <tuexen@fh-muenster.de>
Date: Sat, 19 Sep 2015 01:28:27 +0200
Subject: [PATCH] Use different constructor for SUPPORTED_EXTENSIONS parameter.

---
 gtests/net/packetdrill/sctp_packet.c | 39 ++++++++++++++++++++++++++--
 gtests/net/packetdrill/sctp_packet.h |  2 +-
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/gtests/net/packetdrill/sctp_packet.c b/gtests/net/packetdrill/sctp_packet.c
index eb9a1e5d..23112204 100644
--- a/gtests/net/packetdrill/sctp_packet.c
+++ b/gtests/net/packetdrill/sctp_packet.c
@@ -1571,9 +1571,44 @@ sctp_supported_address_types_parameter_new(struct sctp_address_type_list *list)
 }
 
 struct sctp_parameter_list_item *
-sctp_supported_extensions_parameter_new(s64 len, struct sctp_byte_list *types)
+sctp_supported_extensions_parameter_new(struct sctp_byte_list *list)
 {
-	return sctp_generic_parameter_new(SCTP_SUPPORTED_EXTENSIONS_PARAMETER_TYPE, len, types);
+	struct sctp_supported_extensions_parameter *parameter;
+
+	u32 flags;
+	u16 i, parameter_length, padding_length;
+	struct sctp_byte_list_item *item;
+
+	flags = 0;
+	parameter_length = sizeof(struct sctp_supported_extensions_parameter);
+	if (list == NULL) {
+		flags |= FLAG_PARAMETER_LENGTH_NOCHECK;
+		flags |= FLAG_PARAMETER_VALUE_NOCHECK;
+	} else {
+		assert(list->nr_entries <=
+		       (MAX_SCTP_PARAMETER_BYTES - sizeof(struct sctp_supported_extensions_parameter)) / sizeof(u8));
+		parameter_length += list->nr_entries * sizeof(u8);
+	}
+	padding_length = parameter_length % 4;
+	if (padding_length > 0) {
+		padding_length = 4 - padding_length;
+	}
+	assert(padding_length < 4);
+	parameter = malloc(parameter_length + padding_length);
+	assert(parameter != NULL);
+	parameter->type = htons(SCTP_SUPPORTED_EXTENSIONS_PARAMETER_TYPE);
+	parameter->length = htons(parameter_length);
+	if (list != NULL) {
+		for (i = 0, item = list->first;
+		     (i < list->nr_entries) && (item != NULL);
+		     i++, item = item->next) {
+			parameter->chunk_type[i] = item->byte;
+		}
+		assert((i == list->nr_entries) && (item == NULL));
+	}
+	memset(parameter->chunk_type + list->nr_entries, 0, padding_length);
+	return sctp_parameter_list_item_new((struct sctp_parameter *)parameter,
+	                                    parameter_length, flags);
 }
 
 struct sctp_parameter_list_item *
diff --git a/gtests/net/packetdrill/sctp_packet.h b/gtests/net/packetdrill/sctp_packet.h
index 108b0ef6..ba972b39 100644
--- a/gtests/net/packetdrill/sctp_packet.h
+++ b/gtests/net/packetdrill/sctp_packet.h
@@ -341,7 +341,7 @@ struct sctp_parameter_list_item *
 sctp_pad_parameter_new(s64 len, u8 *padding);
 
 struct sctp_parameter_list_item *
-sctp_supported_extensions_parameter_new(s64 len, struct sctp_byte_list *types);
+sctp_supported_extensions_parameter_new(struct sctp_byte_list *list);
 
 struct sctp_parameter_list_item *
 sctp_pad_parameter_new(s64 len, u8 *padding);
-- 
GitLab