From 2ebaaf164216a73514cfe75dc4bb3453a9596a82 Mon Sep 17 00:00:00 2001
From: hoelscher <jens.hoelscher@fh-muenster.de>
Date: Tue, 20 Oct 2015 06:42:02 +0200
Subject: [PATCH] add support for [gs]etsockopt for SCTP_EVENTS

---
 gtests/net/packetdrill/lexer.l                |  10 +
 gtests/net/packetdrill/parser.y               |  59 ++++++
 gtests/net/packetdrill/run_system_call.c      | 189 +++++++++++++++++-
 gtests/net/packetdrill/script.c               |   6 +-
 gtests/net/packetdrill/symbols_freebsd.c      |   1 +
 .../bsd/sctp/sctp_get_socket_options.pkt      |  22 +-
 .../tests/bsd/sctp/sctp_socket_options.pkt    |   4 +
 7 files changed, 280 insertions(+), 11 deletions(-)

diff --git a/gtests/net/packetdrill/lexer.l b/gtests/net/packetdrill/lexer.l
index 1f7ed9d5..fdb44cee 100644
--- a/gtests/net/packetdrill/lexer.l
+++ b/gtests/net/packetdrill/lexer.l
@@ -245,6 +245,16 @@ spp_ipv6_flowlabel		return SPP_IPV6_FLOWLABEL_; /* avoid name clash */
 spp_dscp			return SPP_DSCP_; /* avoid name clash */
 se_type				return SE_TYPE;
 se_on				return SE_ON;
+sctp_data_io_event              return _SCTP_DATA_IO_EVENT_;
+sctp_association_event          return _SCTP_ASSOCIATION_EVENT_;
+sctp_address_event              return _SCTP_ADDRESS_EVENT_;
+sctp_send_failure_event         return _SCTP_SEND_FAILURE_EVENT_;
+sctp_peer_error_event           return _SCTP_PEER_ERROR_EVENT_;
+sctp_shutdown_event             return _SCTP_SHUTDOWN_EVENT_;
+sctp_partial_delivery_event     return _SCTP_PARTIAL_DELIVERY_EVENT_;
+sctp_adaptation_layer_event     return _SCTP_ADAPTATION_LAYER_EVENT_;
+sctp_authentication_event       return _SCTP_AUTHENTICATION_EVENT_;
+sctp_sender_dry_event           return _SCTP_SENDER_DRY_EVENT_;
 snd_sid				return SND_SID;
 snd_flags			return SND_FLAGS;
 snd_ppid			return SND_PPID;
diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index 9fac14bf..344826a8 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -548,6 +548,10 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %token <reserved> NXT_SID NXT_FLAGS NXT_PPID NXT_LENGTH
 %token <reserved> RECVV_RCVINFO RECVV_NXTINFO
 %token <reserved> SSE_TYPE SSE_FLAGS SSE_LENGTH
+%token <rexerved> _SCTP_DATA_IO_EVENT_ _SCTP_ASSOCIATION_EVENT_ _SCTP_ADDRESS_EVENT_
+%token <reserved> _SCTP_SEND_FAILURE_EVENT_ _SCTP_PEER_ERROR_EVENT_ _SCTP_SHUTDOWN_EVENT_
+%token <reserved> _SCTP_PARTIAL_DELIVERY_EVENT_ _SCTP_ADAPTATION_LAYER_EVENT_
+%token <reserved> _SCTP_AUTHENTICATION_EVENT_ _SCTP_SENDER_DRY_EVENT_
 %token <floating> FLOAT
 %token <integer> INTEGER HEX_INTEGER
 %token <string> WORD STRING BACK_QUOTED CODE IPV4_ADDR IPV6_ADDR
@@ -604,6 +608,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
 %type <expression> sctp_rcvinfo rcv_sid rcv_ssn rcv_flags rcv_ppid rcv_tsn rcv_cumtsn rcv_context
 %type <expression> sctp_nxtinfo nxt_sid nxt_flags nxt_ppid nxt_length sctp_recvv_rn
 %type <expression> sctp_shutdown_event sse_type sse_flags sse_length
+%type <expression> sctp_event_subscribe
 %type <errno_info> opt_errno
 %type <chunk_list> sctp_chunk_list_spec
 %type <chunk_list_item> sctp_chunk_spec
@@ -2461,6 +2466,9 @@ expression
 | sctp_event        {
 	$$ = $1;
 }
+| sctp_event_subscribe {
+	$$ = $1;
+}
 | sctp_sndinfo      {
 	$$ = $1;
 }
@@ -3116,6 +3124,57 @@ sctp_event
 }
 ;
 
+sctp_event_subscribe
+: '{' _SCTP_DATA_IO_EVENT_          '=' INTEGER ',' _SCTP_ASSOCIATION_EVENT_      '=' INTEGER ','
+      _SCTP_ADDRESS_EVENT_          '=' INTEGER ',' _SCTP_SEND_FAILURE_EVENT_     '=' INTEGER ','
+      _SCTP_PEER_ERROR_EVENT_       '=' INTEGER ',' _SCTP_SHUTDOWN_EVENT_         '=' INTEGER ','
+      _SCTP_PARTIAL_DELIVERY_EVENT_ '=' INTEGER ',' _SCTP_ADAPTATION_LAYER_EVENT_ '=' INTEGER ','
+      _SCTP_AUTHENTICATION_EVENT_   '=' INTEGER ',' _SCTP_SENDER_DRY_EVENT_       '=' INTEGER '}' {
+	$$ = new_expression(EXPR_SCTP_EVENT_SUBSCRIBE);
+	$$->value.sctp_event_subscribe = calloc(1, sizeof(struct sctp_event_subscribe_expr));
+	if (!is_valid_u8($4)) {
+		semantic_error("sctp_data_io_event out of range");
+	}
+	$$->value.sctp_event_subscribe->sctp_data_io_event =  new_integer_expression($4, "%hhu");
+	if (!is_valid_u8($8)) {
+		semantic_error("sctp_association_event out of range");
+	}
+	$$->value.sctp_event_subscribe->sctp_association_event =  new_integer_expression($8, "%hhu");
+	if (!is_valid_u8($12)) {
+		semantic_error("sctp_address_event out of range");
+	}
+	$$->value.sctp_event_subscribe->sctp_address_event =  new_integer_expression($12, "%hhu");
+	if (!is_valid_u8($16)) {
+		semantic_error("sctp_send_failure_event out of range");
+	}
+	$$->value.sctp_event_subscribe->sctp_send_failure_event =  new_integer_expression($16, "%hhu");
+	if (!is_valid_u8($20)) {
+		semantic_error("sctp_peer_error_event out of range");
+	}
+	$$->value.sctp_event_subscribe->sctp_peer_error_event =  new_integer_expression($20, "%hhu");
+	if (!is_valid_u8($24)) {
+		semantic_error("sctp_shutdown_event out of range");
+	}
+	$$->value.sctp_event_subscribe->sctp_shutdown_event =  new_integer_expression($24, "%hhu");
+	if (!is_valid_u8($28)) {
+		semantic_error("sctp_partial_delivery_event out of range");
+	}
+	$$->value.sctp_event_subscribe->sctp_partial_delivery_event =  new_integer_expression($28, "%hhu");
+	if (!is_valid_u8($32)) {
+		semantic_error("sctp_adaptation_layer_event out of range");
+	}
+	$$->value.sctp_event_subscribe->sctp_adaptation_layer_event =  new_integer_expression($32, "%hhu");
+	if (!is_valid_u8($36)) {
+		semantic_error("sctp_authentication_event out of range");
+	}
+	$$->value.sctp_event_subscribe->sctp_authentication_event =  new_integer_expression($36, "%hhu");
+	if (!is_valid_u8($40)) {
+		semantic_error("sctp_sender_dry_event out of range");
+	}
+	$$->value.sctp_event_subscribe->sctp_sender_dry_event =  new_integer_expression($40, "%hhu");
+}
+;
+
 snd_sid
 : SND_SID '=' INTEGER {
 	if (!is_valid_u16($3)) {
diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 7e687115..db8e46ca 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -2316,6 +2316,135 @@ static int check_sctp_event(struct sctp_event_expr *expr,
 }
 #endif
 
+#ifdef SCTP_EVENT
+static int check_sctp_event_subscribe(struct sctp_event_subscribe_expr *expr,
+				      struct sctp_event_subscribe *sctp_events,
+				      char **error)
+{
+	if (expr->sctp_data_io_event->type != EXPR_ELLIPSIS) {
+		u8 sctp_data_io_event;
+
+		if (get_u8(expr->sctp_data_io_event, &sctp_data_io_event, error)) {
+			return STATUS_ERR;
+		}
+		if (sctp_events->sctp_data_io_event != sctp_data_io_event) {
+			asprintf(error, "sctp_event_subscribe.sctp_data_io_event: expected: %hhu actual: %hhu",
+				 sctp_data_io_event, sctp_events->sctp_data_io_event);
+			return STATUS_ERR;
+		}
+	}
+	if (expr->sctp_association_event->type != EXPR_ELLIPSIS) {
+		u8 sctp_association_event;
+
+		if (get_u8(expr->sctp_association_event, &sctp_association_event, error)) {
+			return STATUS_ERR;
+		}
+		if (sctp_events->sctp_association_event != sctp_association_event) {
+			asprintf(error, "sctp_event_subscribe.sctp_association_event: expected: %hhu actual: %hhu",
+				 sctp_association_event, sctp_events->sctp_association_event);
+			return STATUS_ERR;
+		}
+	}
+	if (expr->sctp_address_event->type != EXPR_ELLIPSIS) {
+		u8 sctp_address_event;
+
+		if (get_u8(expr->sctp_address_event, &sctp_address_event, error)) {
+			return STATUS_ERR;
+		}
+		if (sctp_events->sctp_address_event != sctp_address_event) {
+			asprintf(error, "sctp_event_subscribe.sctp_address_event: expected: %hhu actual: %hhu",
+				 sctp_address_event, sctp_events->sctp_address_event);
+			return STATUS_ERR;
+		}
+	}
+	if (expr->sctp_send_failure_event->type != EXPR_ELLIPSIS) {
+		u8 sctp_send_failure_event;
+
+		if (get_u8(expr->sctp_send_failure_event, &sctp_send_failure_event, error)) {
+			return STATUS_ERR;
+		}
+		if (sctp_events->sctp_send_failure_event != sctp_send_failure_event) {
+			asprintf(error, "sctp_event_subscribe.sctp_send_failure_event: expected: %hhu actual: %hhu",
+				 sctp_send_failure_event, sctp_events->sctp_send_failure_event);
+			return STATUS_ERR;
+		}
+	}
+	if (expr->sctp_peer_error_event->type != EXPR_ELLIPSIS) {
+		u8 sctp_peer_error_event;
+
+		if (get_u8(expr->sctp_peer_error_event, &sctp_peer_error_event, error)) {
+			return STATUS_ERR;
+		}
+		if (sctp_events->sctp_peer_error_event != sctp_peer_error_event) {
+			asprintf(error, "sctp_event_subscribe.sctp_peer_error_event: expected: %hhu actual: %hhu",
+				 sctp_peer_error_event, sctp_events->sctp_peer_error_event);
+			return STATUS_ERR;
+		}
+	}
+	if (expr->sctp_shutdown_event->type != EXPR_ELLIPSIS) {
+		u8 sctp_shutdown_event;
+
+		if (get_u8(expr->sctp_shutdown_event, &sctp_shutdown_event, error)) {
+			return STATUS_ERR;
+		}
+		if (sctp_events->sctp_shutdown_event != sctp_shutdown_event) {
+			asprintf(error, "sctp_event_subscribe.sctp_shutdown_event: expected: %hhu actual: %hhu",
+				 sctp_shutdown_event, sctp_events->sctp_shutdown_event);
+			return STATUS_ERR;
+		}
+	}
+	if (expr->sctp_partial_delivery_event->type != EXPR_ELLIPSIS) {
+		u8 sctp_partial_delivery_event;
+
+		if (get_u8(expr->sctp_partial_delivery_event, &sctp_partial_delivery_event, error)) {
+			return STATUS_ERR;
+		}
+		if (sctp_events->sctp_partial_delivery_event != sctp_partial_delivery_event) {
+			asprintf(error, "sctp_event_subscribe.sctp_partial_delivery_event: expected: %hhu actual: %hhu",
+				 sctp_partial_delivery_event, sctp_events->sctp_partial_delivery_event);
+			return STATUS_ERR;
+		}
+	}
+	if (expr->sctp_adaptation_layer_event->type != EXPR_ELLIPSIS) {
+		u8 sctp_adaptation_layer_event;
+
+		if (get_u8(expr->sctp_adaptation_layer_event, &sctp_adaptation_layer_event, error)) {
+			return STATUS_ERR;
+		}
+		if (sctp_events->sctp_adaptation_layer_event != sctp_adaptation_layer_event) {
+			asprintf(error, "sctp_event_subscribe.sctp_adaptation_layer_event: expected: %hhu actual: %hhu",
+				 sctp_adaptation_layer_event, sctp_events->sctp_adaptation_layer_event);
+			return STATUS_ERR;
+		}
+	}
+	if (expr->sctp_authentication_event->type != EXPR_ELLIPSIS) {
+		u8 sctp_authentication_event;
+
+		if (get_u8(expr->sctp_authentication_event, &sctp_authentication_event, error)) {
+			return STATUS_ERR;
+		}
+		if (sctp_events->sctp_authentication_event != sctp_authentication_event) {
+			asprintf(error, "sctp_event_subscribe.sctp_authentication_event: expected: %hhu actual: %hhu",
+				 sctp_authentication_event, sctp_events->sctp_authentication_event);
+			return STATUS_ERR;
+		}
+	}
+	if (expr->sctp_sender_dry_event->type != EXPR_ELLIPSIS) {
+		u8 sctp_sender_dry_event;
+
+		if (get_u8(expr->sctp_sender_dry_event, &sctp_sender_dry_event, error)) {
+			return STATUS_ERR;
+		}
+		if (sctp_events->sctp_sender_dry_event != sctp_sender_dry_event) {
+			asprintf(error, "sctp_event_subscribe.sctp_sender_dry_event: expected: %hhu actual: %hhu",
+				 sctp_sender_dry_event, sctp_events->sctp_sender_dry_event);
+			return STATUS_ERR;
+		}
+	}
+
+	return STATUS_OK;
+}
+#endif
 #ifdef SCTP_DEFAULT_SNDINFO
 static int check_sctp_sndinfo(struct sctp_sndinfo_expr *expr,
 			      struct sctp_sndinfo *sctp_sndinfo,
@@ -2527,6 +2656,12 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		}
 		break;
 #endif
+#ifdef SCTP_EVENTS
+	case EXPR_SCTP_EVENT_SUBSCRIBE:
+		live_optval = malloc(sizeof(struct sctp_event_subscribe));
+		live_optlen = sizeof(struct sctp_event_subscribe);
+		break;
+#endif
 #ifdef SCTP_DEFAULT_SNDINFO
 	case EXPR_SCTP_SNDINFO:
 		live_optval = malloc(sizeof(struct sctp_sndinfo));
@@ -2621,6 +2756,11 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 		result = check_sctp_event(val_expression->value.sctp_event, live_optval, error);
 		break;
 #endif
+#ifdef SCTP_EVENTS
+	case EXPR_SCTP_EVENT_SUBSCRIBE:
+		result = check_sctp_event_subscribe(val_expression->value.sctp_event_subscribe, live_optval, error);
+		break;
+#endif
 #ifdef SCTP_DEFAULT_SNDINFO
 	case EXPR_SCTP_SNDINFO:
 		result = check_sctp_sndinfo(val_expression->value.sctp_sndinfo, live_optval, error);
@@ -2681,6 +2821,9 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 #ifdef SCTP_EVENT
 	struct sctp_event event;
 #endif
+#ifdef SCTP_EVENTS
+	struct sctp_event_subscribe event_subscribe;
+#endif
 #ifdef SCTP_DEFAULT_SNDINFO
 	struct sctp_sndinfo sndinfo;
 #endif
@@ -2694,7 +2837,6 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 	u8 spp_dscp;
 #endif
 #endif
-
 	if (check_arg_count(args, 5, error))
 		return STATUS_ERR;
 	if (s32_arg(args, 0, &script_fd, error))
@@ -2861,6 +3003,51 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		optval = &event;
 		break;
 #endif
+#ifdef SCTP_EVENTS
+	case EXPR_SCTP_EVENT_SUBSCRIBE:
+		if (get_u8(val_expression->value.sctp_event_subscribe->sctp_data_io_event,
+			    &event_subscribe.sctp_data_io_event, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u8(val_expression->value.sctp_event_subscribe->sctp_association_event,
+			    &event_subscribe.sctp_association_event, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u8(val_expression->value.sctp_event_subscribe->sctp_address_event,
+			    &event_subscribe.sctp_address_event, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u8(val_expression->value.sctp_event_subscribe->sctp_send_failure_event,
+			    &event_subscribe.sctp_send_failure_event, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u8(val_expression->value.sctp_event_subscribe->sctp_peer_error_event,
+			    &event_subscribe.sctp_peer_error_event, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u8(val_expression->value.sctp_event_subscribe->sctp_shutdown_event,
+			    &event_subscribe.sctp_shutdown_event, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u8(val_expression->value.sctp_event_subscribe->sctp_partial_delivery_event,
+			    &event_subscribe.sctp_partial_delivery_event, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u8(val_expression->value.sctp_event_subscribe->sctp_adaptation_layer_event,
+			    &event_subscribe.sctp_adaptation_layer_event, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u8(val_expression->value.sctp_event_subscribe->sctp_authentication_event,
+			    &event_subscribe.sctp_authentication_event, error)) {
+			return STATUS_ERR;
+		}
+		if (get_u8(val_expression->value.sctp_event_subscribe->sctp_sender_dry_event,
+			    &event_subscribe.sctp_sender_dry_event, error)) {
+			return STATUS_ERR;
+		}
+		optval = &event_subscribe;
+		break;
+#endif
 #ifdef SCTP_DEFAULT_SNDINFO
 	case EXPR_SCTP_SNDINFO:
 		sndinfo.snd_assoc_id = 0;
diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c
index adf37cd8..9f162ddf 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -938,8 +938,8 @@ static int evaluate_sctp_event_expression(struct expression *in,
 }
 
 static int evaluate_sctp_event_subscribe_expression(struct expression *in,
-						 struct expression *out,
-						 char **error)
+						    struct expression *out,
+						    char **error)
 {
 	struct sctp_event_subscribe_expr *in_event;
 	struct sctp_event_subscribe_expr *out_event;
@@ -994,7 +994,7 @@ static int evaluate_sctp_event_subscribe_expression(struct expression *in,
 		    error))
 		return STATUS_ERR;
 
-	return STATUS_ERR;
+	return STATUS_OK;
 }
 
 static int evaluate_sctp_accocparams_expression(struct expression *in,
diff --git a/gtests/net/packetdrill/symbols_freebsd.c b/gtests/net/packetdrill/symbols_freebsd.c
index 284e156c..8f8bd758 100644
--- a/gtests/net/packetdrill/symbols_freebsd.c
+++ b/gtests/net/packetdrill/symbols_freebsd.c
@@ -89,6 +89,7 @@ struct int_symbol platform_symbols_table[] = {
 	{ SCTP_MAX_BURST,                   "SCTP_MAX_BURST"                  },
 	{ SCTP_PEER_ADDR_PARAMS,            "SCTP_PEER_ADDR_PARAMS"           },
 	{ SCTP_EVENT,			    "SCTP_EVENT"		      },
+	{ SCTP_EVENTS,			    "SCTP_EVENTS"		      },
 	{ SCTP_DEFAULT_SNDINFO,             "SCTP_DEFAULT_SNDINFO"            },
 	{ SCTP_STATUS,                      "SCTP_STATUS"                     },
 	{ SCTP_GET_PEER_ADDR_INFO,          "SCTP_GET_PEER_ADDR_INFO"         },
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt
index 1c597779..2b9f57a4 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_get_socket_options.pkt
@@ -115,16 +115,24 @@ sasoc_cookie_life=...}, [20]) = 0
 +0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
 +0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
 
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=0, snd_ppid=1, snd_context=1}, 16) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=0, snd_ppid=1, snd_context=1}, [16]) = 0
-+0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=SCTP_UNORDERED, snd_ppid=2, snd_context=2}, 16) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=SCTP_UNORDERED, snd_ppid=2, snd_context=2}, [16]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=SCTP_UNORDERED, snd_ppid=2, snd_context=...}, [16]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=0, snd_ppid=htonl(1), snd_context=1}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=0, snd_ppid=htonl(1), snd_context=1}, [16]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=SCTP_UNORDERED, snd_ppid=htonl(2), snd_context=2}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=SCTP_UNORDERED, snd_ppid=htonl(2), snd_context=2}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=SCTP_UNORDERED, snd_ppid=htonl(2), snd_context=...}, [16]) = 0
 +0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=SCTP_UNORDERED, snd_ppid=..., snd_context=2}, [16]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=..., snd_ppid=2, snd_context=2}, [16]) = 0
-+0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=..., snd_flags=SCTP_UNORDERED, snd_ppid=2, snd_context=2}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0, snd_flags=..., snd_ppid=htonl(2), snd_context=2}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=..., snd_flags=SCTP_UNORDERED, snd_ppid=htonl(2), snd_context=2}, [16]) = 0
 
 +0 setsockopt(3, IPPROTO_SCTP, SCTP_ADAPTATION_LAYER, {ssb_adaptation_ind=2}, 4) = 0
 +0 getsockopt(3, IPPROTO_SCTP, SCTP_ADAPTATION_LAYER, {ssb_adaptation_ind=2}, [4]) = 0
 
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=1, sctp_address_event=0, sctp_send_failure_event=1,
+sctp_peer_error_event=0, sctp_shutdown_event=1, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0,
+sctp_sender_dry_event=0}, 11) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=1, sctp_address_event=0, sctp_send_failure_event=1,
+sctp_peer_error_event=0, sctp_shutdown_event=1, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0,
+sctp_sender_dry_event=0}, [11]) = 0
+
 +0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt b/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt
index 4fab681e..af811a60 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/sctp_socket_options.pkt
@@ -45,4 +45,8 @@
 +0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
 spp_hbinterval=30000, spp_pathmaxrxt=100, spp_pathmtu=1468, spp_flags=0, spp_ipv6_flowlabel=0, spp_dscp=0}, 152) = 0
 
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=0, sctp_address_event=0, sctp_send_failure_event=0,
+sctp_peer_error_event=0, sctp_shutdown_event=0, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0,
+sctp_sender_dry_event=0}, 11) = 0
+
 +0 close(3) = 0
-- 
GitLab