diff --git a/src/or/control.c b/src/or/control.c
index d237f8feb1..fb74d7d6f3 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -6233,6 +6233,27 @@ get_desc_id_from_query(const rend_data_t *rend_data, const char *hsdir_fp)
return desc_id;
}
+/** send HS_DESC CREATED event when a local service generates a descriptor.
+ *
+ * service_id is the descriptor onion address.
+ * desc_id_base32 is the descriptor ID.
+ */
+void
+control_event_hs_descriptor_created(const char *service_id,
+ const char *desc_id_base32)
+{
+ if (!service_id || !desc_id_base32) {
+ log_warn(LD_BUG, "Called with service_digest==%p, "
+ "desc_id_base32==%p", service_id, desc_id_base32);
+ return;
+ }
+
+ send_control_event(EVENT_HS_DESC,
+ "650 HS_DESC CREATED %s UNKNOWN UNKNOWN %s\r\n",
+ service_id,
+ desc_id_base32);
+}
+
/** send HS_DESC upload event.
*
* service_id is the descriptor onion address.
diff --git a/src/or/control.h b/src/or/control.h
index fdf7903cb8..26f7f50b88 100644
--- a/src/or/control.h
+++ b/src/or/control.h
@@ -117,6 +117,8 @@ MOCK_DECL(const char *, node_describe_longname_by_id,(const char *id_digest));
void control_event_hs_descriptor_requested(const rend_data_t *rend_query,
const char *desc_id_base32,
const char *hs_dir);
+void control_event_hs_descriptor_created(const char *service_id,
+ const char *desc_id_base32);
void control_event_hs_descriptor_upload(const char *service_id,
const char *desc_id_base32,
const char *hs_dir);