From 5f11dfda19a2883a74f258b6bca6df836bbff0c8 Mon Sep 17 00:00:00 2001
From: hoelscher <jens.hoelscher@fh-muenster.de>
Date: Sat, 28 Nov 2015 01:59:59 +0100
Subject: [PATCH] add syntax in parser for sctp_authchunk and sctp_authkey

---
 gtests/net/packetdrill/lexer.l  |  5 ++++
 gtests/net/packetdrill/parser.y | 51 +++++++++++++++++++++++++++++++--
 2 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l
index 5ab6e90f..097cdc9e 100644
--- a/gtests/net/packetdrill/lexer.l
+++ b/gtests/net/packetdrill/lexer.l
@@ -389,6 +389,11 @@ gauth_number_of_chunks		return GAUTH_NUMBER_OF_CHUNKS;
 gauth_chunks			return GAUTH_CHUNKS;
 sspp_assoc_id			return SSPP_ASSOC_ID;
 sspp_addr			return SSPP_ADDR;
+sauth_chunk			return SAUTH_CHUNK;
+sca_assoc_id			return SCA_ASSOC_ID;
+sca_keynumber			return SCA_KEYNUMBER;
+sca_keylength			return SCA_KEYLENGTH;
+sca_key				return SCA_KEY;
 CHUNK				return CHUNK;
 DATA				return DATA;
 INIT				return INIT;
diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index c4fc0704..7613efa1 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -565,7 +565,8 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %token <reserved> SSF_TYPE SSF_LENGTH SSF_FLAGS SSF_ERROR SSF_INFO SSF_ASSOC_ID SSF_DATA
 %token <reserved> SAI_TYPE SAI_FLAGS SAI_LENGTH SAI_ADAPTATION_IND SAI_ASSOC_ID
 %token <reserved> GAIDS_NUMBER_OF_IDS GAIDS_ASSOC_ID SSPP_ASSOC_ID SSPP_ADDR
-%token <reserved> SN_TYPE SN_FLAGS SN_LENGTH
+%token <reserved> SN_TYPE SN_FLAGS SN_LENGTH SAUTH_CHUNK
+%token <reserved> SCA_ASSOC_ID SCA_KEYNUMBER SCA_KEYLENGTH SCA_KEY
 %token <floating> FLOAT
 %token <integer> INTEGER HEX_INTEGER
 %token <string> WORD STRING BACK_QUOTED CODE IPV4_ADDR IPV6_ADDR
@@ -638,7 +639,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %type <expression> sctp_send_failed ssf_type ssf_length ssf_flags ssf_error ssf_info ssf_data
 %type <expression> sctp_adaptation_event sai_type sai_flags sai_length sai_adaptation_ind
 %type <expression> sctp_tlv sn_type sn_flags sn_length sctp_assoc_ids gaids_number_of_ids
-%type <expression> sctp_setpeerprim 
+%type <expression> sctp_setpeerprim sctp_authchunk sctp_authkey
 %type <errno_info> opt_errno
 %type <chunk_list> sctp_chunk_list_spec
 %type <chunk_list_item> sctp_chunk_spec
@@ -2559,6 +2560,12 @@ expression
 | sctp_setpeerprim  {
 	$$ = $1;
 }
+| sctp_authchunk    {
+	$$ = $1;
+}
+| sctp_authkey      {
+	$$ = $1;
+}
 | null              {
 	$$ = $1;
 }
@@ -4833,6 +4840,46 @@ sctp_setpeerprim
 	$$->value.sctp_setpeerprim->sspp_addr = $4;
 };
 
+sctp_authchunk
+: '{' SAUTH_CHUNK '=' INTEGER '}' {
+	$$ = new_expression(EXPR_SCTP_AUTHCHUNK);
+	$$->value.sctp_authchunk = calloc(1, sizeof(struct sctp_authchunk_expr));
+	if (!is_valid_u8($4)) {
+		semantic_error("sauth_chunk out of range");
+	}
+	$$->value.sctp_authchunk->sauth_chunk = new_integer_expression($4, "%hhu");
+};
+
+sctp_authkey
+: '{' SCA_ASSOC_ID '=' sctp_assoc_id ',' SCA_KEYNUMBER '=' INTEGER ',' SCA_KEYLENGTH '=' INTEGER ',' SCA_KEY '=' array '}' {
+	$$ = new_expression(EXPR_SCTP_AUTHKEY);
+	$$->value.sctp_authkey = calloc(1, sizeof(struct sctp_authkey_expr));
+	$$->value.sctp_authkey->sca_assoc_id = $4;
+	if (!is_valid_u16($8)) {
+		semantic_error("sca_keynumber out of range");
+	}
+	$$->value.sctp_authkey->sca_keynumber = new_integer_expression($8, "%hu");
+	if (!is_valid_u16($12)) {
+		semantic_error("sca_keylength out of range");
+	}
+	$$->value.sctp_authkey->sca_keylength = new_integer_expression($12, "%hu");
+	$$->value.sctp_authkey->sca_key = $16;
+}
+| '{' SCA_KEYNUMBER '=' INTEGER ',' SCA_KEYLENGTH '=' INTEGER ',' SCA_KEY '=' array '}' {
+	$$ = new_expression(EXPR_SCTP_AUTHKEY);
+	$$->value.sctp_authkey = calloc(1, sizeof(struct sctp_authkey_expr));
+	$$->value.sctp_authkey->sca_assoc_id = new_expression(EXPR_ELLIPSIS);
+	if (!is_valid_u16($4)) {
+		semantic_error("sca_keynumber out of range");
+	}
+	$$->value.sctp_authkey->sca_keynumber = new_integer_expression($4, "%hu");
+	if (!is_valid_u16($8)) {
+		semantic_error("sca_keylength out of range");
+	}
+	$$->value.sctp_authkey->sca_keylength = new_integer_expression($8, "%hu");
+	$$->value.sctp_authkey->sca_key = $12;
+};
+
 opt_errno
 :                   { $$ = NULL; }
 | WORD note         {
-- 
GitLab