diff sip-out/e911.c @ 259:9f96e5b14755

sip-out: implement E911 special handling
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 15 Aug 2023 11:28:30 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sip-out/e911.c	Tue Aug 15 11:28:30 2023 -0800
@@ -0,0 +1,48 @@
+/*
+ * In this module we implement E911 routing, i.e., special handling
+ * for calls to either the real 911 or E911 test numbers.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <syslog.h>
+#include "../include/mncc.h"
+#include "../include/gsm48_const.h"
+#include "../include/number_db_v2.h"
+#include "../libnumdb2/lookup_func.h"
+
+e911_call_preen(msg)
+	struct gsm_mncc *msg;
+{
+	struct owned_number_rec *nr;
+
+	syslog(LOG_NOTICE, "E911 call attempt from %s to %s, emergency flag %d",
+		msg->calling.number, msg->called.number, msg->emergency);
+	refresh_number_db();
+	nr = numdb_lookup_nanp(msg->calling.number+1);
+	if (!nr) {
+		syslog(LOG_NOTICE,
+		"E911 call rejected: calling number is not in database");
+		return 0;
+	}
+	if (nr->number_flags & NUMBER_FLAG_E911PROV) {
+		syslog(LOG_NOTICE,
+			"E911 call allowed: calling number has E911 flag set");
+		return 1;
+	}
+	if (nr->usage & NUMBER_USAGE_FLAG_E911_VIA) {
+		sprintf(msg->calling.number, "1%03u%03u%04u",
+			nr->remap[0], nr->remap[1], nr->remap[2]);
+		syslog(LOG_NOTICE, "E911 call: source number changed to %s",
+			msg->calling.number);
+		return 1;
+	}
+	syslog(LOG_NOTICE,
+		"E911 call rejected: calling number is not E911-provisioned");
+	return 0;
+}