diff sip-in/invite.c @ 49:dec31b1a8b96

sip-in: check Require and Supported
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 06 Sep 2022 22:57:16 -0800
parents 8117d8ee44a5
children daf1c26d7ae2
line wrap: on
line diff
--- a/sip-in/invite.c	Tue Sep 06 22:07:51 2022 -0800
+++ b/sip-in/invite.c	Tue Sep 06 22:57:16 2022 -0800
@@ -13,8 +13,11 @@
 #include <unistd.h>
 #include "../libsip/parse.h"
 #include "../libsip/uas_basic.h"
+#include "../libsip/req_supp.h"
 #include "../libsip/out_msg.h"
 
+extern int cfg_use_100rel;
+
 void
 handle_sip_invite(req, ess, sin)
 	struct sip_pkt_rx *req;
@@ -23,6 +26,9 @@
 {
 	char uri_user[13], *called_nanp;
 	struct sip_msg_out resp;
+	struct supported_ext supp_ext;
+	char *unsup_ext;
+	int ext_100rel_req, ext_100rel_sup, use_100rel;
 	int rc;
 
 	/* check for existing Call-ID will go here */
@@ -33,7 +39,7 @@
 			"416 Request-URI is not a NANP number");
 error_resp:	rc = add_resp_basic_headers(&resp, ess, req->req_method);
 		if (rc < 0) {
-			syslog(LOG_ERR,
+error_resp_toolong:	syslog(LOG_ERR,
 				"INVITE error response length exceeded");
 			return;
 		}
@@ -67,9 +73,27 @@
 			"404 Called number does not belong here");
 		goto error_resp;
 	}
+	/* check 100rel and catch any unsupported requirements */
+	supp_ext.name = "100rel";
+	supp_ext.req_flag = &ext_100rel_req;
+	supp_ext.sup_flag = &ext_100rel_sup;
+	ext_100rel_req = ext_100rel_sup = 0;
+	rc = parse_require_supported(req, &supp_ext, 1, &unsup_ext);
+	if (rc < 0) {
+		start_response_out_msg(&resp, "420 Extension not supported");
+		rc = out_msg_add_header(&resp, "Unsupported", unsup_ext);
+		if (rc < 0)
+			goto error_resp_toolong;
+		goto error_resp;
+	}
+	if (ext_100rel_req)
+		use_100rel = 1;
+	else if (ext_100rel_sup)
+		use_100rel = cfg_use_100rel;
+	else
+		use_100rel = 0;
 	/*
 	 * Remaining checks to be implemented:
-	 * Require and Supported headers
 	 * SDP message body
 	 */
 }