From e563992c0990420b5c41c6f53b559147f6b7a7e2 Mon Sep 17 00:00:00 2001
From: Michael Tuexen <tuexen@fh-muenster.de>
Date: Sat, 12 Aug 2017 22:56:08 +0200
Subject: [PATCH] SO_ACCEPTFILTER is also supported by NetBSD.

---
 gtests/net/packetdrill/parser.y |  4 ++--
 gtests/net/packetdrill/script.c | 12 +++++++++---
 gtests/net/packetdrill/script.h | 20 +++++++++++++-------
 3 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/gtests/net/packetdrill/parser.y b/gtests/net/packetdrill/parser.y
index a2081b66..faa05584 100644
--- a/gtests/net/packetdrill/parser.y
+++ b/gtests/net/packetdrill/parser.y
@@ -3244,7 +3244,7 @@ af_arg
 
 accept_filter_arg
 : '{' af_name '}' {
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__NetBSD__)
 	$$ = new_expression(EXPR_ACCEPT_FILTER_ARG);
 	$$->value.accept_filter_arg = calloc(1, sizeof(struct accept_filter_arg_expr));
 	$$->value.accept_filter_arg->af_name = $2;
@@ -3254,7 +3254,7 @@ accept_filter_arg
 #endif
 }
 | '{' af_name ',' af_arg '}' {
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__NetBSD__)
 	$$ = new_expression(EXPR_ACCEPT_FILTER_ARG);
 	$$->value.accept_filter_arg = calloc(1, sizeof(struct accept_filter_arg_expr));
 	$$->value.accept_filter_arg->af_name = $2;
diff --git a/gtests/net/packetdrill/script.c b/gtests/net/packetdrill/script.c
index 822e9cf3..eb00bd09 100644
--- a/gtests/net/packetdrill/script.c
+++ b/gtests/net/packetdrill/script.c
@@ -68,9 +68,11 @@ struct expression_type_entry expression_type_table[] = {
 	{ EXPR_MSGHDR,                      "msghdr"                          },
 	{ EXPR_CMSGHDR,                     "cmsghdr"                         },
 	{ EXPR_POLLFD,                      "pollfd"                          },
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+	{ EXPR_ACCEPT_FILTER_ARG,           "accept_filter_arg"               },
+#endif
 #if defined(__FreeBSD__)
 	{ EXPR_SF_HDTR,                     "sf_hdtr"                         },
-	{ EXPR_ACCEPT_FILTER_ARG,           "accept_filter_arg"               },
 	{ EXPR_TCP_FUNCTION_SET,            "tcp_function_set"                },
 #endif
 	{ EXPR_SCTP_RTOINFO,                "sctp_rtoinfo"                    },
@@ -333,12 +335,14 @@ void free_expression(struct expression *expression)
 		free_expression(expression->value.linger->l_onoff);
 		free_expression(expression->value.linger->l_linger);
 		break;
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) || defined(__NetBSD__)
 	case EXPR_ACCEPT_FILTER_ARG:
 		assert(expression->value.accept_filter_arg);
 		free_expression(expression->value.accept_filter_arg->af_name);
 		free_expression(expression->value.accept_filter_arg->af_arg);
 		break;
+#endif
+#if defined(__FreeBSD__)
 	case EXPR_TCP_FUNCTION_SET:
 		assert(expression->value.tcp_function_set);
 		free_expression(expression->value.tcp_function_set->function_set_name);
@@ -2773,11 +2777,13 @@ static int evaluate(struct expression *in,
 		memcpy(&out->value.linger, &in->value.linger,
 		       sizeof(in->value.linger));
 		break;
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__) | defined(__NetBSD__)
 	case EXPR_ACCEPT_FILTER_ARG:		/* copy as-is */
 		memcpy(&out->value.accept_filter_arg, &in->value.accept_filter_arg,
 		       sizeof(in->value.accept_filter_arg));
 		break;
+#endif
+#if defined(__FreeBSD__)
 	case EXPR_TCP_FUNCTION_SET:		/* copy as-is */
 		memcpy(&out->value.tcp_function_set, &in->value.tcp_function_set,
 		       sizeof(in->value.tcp_function_set));
diff --git a/gtests/net/packetdrill/script.h b/gtests/net/packetdrill/script.h
index 030d45ab..31c69416 100644
--- a/gtests/net/packetdrill/script.h
+++ b/gtests/net/packetdrill/script.h
@@ -47,9 +47,11 @@ enum expression_t {
 	EXPR_MSGHDR,		  /* expression tree for a msghdr struct */
 	EXPR_CMSGHDR,             /* expression tree for a cmsghdr struct */
 	EXPR_POLLFD,		  /* expression tree for a pollfd struct */
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+	EXPR_ACCEPT_FILTER_ARG,	  /* struct accept_filter_arg */
+#endif
 #if defined(__FreeBSD__)
 	EXPR_SF_HDTR,		  /* struct sf_hdtr for sendfile */
-	EXPR_ACCEPT_FILTER_ARG,	  /* struct accept_filter_arg */
 	EXPR_TCP_FUNCTION_SET,	  /* struct tcp_function_set */
 #endif
 	EXPR_SCTP_RTOINFO,	  /* struct sctp_rtoinfo for SCTP_RTOINFO */
@@ -119,9 +121,11 @@ struct expression {
 		struct msghdr_expr *msghdr;
 		struct cmsghdr_expr *cmsghdr;
 		struct pollfd_expr *pollfd;
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+		struct accept_filter_arg_expr *accept_filter_arg;
+#endif
 #if defined(__FreeBSD__)
 		struct sf_hdtr_expr *sf_hdtr;
-		struct accept_filter_arg_expr *accept_filter_arg;
 		struct tcp_function_set_expr *tcp_function_set;
 #endif
 		struct sctp_rtoinfo_expr *sctp_rtoinfo;
@@ -228,6 +232,13 @@ struct linger_expr {
 	struct expression *l_linger;
 };
 
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+struct accept_filter_arg_expr {
+	struct expression *af_name;
+	struct expression *af_arg;
+};
+#endif
+
 #if defined(__FreeBSD__)
 /* Parse tree for a sf_hdtr struct in a sendfile syscall. */
 struct sf_hdtr_expr {
@@ -237,11 +248,6 @@ struct sf_hdtr_expr {
 	struct expression *trl_cnt;
 };
 
-struct accept_filter_arg_expr {
-	struct expression *af_name;
-	struct expression *af_arg;
-};
-
 struct tcp_function_set_expr {
 	struct expression *function_set_name;
 	struct expression *pcbcnt;
-- 
GitLab