[asterisk-commits] oej: branch oej/midcom-0.5.3.2 r53575 -
/team/oej/midcom-0.5.3.2/
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Thu Feb 8 09:31:20 MST 2007
Author: oej
Date: Thu Feb 8 10:31:19 2007
New Revision: 53575
URL: http://svn.digium.com/view/asterisk?view=rev&rev=53575
Log:
Update
Modified:
team/oej/midcom-0.5.3.2/res_netsec.c
team/oej/midcom-0.5.3.2/res_netsec.h
Modified: team/oej/midcom-0.5.3.2/res_netsec.c
URL: http://svn.digium.com/view/asterisk/team/oej/midcom-0.5.3.2/res_netsec.c?view=diff&rev=53575&r1=53574&r2=53575
==============================================================================
--- team/oej/midcom-0.5.3.2/res_netsec.c (original)
+++ team/oej/midcom-0.5.3.2/res_netsec.c Thu Feb 8 10:31:19 2007
@@ -24,6 +24,26 @@
*
*/
+/*! \file
+ * res_netsec.c -- Provides the MIDCOM services to Asterisk
+ *
+ * \author Srivatsa Chivukula <srivatsa at ranchnetworks.com>
+ *
+ * \todo
+ * - Create registration in rtp.c for a remote RTP handler
+ * - Make interface less SIP-specific (this can be used for
+ * all RTP based channels - H.323, jingle, mgcp)
+ * - Make source code follow coding guidelines
+ * - Check licensing
+ * - Fix proper reload function
+ - How does this affect midcom connections to a device?
+ * - fix autoconfigure to set MIDCOM_EXISTS flag if libmidcom is installed
+ */
+
+/*** MODULEINFO
+ <depend>libmidcom</depend>
+***/
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -67,12 +87,13 @@
#define MIDCOM_MAX_SIMCO_RETRY_CNT 1
static const char version[] = "Libmidcom version 0.5.3.2";
-static const char desc[] = "MiddleBox Communication Module (MIDCOM)";
+static const char desc[] = "MiddleBox Communication Module (MIDCOM/SIMCO)";
static unsigned int midcomnat = FAREND;
static char cert[512];
static char* config = "midcom.conf";
static int midcom_enabled = 1;
static int midcom_err_state = 0;
+static int told_them_that_midcom_is_not_enabled = 0;
#define MIDCOM_NO_CONFIG 0x1
#define MIDCOM_NO_INIT 0x2
@@ -110,60 +131,68 @@
static timer_task_context_t *timer_context_create(void);
static void timer_context_delete(timer_task_context_t *ttc);
+*! Midcom ruleset, one per session (pvt)
+ \note this structure needs a pointer in the channel's
+ pvt structure
+*/
+
static struct midcom_rule {
- char username[256];
- unsigned int nat_done:1,
+ char username[256];
+ unsigned int nat_done:1,
firewall_done:1,
bridge_done:1,
bye_done:1,
novideo:1,
enable_rtcp:1,
- bridged_node:1, /* bridged_node = 1 - bridging done throught this rule */
+ bridged_node:1, /*!< bridged_node = 1 - bridging done throught this rule */
tls:1,
invalid:1,
audio_to_asterisk:1,
video_to_asterisk:1,
- may_xfer_call:1, /* call may be transferred to another extension */
+ may_xfer_call:1, /*!< call may be transferred to another extension */
unused:20;
- struct connection *conn; /* midbox to which we are talking to for this rule */
+ struct connection *conn; /*!< midbox to which we are talking to for this rule */
int ruleid;
int vruleid;
int aux_ruleid;
int aux_vruleid;
- struct sockaddr_in our_internal_addr; /* audio - internal address of the endpoint (pre NAT) */
- struct sockaddr_in our_external_addr; /* audio - external address of the endpoint (post NAT) */
- struct sockaddr_in our_natted_addr; /* audio - address assigned to endpoint by Midbox */
- struct sockaddr_in our_internal_vaddr; /* video - internal address of the endpoint (pre NAT) */
- struct sockaddr_in our_external_vaddr; /* video - external address of the endpoint (post NAT) */
- struct sockaddr_in our_natted_vaddr; /* video - address assigned to endpoint by Midbox */
+ struct sockaddr_in our_internal_addr; /*!< audio - internal address of the endpoint (pre NAT) */
+ struct sockaddr_in our_external_addr; /*!< audio - external address of the endpoint (post NAT) */
+ struct sockaddr_in our_natted_addr; /*!< audio - address assigned to endpoint by Midbox */
+ struct sockaddr_in our_internal_vaddr; /*!< video - internal address of the endpoint (pre NAT) */
+ struct sockaddr_in our_external_vaddr; /*!< video - external address of the endpoint (post NAT) */
+ struct sockaddr_in our_natted_vaddr; /*!< video - address assigned to endpoint by Midbox */
+ /* XXX For Asterisk 1.6, we need text RTP. */
int lifetime;
timer_id_t timer_handle;
- void *p; /* handle to tech pvt data structure */
- struct midcom_rule *pr; /* peer MIDCOM rule for the other leg of a bridged call. */
+ void *p; /*!< handle to tech pvt data structure */
+ struct midcom_rule *pr; /*!< peer MIDCOM rule for the other leg of a bridged call. */
struct midcom_rule *next;
} *midcom_rule_head = NULL;
+/*! \brief midcom connection to the remote device */
static struct connection {
- struct in_addr ipaddress;
- char name[256];
- char username[256];
- char password[256];
- int tls;
- int location;
- int role;
- int sock;
- int pingsock;
- mbox_state_t state;
- ast_mutex_t lock;
- unsigned int thread; /* thread currently holding lock */
- timer_id_t timer_handle;
- struct connection *next;
+ struct in_addr ipaddress;
+ char name[256];
+ char username[256];
+ char password[256];
+ int tls;
+ int location;
+ int role;
+ int sock;
+ int pingsock;
+ mbox_state_t state;
+ ast_mutex_t lock;
+ unsigned int thread; /* thread currently holding lock */
+ timer_id_t timer_handle;
+ struct connection *next;
} *connl = NULL;
-/* Protect the midcom rule list */
+/*! \brief Protect the midcom rule list */
AST_MUTEX_DEFINE_STATIC(netsec_lock);
+/*! Forward declarations */
static int midcom_config_reload(void);
static struct connection * get_primary_midbox(void);
@@ -213,7 +242,7 @@
static void midcom_get_vredirip_video_hook(void *r, struct sockaddr_in *vredirip);
static void midcom_rtp_get_their_nat_audio_hook(struct ast_rtp *rtp, void *r);
static void midcom_rtp_get_their_nat_video_hook(struct ast_rtp *vrtp, void *r);
-static void midcom_sip_helper_register(struct ast_sip_helper_cb *cb);
+static void midcom_sip_helper_register(struct ast_rtp_helper_cb *cb);
static void midcom_sip_helper_unregister(void);
static struct midcom_rule *get_peer_rule(struct midcom_rule *r);
@@ -225,7 +254,7 @@
static int midcom_mutex_lock(ast_mutex_t *mutex);
static int midcom_mutex_unlock(ast_mutex_t *mutex);
-static struct ast_sip_helper_cb *sip_cb = NULL;
+static struct ast_rtp_helper_cb *channel_cb = NULL;
struct ast_sip_hook_cb *m_cb = NULL; /*move this to the core asterisk files */
@@ -280,18 +309,18 @@
ast_get_vredirip_video_hook: midcom_get_vredirip_video_hook,
ast_rtp_get_their_nat_audio_hook: midcom_rtp_get_their_nat_audio_hook,
ast_rtp_get_their_nat_video_hook: midcom_rtp_get_their_nat_video_hook,
- ast_sip_helper_register: midcom_sip_helper_register,
- ast_sip_helper_unregister: midcom_sip_helper_unregister,
+ ast_rtp_helper_cb: midcom_sip_helper_register,
+ ast_rtp_helper_cb: midcom_sip_helper_unregister,
};
-static void midcom_sip_helper_register(struct ast_sip_helper_cb *cb)
-{
- sip_cb = cb;
+static void midcom_sip_helper_register(struct ast_rtp_helper_cb *cb)
+{
+ channel_cb = cb;
}
static void midcom_sip_helper_unregister(void)
{
- sip_cb = NULL;
+ channel_cb = NULL;
}
@@ -338,8 +367,8 @@
if (!ast_mutex_lock(&netsec_lock)) {
/* Hangup all interfaces if they have an owner */
while (r) {
- if (sip_cb)
- sip_cb->ast_softhangup_helper(r->p);
+ if (channel_cb)
+ channel_cb->ast_softhangup_helper(r->p);
r = r->next;
}
midcom_rule_head = NULL;
@@ -775,12 +804,12 @@
return NULL;
}
memset(r, 0, sizeof(struct midcom_rule));
- r->novideo = (sip_cb->ast_get_flag_novideo(p)) ? 1 : 0;
- sip_cb->ast_rtp_get_peer_audio_helper(p, &r->our_internal_addr);
+ r->novideo = (channel_cb->ast_get_flag_novideo(p)) ? 1 : 0;
+ channel_cb->ast_rtp_get_peer_audio_helper(p, &r->our_internal_addr);
if (!r->novideo) {
- sip_cb->ast_rtp_get_peer_video_helper(p, &r->our_internal_vaddr);
- }
- strncpy(r->username, sip_cb->ast_get_username(p), 256);
+ channel_cb->ast_rtp_get_peer_video_helper(p, &r->our_internal_vaddr);
+ }
+ strncpy(r->username, channel_cb->ast_get_username(p), 256);
r->ruleid = -1;
r->vruleid = -1;
r->aux_ruleid = -1;
@@ -807,14 +836,14 @@
return 1;
}
- if (!sip_cb) {
+ if (!channel_cb) {
ast_log(LOG_ERROR, "Midcom: Module not initialized properly\n");
if (option_verbose > 1)
ast_verbose("Midcom: Error!! - Module not initialized\n");
return 0;
}
- if ((r = sip_cb->ast_get_hook_struct(p)))
+ if ((r = channel_cb->ast_get_hook_struct(p)))
return 1;
r = midcom_rule_alloc(p);
@@ -848,7 +877,7 @@
}
if (debug_midbox)
ast_log(LOG_DEBUG, "Acquired netsec_lock in the context of thread id 0x%x\n", (unsigned) pthread_self());
- sip_cb->ast_map_hook_struct(p, (void *)r);
+ channel_cb->ast_map_hook_struct(p, (void *)r);
r->next = midcom_rule_head;
midcom_rule_head = r;
ast_mutex_unlock(&netsec_lock);
@@ -869,14 +898,14 @@
return 1;
}
- if (!sip_cb) {
+ if (!channel_cb) {
ast_log(LOG_ERROR, "Midcom: Module not initialized properly\n");
if (option_verbose > 1)
ast_verbose("Midcom: Error!! - Module not initialized\n");
return 0;
}
- if ((r = sip_cb->ast_get_hook_struct(p)))
+ if ((r = channel_cb->ast_get_hook_struct(p)))
return 1;
r = midcom_rule_alloc(p);
@@ -885,7 +914,7 @@
if (option_verbose > 1)
ast_verbose("Midcom: Allocating new rule for phone: %s\n", r->username);
- /* sip_cb->ast_get_recv_addr(p, &r->midbox_addr); */
+ /* channel_cb->ast_get_recv_addr(p, &r->midbox_addr); */
if ( (r->conn = get_primary_midbox()) == NULL)
return 0;
if(midcom_open_firewall(r, MIDCOM_ALLOW_AUDIO, MIDCOM_ALLOW_VIDEO) != 0)
@@ -909,7 +938,7 @@
}
if (debug_midbox)
ast_log(LOG_DEBUG, "Acquired netsec_lock in the context of thread id 0x%x\n", (unsigned) pthread_self());
- sip_cb->ast_map_hook_struct(p, (void *)r);
+ channel_cb->ast_map_hook_struct(p, (void *)r);
r->next = midcom_rule_head;
midcom_rule_head = r;
ast_mutex_unlock(&netsec_lock);
@@ -931,18 +960,18 @@
return 1;
}
- if (!sip_cb) {
+ if (!channel_cb) {
ast_log(LOG_ERROR, "Midcom: Module not initialized properly\n");
if (option_verbose > 1)
ast_verbose("Midcom: Error!! - Module not initialized\n");
return 0;
}
- if (!(r = sip_cb->ast_get_hook_struct(p))) {
-
- ast_log(LOG_ERROR, "Midcom: Unable to retrieve Midcom Rule for phone: %s\n", sip_cb->ast_get_username(p));
+ if (!(r = channel_cb->ast_get_hook_struct(p))) {
+
+ ast_log(LOG_ERROR, "Midcom: Unable to retrieve Midcom Rule for phone: %s\n", channel_cb->ast_get_username(p));
if (option_verbose > 1)
- ast_verbose("Midcom: Error!! - Unable to retrieve Midcom Rule for phone: %s\n", sip_cb->ast_get_username(p));
+ ast_verbose("Midcom: Error!! - Unable to retrieve Midcom Rule for phone: %s\n", channel_cb->ast_get_username(p));
return 0;
}
@@ -1131,7 +1160,7 @@
ast_verbose("Midcom: Trying to rebridge audio between %s and %s\n", r->username, r->pr ? r->pr->username : '\0');
midcom_delete_rule(rule->conn, rule->aux_ruleid, rule);
rule->aux_ruleid = -1;
- sip_cb->ast_get_capability_helper(r->p, &codec, 0);
+ channel_cb->ast_get_capability_helper(r->p, &codec, 0);
res = midcom_bridge_firewall( r, pr, MIDCOM_BRIDGE_AUDIO, 0 );
if (res != 0)
@@ -1166,7 +1195,7 @@
midcom_delete_rule(r->conn, r->aux_vruleid, r);
r->aux_vruleid = -1;
- sip_cb->ast_get_capability_helper(r->p, &codec, 0);
+ channel_cb->ast_get_capability_helper(r->p, &codec, 0);
res = midcom_bridge_firewall( r, pr, 0, MIDCOM_BRIDGE_VIDEO );
if (res != 0)
@@ -1203,14 +1232,14 @@
char *username=NULL;
struct midcom_rule *peer=NULL;
- if (!sip_cb) {
+ if (!channel_cb) {
ast_log(LOG_DEBUG, "Midcom: Module not initialized properly\n");
return 1;
}
- if (!(s = sip_cb->ast_get_hook_struct(p))) {
-
- username = sip_cb->ast_get_username(p);
+ if (!(s = channel_cb->ast_get_hook_struct(p))) {
+
+ username = channel_cb->ast_get_username(p);
if (midcom_enabled && username && username[0]) {
ast_log(LOG_DEBUG, "Midcom: Unable to retrieve Midcom Rule for phone: %s\n", username);
}
@@ -1707,8 +1736,8 @@
ast_log(LOG_DEBUG, "Acquired connection lock in the context of thread id 0x%x\n", (unsigned) pthread_self());
if( allow_audio )
{
- sip_cb->ast_rtp_get_us_audio_helper(r->p, &sin, 0);
- sip_cb->ast_get_capability_helper(r->p, &acodec, 0);
+ channel_cb->ast_rtp_get_us_audio_helper(r->p, &sin, 0);
+ channel_cb->ast_get_capability_helper(r->p, &acodec, 0);
memset((void*)&spacket, 0, sizeof(simcoPacket_t));
ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr);
@@ -1743,10 +1772,10 @@
if( allow_video && !r->novideo )
{
- sip_cb->ast_rtp_get_us_video_helper(r->p, &sin);
+ channel_cb->ast_rtp_get_us_video_helper(r->p, &sin);
#if 0
/* We need to get the actual video codec here */
- vcodec = sip_cb->ast_get_capability_helper(r->p);
+ vcodec = channel_cb->ast_get_capability_helper(r->p);
#endif
memset((void*)&spacket, 0, sizeof(simcoPacket_t));
ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr);
@@ -1868,11 +1897,11 @@
ast_log(LOG_DEBUG, "Acquired connection lock in the context of thread id 0x%x\n", (unsigned) pthread_self());
if( bridge_audio )
{
- sip_cb->ast_get_capability_helper(r->p, &acodec, &dtmf_payload0);
- sip_cb->ast_get_capability_helper(peer->p, &acodec, &dtmf_payload1);
-
- sip_cb->ast_rtp_get_us_audio_helper(r->p, &sin, &pbx_rtp0);
- sip_cb->ast_rtp_get_us_audio_helper(peer->p, &sin, &pbx_rtp1);
+ channel_cb->ast_get_capability_helper(r->p, &acodec, &dtmf_payload0);
+ channel_cb->ast_get_capability_helper(peer->p, &acodec, &dtmf_payload1);
+
+ channel_cb->ast_rtp_get_us_audio_helper(r->p, &sin, &pbx_rtp0);
+ channel_cb->ast_rtp_get_us_audio_helper(peer->p, &sin, &pbx_rtp1);
memset((void*)&spacket, 0, sizeof(simcoPacket_t));
spacket.ruleId = r->ruleid;
@@ -1925,7 +1954,7 @@
{
#if 0
/* Need to determine video codec here */
- vcodec = sip_cb->ast_get_capability_helper(r->p);
+ vcodec = channel_cb->ast_get_capability_helper(r->p);
#endif
memset((void*)&spacket, 0, sizeof(simcoPacket_t));
spacket.ruleId = r->vruleid;
@@ -2273,8 +2302,8 @@
struct connection *conn= NULL;
char *loc = "Master";
- sip_cb->ast_get_recv_addr(rule->p, &my_endpoint);
- sip_cb->ast_get_recv_addr(peer->p, &peer_endpoint);
+ channel_cb->ast_get_recv_addr(rule->p, &my_endpoint);
+ channel_cb->ast_get_recv_addr(peer->p, &peer_endpoint);
if (option_verbose > 30)
ast_verbose("Midcom: Phone: %s My endpoint: %s Peer Endpoint: %s, Midbox addr: %s\n", rule->username, ast_inet_ntoa(iabuf, sizeof(iabuf), my_endpoint), ast_inet_ntoa(iabuf1, sizeof(iabuf1), peer_endpoint), rule->conn ? (ast_inet_ntoa(iabuf2, sizeof(iabuf2), rule->conn->ipaddress)) : "");
@@ -2324,10 +2353,10 @@
if (r && r->p) { /* pure paranoia */
- my_chan = sip_cb->ast_channel_helper(r->p);
- peer_chan = sip_cb->ast_bridged_channel_helper(r->p);
+ my_chan = channel_cb->ast_channel_helper(r->p);
+ peer_chan = channel_cb->ast_bridged_channel_helper(r->p);
if (peer_chan && peer_chan->tech_pvt && (my_chan->tech == peer_chan->tech))
- peer_rule = sip_cb->ast_get_hook_struct(peer_chan->tech_pvt);
+ peer_rule = channel_cb->ast_get_hook_struct(peer_chan->tech_pvt);
}
return peer_rule;
}
Modified: team/oej/midcom-0.5.3.2/res_netsec.h
URL: http://svn.digium.com/view/asterisk/team/oej/midcom-0.5.3.2/res_netsec.h?view=diff&rev=53575&r1=53574&r2=53575
==============================================================================
--- team/oej/midcom-0.5.3.2/res_netsec.h (original)
+++ team/oej/midcom-0.5.3.2/res_netsec.h Thu Feb 8 10:31:19 2007
@@ -20,10 +20,16 @@
*
*/
+/*! \file res_netsec.h
+ This file glues res_netsec to client channels
+ *
+ * \author Srivatsa Chivukula <srivatsa at ranchnetworks.com>
+*/
extern int midcom_load_module(void);
extern void midcom_unload_module(void);
-struct ast_sip_helper_cb {
+/* The RTP helper module */
+struct ast_rtp_helper_cb {
void (* const ast_rtp_get_peer_audio_helper)(void *p, struct sockaddr_in *them);
void (* const ast_rtp_get_peer_video_helper)(void *p, struct sockaddr_in *them);
void (* const ast_rtp_get_us_audio_helper)(void *p, struct sockaddr_in *sin, struct sockaddr_in *pbx_rtp);
@@ -40,6 +46,15 @@
void (* const ast_softhangup_helper)(void *p);
};
+/*! Hooks into the SIP channel
+ \note Can we make this more generic so it works for other channels
+ or do we need to have one per channel?
+ I think we can define various stages in the media setup process
+ instead or "transmit_response_with_sdp" etc - those are
+ function calls and not states.
+ A good way would be to compare chan_jingle and chan_sip
+ to find these hooks.
+*/
struct ast_sip_hook_cb {
int (* const handle_request_invite_hook)(void *p);
int (* const handle_response_invite_hook)(void *p);
@@ -52,7 +67,7 @@
void (* const ast_get_vredirip_video_hook)(void *r, struct sockaddr_in *vredirip);
void (* const ast_rtp_get_their_nat_audio_hook)(struct ast_rtp *rtp, void *r);
void (* const ast_rtp_get_their_nat_video_hook)(struct ast_rtp *vrtp, void *r);
- void (* const ast_sip_helper_register)(struct ast_sip_helper_cb *cb);
+ void (* const ast_sip_helper_register)(struct ast_rtp_helper_cb *cb);
void (* const ast_sip_helper_unregister)(void);
};
More information about the asterisk-commits
mailing list