[asterisk-commits] oej: branch oej/midcomstuff r53714 - in
/team/oej/midcomstuff: channels/ incl...
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Fri Feb 9 09:14:39 MST 2007
Author: oej
Date: Fri Feb 9 10:14:38 2007
New Revision: 53714
URL: http://svn.digium.com/view/asterisk?view=rev&rev=53714
Log:
Adding a hook in rtp.c so that the midcom module registers to the core
and the SIP module checks whether or not we have midcom loaded.
Also, add a notifier so that RTP.c can notify SIP if the netsec
module is unloaded by force.
Thirdly, add a shutdown mode in res_netsec, so that no new calls will be handled
by the midcom device during shutdown.
Modified:
team/oej/midcomstuff/channels/chan_sip.c
team/oej/midcomstuff/include/asterisk/rtp.h
team/oej/midcomstuff/main/rtp.c
team/oej/midcomstuff/res/res_netsec.c
Modified: team/oej/midcomstuff/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/oej/midcomstuff/channels/chan_sip.c?view=diff&rev=53714&r1=53713&r2=53714
==============================================================================
--- team/oej/midcomstuff/channels/chan_sip.c (original)
+++ team/oej/midcomstuff/channels/chan_sip.c Fri Feb 9 10:14:38 2007
@@ -1551,7 +1551,8 @@
static void sip_get_capability_helper(void *p, int *codec, int *dtmf_payload);
static void sip_softhangup_helper(void *p);
-extern struct ast_sip_hook_cb *midcom_cb;
+/*! Hook for midcom */
+struct ast_sip_hook_cb *midcom_cb = NULL;
#endif
/*! \brief Definition of this channel for PBX channel registration */
@@ -1751,6 +1752,16 @@
struct sip_pvt *dialog = (struct sip_pvt *) p;
if (dialog && (dialog->owner))
ast_softhangup(dialog->owner, AST_SOFTHANGUP_APPUNLOAD);
+}
+
+/*! \brief Activate or deactivate midcom */
+static int sip_midcom_notify(int state)
+{
+ if (!state)
+ midcom_cb = NULL;
+ else
+ midcom_cb = (struct ast_sip_hook_cb *) midcom_gethook(&sip_midcom_notify);
+ return TRUE;
}
#endif
@@ -17533,6 +17544,7 @@
#ifdef SIP_MIDCOM
/* Register the sip helper functions */
+ sip_midcom_notify(TRUE);
if (midcom_cb)
midcom_cb->ast_sip_helper_register(&sip_helper);
#endif
Modified: team/oej/midcomstuff/include/asterisk/rtp.h
URL: http://svn.digium.com/view/asterisk/team/oej/midcomstuff/include/asterisk/rtp.h?view=diff&rev=53714&r1=53713&r2=53714
==============================================================================
--- team/oej/midcomstuff/include/asterisk/rtp.h (original)
+++ team/oej/midcomstuff/include/asterisk/rtp.h Fri Feb 9 10:14:38 2007
@@ -238,6 +238,12 @@
/* \brief Put RTP timeout timers on hold during another transaction, like T.38 */
void ast_rtp_set_rtptimers_onhold(struct ast_rtp *rtp);
+/*! \brief Midcom stub function to register midcom module */
+void midcom_register(void (* const midcom_gethook)(void));
+
+/*! \brief Get midcom hook to enable midcom support in channel module */
+void *midcom_gethook(int (* midcom_notify)(int));
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
Modified: team/oej/midcomstuff/main/rtp.c
URL: http://svn.digium.com/view/asterisk/team/oej/midcomstuff/main/rtp.c?view=diff&rev=53714&r1=53713&r2=53714
==============================================================================
--- team/oej/midcomstuff/main/rtp.c (original)
+++ team/oej/midcomstuff/main/rtp.c Fri Feb 9 10:14:38 2007
@@ -3658,3 +3658,29 @@
ast_rtp_reload();
}
+/*! Hook to function that returns an ast_sip_hook_cb (res_netsec.h) to
+ connect to the netsec midcom support module */
+void *midcom_init;
+
+/*! Pointer back to the channel to notify about unload of midcom
+ \note This will need to be a list when we have multiple channel clients
+*/
+int (* midcom_client_notify)(int);
+
+/*! Register midcom module */
+void midcom_register(void (* const midcom_hook)(void))
+{
+ midcom_init = (void *) midcom_hook;
+ if (midcom_client_notify)
+ (midcom_client_notify)(midcom_init ? 1 : 0);
+}
+
+/*! Get hook to midcom module
+ Needs a callback module to the channel that gets the hook,
+ so we can alert of changes.
+*/
+void *midcom_gethook(int (* midcom_notify)(int))
+{
+ midcom_client_notify = midcom_notify;
+ return midcom_init;
+}
Modified: team/oej/midcomstuff/res/res_netsec.c
URL: http://svn.digium.com/view/asterisk/team/oej/midcomstuff/res/res_netsec.c?view=diff&rev=53714&r1=53713&r2=53714
==============================================================================
--- team/oej/midcomstuff/res/res_netsec.c (original)
+++ team/oej/midcomstuff/res/res_netsec.c Fri Feb 9 10:14:38 2007
@@ -111,8 +111,16 @@
#define MIDCOM_NO_INIT 0x2
#define MIDCOM_NO_TIMER 0x4
+static int shutdown_proceeding;
static int usecnt = 0;
AST_MUTEX_DEFINE_STATIC(usecnt_lock);
+
+#ifndef TRUE
+ #define TRUE 1
+#endif
+#ifndef FALSE
+ #define FALSE 0
+#endif
typedef enum {
@@ -308,7 +316,7 @@
{ { "netsec", "show", "version", NULL }, midcom_show_version, "Display the current version of the res_netsec module", show_version_usage }
};
-/*--- midcom_sip: Interface structure with callbacks used to connect to sip module --*/
+/*! \brief midcom_sip: Interface structure with callbacks used to connect to sip module --*/
static struct ast_sip_hook_cb sip_hook = {
handle_request_invite_hook: midcom_handle_request_invite_hook,
handle_response_invite_hook: midcom_handle_response_invite_hook,
@@ -338,6 +346,7 @@
static int load_module(void)
{
+ shutdown_proceeding = FALSE;
midcom_enabled = 0;
midcom_err_state = 0;
if (midcom_config_reload()) {
@@ -358,7 +367,7 @@
}
/* Register the sip hook functions */
- midcom_cb = &sip_hook;
+ midcom_register((void *) &sip_hook);
/* Register all CLI functions for midcom */
ast_cli_register_multiple(my_clis, sizeof(my_clis)/ sizeof(my_clis[0]));
@@ -374,6 +383,7 @@
struct midcom_rule *r;
struct connection *c, *tconn;
+ shutdown_proceeding = TRUE;
r = midcom_rule_head;
if (r) {
if (!ast_mutex_lock(&netsec_lock)) {
@@ -409,8 +419,9 @@
}
ast_mutex_destroy(&netsec_lock);
+
/* Unregister the sip hook functions */
- midcom_cb = NULL;
+ midcom_register(NULL);
ast_cli_unregister_multiple(my_clis, sizeof(my_clis)/ sizeof(my_clis[0]));
mc_close();
@@ -422,12 +433,11 @@
-/*--- midcom_enable_firewall: Turn on Midcom firewall (CLI command) */
+/*! \brief midcom_enable_firewall: Turn on Midcom firewall (CLI command) */
static int midcom_enable_firewall(int fd, int argc, char *argv[])
{
int oldflag = midcom_enabled;
- if(midcom_err_state)
- {
+ if(midcom_err_state) {
ast_cli(fd, "Can not enable firewall. Module in inconsistent state. Run status command for more information\n");
return RESULT_FAILURE;
}
@@ -441,7 +451,7 @@
return RESULT_SUCCESS;
}
-/*--- midcom_disable_firewall: Turn off Midcom firewall (CLI command) */
+/*! \brief midcom_disable_firewall: Turn off Midcom firewall (CLI command) */
static int midcom_disable_firewall(int fd, int argc, char *argv[])
{
if (argc != 3)
@@ -451,7 +461,7 @@
return RESULT_SUCCESS;
}
-/*--- midcom_show_firewall: Show Midcom firewall rules (CLI command) */
+/*! \brief midcom_show_firewall: Show Midcom firewall rules (CLI command) */
static int midcom_show_firewall(int fd, int argc, char *argv[])
{
regex_t regexbuf;
@@ -619,7 +629,7 @@
}
-/*--- midcom_show_version: Show the current version of Midcom module */
+/*! \brief midcom_show_version: Show the current version of Midcom module */
static int midcom_show_version(int fd, int argc, char *argv[])
{
@@ -630,7 +640,7 @@
}
-/*--- midcom_enable_debug: Enable debug prints on the Midcom module */
+/*! \brief midcom_enable_debug: Enable debug prints on the Midcom module */
static int midcom_enable_debug(int fd, int argc, char *argv[])
{
@@ -642,7 +652,7 @@
}
-/*--- midcom_disable_debug: Disable debug prints on the Midcom module */
+/*! \brief midcom_disable_debug: Disable debug prints on the Midcom module */
static int midcom_disable_debug(int fd, int argc, char *argv[])
{
@@ -822,6 +832,9 @@
{
struct midcom_rule *r = NULL;
+ if (shutdown_proceeding)
+ return 0;
+
if (!midcom_enabled) {
ast_log(LOG_ERROR, "Midcom: Module not enabled\n");
if (option_verbose > 1)
@@ -883,6 +896,9 @@
static int midcom_transmit_response_with_sdp_hook(void *p)
{
struct midcom_rule *r = NULL;
+
+ if (shutdown_proceeding)
+ return 0;
if (!midcom_enabled) {
ast_log(LOG_ERROR, "Midcom: Module not enabled\n");
@@ -946,6 +962,9 @@
int ret = 0;
struct midcom_rule *r = NULL;
+ if (shutdown_proceeding)
+ return 0;
+
if (!midcom_enabled) {
ast_log(LOG_ERROR, "Midcom: Module not enabled\n");
if (option_verbose > 1)
@@ -985,6 +1004,10 @@
struct connection *conn=NULL;
int lifetime;
int first_phone = 0;
+
+ if (shutdown_proceeding)
+ return 0;
+
if (option_debug)
ast_log(LOG_DEBUG, "MIDCOM :: We are here!\n");
More information about the asterisk-commits
mailing list