diff --git a/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/recvmsg.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..bf44947527a16a98c19550410182fff1011606e2
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/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/bsd/sctp/api_tests/cmsgs/sendmsg.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..7dec990876a50acf1949cf4c9a10ea43c7510f4b
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/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/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_authinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_authinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..73287130a3a050b27916cf1e786abff955ab266d
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/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/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv4.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_dstaddrv4.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c298b1777c8c2c2a304873edaf5fc9431cb56b22
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/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/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..d92e3f7ac26bde06922d8f6e75af91759c7e045a
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_init.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/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_prinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_prinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..c4b32245c416cf9deea5da37838636cb601d4dc3
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/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/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..b0ec2423b804e0b6bfa3e78c4960e2d891409394
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndinfo.pkt
@@ -0,0 +1,74 @@
+--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 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/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt
new file mode 100644
index 0000000000000000000000000000000000000000..983b51e791d3c029fecc3c86bf9eec224f319233
--- /dev/null
+++ b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/cmsgs/sendmsg_sctp_sndrcv.pkt
@@ -0,0 +1,100 @@
+--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 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]