From c907a1f7c672b34fbb9ed346859e23caf9d58c81 Mon Sep 17 00:00:00 2001
From: Jens Hoelscher <jens.hoelscher@fh-muenster.de>
Date: Sat, 9 Jan 2016 17:16:25 +0100
Subject: [PATCH] add Symbols for linux sockopts

---
 gtests/net/packetdrill/run_system_call.c      | 53 ++++++-------------
 gtests/net/packetdrill/symbols_linux.c        | 47 ++++++++++++++++
 .../api_tests/cmsgs/sendmsg_sctp_init.pkt     | 19 ++-----
 .../getsockopt/sctp_i_want_mapped_v4_addr.pkt |  1 +
 .../api_tests/getsockopt/sctp_nodelay.pkt     |  5 +-
 .../api_tests/getsockopt/sctp_rtoinfo.pkt     |  1 +
 6 files changed, 71 insertions(+), 55 deletions(-)

diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c
index 3aca6257..0f90f550 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;
@@ -3327,7 +3318,7 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
 
 	live_result = getsockopt(live_fd, level, optname, live_optval, &live_optlen);
 
-	if (end_syscall(state, syscall, CHECK_NON_NEGATIVE, live_result, error)) {
+	if (end_syscall(state, syscall, CHECK_EXACT, live_result, 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 3f7deb54..64e2e0f9 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 d92e3f7a..ce84ba4a 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
@@ -8,27 +8,14 @@
 
 +0.0 sendmsg(3, {msg_name(...)=...,
 		 msg_iov(1)=[{iov_base=..., iov_len=1000}],
-		 msg_control(64)=[{cmsg_len=20,
+		 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=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
+					      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=...]]
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 1b0fbf0f..5ad5fcdc 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 0745ab4b..3bcaeb63 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_rtoinfo.pkt b/gtests/net/packetdrill/tests/bsd/sctp/api_tests/getsockopt/sctp_rtoinfo.pkt
index 554879b1..edfa41e0 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
-- 
GitLab