OBJS += server_fork.o
OBJS += server_pool.o
OBJS += server_run.o
+
OBJS += helper.o
+OBJS += resolve_helper.o
+
OBJS += hash_table.o list_entry.o
OBJS += timer.o
OBJS += ikev2_host_pair.o
* down the main thread with cryptography, increasing throughput.
*/
-#ifndef HELPERS_H
-#define HELPERS_H
+#ifndef HELPER_H
+#define HELPER_H
+
+#include <stdint.h> /* for uintmax_t; */
+
+#include "where.h"
#include "verbose.h"
struct help_request;
+struct refcnt;
#define alloc_help_request(WHAT, DISCARD_CONTENT, OWNER) \
({ \
--- /dev/null
+/* resolve helper, for libreswan
+ *
+ * Copyright (C) 2025 Andrew Cagney
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See <https://www.gnu.org/licenses/gpl2.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ */
+
+#include "resolve_helper.h"
+
+#include "refcnt.h"
+#include "defaultroute.h"
+
+#include "extract.h"
+#include "helper.h"
+#include "connections.h"
+#include "log.h"
+
+static helper_fn resolve_helper;
+static helper_cb resolve_continue;
+
+static refcnt_discard_content_fn discard_resolve_help_request_content;
+
+struct help_request {
+ refcnt_t refcnt;
+ struct whack_message_refcnt *wmr;
+ struct extracted_host_addrs extracted_host_addrs;
+ struct resolved_host_addrs resolved_host_addrs;
+ resolve_helper_cb *callback;
+};
+
+void discard_resolve_help_request_content(void *pointer, const struct logger *owner, where_t where)
+{
+ struct help_request *request = pointer;
+ refcnt_delref(&request->wmr, owner, where);
+}
+
+void request_resolve_help(struct whack_message_refcnt *wmr,
+ const struct extracted_host_addrs *extracted_host_addrs,
+ resolve_helper_cb *callback,
+ struct logger *logger)
+{
+ struct help_request *request = alloc_help_request("resolve helper",
+ discard_resolve_help_request_content,
+ logger);
+ request->wmr = refcnt_addref(wmr, logger, HERE);
+ request->extracted_host_addrs = (*extracted_host_addrs);
+ request->callback = callback;
+ request_help(request, resolve_helper, logger);
+}
+
+helper_cb *resolve_helper(struct help_request *request,
+ struct verbose verbose,
+ enum helper_id helper_id UNUSED)
+{
+ request->resolved_host_addrs = resolve_extracted_host_addrs(&request->extracted_host_addrs, verbose);
+ return resolve_continue;
+}
+
+void resolve_continue(struct help_request *request,
+ struct verbose verbose)
+{
+ request->callback(request->wmr,
+ &request->extracted_host_addrs,
+ &request->resolved_host_addrs,
+ verbose);
+}
--- /dev/null
+/* resolve helper, for libreswan
+ *
+ * Copyright (C) 2025 Andrew Cagney
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See <https://www.gnu.org/licenses/gpl2.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ */
+
+#ifndef RESOLVE_HELPER_H
+#define RESOLVE_HELPER_H
+
+#include "verbose.h"
+
+struct whack_message_refcnt;
+struct extracted_host_addrs;
+struct resolved_host_addrs;
+struct logger;
+
+typedef void (resolve_helper_cb)(struct whack_message_refcnt *wmr,
+ const struct extracted_host_addrs *extracted_host_addrs,
+ const struct resolved_host_addrs *resolved_host_addrs,
+ struct verbose verbose);
+
+void request_resolve_help(struct whack_message_refcnt *wmr,
+ const struct extracted_host_addrs *extracted_host_addrs,
+ resolve_helper_cb *callback,
+ struct logger *logger);
+
+#endif
#include "connections.h"
#include "whack_delete.h"
#include "extract.h"
-#include "helper.h"
+#include "resolve_helper.h"
-static helper_fn add_connections_resolve_helper;
-static helper_cb add_connections_resolve_continue;
-
-static refcnt_discard_content_fn discard_whack_add_request_content;
-
-struct help_request {
- refcnt_t refcnt;
- struct whack_message_refcnt *wmr;
- struct extracted_host_addrs extracted_host_addrs;
- struct resolved_host_addrs resolved_host_addrs;
-};
-
-void discard_whack_add_request_content(void *pointer, const struct logger *owner, where_t where)
-{
- struct help_request *request = pointer;
- refcnt_delref(&request->wmr, owner, where);
-}
+static resolve_helper_cb add_connections_resolve_continue;
PRINTF_LIKE(2)
static void llog_add_connection_failed(struct verbose verbose,
}
-static void submit_add_connections(struct whack_message_refcnt *wmr,
- const struct extracted_host_addrs *extracted_host_addrs,
- struct logger *logger)
-{
- struct help_request *request = alloc_help_request("ipsec add: resolve",
- discard_whack_add_request_content,
- logger);
- request->wmr = refcnt_addref(wmr, logger, HERE);
- request->extracted_host_addrs = (*extracted_host_addrs);
- request_help(request, add_connections_resolve_helper, logger);
-}
-
-helper_cb *add_connections_resolve_helper(struct help_request *request,
- struct verbose verbose,
- enum helper_id helper_id UNUSED)
-{
- request->resolved_host_addrs = resolve_extracted_host_addrs(&request->extracted_host_addrs, verbose);
- return add_connections_resolve_continue;
-}
-
-void add_connections_resolve_continue(struct help_request *request,
+void add_connections_resolve_continue(struct whack_message_refcnt *wmr,
+ const struct extracted_host_addrs *extracted_host_addrs,
+ const struct resolved_host_addrs *resolved_host_addrs,
struct verbose verbose)
{
- const struct whack_message *wm = &request->wmr->wm;
+ const struct whack_message *wm = &wmr->wm;
/*
* Reject {left,right}subnets=... combined with
/* basic case, nothing special to synthize! */
if (!have_subnets) {
diag_t d = add_connection(wm,
- &request->extracted_host_addrs,
- &request->resolved_host_addrs,
+ extracted_host_addrs,
+ resolved_host_addrs,
verbose.logger);
if (d != NULL) {
llog_add_connection_failed(verbose, "%s", str_diag(d));
}
permutate_connection_subnets(wm,
- &request->extracted_host_addrs,
- &request->resolved_host_addrs,
+ extracted_host_addrs,
+ resolved_host_addrs,
&left, &right, verbose);
pfreeany(left.subnets.list);
pfreeany(right.subnets.list);
return;
}
- submit_add_connections(wmr, &extracted_host_addrs, conn_logger);
+ request_resolve_help(wmr, &extracted_host_addrs,
+ add_connections_resolve_continue,
+ conn_logger);
}
free_logger(&conn_logger, HERE);
}