diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 52de7a51a2351413decdee45f1edda28568f3394..0f90f5503c64714f34f42df6e64089fb3f462b36 100644
--- a/gtests/net/packetdrill/run_system_call.c
+++ b/gtests/net/packetdrill/run_system_call.c
@@ -2884,18 +2884,9 @@ static int check_sctp_sndinfo(struct sctp_sndinfo_expr *expr,
 	if (check_u16_expr(expr->snd_flags, sctp_sndinfo->snd_flags,
 			   "sctp_sndinfo.snd_flags", error))
 		return STATUS_ERR;
-	if (expr->snd_ppid->type != EXPR_ELLIPSIS) {
-		u32 snd_ppid;
-
-		if (get_u32(expr->snd_ppid, &snd_ppid, error)) {
-			return STATUS_ERR;
-		}
-		if (sctp_sndinfo->snd_ppid != snd_ppid) {
-			asprintf(error, "sctp_sndinfo.snd_ppid: expected: %u actual: %u",
-				 snd_ppid, sctp_sndinfo->snd_ppid);
-			return STATUS_ERR;
-		}
-	}
+	if (check_u32_hton_expr(expr->snd_ppid, sctp_sndinfo->snd_ppid,
+			   "sctp_sndinfo.snd_ppid", error))
+		return STATUS_ERR;
 	if (check_u32_expr(expr->snd_context, sctp_sndinfo->snd_context,
 			   "sctp_sndinfo.snd_context", error))
 		return STATUS_ERR;
@@ -3790,8 +3781,8 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
 		if (parse_expression_to_sctp_sndrcvinfo(val_expression, &sndrcvinfo, true, error)) {
 			return STATUS_ERR;
 		}
-		optval = &sndrcvinfo;	
-		break;	
+		optval = &sndrcvinfo;
+		break;
 #endif
 #ifdef SCTP_DEFAULT_SNDINFO
 	case EXPR_SCTP_SNDINFO:
@@ -4254,7 +4245,7 @@ static int syscall_sctp_recvmsg(struct state *state, struct syscall_spec *syscal
 				char **error)
 {
 #if defined(__FreeBSD__) || defined(linux)
-	int script_fd, live_fd, live_msg_flags, result;
+	int script_fd, live_fd, live_msg_flags = 0, result;
 	void *msg;
 	u32 len;
 	struct sockaddr live_from;
@@ -4288,21 +4279,14 @@ static int syscall_sctp_recvmsg(struct state *state, struct syscall_spec *syscal
 	}
 
 	script_from_expr = get_arg(args, 3, error);
-	if (check_sockaddr(script_from_expr, &live_from, error))
+	if (check_sockaddr(script_from_expr, &live_from, error)) {
 		return STATUS_ERR;
-
+	}
 	script_fromlen_expr = get_arg(args, 4, error);
-	if (script_fromlen_expr->type != EXPR_ELLIPSIS) {
-		int script_fromlen;
-		if (get_s32(script_fromlen_expr, &script_fromlen, error))
-			return STATUS_ERR;
-		if (script_fromlen != live_fromlen) {
-			asprintf(error, "sctp_recvmsg fromlen: expected: %d actual: %d",
-				 script_fromlen, live_fromlen);
-			return STATUS_ERR;
-		}
+	if (check_socklen_t_expr(script_fromlen_expr, live_fromlen,
+				 "sctp_recvmsg fromlen", error)) {
+		return STATUS_ERR;
 	}
-
 	script_sinfo_expr = get_arg(args, 5, error);
 	if (script_sinfo_expr->type != EXPR_ELLIPSIS) {
 		if (check_sctp_sndrcvinfo(script_sinfo_expr->value.sctp_sndrcvinfo, &live_sinfo, error)) {
@@ -4310,16 +4294,11 @@ static int syscall_sctp_recvmsg(struct state *state, struct syscall_spec *syscal
 		}
 	}
 	script_msg_flags_expr = get_arg(args, 6, error);
-	if (script_msg_flags_expr->type != EXPR_ELLIPSIS) {
-		int script_msg_flags;
-		if (get_s32(script_msg_flags_expr, &script_msg_flags, error))
-			return STATUS_ERR;
-		if (script_msg_flags != live_msg_flags) {
-			asprintf(error, "sctp_recvmsg msg_flags: expected: %d actual: %d",
-				 script_msg_flags, live_msg_flags);
-			return STATUS_ERR;
-		}
+	if (check_s32_expr(script_msg_flags_expr, live_msg_flags,
+			   "sctp_recvmsg msg_flags", error)) {
+		return STATUS_ERR;
 	}
+
 	return STATUS_OK;
 #else
 	asprintf(error, "sctp_recvmsg is not supported");
diff --git a/gtests/net/packetdrill/symbols_linux.c b/gtests/net/packetdrill/symbols_linux.c
index 3f7deb541fb5344433a242a706ae2e14ab70fe34..64e2e0f96ffa8b963aa8bd84ec75e29b78c3d99d 100644
--- a/gtests/net/packetdrill/symbols_linux.c
+++ b/gtests/net/packetdrill/symbols_linux.c
@@ -104,9 +104,25 @@ struct int_symbol platform_symbols_table[] = {
 	{ SCTP_ASSOCINFO,                   "SCTP_ASSOCINFO"                  },
 	{ SCTP_INITMSG,                     "SCTP_INITMSG"                    },
 	{ SCTP_NODELAY,                     "SCTP_NODELAY"                    },
+	{ SCTP_AUTOCLOSE,                   "SCTP_AUTOCLOSE"                  },
+	{ SCTP_PRIMARY_ADDR,                "SCTP_PRIMARY_ADDR"               },
+	{ SCTP_I_WANT_MAPPED_V4_ADDR,       "SCTP_I_WANT_MAPPED_V4_ADDR"      },
+	{ SCTP_DISABLE_FRAGMENTS,           "SCTP_DISABLE_FRAGMENTS"          },
+	{ SCTP_DEFAULT_SEND_PARAM,          "SCTP_DEFAULT_SEND_PARAM"         },
 	{ SCTP_MAXSEG,                      "SCTP_MAXSEG"                     },
+	{ SCTP_HMAC_IDENT,                  "SCTP_HMAC_IDENT"                 },
+	{ SCTP_AUTH_ACTIVE_KEY,             "SCTP_AUTH_ACTIVE_KEY"            },
 	{ SCTP_DELAYED_SACK,                "SCTP_DELAYED_SACK"               },
+	{ SCTP_PARTIAL_DELIVERY_POINT,      "SCTP_PARTIAL_DELIVERY_POINT"     },
 	{ SCTP_MAX_BURST,                   "SCTP_MAX_BURST"                  },
+	{ SCTP_CONTEXT,                     "SCTP_CONTEXT"                    },
+	{ SCTP_PEER_AUTH_CHUNKS,            "SCTP_PEER_AUTH_CHUNKS"           },
+	{ SCTP_LOCAL_AUTH_CHUNKS,           "SCTP_LOCAL_AUTH_CHUNKS"          },
+	{ SCTP_GET_ASSOC_NUMBER,            "SCTP_GET_ASSOC_NUMBER"           },
+	{ SCTP_SET_PEER_PRIMARY_ADDR,       "SCTP_SET_PEER_PRIMARY_ADDR"      },
+	{ SCTP_AUTH_CHUNK,                  "SCTP_AUTH_CHUNK"                 },
+	{ SCTP_AUTH_KEY,                    "SCTP_AUTH_KEY"                   },
+	{ SCTP_AUTH_DELETE_KEY,             "SCTP_AUTH_DELETE_KEY"            },
 #if 0
 	{ SCTP_DEFAULT_SNDINFO,             "SCTP_DEFAULT_SNDINFO"            },
 #endif
@@ -204,6 +220,36 @@ struct int_symbol platform_symbols_table[] = {
         { SCTP_SENDALL,                     "SCTP_SENDALL"                    },
         { SCTP_EOR,                         "SCTP_EOR"                        },
 #endif
+//sctp auth hmac ident
+	{ SCTP_AUTH_HMAC_ID_SHA1,           "SCTP_AUTH_HMAC_ID_SHA1"          },
+	{ SCTP_AUTH_HMAC_ID_SHA1,           "SCTP_AUTH_HMAC_ID_SHA256"        },
+//cmsgs type for sctp
+	{ SCTP_INIT,                        "SCTP_INIT"                       },
+	{ SCTP_SNDRCV,                      "SCTP_SNDRCV"                     },
+//flags for sctp_assoc_change
+	{ SCTP_COMM_UP,                     "SCTP_COMM_UP"                    },
+	{ SCTP_COMM_LOST,                   "SCTP_COMM_LOST"                  },
+	{ SCTP_RESTART,                     "SCTP_RESTART"                    },
+	{ SCTP_SHUTDOWN_COMP,               "SCTP_SHUTDOWN_COMP"              },
+	{ SCTP_CANT_STR_ASSOC,              "SCTP_CANT_STR_ASSOC"             },
+#if 0
+	{ SCTP_ASSOC_SUPPORTS_PR,           "SCTP_ASSOC_SUPPORTS_PR"          },
+	{ SCTP_ASSOC_SUPPORTS_AUTH,         "SCTP_ASSOC_SUPPORTS_AUTH"        },
+	{ SCTP_ASSOC_SUPPORTS_ASCONF,       "SCTP_ASSOC_SUPPORTS_ASCONF"      },
+	{ SCTP_ASSOC_SUPPORTS_MULTIBUF,     "SCTP_ASSOC_SUPPORTS_MULTIBUF"    },
+#endif
+//flags for sctp_send_failed
+	{ SCTP_DATA_UNSENT,                 "SCTP_DATA_UNSENT"                },
+	{ SCTP_DATA_SENT,                   "SCTP_DATA_SENT"                  },
+//flags for sctp_peer_addr_change
+	{ SCTP_ADDR_AVAILABLE,              "SCTP_ADDR_AVAILABLE"             },
+	{ SCTP_ADDR_UNREACHABLE,            "SCTP_ADDR_UNREACHABLE"           },
+	{ SCTP_ADDR_REMOVED,                "SCTP_ADDR_REMOVED"               },
+	{ SCTP_ADDR_ADDED,                  "SCTP_ADDR_ADDED"                 },
+	{ SCTP_ADDR_MADE_PRIM,              "SCTP_ADDR_MADE_PRIM"             },
+//flags for sctp_partial_delivery_event
+	{ SCTP_PARTIAL_DELIVERY_ABORTED,    "SCTP_PARTIAL_DELIVERY_ABORTED"   },
+
 	{ SCTP_BINDX_ADD_ADDR,              "SCTP_BINDX_ADD_ADDR"             },
 	{ SCTP_BINDX_REM_ADDR,              "SCTP_BINDX_REM_ADDR"             },
         { SCTP_SACK_IMMEDIATELY,            "SCTP_SACK_IMMEDIATELY"           },
@@ -301,6 +347,7 @@ struct int_symbol platform_symbols_table[] = {
 	{ MSG_MORE,                         "MSG_MORE"                        },
 	{ MSG_CMSG_CLOEXEC,                 "MSG_CMSG_CLOEXEC"                },
 	{ MSG_FASTOPEN,                     "MSG_FASTOPEN"                    },
+	{ MSG_NOTIFICATION,                 "MSG_NOTIFICATION"                },
 
 #ifdef SIOCINQ
 	{ SIOCINQ,                          "SIOCINQ"                         },
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt
index d92e3f7ac26bde06922d8f6e75af91759c7e045a..bf9c337fc31d7818c82676ac806f687fc4dfdd3e 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt
@@ -28,7 +28,8 @@
 				   cmsg_type=SCTP_DSTADDRV4,
 				   cmsg_data={sa_family=AF_INET,
 					      sin_port=htons(8080),
-					      sin_addr=inet_addr("192.0.2.1")}}], msg_flags=0}, 0) = 1000
+					      sin_addr=inet_addr("192.0.2.1")}}],
+		 msg_flags=0}, 0) = 1000
 
 *    > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
 +0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt
index 1b0fbf0fbe6b0f38cb633bf67e652ab638084fc2..5ad5fcdc6287d097f3a29235d03fa33ce0257678 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt
@@ -1,3 +1,4 @@
+	--ip_version=ipv6
 0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
 +0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
 +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_nodelay.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_nodelay.pkt
index 0745ab4b59b6c24ba55ae4853e023ce977292589..3bcaeb635def94163aa9f593606fc857a923afbc 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_nodelay.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_nodelay.pkt
@@ -10,8 +10,9 @@
 
 +0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
 
-+0 getsockopt(3, SOL_SOCKET, SCTP_NODELAY, [0], [4]) = 0
-+0 setsockopt(3, SOL_SOCKET, SCTP_NODELAY, [1], 4) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_NODELAY, [1], 4) = 0
 +0 getsockopt(3, SOL_SOCKET, SCTP_NODELAY, [4], [4]) = 0
++0 setsockopt(3, SOL_SOCKET, SCTP_NODELAY, [0], 4) = 0
++0 getsockopt(3, SOL_SOCKET, SCTP_NODELAY, [0], [4]) = 0
 
 +0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_reuse_port.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_reuse_port.pkt
index 7f0849265f6b3272df860899682335de2c2b0fef..04e9728f883a7092fcda52a85d141400b67ba078 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_reuse_port.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_reuse_port.pkt
@@ -1,7 +1,6 @@
 0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
 +0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
 +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
-+0.0 bind(3, ..., ...) = 0
 
 +0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
 
diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt
index 554879b17acbc5504ea78c29dbef9c23f7ec236f..edfa41e0a87b34175803a673930d6c57a9aae12d 100644
--- a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt
@@ -1,3 +1,4 @@
+--tolerance_usecs=1000000
 0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
 +0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
 +0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..bf44947527a16a98c19550410182fff1011606e2
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg.pkt
@@ -0,0 +1,168 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//recvmsg(sd, msghdr, flags)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
+                {spp_assoc_id=0,
+		 spp_address=...,
+                 spp_hbinterval=0,
+                 spp_pathmaxrxt=8,
+                 spp_pathmtu=1468,
+                 spp_flags=SPP_HB_DISABLE,
+                 spp_ipv6_flowlabel=0,
+                 spp_dscp=0}, 152) = 0
+//base test
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=2, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(40)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=0,
+                                              rcv_flags=SCTP_UNORDERED,
+                                              rcv_ppid=htonl(0),
+                                              rcv_tsn=2,
+                                              rcv_cumtsn=2,
+                                              rcv_context=0,
+                                              rcv_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=3, sid=0, ssn=1, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=4, sid=0, ssn=2, ppid=1234]
+*    > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(28)=[{cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data={nxt_sid=0,
+                                              nxt_flags=SCTP_COMPLETE,
+                                              nxt_ppid=htonl(1234),
+                                              nxt_length=1000,
+                                              nxt_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=5, sid=0, ssn=0, ppid=9876]
+*    > sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(68)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=2,
+                                              rcv_flags=0,
+                                              rcv_ppid=htonl(1234),
+                                              rcv_tsn=4,
+                                              rcv_cumtsn=5,
+                                              rcv_context=0,
+                                              rcv_assoc_id=...}},
+                                  {cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data= {nxt_sid=0,
+                                               nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE,
+                                               nxt_ppid=htonl(9876),
+                                               nxt_length=1000,
+                                               nxt_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++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.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [0], 4) = 0
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_SNDRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=0,
+                                               sinfo_flags=SCTP_UNORDERED,
+                                               sinfo_ppid=htonl(9876),
+                                               sinfo_context=0,
+                                               sinfo_timetolive=0,
+                                               sinfo_tsn=5,
+                                               sinfo_cumtsn=5,
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=6, sid=0, ssn=3, ppid=9877]
+*    > sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_EXTRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=3,
+                                               sinfo_flags=0,
+                                               sinfo_ppid=htonl(9877),
+                                               sinfo_context=0,
+                                               sinfo_pr_value=0,
+                                               sinfo_tsn=6,
+                                               sinfo_cumtsn=6,
+                                               serinfo_next_flags=0,
+                                               serinfo_next_stream=0,
+                                               serinfo_next_aid=0,
+                                               serinfo_next_length=0,
+                                               serinfo_next_ppid=htonl(0),
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=7, sid=0, ssn=4, ppid=9878]
+*    > sctp: SACK[flgs=0, cum_tsn=7, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=8, sid=1, ssn=0, ppid=9879]
+*    > sctp: SACK[flgs=0, cum_tsn=8, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_EXTRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=4,
+                                               sinfo_flags=0,
+                                               sinfo_ppid=htonl(9878),
+                                               sinfo_context=0,
+                                               sinfo_pr_value=0,
+                                               sinfo_tsn=7,
+                                               sinfo_cumtsn=8,
+                                               serinfo_next_flags=SCTP_NEXT_MSG_AVAIL|SCTP_NEXT_MSG_ISCOMPLETE|SCTP_NEXT_MSG_IS_UNORDERED,
+                                               serinfo_next_stream=1,
+                                               serinfo_next_aid=...,
+                                               serinfo_next_length=1000,
+                                               serinfo_next_ppid=htonl(9879),
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_extrcv.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_extrcv.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..3609bc3178d1483ed66ca38296cf41326b284f91
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_extrcv.pkt
@@ -0,0 +1,108 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
+                {spp_assoc_id=0,
+		 spp_address=...,
+                 spp_hbinterval=0,
+                 spp_pathmaxrxt=8,
+                 spp_pathmtu=1468,
+                 spp_flags=SPP_HB_DISABLE,
+                 spp_ipv6_flowlabel=0,
+                 spp_dscp=0}, 152) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++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.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], 4) = 0
+
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=9877]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_EXTRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=0,
+                                               sinfo_flags=0,
+                                               sinfo_ppid=htonl(9877),
+                                               sinfo_context=0,
+                                               sinfo_pr_value=0,
+                                               sinfo_tsn=1,
+                                               sinfo_cumtsn=1,
+                                               serinfo_next_flags=0,
+                                               serinfo_next_stream=0,
+                                               serinfo_next_aid=0,
+                                               serinfo_next_length=0,
+                                               serinfo_next_ppid=htonl(0),
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=2, sid=0, ssn=1, ppid=9878]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=3, sid=1, ssn=0, ppid=9879]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_EXTRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=1,
+                                               sinfo_flags=0,
+                                               sinfo_ppid=htonl(9878),
+                                               sinfo_context=0,
+                                               sinfo_pr_value=0,
+                                               sinfo_tsn=2,
+                                               sinfo_cumtsn=3,
+                                               serinfo_next_flags=SCTP_NEXT_MSG_AVAIL|SCTP_NEXT_MSG_ISCOMPLETE|SCTP_NEXT_MSG_IS_UNORDERED,
+                                               serinfo_next_stream=1,
+                                               serinfo_next_aid=...,
+                                               serinfo_next_length=1000,
+                                               serinfo_next_ppid=htonl(9879),
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=4, sid=2, ssn=0, ppid=9880]
+*    > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_EXTRCV,
+                                    cmsg_data={sinfo_stream=1,
+                                               sinfo_ssn=0,
+                                               sinfo_flags=SCTP_UNORDERED,
+                                               sinfo_ppid=htonl(9879),
+                                               sinfo_context=0,
+                                               sinfo_pr_value=0,
+                                               sinfo_tsn=3,
+                                               sinfo_cumtsn=4,
+                                               serinfo_next_flags=SCTP_NEXT_MSG_AVAIL|SCTP_NEXT_MSG_ISCOMPLETE|SCTP_NEXT_MSG_IS_UNORDERED,
+                                               serinfo_next_stream=2,
+                                               serinfo_next_aid=...,
+                                               serinfo_next_length=1000,
+                                               serinfo_next_ppid=htonl(9880)}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_nxtinfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_nxtinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..aaea9f59ae4bc3ba1f7a105d6cc79ba0f69ed211
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_nxtinfo.pkt
@@ -0,0 +1,93 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//recvmsg(sd, msghdr, flags)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
+                {spp_assoc_id=0,
+		 spp_address=...,
+                 spp_hbinterval=0,
+                 spp_pathmaxrxt=8,
+                 spp_pathmtu=1468,
+                 spp_flags=SPP_HB_DISABLE,
+                 spp_ipv6_flowlabel=0,
+                 spp_dscp=0}, 152) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=2, sid=0, ssn=1, ppid=1234]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(28)=[{cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data={nxt_sid=0,
+                                              nxt_flags=SCTP_COMPLETE,
+                                              nxt_ppid=htonl(1234),
+                                              nxt_length=1000,
+                                              nxt_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=3, sid=0, ssn=0, ppid=9876]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(68)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=1,
+                                              rcv_flags=0,
+                                              rcv_ppid=htonl(1234),
+                                              rcv_tsn=2,
+                                              rcv_cumtsn=3,
+                                              rcv_context=0,
+					      rcv_assoc_id=3}},
+                                  {cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data= {nxt_sid=0,
+                                               nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE,
+                                               nxt_ppid=htonl(9876),
+                                               nxt_length=1000,
+					       nxt_assoc_id=3}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=4, sid=0, ssn=0, ppid=9876]
+*    > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(68)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=0,
+                                              rcv_flags=SCTP_UNORDERED,
+                                              rcv_ppid=htonl(9876),
+                                              rcv_tsn=3,
+                                              rcv_cumtsn=4,
+                                              rcv_context=0}},
+                                  {cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data= {nxt_sid=0,
+                                               nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE,
+                                               nxt_ppid=htonl(9876),
+                                               nxt_length=1000}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_rcvinfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_rcvinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..9d19a020045722901690e98a75f633cbd3979295
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_rcvinfo.pkt
@@ -0,0 +1,149 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//recvmsg(sd, msghdr, flags)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
+                {spp_assoc_id=0,
+		 spp_address=...,
+                 spp_hbinterval=0,
+                 spp_pathmaxrxt=8,
+                 spp_pathmtu=1468,
+                 spp_flags=SPP_HB_DISABLE,
+                 spp_ipv6_flowlabel=0,
+                 spp_dscp=0}, 152) = 0
+//base test
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=2, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(40)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=0,
+                                              rcv_flags=SCTP_UNORDERED,
+                                              rcv_ppid=htonl(0),
+                                              rcv_tsn=2,
+                                              rcv_cumtsn=2,
+                                              rcv_context=0,
+                                              rcv_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=3, sid=0, ssn=1, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=4, sid=0, ssn=2, ppid=1234]
+*    > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(28)=[{cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data={nxt_sid=0,
+                                              nxt_flags=SCTP_COMPLETE,
+                                              nxt_ppid=htonl(1234),
+                                              nxt_length=1000,
+                                              nxt_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=5, sid=0, ssn=0, ppid=9876]
+*    > sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(68)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=2,
+                                              rcv_flags=0,
+                                              rcv_ppid=htonl(1234),
+                                              rcv_tsn=4,
+                                              rcv_cumtsn=5,
+                                              rcv_context=0,
+                                              rcv_assoc_id=...}},
+                                  {cmsg_len=28,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_NXTINFO,
+                                   cmsg_data= {nxt_sid=0,
+                                               nxt_flags=SCTP_UNORDERED|SCTP_COMPLETE,
+                                               nxt_ppid=htonl(9876),
+                                               nxt_length=1000,
+                                               nxt_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++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.0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [0], 4) = 0
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_SNDRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=0,
+                                               sinfo_flags=SCTP_UNORDERED,
+                                               sinfo_ppid=htonl(9876),
+                                               sinfo_context=0,
+                                               sinfo_timetolive=0,
+                                               sinfo_tsn=5,
+                                               sinfo_cumtsn=5,
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], 4) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                               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.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=6, sid=0, ssn=0, ppid=9876]
+*    > sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(40)=[{cmsg_len=40,
+                                   cmsg_level=IPPROTO_SCTP,
+                                   cmsg_type=SCTP_RCVINFO,
+                                   cmsg_data={rcv_sid=0,
+                                              rcv_ssn=0,
+                                              rcv_flags=SCTP_UNORDERED,
+                                              rcv_ppid=htonl(9876),
+                                              rcv_tsn=6,
+                                              rcv_cumtsn=6,
+                                              rcv_context=0}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_sndrcv.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_sndrcv.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..3e1c7fc76ade256d3abffece9dd5def28b48a93f
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/recvmsg_sctp_sndrcv.pkt
@@ -0,0 +1,89 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//recvmsg(sd, msghdr, flags)
+
++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.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS,
+                {spp_assoc_id=0,
+		 spp_address=...,
+                 spp_hbinterval=0,
+                 spp_pathmaxrxt=8,
+                 spp_pathmtu=1468,
+                 spp_flags=SPP_HB_DISABLE,
+                 spp_ipv6_flowlabel=0,
+                 spp_dscp=0}, 152) = 0
+
++0.0 < sctp: DATA[flgs=IBE, len=1016, tsn=1, sid=0, ssn=0, ppid=9877]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_SNDRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=0,
+                                               sinfo_flags=0,
+                                               sinfo_ppid=htonl(9877),
+                                               sinfo_context=0,
+                                               sinfo_timetolive=0,
+                                               sinfo_tsn=1,
+                                               sinfo_cumtsn=1,
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=2, sid=0, ssn=1, ppid=9878]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_SNDRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=1,
+                                               sinfo_flags=SCTP_UNORDERED,
+                                               sinfo_ppid=htonl(9878),
+                                               sinfo_context=0,
+                                               sinfo_timetolive=0,
+                                               sinfo_tsn=2,
+                                               sinfo_cumtsn=2,
+                                               sinfo_assoc_id=...}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
+
++0.0 < sctp: DATA[flgs=IUBE, len=1016, tsn=3, sid=0, ssn=2, ppid=9879]
+*    > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=..., gaps=[], dups=[]]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+                 msg_control(140)=[{cmsg_len=140,
+                                    cmsg_level=IPPROTO_SCTP,
+                                    cmsg_type=SCTP_SNDRCV,
+                                    cmsg_data={sinfo_stream=0,
+                                               sinfo_ssn=2,
+                                               sinfo_flags=SCTP_UNORDERED,
+                                               sinfo_ppid=htonl(9879),
+                                               sinfo_context=0,
+                                               sinfo_timetolive=0,
+                                               sinfo_tsn=3,
+                                               sinfo_cumtsn=3}}],
+                 msg_flags=MSG_EOR}, 0) = 1000
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..7dec990876a50acf1949cf4c9a10ea43c7510f4b
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg.pkt
@@ -0,0 +1,154 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(0)=[],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
+//base test
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(28)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(3),
+					      snd_context=2,
+					      snd_assoc_id=0}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=0, ppid=3]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
+// test with 2 cmsg
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(44)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(4),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=2, ssn=1, ppid=4]
++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
+
+// test with 2 cmsg
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(64)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(5),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}},
+				  {cmsg_len=18,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_PRINFO,
+				   cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=2, ssn=2, ppid=5]
++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]]
+
+// test with 4 cmsg
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(80)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(6),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}},
+				  {cmsg_len=18,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_PRINFO,
+				   cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}},
+			          {cmsg_len=14,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_AUTHINFO,
+				   cmsg_data={auth_keynumber=123}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=5, sid=2, ssn=3, ppid=6]
++0.0 < sctp: SACK[flgs=0, cum_tsn=5, a_rwnd=1500, gaps=[], dups=[]]
+
+//test for sndrcvinfo
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(168)=[{cmsg_len=28,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDINFO,
+				    cmsg_data={snd_sid=2,
+					       snd_flags=0,
+					       snd_ppid=htonl(6),
+					       snd_context=2,
+					       snd_assoc_id=0}},
+				   {cmsg_len=140,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDRCV,
+				    cmsg_data={sinfo_stream=3,
+					       sinfo_ssn=3,
+					       sinfo_flags=0,
+					       sinfo_ppid=htonl(7),
+					       sinfo_context=0,
+					       sinfo_timetolive=0,
+					       sinfo_tsn=6,
+					       sinfo_cumtsn=6,
+					       sinfo_assoc_id=3}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=6, sid=3, ssn=0, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=6, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_authinfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_authinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..73287130a3a050b27916cf1e786abff955ab266d
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_authinfo.pkt
@@ -0,0 +1,58 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(44)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(6),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+			          {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_AUTHINFO,
+				   cmsg_data={auth_keynumber=123}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=6]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(16)=[{cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_AUTHINFO,
+				   cmsg_data={auth_keynumber=123}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv4.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv4.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c298b1777c8c2c2a304873edaf5fc9431cb56b22
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv4.pkt
@@ -0,0 +1,62 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(16)=[{cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(44)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(5),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=0, ppid=5]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv6.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv6.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..60530f1f9ca496e6f85282a9c7123cd06257ea06
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv6.pkt
@@ -0,0 +1,62 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET6,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("2001:DB8::1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(16)=[{cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV6,
+				   cmsg_data={sa_family=AF_INET6,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("2001:DB8::1")}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(44)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(5),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV6,
+				   cmsg_data={sa_family=AF_INET6,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("2001:DB8::1")}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=2, ssn=0, ppid=5]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..ce84ba4a1b4a8943bc453d09b308adb9d807f0c6
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt
@@ -0,0 +1,23 @@
+--tolerance_usecs=100000
+
+0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(20)=[{cmsg_len=20,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_INIT,
+				   cmsg_data={sinit_num_ostreams=1,
+					      sinit_max_instreams=1,
+					      sinit_max_attempts=1,
+					      sinit_max_init_timeo=0}}],
+		 msg_flags=0}, 0) = 1000
+
+*    > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
+*    > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]; DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=1234]
++0.1 < sctp: COOKIE_ACK[flgs=0]; SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_init_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_init_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..d92e3f7ac26bde06922d8f6e75af91759c7e045a
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_init_2.pkt
@@ -0,0 +1,36 @@
+--tolerance_usecs=100000
+
+0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(64)=[{cmsg_len=20,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_INIT,
+				   cmsg_data={sinit_num_ostreams=1,
+					      sinit_max_instreams=1,
+					      sinit_max_attempts=1,
+					      sinit_max_init_timeo=100}},
+				  {cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(1234),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=16,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_DSTADDRV4,
+				   cmsg_data={sa_family=AF_INET,
+					      sin_port=htons(8080),
+					      sin_addr=inet_addr("192.0.2.1")}}], msg_flags=0}, 0) = 1000
+
+*    > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
+*    > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]; DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=1234]
++0.1 < sctp: COOKIE_ACK[flgs=0]; SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_prinfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_prinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c4b32245c416cf9deea5da37838636cb601d4dc3
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_prinfo.pkt
@@ -0,0 +1,58 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(48)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=2,
+					      snd_flags=0,
+					      snd_ppid=htonl(6),
+					      snd_context=2,
+					      snd_assoc_id=0}},
+				  {cmsg_len=20,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_PRINFO,
+				   cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=2, ssn=0, ppid=6]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(20)=[{cmsg_len=20,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_PRINFO,
+				   cmsg_data={pr_policy=SCTP_PR_SCTP_TTL, pr_value=30}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b773b1b2b93f64f5e5013adabf46c4614560a4e1
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt
@@ -0,0 +1,87 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(28)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=1,
+					      snd_flags=0,
+					      snd_ppid=htonl(3),
+					      snd_context=2,
+					      snd_assoc_id=0}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=1, ssn=0, ppid=3]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(28)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=1,
+					      snd_flags=0,
+					      snd_ppid=htonl(3),
+					      snd_context=2,
+					      snd_assoc_id=...}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=1, ssn=1, ppid=3]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(28)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=3,
+					      snd_flags=0,
+					      snd_ppid=htonl(32),
+					      snd_context=2,
+					      snd_assoc_id=...}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=3, ssn=0, ppid=32]
++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(28)=[{cmsg_len=28,
+				   cmsg_level=IPPROTO_SCTP,
+				   cmsg_type=SCTP_SNDINFO,
+				   cmsg_data={snd_sid=4,
+					      snd_flags=0,
+					      snd_ppid=htonl(33),
+					      snd_context=2}}],
+		 msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=4, ssn=0, ppid=33]
++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]]
+
+
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..4485ccf4c78d65f6ef91b9977becefec768bef37
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt
@@ -0,0 +1,124 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+//sendmsg(sd, msghdr, flags)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(140)=[{cmsg_len=140,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDRCV,
+				    cmsg_data={sinfo_stream=3,
+					       sinfo_ssn=0,
+					       sinfo_flags=SCTP_SENDALL,
+					       sinfo_ppid=htonl(7),
+					       sinfo_context=0,
+					       sinfo_timetolive=0,
+					       sinfo_tsn=1,
+					       sinfo_cumtsn=1,
+					       sinfo_assoc_id=3}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
+//test for sndrcvinfo
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(168)=[{cmsg_len=28,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDINFO,
+				    cmsg_data={snd_sid=2,
+					       snd_flags=0,
+					       snd_ppid=htonl(6),
+					       snd_context=2,
+					       snd_assoc_id=0}},
+				   {cmsg_len=140,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDRCV,
+				    cmsg_data={sinfo_stream=3,
+					       sinfo_ssn=3,
+					       sinfo_flags=0,
+					       sinfo_ppid=htonl(7),
+					       sinfo_context=0,
+					       sinfo_timetolive=0,
+					       sinfo_tsn=3,
+					       sinfo_cumtsn=3,
+					       sinfo_assoc_id=3}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=3, ssn=1, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(168)=[{cmsg_len=28,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDINFO,
+				    cmsg_data={snd_sid=2,
+					       snd_flags=0,
+					       snd_ppid=htonl(6),
+					       snd_context=2,
+					       snd_assoc_id=0}},
+				   {cmsg_len=140,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDRCV,
+				    cmsg_data={sinfo_stream=3,
+					       sinfo_ssn=3,
+					       sinfo_flags=0,
+					       sinfo_ppid=htonl(7),
+					       sinfo_context=0,
+					       sinfo_timetolive=0,
+					       sinfo_tsn=...,
+					       sinfo_cumtsn=...,
+					       sinfo_assoc_id=3}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=3, sid=3, ssn=2, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 sendmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
+		 msg_control(168)=[{cmsg_len=28,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDINFO,
+				    cmsg_data={snd_sid=2,
+					       snd_flags=0,
+					       snd_ppid=htonl(6),
+					       snd_context=2}},
+				   {cmsg_len=140,
+				    cmsg_level=IPPROTO_SCTP,
+				    cmsg_type=SCTP_SNDRCV,
+				    cmsg_data={sinfo_stream=3,
+					       sinfo_ssn=3,
+					       sinfo_flags=0,
+					       sinfo_ppid=htonl(7),
+					       sinfo_context=0,
+					       sinfo_timetolive=0,
+					       sinfo_tsn=...,
+					       sinfo_cumtsn=...}}],
+		msg_flags=0}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=4, sid=3, ssn=3, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_adaptation_layer.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_adaptation_layer.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..145d3e6c49ac508a4bd85dae9853934b1b2460a1
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_adaptation_layer.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ADAPTATION_LAYER, {ssb_adaptation_ind=...}, [4]) = 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 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_associnfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_associnfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..8e7a17a3c6898a452acd91b57601ce54c7f39782
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_associnfo.pkt
@@ -0,0 +1,55 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=...,
+						sasoc_asocmaxrxt=5,
+						sasoc_number_peer_destinations=3,
+						sasoc_peer_rwnd=1800,
+						sasoc_local_rwnd=2000,
+						sasoc_cookie_life=40000}, 20) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=...,
+						sasoc_asocmaxrxt=5,
+						sasoc_number_peer_destinations=1,
+						sasoc_peer_rwnd=1500,
+						sasoc_local_rwnd=81920,
+						sasoc_cookie_life=40000}, [20]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=...,
+						sasoc_asocmaxrxt=...,
+						sasoc_number_peer_destinations=...,
+						sasoc_peer_rwnd=1500,
+						sasoc_local_rwnd=...,
+						sasoc_cookie_life=40000}, [20]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=...,
+						sasoc_asocmaxrxt=5,
+						sasoc_number_peer_destinations=1,
+						sasoc_peer_rwnd=1500,
+						sasoc_local_rwnd=...,
+						sasoc_cookie_life=40000}, [20]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_assoc_id=...,
+						sasoc_asocmaxrxt=...,
+						sasoc_number_peer_destinations=...,
+						sasoc_peer_rwnd=...,
+						sasoc_local_rwnd=...,
+						sasoc_cookie_life=...}, [20]) = 0
+//now test structure without associd
++0 setsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5,
+						sasoc_number_peer_destinations=2,
+						sasoc_peer_rwnd=1800,
+						sasoc_local_rwnd=2000,
+						sasoc_cookie_life=40000}, 20) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_ASSOCINFO, {sasoc_asocmaxrxt=5,
+						sasoc_number_peer_destinations=1,
+						sasoc_peer_rwnd=1500,
+						sasoc_local_rwnd=81920,
+						sasoc_cookie_life=40000}, [20]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_active_key.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_active_key.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..f7a3996dd0273c4b3e692bd1ff98b00772fe504a
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_active_key.pkt
@@ -0,0 +1,18 @@
+	--tolerance_usecs=100000
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, {scact_assoc_id=0, scact_keynumber=0}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, {scact_assoc_id=0, scact_keynumber=0}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, {scact_assoc_id=0, scact_keynumber=0}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..05e7fdd02c10db81693749936ce7d9327a9558a7
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_chunk.pkt
@@ -0,0 +1,18 @@
+	--tolerance_usecs=100000
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=0}, 1) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=1}, 1) = -1
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_CHUNK, {sauth_chunk=4}, 1) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_deactivate_key.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_deactivate_key.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..06103c6ba81797f4aeee310542a2dd9b50bc4392
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_deactivate_key.pkt
@@ -0,0 +1,16 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, {scact_assoc_id=..., scact_keynumber=0}, 6) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY, {scact_keynumber=0}, 6) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_delete_key.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_delete_key.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..86d0fa1f4d1a62ae993270d175c603c88ab91280
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_delete_key.pkt
@@ -0,0 +1,16 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, {scact_assoc_id=..., scact_keynumber=0}, 8) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, {scact_keynumber=0}, 8) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_key.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_key.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..58b63eccc76dec085f0d9740fcb2d925a622b4dd
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auth_key.pkt
@@ -0,0 +1,16 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_KEY, {sca_assoc_id=..., sca_keynumber=123, sca_keylength=2, sca_key=[0x00, 0x00]}, 10) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTH_KEY, {sca_keynumber=123, sca_keylength=2, sca_key=[0x00, 0x00]}, 10) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auto_asconf.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auto_asconf.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..d6b3c8481dcd4638c9594c628c928d509e5ffe7a
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_auto_asconf.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTO_ASCONF, [1], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTO_ASCONF, [0], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTO_ASCONF, [0], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_autoclose.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_autoclose.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b7e923431729907fc26ee89e5fd21f3640385148
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_autoclose.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTOCLOSE, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_AUTOCLOSE, [1], 4) = -1
++0 getsockopt(3, IPPROTO_SCTP, SCTP_AUTOCLOSE, [0], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_context.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_context.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..f5f0cd67804565fa0ef5f03911b8e3177c367f89
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_context.pkt
@@ -0,0 +1,19 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_id=0, assoc_value=1100}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_id=..., assoc_value=0}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_value=1200}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_CONTEXT, {assoc_value=1200}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_default_prinfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_default_prinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..86b3b89b0add8207034a0c488c786fc20465094e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_default_prinfo.pkt
@@ -0,0 +1,28 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL,
+						     pr_value=5,
+						     pr_assoc_id=3}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL,
+						     pr_value=5,
+						     pr_assoc_id=3}, [12]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL,
+						     pr_value=5,
+						     pr_assoc_id=...}, [12]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL,
+						     pr_value=5}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_PRINFO, {pr_policy=SCTP_PR_SCTP_TTL,
+						     pr_value=5}, [12]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_default_send_param.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_default_send_param.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..a5d50dc29107cd7bd2b2ed12f618ad83a650fb52
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_default_send_param.pkt
@@ -0,0 +1,62 @@
+	--tolerance_usecs=100000
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0,
+							 sinfo_ssn=2071,
+							 sinfo_flags=0,
+							 sinfo_ppid=htonl(0),
+							 sinfo_context=0,
+							 sinfo_timetolive=0,
+							 sinfo_tsn=0,
+							 sinfo_cumtsn=0,
+							 sinfo_assoc_id=0}, [32]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0,
+							 sinfo_ssn=0,
+							 sinfo_flags=0,
+							 sinfo_ppid=htonl(123),
+							 sinfo_context=0,
+							 sinfo_timetolive=0,
+							 sinfo_tsn=2,
+							 sinfo_cumtsn=1,
+							 sinfo_assoc_id=3}, 32) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0,
+							 sinfo_ssn=2071,
+							 sinfo_flags=0,
+							 sinfo_ppid=htonl(123),
+							 sinfo_context=0,
+							 sinfo_timetolive=0,
+							 sinfo_tsn=0,
+							 sinfo_cumtsn=0,
+							 sinfo_assoc_id=0}, [32]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0,
+							 sinfo_ssn=2071,
+							 sinfo_flags=0,
+							 sinfo_ppid=htonl(123),
+							 sinfo_context=0,
+							 sinfo_timetolive=0,
+							 sinfo_tsn=0,
+							 sinfo_cumtsn=0}, 32) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SEND_PARAM, {sinfo_stream=0,
+							 sinfo_ssn=2071,
+							 sinfo_flags=0,
+							 sinfo_ppid=htonl(123),
+							 sinfo_context=0,
+							 sinfo_timetolive=0,
+							 sinfo_tsn=0,
+							 sinfo_cumtsn=0}, [32]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_default_sndinfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_default_sndinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..aa7732ca66ab0b8385575c6df0150a718d94c6d1
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_default_sndinfo.pkt
@@ -0,0 +1,54 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=0,
+						      snd_ppid=htonl(1),
+						      snd_context=1,
+						      snd_assoc_id=0}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=0,
+						      snd_ppid=htonl(1),
+						      snd_context=1,
+						      snd_assoc_id=0}, [16]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=SCTP_UNORDERED,
+						      snd_ppid=htonl(2),
+						      snd_context=2,
+						      snd_assoc_id=0}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=SCTP_UNORDERED,
+						      snd_ppid=htonl(2),
+						      snd_context=2,
+						      snd_assoc_id=...}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=SCTP_UNORDERED,
+						      snd_ppid=htonl(2),
+						      snd_context=...,
+						      snd_assoc_id=...}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=SCTP_UNORDERED,
+						      snd_ppid=...,
+						      snd_context=2,
+						      snd_assoc_id=...}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=0,
+						      snd_flags=...,
+						      snd_ppid=htonl(2),
+						      snd_context=2,
+						      snd_assoc_id=...}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DEFAULT_SNDINFO, {snd_sid=...,
+						      snd_flags=SCTP_UNORDERED,
+						      snd_ppid=htonl(2),
+						      snd_context=2,
+						      snd_assoc_id=...}, [16]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_delayed_sack.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_delayed_sack.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..db97982ef38db9bf444efb90388f6e401d46518c
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_delayed_sack.pkt
@@ -0,0 +1,24 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0,   sack_delay=400, sack_freq=2}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=0,   sack_delay=400, sack_freq=2}, [12]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=400, sack_freq=2}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=400, sack_freq=2}, [12]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=..., sack_freq=2}, [12]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_assoc_id=..., sack_delay=400, sack_freq=...}, [12]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=400, sack_freq=2}, 12) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DELAYED_SACK, {sack_delay=400, sack_freq=2}, [12]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_disable_fragments.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_disable_fragments.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..5498560b078b643fe0d8f1d2320d8c7aef4d266e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_disable_fragments.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_DISABLE_FRAGMENTS, [1], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_event.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..d817e4150f47ab2084c1e652eb89515c85f55eba
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_event.pkt
@@ -0,0 +1,20 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_events.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_events.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..8cbd363c0fa211fa8f627e2310b32c058dcf7c78
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_events.pkt
@@ -0,0 +1,48 @@
+	--tolerance_usecs=1000000
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+					     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}, [10]) = 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=1,
+					     sctp_partial_delivery_event=0,
+					     sctp_adaptation_layer_event=0,
+					     sctp_authentication_event=0,
+					     sctp_sender_dry_event=0}, 10) = 0
+
++0 getsockopt(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=1,
+					     sctp_partial_delivery_event=0,
+					     sctp_adaptation_layer_event=0,
+					     sctp_authentication_event=0,
+					     sctp_sender_dry_event=0}, [10]) = 0
+
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_explicit_eor.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_explicit_eor.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..e2cfe119980df381910c5701e16c76ac92470d39
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_explicit_eor.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EXPLICIT_EOR, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EXPLICIT_EOR, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EXPLICIT_EOR, [1], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_fragment_interleave.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_fragment_interleave.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b0e1ba1aa8cc6f9b1ba94dc509a9d6932b5f935a
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_fragment_interleave.pkt
@@ -0,0 +1,18 @@
+	--tolerance_usecs=100000
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE, [2], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_FRAGMENT_INTERLEAVE, [2], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_get_assoc_id_list.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_get_assoc_id_list.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..e09f741ffa43b803f4dfb217bd2ce7f9f5d040f6
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_get_assoc_id_list.pkt
@@ -0,0 +1,15 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_ASSOC_ID_LIST, {gaids_number_of_ids=1, gaids_assoc_id=[3]}, [8]) = -1
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_get_assoc_number.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_get_assoc_number.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..333a24f6474894861b8d92d3e350f10a6cea15af
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_get_assoc_number.pkt
@@ -0,0 +1,15 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_ASSOC_NUMBER, [0], [4]) = -1
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_get_peer_addr_info.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_get_peer_addr_info.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..4a2226b1e85e67dbfafa0fc12c0bcfc347349b74
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_get_peer_addr_info.pkt
@@ -0,0 +1,101 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4380,
+							 spinfo_srtt=111,
+							 spinfo_rto=3000,
+							 spinfo_mtu=1500}, 152) = -1 (ENOPROTOOPT)
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4380,
+							 spinfo_srtt=...,
+							 spinfo_rto=3000,
+							 spinfo_mtu=1500}, [152]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4380,
+							 spinfo_srtt=...,
+							 spinfo_rto=3000,
+							 spinfo_mtu=1500}, [152]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address=...,
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=...,
+							 spinfo_srtt=...,
+							 spinfo_rto=3000,
+							 spinfo_mtu=1500}, [152]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=...,
+							 spinfo_cwnd=...,
+							 spinfo_srtt=...,
+							 spinfo_rto=3000,
+							 spinfo_mtu=1500}, [152]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=...,
+							 spinfo_srtt=...,
+							 spinfo_rto=...,
+							 spinfo_mtu=1500}, [152]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_assoc_id=...,
+							 spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4380,
+							 spinfo_srtt=...,
+							 spinfo_rto=3000,
+							 spinfo_mtu=...}, [152]) = 0
+
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4380,
+							 spinfo_srtt=111,
+							 spinfo_rto=3000,
+							 spinfo_mtu=1500}, 152) = -1 (ENOPROTOOPT)
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET,
+									 sin_port=htons(8080),
+									 sin_addr=inet_addr("192.0.2.1")},
+							 spinfo_state=SCTP_ACTIVE,
+							 spinfo_cwnd=4380,
+							 spinfo_srtt=...,
+							 spinfo_rto=3000,
+							 spinfo_mtu=1500}, [152]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_hmac_ident.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_hmac_ident.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..2388a9c2ccc873ae78914deac891e092a7fbd1bf
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_hmac_ident.pkt
@@ -0,0 +1,16 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_HMAC_IDENT, {shmac_number_of_idents=2, shmac_idents=[SCTP_AUTH_HMAC_ID_SHA1, SCTP_AUTH_HMAC_ID_SHA256]}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_HMAC_IDENT, {shmac_number_of_idents=2, shmac_idents=[SCTP_AUTH_HMAC_ID_SHA1, SCTP_AUTH_HMAC_ID_SHA256]}, 8) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..da91cff68455db2cd35aab326705c2b477684d12
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_i_want_mapped_v4_addr.pkt
@@ -0,0 +1,18 @@
+	--ip_version=ipv6
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, [1], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, [0], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR, [0], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_initmsg.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_initmsg.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..adaa43af3223218add8d476ef981e83407edcdec
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_initmsg.pkt
@@ -0,0 +1,42 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2,
+					      sinit_max_instreams=2,
+					      sinit_max_attempts=2,
+					      sinit_max_init_timeo=30}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2,
+					      sinit_max_instreams=2,
+					      sinit_max_attempts=2,
+					      sinit_max_init_timeo=30}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=...,
+					      sinit_max_instreams=2,
+					      sinit_max_attempts=2,
+					      sinit_max_init_timeo=30}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2,
+					      sinit_max_instreams=...,
+					      sinit_max_attempts=2,
+					      sinit_max_init_timeo=30}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2,
+					      sinit_max_instreams=2,
+					      sinit_max_attempts=...,
+					      sinit_max_init_timeo=30}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=2,
+					      sinit_max_instreams=2,
+					      sinit_max_attempts=2,
+					      sinit_max_init_timeo=...}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_INITMSG, {sinit_num_ostreams=...,
+					      sinit_max_instreams=...,
+					      sinit_max_attempts=...,
+					      sinit_max_init_timeo=...}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_local_auth_chunks.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_local_auth_chunks.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..fab0f1c5d9b81d73fb138a48124d8b031d95d233
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_local_auth_chunks.pkt
@@ -0,0 +1,20 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, {gauth_assoc_id=3,
+							gauth_number_of_chunks=2,
+							gauth_chunks=[0x80,0xC1]}, [10]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, {gauth_number_of_chunks=2,
+							gauth_chunks=[0x80,0xC1]}, [10]) = 0
+
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_max_burst.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_max_burst.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..9f3dd90242304adfd252d70b8895af41bb689850
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_max_burst.pkt
@@ -0,0 +1,20 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=4}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=5}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_id=0, assoc_value=5}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=4}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAX_BURST, {assoc_value=4}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_maxseg.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_maxseg.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..5a941be44d88d394bc0ea71646ae091fc009e81d
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_maxseg.pkt
@@ -0,0 +1,20 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1452}, [8]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1200}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_id=0, assoc_value=1200}, [8]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1452}, 8) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_MAXSEG, {assoc_value=1452}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_nodelay.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_nodelay.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..9def93121d4fba7620b1c7db690e3f5b4edc1025
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_nodelay.pkt
@@ -0,0 +1,18 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_NODELAY, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_NODELAY, [1], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_NODELAY, [0], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_NODELAY, [0], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_partial_delivery_point.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_partial_delivery_point.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b98d0b231ac856257905d7f01e4b2ea17d4d533e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_partial_delivery_point.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, [1000], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, [1000], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_peer_addr_params.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_peer_addr_params.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..68fc57ff33ee3702a5b78b31013734a0a181fdb9
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_peer_addr_params.pkt
@@ -0,0 +1,130 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=3,
+						       spp_address={sa_family=AF_INET,
+								    sin_port=htons(8080),
+								    sin_addr=inet_addr("192.0.2.1")},
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_HB_ENABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, 152) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=0,
+						       spp_address={sa_family=AF_INET, 
+								    sin_port=htons(8080),
+								    sin_addr=inet_addr("192.0.2.1")},
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1500,
+						       spp_flags=SPP_HB_ENABLE|SPP_PMTUD_ENABLE|SPP_SACKDELAY_ENABLE,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=...}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address={sa_family=AF_INET, 
+								    sin_port=htons(8080),
+								    sin_addr=inet_addr("192.0.2.1")},
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1500,
+						       spp_flags=SPP_HB_ENABLE|SPP_PMTUD_ENABLE|SPP_SACKDELAY_ENABLE,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=...}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1500,
+						       spp_flags=SPP_HB_ENABLE|SPP_PMTUD_ENABLE|SPP_SACKDELAY_ENABLE,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=...}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1500,
+						       spp_flags=SPP_HB_ENABLE|SPP_PMTUD_ENABLE|SPP_SACKDELAY_ENABLE,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=...}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=...,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1500,
+						       spp_flags=SPP_HB_ENABLE|SPP_PMTUD_ENABLE|SPP_SACKDELAY_ENABLE,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=...}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=...,
+						       spp_pathmtu=1500,
+						       spp_flags=SPP_HB_ENABLE|SPP_PMTUD_ENABLE|SPP_SACKDELAY_ENABLE,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=...}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=...,
+						       spp_flags=SPP_HB_ENABLE|SPP_PMTUD_ENABLE|SPP_SACKDELAY_ENABLE,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=...}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1500,
+						       spp_flags=...,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=...}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1500,
+						       spp_flags=SPP_HB_ENABLE|SPP_PMTUD_ENABLE|SPP_SACKDELAY_ENABLE,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=...}, [152]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1500,
+						       spp_flags=SPP_HB_ENABLE|SPP_PMTUD_ENABLE|SPP_SACKDELAY_ENABLE,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=...}, [152]) = 0
+
++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=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1500,
+						       spp_flags=SPP_HB_DISABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, 152) = 0
+
++0 getsockopt(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=300,
+						       spp_pathmaxrxt=8,
+						       spp_pathmtu=1500,
+						       spp_flags=SPP_HB_DISABLE|SPP_PMTUD_ENABLE|SPP_SACKDELAY_ENABLE,
+						       spp_ipv6_flowlabel=...,
+						       spp_dscp=...}, [152]) = 0
+
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_peer_auth_chunks.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_peer_auth_chunks.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..e97bfe5954fd2e17b74e0a5676bf2f9ef11108ab
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_peer_auth_chunks.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//only dummy values, unimplemented in packetdrill
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, {gauth_assoc_id=..., gauth_number_of_chunks=0, gauth_chunks=[]}, [8]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, {gauth_number_of_chunks=0, gauth_chunks=[]}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_primary_addr.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_primary_addr.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..db160a48f491c9541e8f87a8b8af24035b05e340
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_primary_addr.pkt
@@ -0,0 +1,31 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=...,
+						   ssp_addr={sa_family=AF_INET,
+							     sin_port=htons(8080),
+							     sin_addr=inet_addr("192.0.2.1")}}, 136) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=...,
+						   ssp_addr={sa_family=AF_INET,
+						   sin_port=htons(8080),
+						   sin_addr=inet_addr("192.0.2.1")}}, [136]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_assoc_id=...,
+						   ssp_addr=...}, [136]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_addr={sa_family=AF_INET,
+							     sin_port=htons(8080),
+							     sin_addr=inet_addr("192.0.2.1")}}, 136) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, {ssp_addr={sa_family=AF_INET,
+						   sin_port=htons(8080),
+						   sin_addr=inet_addr("192.0.2.1")}}, [136]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_recvnxtinfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_recvnxtinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..59eea97afadd197ac065fcdd4b5ef08b6cd048c7
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_recvnxtinfo.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVNXTINFO, [1], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_recvrcvinfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_recvrcvinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..037533c8e9725833a469487ca2629bb64fda98fe
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_recvrcvinfo.pkt
@@ -0,0 +1,17 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RECVRCVINFO, [1], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_reuse_port.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_reuse_port.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..7f0849265f6b3272df860899682335de2c2b0fef
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_reuse_port.pkt
@@ -0,0 +1,12 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_REUSE_PORT, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_REUSE_PORT, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_REUSE_PORT, [1], [4]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..ef5cdcc0a6c7c637416eee9d2092832b7278d3a9
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt
@@ -0,0 +1,42 @@
+--tolerance_usecs=1000000
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=...,
+					      srto_initial=100,
+					      srto_max=200,
+					      srto_min=50}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=...,
+					      srto_initial=100,
+					      srto_max=200,
+					      srto_min=52}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=...,
+					      srto_initial=...,
+					      srto_max=200,
+					      srto_min=52}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+					      srto_initial=100,
+					      srto_max=...,
+					      srto_min=52}, [16]) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+					      srto_initial=100,
+					      srto_max=200,
+					      srto_min=...}, [16]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=150,
+					      srto_max=200,
+					      srto_min=50}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_initial=152,
+					      srto_max=200,
+					      srto_min=52}, [16]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_set_peer_primary_addr.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_set_peer_primary_addr.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..4a3e7b8886287e753d001cf9bbd251806417c0c4
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_set_peer_primary_addr.pkt
@@ -0,0 +1,21 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, {sspp_addr={sa_family=AF_INET,
+								       sin_port=htons(8080),
+								       sin_addr=inet_addr("192.0.2.1")}}, 136) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, {sspp_assoc_id=...,
+							    sspp_addr={sa_family=AF_INET,
+								       sin_port=htons(8080),
+								       sin_addr=inet_addr("192.0.2.1")}}, 136) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_status.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_status.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..5a37b4914a4791d23f9ea8bc6c0f8a3e2f7ef717
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_status.pkt
@@ -0,0 +1,167 @@
+	--tolerance_usecs=1000000
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=...,
+					     sstat_rwnd=...,
+					     sstat_unackdata=..., sstat_penddata=...,
+					     sstat_instrms=...,
+					     sstat_outstrms=...,
+					     sstat_fragmentation_point=...,
+					     sstat_primary=...}, 176) = -1
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500,
+					     sstat_unackdata=0, 
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary={spinfo_assoc_id=...,
+							    spinfo_address={sa_family=AF_INET,
+									    sin_port=htons(8080),
+									    sin_addr=inet_addr("192.0.2.1")},
+							    spinfo_state=SCTP_ACTIVE,
+							    spinfo_cwnd=4380,
+							    spinfo_srtt=...,
+							    spinfo_rto=3000,
+							    spinfo_mtu=1500}}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=...,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=..., 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=...,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=...,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=...,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=...,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=...,
+					     sstat_primary=...}, [176]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_assoc_id=...,
+					     sstat_state=4,
+					     sstat_rwnd=1500, 
+					     sstat_unackdata=0,
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=...,
+					     sstat_primary=...}, [176]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=...,
+					     sstat_rwnd=...,
+					     sstat_unackdata=..., sstat_penddata=...,
+					     sstat_instrms=...,
+					     sstat_outstrms=...,
+					     sstat_fragmentation_point=...,
+					     sstat_primary=...}, 176) = -1
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=SCTP_ESTABLISHED,
+					     sstat_rwnd=1500,
+					     sstat_unackdata=0, 
+					     sstat_penddata=0,
+					     sstat_instrms=1,
+					     sstat_outstrms=1,
+					     sstat_fragmentation_point=1452,
+					     sstat_primary={spinfo_assoc_id=...,
+							    spinfo_address={sa_family=AF_INET,
+									    sin_port=htons(8080),
+									    sin_addr=inet_addr("192.0.2.1")},
+							    spinfo_state=SCTP_ACTIVE,
+							    spinfo_cwnd=4380,
+							    spinfo_srtt=...,
+							    spinfo_rto=3000,
+							    spinfo_mtu=1500}}, [176]) = 0
+
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_use_ext_rcvinfo.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_use_ext_rcvinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..64defd820a9033a8d91bda101de1bdb420ae4615
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/sctp_use_ext_rcvinfo.pkt
@@ -0,0 +1,18 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], 4) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_USE_EXT_RCVINFO, [1], [4]) = 0
+
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/so_linger.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/so_linger.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..0d1fa45efcee66f946ef835da8850ed4423d1ccb
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/getsockopt/so_linger.pkt
@@ -0,0 +1,19 @@
+0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1,   linger=30}, 8) = 0
++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1,   linger=30}, [8]) = 0
++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1,   linger=...}, [8]) = 0
++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=..., linger=30}, [8]) = 0
++0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=..., linger=...}, [8]) = 0
+
++0 close(3) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_adaptation_event.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_adaptation_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..7f9a12182176ea9528d2c24f733e823d3d74e8b7
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_adaptation_event.pkt
@@ -0,0 +1,54 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.0 bind(3, ..., ...) = 0
++0.0 listen(3, 1) = 0
+
+// Enable Event notification
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             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=1,
+                                             sctp_authentication_event=0,
+                                             sctp_sender_dry_event=0}, 10) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             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=1,
+                                             sctp_authentication_event=0,
+                                             sctp_sender_dry_event=0}, [10]) = 0
+
+
+
+// Send Adaptation Indication with Init chunk
++0.0 < sctp: INIT[flgs=0, tag=1, a_rwnd=1500, os=1, is=1, tsn=0,
+                  ECN_CAPABLE[],
+		  ADAPTATION_INDICATION[adaptation_code_point=3],
+                  COOKIE_PRESERVATIVE[incr=12345],
+                  SUPPORTED_ADDRESS_TYPES[types=[IPv4]]]
+
+*    > sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=..., os=..., is=..., tsn=10, ...]
++0.0 < sctp: COOKIE_ECHO[flgs=0, len=..., val=...]
+*    > sctp: COOKIE_ACK[flgs=0]
+
++0.0 accept(3, ..., ...) = 4
+
+//TODO: Packetdrill does not support Path reconfiguration, after that update this test
++0.0 recvmsg(4, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={sai_type=SCTP_ADAPTATION_INDICATION,
+			       sai_flags=0,
+			       sai_length=16,
+			       sai_adaptation_ind=3,
+			       sai_assoc_id=...}, iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 16
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_assoc_change_event.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_assoc_change_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..03408580c91fbc69f21331a9b3c2b834502e5864
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_assoc_change_event.pkt
@@ -0,0 +1,66 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=1,
+                                             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}, 10) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=1,
+                                             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}, 10) = 0
+
+
+
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={sac_type=SCTP_ASSOC_CHANGE,
+				       sac_flags=0,
+				       sac_length=20,
+				       sac_state=SCTP_COMM_UP,
+				       sac_error=0,
+				       sac_outbound_streams=1, 
+				       sac_inbound_streams=1,
+				       sac_assoc_id=...,
+				       sac_info=[]},
+			      iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 20
+
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
++0.5 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={sac_type=SCTP_ASSOC_CHANGE,
+				       sac_flags=0,
+				       sac_length=20,
+				       sac_state=SCTP_SHUTDOWN_COMP,
+				       sac_error=0,
+				       sac_outbound_streams=1, 
+				       sac_inbound_streams=1,
+				       sac_assoc_id=...,
+				       sac_info=[]},
+			      iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 20
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_authentication_event.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_authentication_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..ca23f26da53614e2faaac26fab3a40611d5550c3
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_authentication_event.pkt
@@ -0,0 +1,50 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             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=1,
+                                             sctp_sender_dry_event=0}, 10) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             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=1,
+                                             sctp_sender_dry_event=0}, [10]) = 0
+
+
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={auth_type=SCTP_AUTHENTICATION_EVENT,
+			       auth_flags=0,
+			       auth_length=20,
+			       auth_keynumber=0,
+			       auth_indication=SCTP_AUTH_NO_AUTH,
+			       auth_assoc_id=3}, iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 20
+
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
+
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_authentication_event_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_authentication_event_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b43bf482f1002b4a2d4f18292021b411be65e33b
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_authentication_event_2.pkt
@@ -0,0 +1,23 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_AUTHENTICATION_EVENT, se_on=1}, [8]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 sctp_recvv(3, [{iov_base={auth_type=SCTP_AUTHENTICATION_EVENT,
+			       auth_flags=0,
+			       auth_length=20,
+			       auth_keynumber=0,
+			       auth_indication=SCTP_AUTH_NO_AUTH}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 20
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
+
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_notifications_stopped_event.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_notifications_stopped_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..9cdbacb710da7e97d976396617f4877629515203
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_notifications_stopped_event.pkt
@@ -0,0 +1,22 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_ADAPTATION_INDICATION, se_on=1}, [8]) = 0
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_NOTIFICATIONS_STOPPED_EVENT, se_on=1}, 8) = 0
+
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+// No implementation provides this messages, so it can't be tested
+// as discribed in rfc, create an notification storm so that the implementation disable notifications
++0.0 recvmsg(3, {msg_name(...)=...,
+		 msg_iov(1)=[{iov_base={sn_type=SCTP_NOTIFICATIONS_STOPPED_EVENT,
+					sn_flags=0,
+					sn_length=8}, iov_len=1000}],
+		 msg_control(0)=[],
+		 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 21
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_partial_delivery_event.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_partial_delivery_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..356c31cbb8c3c087ef092877c51632d31da997e0
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_partial_delivery_event.pkt
@@ -0,0 +1,48 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+//Enable Partial delivery event
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             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=1,
+                                             sctp_adaptation_layer_event=0,
+                                             sctp_authentication_event=0,
+                                             sctp_sender_dry_event=0}, 10) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             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=1,
+                                             sctp_adaptation_layer_event=0,
+                                             sctp_authentication_event=0,
+                                             sctp_sender_dry_event=0}, [10]) = 0
+
++0.0 < sctp: DATA[flgs=B, len=300, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=0, len=300, tsn=2, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: ABORT[flgs=0]
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(2)=[{iov_base=..., iov_len=1000},
+			     {iov_base={pdapi_type=SCTP_PARTIAL_DELIVERY_EVENT,
+			       pdapi_flags=0,
+			       pdapi_length=24,
+			       pdapi_indication=SCTP_PARTIAL_DELIVERY_ABORTED,
+			       pdapi_stream=0,
+			       pdapi_seq=0,
+			       pdapi_assoc_id=...}, iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 21
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_partial_delivery_event_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_partial_delivery_event_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..53dfa5436c70311f318a7f98a058a77fc15dd2c2
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_partial_delivery_event_2.pkt
@@ -0,0 +1,25 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+//Enable Partial delivery event
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_PARTIAL_DELIVERY_EVENT, se_on=1}, [8]) = 0
+
++0.0 < sctp: DATA[flgs=B, len=300, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: DATA[flgs=0, len=300, tsn=2, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 < sctp: ABORT[flgs=0]
++1.5 sctp_recvv(3, [{iov_base=..., iov_len=1000},
+		    {iov_base={pdapi_type=SCTP_PARTIAL_DELIVERY_EVENT,
+			       pdapi_flags=0,
+			       pdapi_length=24,
+			       pdapi_indication=SCTP_PARTIAL_DELIVERY_ABORTED,
+			       pdapi_stream=0,
+			       pdapi_seq=0}, iov_len=1000}], 2, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 21
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_peer_addr_change.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_peer_addr_change.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..ccd2210044c09a3ab47717725234b3f7fbeb31ee
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_peer_addr_change.pkt
@@ -0,0 +1,75 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+
+//test for enable socketoptions with SCTP_EVENTS
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=1,
+                                             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}, 10) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=1,
+                                             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}, [10]) = 0
+
+
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address=...,
+							 spp_hbinterval=1,
+							 spp_pathmaxrxt=3,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_ENABLE, 
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+
++0.5 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE,
+				        spc_flags=0,
+				        spc_length=148,
+				        spc_aaddr=...,
+				        spc_state=SCTP_ADDR_UNREACHABLE,
+				        spc_error=0,
+				        spc_assoc_id=...},
+		 	    iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 148
+
+
++0.0 < sctp: HEARTBEAT_ACK[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+
++0.5 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE,
+				        spc_flags=0,
+				        spc_length=148,
+				        spc_aaddr=...,
+				        spc_state=SCTP_ADDR_AVAILABLE,
+				        spc_error=2,
+				        spc_assoc_id=...},
+			     iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 148
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_peer_addr_change_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_peer_addr_change_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..7ffba6ee682125650bfbb42443be29d4dddc5364
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_peer_addr_change_2.pkt
@@ -0,0 +1,73 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+
+//test for enable socketoptions with SCTP_EVENTS
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=1,
+                                             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}, 10) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=1,
+                                             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}, [10]) = 0
+
+
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address=...,
+							 spp_hbinterval=1,
+							 spp_pathmaxrxt=3,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_ENABLE, 
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+*    > sctp: HEARTBEAT[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+
++0.5 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE,
+				        spc_flags=0,
+				        spc_length=148,
+				        spc_aaddr=...,
+				        spc_state=SCTP_ADDR_UNREACHABLE,
+				        spc_error=0},
+		 	    iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 148
+
+
++0.0 < sctp: HEARTBEAT_ACK[flgs=0, HEARTBEAT_INFORMATION[len=..., val=...]]
+
++0.5 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={spc_type=SCTP_PEER_ADDR_CHANGE,
+				        spc_flags=0,
+				        spc_length=148,
+				        spc_aaddr=...,
+				        spc_state=SCTP_ADDR_AVAILABLE,
+				        spc_error=2},
+			     iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 148
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_remote_error.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_remote_error.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..308f661e6a01a7d813346a48ea0f82456eef3208
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_remote_error.pkt
@@ -0,0 +1,51 @@
+	--tolerance_usecs=100000
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+
+//test for enable socketoptions with SCTP_EVENTS
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=0,
+                                             sctp_send_failure_event=0,
+                                             sctp_peer_error_event=1,
+                                             sctp_shutdown_event=0,
+                                             sctp_partial_delivery_event=0,
+                                             sctp_adaptation_layer_event=0,
+                                             sctp_authentication_event=0,
+                                             sctp_sender_dry_event=0}, 10) = 0
+
+//test for enable socketoptions with SCTP_EVENTS
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=0,
+                                             sctp_send_failure_event=0,
+                                             sctp_peer_error_event=1,
+                                             sctp_shutdown_event=0,
+                                             sctp_partial_delivery_event=0,
+                                             sctp_adaptation_layer_event=0,
+                                             sctp_authentication_event=0,
+                                             sctp_sender_dry_event=0}, [10]) = 0
+
+
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: ERROR[flgs=0, INVALID_STREAM_IDENTIFIER[sid=1]]
+
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={sre_type=SCTP_REMOTE_ERROR,
+				       sre_flags=0,
+				       sre_length=20,
+				       sre_error=256,
+				       sre_assoc_id=...,
+				       sre_data=[0x00, 0x01, 0x00, 0x00]},
+			     iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 20
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_remote_error_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_remote_error_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..23f81705327789632689a7dab0ddf5a3443d9c9b
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_remote_error_2.pkt
@@ -0,0 +1,50 @@
+	--tolerance_usecs=100000
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+
+//test for enable socketoptions with SCTP_EVENTS
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=0,
+                                             sctp_send_failure_event=0,
+                                             sctp_peer_error_event=1,
+                                             sctp_shutdown_event=0,
+                                             sctp_partial_delivery_event=0,
+                                             sctp_adaptation_layer_event=0,
+                                             sctp_authentication_event=0,
+                                             sctp_sender_dry_event=0}, 10) = 0
+
+//test for enable socketoptions with SCTP_EVENTS
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=0,
+                                             sctp_send_failure_event=0,
+                                             sctp_peer_error_event=1,
+                                             sctp_shutdown_event=0,
+                                             sctp_partial_delivery_event=0,
+                                             sctp_adaptation_layer_event=0,
+                                             sctp_authentication_event=0,
+                                             sctp_sender_dry_event=0}, [10]) = 0
+
+
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: ERROR[flgs=0, INVALID_STREAM_IDENTIFIER[sid=1]]
+
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={sre_type=SCTP_REMOTE_ERROR,
+				       sre_flags=0,
+				       sre_length=20,
+				       sre_error=256,
+				       sre_data=[0x00, 0x01, 0x00, 0x00]},
+			     iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 20
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..627892ad90a159dd33128ce6e181b20d8b444548
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed.pkt
@@ -0,0 +1,78 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address=...,
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=100,
+							 spp_pathmtu=1468, 
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
+//test for enable socketoptions with SCTP_EVENTS
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=0,
+                                             sctp_send_failure_event=1,
+                                             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}, 10) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=0,
+                                             sctp_send_failure_event=1,
+                                             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}, [10]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+						srto_initial=100,
+						srto_max=150,
+						srto_min=50}, 16) = 0
+
++0.0 write(3, ..., 1000) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+
++0.0 recvmsg(3, {msg_name(...)=..., 
+		 msg_iov(1)=[{iov_base={ssf_type=SCTP_SEND_FAILED,
+					ssf_flags=SCTP_DATA_SENT,
+					ssf_length=1144,
+					ssf_error=0,
+					ssf_info={sinfo_stream=0,
+						  sinfo_ssn=0,
+						  sinfo_flags=3,
+						  sinfo_ppid=htonl(0),
+						  sinfo_context=0,
+						  sinfo_timetolive=0,
+						  sinfo_tsn=0,
+						  sinfo_cumtsn=0,
+						  sinfo_assoc_id=...},
+					ssf_assoc_id=...,
+					ssf_data=...}, iov_len=1500}],
+		 msg_control(0)=[],
+		 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 1144
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..2244a1678b11af7a859dd9bd99b01ad3db4495b5
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed_2.pkt
@@ -0,0 +1,51 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address=...,
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=100,
+							 spp_pathmtu=1468, 
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
+//test for SEND_FAILED_EVENT
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, 8) = 0
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0, se_type=SCTP_SEND_FAILED, se_on=1}, [8]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+						srto_initial=100,
+						srto_max=150,
+						srto_min=50}, 16) = 0
+
++0.0 write(3, ..., 1000) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++1.0 sctp_recvv(3, [{iov_base={ssf_type=SCTP_SEND_FAILED,
+			       ssf_flags=SCTP_DATA_SENT,
+			       ssf_length=1144,
+			       ssf_error=0,
+			       ssf_info={sinfo_stream=0,
+					 sinfo_ssn=0,
+					 sinfo_flags=3,
+					 sinfo_ppid=htonl(0),
+					 sinfo_context=0,
+					 sinfo_timetolive=0,
+					 sinfo_tsn=0,
+					 sinfo_cumtsn=0},
+			       ssf_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed_event.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..3febfbd9c61efa0aa4c736063585dca7504f570e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed_event.pkt
@@ -0,0 +1,50 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=0,
+						       spp_pathmaxrxt=100,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_HB_DISABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, 152) = 0
+
+//test for SEND_FAILED_EVENT
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0,
+					      se_type=SCTP_SEND_FAILED_EVENT,
+					      se_on=1}, 8) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+						srto_initial=100,
+						srto_max=150,
+						srto_min=50}, 16) = 0
+
++0.0 write(3, ..., 1000) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT,
+			       ssfe_flags=SCTP_DATA_SENT,
+			       ssfe_length=1032,
+			       ssfe_error=0,
+			       ssfe_info={snd_sid=0,
+					  snd_flags=3,
+                                          snd_ppid=htonl(0),
+                                          snd_context=0,
+					  snd_assoc_id=3},
+			       ssfe_assoc_id=3,
+			       ssfe_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed_event_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed_event_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..39d8113ee59bbacccee271cfd29d2d2f7b95ab70
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_send_failed_event_2.pkt
@@ -0,0 +1,48 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+						       spp_address=...,
+						       spp_hbinterval=0,
+						       spp_pathmaxrxt=100,
+						       spp_pathmtu=1468,
+						       spp_flags=SPP_HB_DISABLE,
+						       spp_ipv6_flowlabel=0,
+						       spp_dscp=0}, 152) = 0
+
+//test for SEND_FAILED_EVENT
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_assoc_id=0,
+					      se_type=SCTP_SEND_FAILED_EVENT,
+					      se_on=1}, 8) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0,
+						srto_initial=100,
+						srto_max=150,
+						srto_min=50}, 16) = 0
+
++0.0 write(3, ..., 1000) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++1.0 sctp_recvv(3, [{iov_base={ssfe_type=SCTP_SEND_FAILED_EVENT,
+			       ssfe_flags=SCTP_DATA_SENT,
+			       ssfe_length=1032,
+			       ssfe_error=0,
+			       ssfe_info={snd_sid=0,
+					  snd_flags=3,
+                                          snd_ppid=htonl(0),
+                                          snd_context=0},
+			       ssfe_data=...}, iov_len=1000}], 1, ..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION]) = 1000
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_sender_dry_event.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_sender_dry_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..edfd4014aa2ec37eba9bb5a7842bd4b12e1d721b
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_sender_dry_event.pkt
@@ -0,0 +1,43 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+					       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=1}, 10) = 0
+
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+					       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=1}, [10]) = 0
+
+
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT,
+			       sender_dry_flags=0,
+			       sender_dry_length=12,
+			       sender_dry_assoc_id=...}, iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12
+
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_sender_dry_event_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_sender_dry_event_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..d1d2fc8c003b947b440fe117756286532e4be58e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_sender_dry_event_2.pkt
@@ -0,0 +1,42 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//test for enable socketoptions with SCTP_EVENT and SCTP_EVENTS
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+					       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=1}, 10) = 0
+
++0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+					       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=1}, [10]) = 0
+
+
++0.0 recvmsg(3, {msg_name(...)=...,
+                 msg_iov(1)=[{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT,
+			       sender_dry_flags=0,
+			       sender_dry_length=12}, iov_len=1000}],
+                 msg_control(0)=[],
+                 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12
+
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_shutdown_event.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_shutdown_event.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c9b1409fe54342d5608ddda10f8f8d99b62d2827
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_shutdown_event.pkt
@@ -0,0 +1,45 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//test for enable socketoptions with SCTP_EVENTS
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+					     sctp_association_event=0,
+					     sctp_address_event=0,
+					     sctp_send_failure_event=0,
+					     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}, 10) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+					     sctp_association_event=0,
+					     sctp_address_event=0,
+					     sctp_send_failure_event=0,
+					     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}, [10]) = 0
+
+// Tear down the association
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
++0.0 recvmsg(3, {msg_name(...)=..., 
+		 msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT,
+					sse_flags=0,
+					sse_length=12,
+					sse_assoc_id=...}, iov_len=1000}],
+		 msg_control(0)=[],
+		 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_shutdown_event_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_shutdown_event_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c564062cb015ad332f9b4c7c92e92d2b05e35e99
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/notifications/sctp_shutdown_event_2.pkt
@@ -0,0 +1,45 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
+//test for enable socketoptions with SCTP_EVENTS
++0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=0,
+                                             sctp_send_failure_event=0,
+                                             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}, 10) = 0
+
++0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=0,
+                                             sctp_association_event=0,
+                                             sctp_address_event=0,
+                                             sctp_send_failure_event=0,
+                                             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}, [10]) = 0
+
+// Tear down the association
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
++0.0 recvmsg(3, {msg_name(...)=..., 
+		 msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT,
+					sse_flags=0,
+					sse_length=12},
+			      iov_len=1000}],
+		 msg_control(0)=[],
+		 msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/run-all-tests b/gtests/net/packetdrill/tests/linux/sctp/api_tests/run-all-tests
new file mode 100755
index 0000000000000000000000000000000000000000..8121ea5fc2d3e7935ea70e5fb8693e579ff828b4
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/run-all-tests
@@ -0,0 +1,176 @@
+#!/usr/bin/env tcsh
+
+#
+# Copyright (c) 2015 Michael Tuexen
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+set packetdrill = ./../../../../packetdrill
+set delay = 1
+set testcases = (setsockopt/sctp_rtoinfo_1 \
+		 setsockopt/sctp_rtoinfo_2 \
+		 setsockopt/sctp_rtoinfo_3 \
+		 getsockopt/sctp_rtoinfo \
+		 getsockopt/sctp_associnfo \
+		 getsockopt/sctp_initmsg \
+		 getsockopt/so_linger \
+		 getsockopt/sctp_nodelay \
+		 getsockopt/sctp_autoclose \
+		 getsockopt/sctp_primary_addr \
+		 getsockopt/sctp_adaptation_layer \
+		 getsockopt/sctp_disable_fragments \
+		 getsockopt/sctp_peer_addr_params \
+		 getsockopt/sctp_default_send_param \
+		 getsockopt/sctp_events \
+		 getsockopt/sctp_i_want_mapped_v4_addr \
+		 getsockopt/sctp_maxseg \
+		 getsockopt/sctp_hmac_ident \
+		 getsockopt/sctp_auth_active_key \
+		 getsockopt/sctp_delayed_sack \
+		 getsockopt/sctp_fragment_interleave \
+		 getsockopt/sctp_partial_delivery_point \
+		 getsockopt/sctp_use_ext_rcvinfo \
+		 getsockopt/sctp_auto_asconf \
+		 getsockopt/sctp_max_burst \
+		 getsockopt/sctp_context \
+		 getsockopt/sctp_explicit_eor \
+		 getsockopt/sctp_reuse_port \
+		 getsockopt/sctp_event \
+		 getsockopt/sctp_recvrcvinfo \
+		 getsockopt/sctp_recvnxtinfo \
+		 getsockopt/sctp_default_sndinfo \
+		 getsockopt/sctp_default_prinfo \
+		 getsockopt/sctp_status \
+		 getsockopt/sctp_get_peer_addr_info \
+		 getsockopt/sctp_peer_auth_chunks \
+		 getsockopt/sctp_local_auth_chunks \
+		 getsockopt/sctp_get_assoc_number \
+		 getsockopt/sctp_get_assoc_id_list \
+		 getsockopt/sctp_set_peer_primary_addr \
+		 getsockopt/sctp_auth_chunk \
+		 getsockopt/sctp_auth_key \
+		 getsockopt/sctp_auth_deactivate_key \
+		 getsockopt/sctp_auth_delete_key \
+		 notifications/sctp_adaptation_event \
+                 notifications/sctp_notifications_stopped_event \
+                 notifications/sctp_remote_error \
+                 notifications/sctp_remote_error_2 \
+                 notifications/sctp_sender_dry_event \
+                 notifications/sctp_sender_dry_event_2 \
+                 notifications/sctp_assoc_change_event \
+                 notifications/sctp_partial_delivery_event \
+                 notifications/sctp_partial_delivery_event_2 \
+                 notifications/sctp_send_failed \
+                 notifications/sctp_send_failed_2 \
+                 notifications/sctp_shutdown_event \
+                 notifications/sctp_shutdown_event_2 \
+                 notifications/sctp_authentication_event \
+                 notifications/sctp_authentication_event_2 \
+                 notifications/sctp_peer_addr_change \
+                 notifications/sctp_peer_addr_change_2 \
+                 notifications/sctp_send_failed_event \
+                 notifications/sctp_send_failed_event_2 \
+		 cmsgs/sendmsg_sctp_init \
+		 cmsgs/sendmsg_sctp_sndrcv \
+		 cmsgs/sendmsg_sctp_sndinfo \
+		 cmsgs/sendmsg_sctp_authinfo \
+		 cmsgs/sendmsg_sctp_prinfo \
+		 cmsgs/sendmsg_sctp_dstaddrv4 \
+		 cmsgs/sendmsg_sctp_dstaddrv6 \
+		 cmsgs/recvmsg_sctp_extrcv \
+		 cmsgs/recvmsg_sctp_nxtinfo \
+		 cmsgs/recvmsg_sctp_rcvinfo \
+		 cmsgs/recvmsg_sctp_sndrcv \
+		 cmsgs/recvmsg \
+		 cmsgs/sendmsg \
+		 sctp_send/sctp_send_1 \
+		 sctp_send/sctp_send_2 \
+		 sctp_bindx/sctp_bindx \
+		 sctp_peeloff/sctp_peeloff \
+		 sctp_getpaddrs/sctp_getpaddrs \
+		 sctp_getladdrs/sctp_getladdrs \
+		 sctp_sendmsg/sctp_sendmsg_1 \
+		 sctp_sendmsg/sctp_sendmsg_2 \
+		 sctp_sendmsg/sctp_sendmsg_3 \
+		 sctp_recvmsg/sctp_recvmsg_1 \
+		 sctp_recvmsg/sctp_recvmsg_2 \
+		 sctp_recvmsg/sctp_recvmsg_3 \
+		 sctp_connectx/sctp_connectx \
+		 sctp_sendx/sctp_sendx \
+		 sctp_sendv/sctp_sendv \
+		 sctp_recvv/sctp_recvv )
+
+set rootdir = `/usr/bin/dirname $0`
+set os = `uname -s | tr '[A-Z]' '[a-z]'`
+set passed = 0
+set failed = 0
+set run = 0
+set skipped = 0
+set first = 1
+
+printf "Name                                        Verdict\n"
+printf "===================================================\n"
+foreach testcase ($testcases)
+  printf "%-40.40s " `/usr/bin/basename $testcase`
+  if ($first == 0) then
+    if ($delay != 0) then
+      printf "\033[33m%10s\033[0m" "WAITING"
+      sleep $delay
+      printf "\b\b\b\b\b\b\b\b\b\b"
+    endif
+  else
+    set first = 0
+  endif
+  printf "\033[33m%10s\033[0m" "RUNNING"
+  if (-f ${rootdir}/${testcase}-$os.pkt) then
+    $packetdrill ${rootdir}/${testcase}-$os.pkt >& /dev/null
+    set result = $status
+    set found = 1
+  else if (-f ${rootdir}/${testcase}.pkt) then
+    $packetdrill ${rootdir}/${testcase}.pkt >& /dev/null
+    set result = $status
+    set found = 1
+  else
+    set found = 0
+  endif
+  printf "\b\b\b\b\b\b\b\b\b\b"
+  if ($found == 1) then
+    if ($result == 0) then
+      @ passed++
+      printf "\033[32m%10s\033[0m\n" "PASSED"
+    else
+      @ failed++
+      printf "\033[31m%10s\033[0m\n" "FAILED"
+    endif
+    @ run++
+  else
+    printf "\033[34m%10s\033[0m\n" "SKIPPED"
+    @ skipped++
+  endif
+end
+printf "===================================================\n"
+printf "Summary: Number of tests run:     %3u\n" $run
+printf "         Number of tests passed:  %3u\n" $passed
+printf "         Number of tests failed:  %3u\n" $failed
+printf "         Number of tests skipped: %3u\n" $skipped
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_bindx/sctp_bindx.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_bindx/sctp_bindx.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..664ca300e40758a088790ed15a7f6759908a762e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_bindx/sctp_bindx.pkt
@@ -0,0 +1,6 @@
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+
++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_connectx/sctp_connectx.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_connectx/sctp_connectx.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..8e33925643afae0accb16042ac8dbc7cc6ab48eb
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_connectx/sctp_connectx.pkt
@@ -0,0 +1,17 @@
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+
++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0
+
+// Check the handshake with an empty(!) cookie
++0.1 sctp_connectx(3, [...], 1, [3]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
+*    > sctp: SHUTDOWN_ACK[flgs=0]
++0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_getladdrs/sctp_getladdrs.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_getladdrs/sctp_getladdrs.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..df23f4aff645690ef739dd7b9a723e3f1790ae53
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_getladdrs/sctp_getladdrs.pkt
@@ -0,0 +1,19 @@
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+
++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0
+
+// Check the handshake with an empty(!) cookie
++0.1 sctp_connectx(3, [...], 1, [...]) = -1
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 sctp_getladdrs(3, 3, [...]) = 1
++0.0 sctp_freeladdrs([...]) = 0
+
++0.0 sctp_getladdrs(3, 3, [{sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.168.0.1")}]) = 1
++0.0 sctp_freeladdrs([...]) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_getpaddrs/sctp_getpaddrs.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_getpaddrs/sctp_getpaddrs.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..78e7f064c35da3c3764bfcd21ca4097003d97cca
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_getpaddrs/sctp_getpaddrs.pkt
@@ -0,0 +1,19 @@
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+
++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0
+
+// Check the handshake with an empty(!) cookie
++0.1 sctp_connectx(3, [...], 1, [...]) = -1
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 sctp_getpaddrs(3, 3, [...]) = 1
++0.0 sctp_freepaddrs([...]) = 0
+
++0.0 sctp_getpaddrs(3, 3, [{sa_family=AF_INET,sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}]) = 1
++0.0 sctp_freepaddrs([...]) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_peeloff/sctp_peeloff.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_peeloff/sctp_peeloff.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..de7c9edfe1119689b45e514f6427d0e58c4944d3
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_peeloff/sctp_peeloff.pkt
@@ -0,0 +1,15 @@
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+
++0.0 sctp_bindx(3, [...], 1, SCTP_BINDX_ADD_ADDR) = 0
+
+// Check the handshake with an empty(!) cookie
++0.1 sctp_connectx(3, [...], 1, [3]) = 0
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 sctp_peeloff(3, 3) = 4
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_1.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_1.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..569fae58952a350ebbbf755449b608e449e90305
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_1.pkt
@@ -0,0 +1,20 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvmsg(3, ..., 1000, ..., ..., ..., MSG_EOR) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..ef3af18f24aa5cadd0cbf1d88ced9d137114cd5b
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_2.pkt
@@ -0,0 +1,28 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=1234]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvmsg(3, ..., 1000, ..., ..., {sinfo_stream=...,
+                                           sinfo_ssn=...,
+                                           sinfo_flags=0,
+                                           sinfo_ppid=htonl(205526792),
+                                           sinfo_context=...,
+                                           sinfo_timetolive=...,
+                                           sinfo_tsn=...,
+                                           sinfo_cumtsn=...,
+                                           sinfo_assoc_id=...}, 128) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=1]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_3.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_3.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..79dffa221038e8549d17df1b0aef6f4d8b87dc4f
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_recvmsg/sctp_recvmsg_3.pkt
@@ -0,0 +1,49 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvmsg(3, ..., 1000,
+                  {sa_family=AF_INET,
+                   sin_port=htons(8080),
+                   sin_addr=inet_addr("192.0.2.1")},
+                  16,
+                  {sinfo_stream=...,
+                   sinfo_ssn=...,
+                   sinfo_flags=0,
+                   sinfo_ppid=htonl(205526792),
+                   sinfo_context=...,
+                   sinfo_timetolive=...,
+                   sinfo_tsn=...,
+                   sinfo_cumtsn=...,
+                   sinfo_assoc_id=...}, MSG_EOR) = 1000
+
++0.0 < sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=1, ppid=0]
+*    > sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=..., gaps=[], dups=[]]
++0.0 sctp_recvmsg(3, ..., 1000,
+                  {sa_family=AF_INET,
+                   sin_port=htons(8080),
+                   sin_addr=inet_addr("192.0.2.1")},
+                  16,
+                  {sinfo_stream=...,
+                   sinfo_ssn=...,
+                   sinfo_flags=0,
+                   sinfo_ppid=htonl(205526792),
+                   sinfo_context=...,
+                   sinfo_timetolive=...,
+                   sinfo_tsn=...,
+                   sinfo_cumtsn=...}, MSG_EOR) = 1000
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=2]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_send/sctp_send_1.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_send/sctp_send_1.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..ceff10fc530e27fdcb245ec691d348a3cf0c0e2d
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_send/sctp_send_1.pkt
@@ -0,0 +1,42 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++1.0 sctp_send(3, ..., 1000, {sinfo_stream=3,
+                              sinfo_ssn=3,
+                              sinfo_flags=0,
+                              sinfo_ppid=htonl(7),
+                              sinfo_context=0,
+                              sinfo_timetolive=0,
+                              sinfo_tsn=1,
+                              sinfo_cumtsn=6,
+                              sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_send/sctp_send_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_send/sctp_send_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..940f5485eeeb3f949cc05899ad3764e49147388a
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_send/sctp_send_2.pkt
@@ -0,0 +1,55 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
+
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_assoc_id=...,
+							 spp_address={sa_family=AF_INET,
+								      sin_port=htons(8080),
+								      sin_addr=inet_addr("192.0.2.1")},
+							 spp_hbinterval=0,
+							 spp_pathmaxrxt=8,
+							 spp_pathmtu=1468,
+							 spp_flags=SPP_HB_DISABLE,
+							 spp_ipv6_flowlabel=0,
+							 spp_dscp=0}, 152) = 0
+
++1.0 sctp_send(3, ..., 1000, {sinfo_stream=3,
+                              sinfo_ssn=3,
+                              sinfo_flags=0,
+                              sinfo_ppid=htonl(7),
+                              sinfo_context=0,
+                              sinfo_timetolive=0,
+                              sinfo_tsn=1,
+                              sinfo_cumtsn=6,
+                              sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=3, ssn=0, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++1.0 sctp_send(3, ..., 1000, {sinfo_stream=3,
+                              sinfo_ssn=3,
+                              sinfo_flags=0,
+                              sinfo_ppid=htonl(7),
+                              sinfo_context=0,
+                              sinfo_timetolive=0,
+                              sinfo_tsn=1,
+                              sinfo_cumtsn=6,
+                              sinfo_assoc_id=3}, 0) = 1000
+*    > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=3, ssn=1, ppid=7]
++0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_1.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_1.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..2144bf4d295c4e7600160d8c39d3b015f4a78615
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_1.pkt
@@ -0,0 +1,20 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 sctp_sendmsg(3, ..., 1000, ..., ..., htonl(1234), SCTP_UNORDERED, 1, 0, 0) = 1000
++0.0 > sctp: DATA[flgs=UBE, len=1016, tsn=1, sid=1, ssn=0, ppid=1234]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..4e916dca4981c3ea01a7ff47854dd63f0397d60c
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_2.pkt
@@ -0,0 +1,23 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 sctp_sendmsg(3, ..., 1000, {sa_family=AF_INET,
+				 sin_port=htons(8080),
+				 sin_addr=inet_addr("192.0.2.1")},
+		 16, htonl(0x1234), 0, 0, 0, 0) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0x1234]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_3.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_3.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b02ac279aaae3b92db943cb7e2fc8e6827440f12
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/sctp_sendmsg/sctp_sendmsg_3.pkt
@@ -0,0 +1,20 @@
++0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+// Check the handshake with an empty(!) cookie
++0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
++0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
++0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=16, is=16, tsn=1, STATE_COOKIE[len=4, val=...]]
++0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
++0.1 < sctp: COOKIE_ACK[flgs=0]
++0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+
++0.0 sctp_sendmsg(3, ..., 1000, NULL, 0, 0, 0, 0, 0, 0) = 1000
++0.0 > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
++0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
+
++0.0 close(3) = 0
++0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=0]
++0.1 < sctp: SHUTDOWN_ACK[flgs=0]
++0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/setsockopt/sctp_rtoinfo_1.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/setsockopt/sctp_rtoinfo_1.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..1a6fe6762e9cf441ad426da25915b5a532e0e457
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/setsockopt/sctp_rtoinfo_1.pkt
@@ -0,0 +1,9 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+
+// Check sctp_rtoinfo before connection startup
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=..., srto_max=..., srto_min=...}, [16]) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/setsockopt/sctp_rtoinfo_2.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/setsockopt/sctp_rtoinfo_2.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..80305cd4fb022a8b65f08aa9f847ddd08b11b96e
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/setsockopt/sctp_rtoinfo_2.pkt
@@ -0,0 +1,10 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+
+// Check sctp_rtoinfo before connection startup
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, [16]) = 0
diff --git a/gtests/net/packetdrill/tests/linux/sctp/api_tests/setsockopt/sctp_rtoinfo_3.pkt b/gtests/net/packetdrill/tests/linux/sctp/api_tests/setsockopt/sctp_rtoinfo_3.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..164ace174e5380211078cf1eb8b541825b2c1be4
--- /dev/null
+++ b/gtests/net/packetdrill/tests/linux/sctp/api_tests/setsockopt/sctp_rtoinfo_3.pkt
@@ -0,0 +1,11 @@
+--tolerance_usecs=100000
+
+ 0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
++0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
++0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
++0.0 bind(3, ..., ...) = 0
+
+// Check sctp_rtoinfo for one-to-one style check if srto_assoc_id is ignored
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=200, srto_max=400, srto_min=100}, 16) = 0
++0 setsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=3, srto_initial=100, srto_max=200, srto_min=50}, 16) = 0
++0 getsockopt(3, IPPROTO_SCTP, SCTP_RTOINFO, {srto_assoc_id=0, srto_initial=100, srto_max=200, srto_min=50}, [16]) = 0