From 36840b90018534ed1c333ed1c072f70fe1e68633 Mon Sep 17 00:00:00 2001
From: Michael Tuexen <tuexen@fh-muenster.de>
Date: Sat, 8 Dec 2018 15:04:27 +0100
Subject: [PATCH] Add print support for HMAC_ALGO parameter.

---
 gtests/net/packetdrill/sctp.h                 |  9 ++++
 gtests/net/packetdrill/sctp_chunk_to_string.c | 43 +++++++++++++++++++
 2 files changed, 52 insertions(+)

diff --git a/gtests/net/packetdrill/sctp.h b/gtests/net/packetdrill/sctp.h
index 81d71ba1..ab73edda 100644
--- a/gtests/net/packetdrill/sctp.h
+++ b/gtests/net/packetdrill/sctp.h
@@ -445,6 +445,15 @@ struct sctp_chunks_parameter {
 	__u8 chunk_type[];
 } __packed;
 
+#define SCTP_HMAC_ID_SHA_1	1
+#define SCTP_HMAC_ID_SHA_256	3
+
+struct sctp_hmac_algo_parameter {
+	__be16 type;
+	__be16 length;
+	__be16 hmac_id[];
+} __packed;
+
 struct sctp_supported_extensions_parameter {
 	__be16 type;
 	__be16 length;
diff --git a/gtests/net/packetdrill/sctp_chunk_to_string.c b/gtests/net/packetdrill/sctp_chunk_to_string.c
index 667c78dc..bc506308 100644
--- a/gtests/net/packetdrill/sctp_chunk_to_string.c
+++ b/gtests/net/packetdrill/sctp_chunk_to_string.c
@@ -511,6 +511,44 @@ static int sctp_chunks_parameter_to_string(
 	return STATUS_OK;
 }
 
+static int sctp_hmac_algo_parameter_to_string(
+	FILE *s,
+	struct sctp_hmac_algo_parameter *parameter,
+	char **error)
+{
+	u16 i, length, nr_hmac_algos;
+
+	length = ntohs(parameter->length);
+	if ((length < sizeof(struct sctp_hmac_algo_parameter)) ||
+	    ((length & 0x0001) != 0)) {
+		asprintf(error,
+			 "HMAC_ALGO parameter illegal (length=%u)",
+			 length);
+		return STATUS_ERR;
+	}
+	nr_hmac_algos =
+		(length - sizeof(struct sctp_hmac_algo_parameter))
+		/ sizeof(u16);
+	fputs("HMAC_ALGO[types=[", s);
+	for (i = 0; i < nr_hmac_algos; i++) {
+		if (i > 0)
+			fputs(", ", s);
+		switch (ntohs(parameter->hmac_id[i])) {
+		case SCTP_HMAC_ID_SHA_1:
+			fputs("SHA-1", s);
+			break;
+		case SCTP_HMAC_ID_SHA_256:
+			fputs("SHA-256", s);
+			break;
+		default:
+			fprintf(s, "0x%04x", ntohs(parameter->hmac_id[i]));
+			break;
+		}
+	}
+	fputs("]]", s);
+	return STATUS_OK;
+}
+
 static int sctp_supported_extensions_parameter_to_string(
 	FILE *s,
 	struct sctp_supported_extensions_parameter *parameter,
@@ -765,6 +803,11 @@ static int sctp_parameter_to_string(FILE *s,
 			(struct sctp_chunks_parameter *)parameter,
 			error);
 		break;
+	case SCTP_HMAC_ALGO_PARAMETER_TYPE:
+		result = sctp_hmac_algo_parameter_to_string(s,
+			(struct sctp_hmac_algo_parameter *)parameter,
+			error);
+		break;
 	case SCTP_SUPPORTED_EXTENSIONS_PARAMETER_TYPE:
 		result = sctp_supported_extensions_parameter_to_string(s,
 			(struct sctp_supported_extensions_parameter *)parameter,
-- 
GitLab