dect
/
asterisk
Archived
13
0
Fork 0

Rename a couple variables, to be consistent with the rest of the functions

Abstract out some common code into a single function

With the recent scheduler "issues", it pointed out a few things I might have been missing,
  so I added some rudimentary vrtp and rtcp stuff

General cleanup...


git-svn-id: http://svn.digium.com/svn/asterisk/trunk@37629 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
north 2006-07-14 20:14:38 +00:00
parent 91e87fec3e
commit 668f726c39
1 changed files with 124 additions and 108 deletions

View File

@ -1584,30 +1584,30 @@ static void do_housekeeping(struct skinnysession *s)
/* I do not believe skinny can deal with video.
Anyone know differently? */
/* Yes, it can. Currently 7985 and Cisco VT Advantage do video. */
static struct ast_rtp *skinny_get_vrtp_peer(struct ast_channel *chan)
static struct ast_rtp *skinny_get_vrtp_peer(struct ast_channel *c)
{
struct skinny_subchannel *sub;
sub = chan->tech_pvt;
sub = c->tech_pvt;
if (sub && sub->vrtp) {
return sub->vrtp;
}
return NULL;
}
static struct ast_rtp *skinny_get_rtp_peer(struct ast_channel *chan)
static struct ast_rtp *skinny_get_rtp_peer(struct ast_channel *c)
{
struct skinny_subchannel *sub;
sub = chan->tech_pvt;
sub = c->tech_pvt;
if (sub && sub->rtp) {
return sub->rtp;
}
return NULL;
}
static int skinny_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs, int nat_active)
static int skinny_set_rtp_peer(struct ast_channel *c, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs, int nat_active)
{
struct skinny_subchannel *sub;
sub = chan->tech_pvt;
sub = c->tech_pvt;
if (sub) {
/* transmit_modify_with_sdp(sub, rtp); @@FIXME@@ if needed */
return 0;
@ -2026,24 +2026,60 @@ static void start_rtp(struct skinny_subchannel *sub)
{
struct skinny_line *l = sub->parent;
struct skinny_device *d = l->parent;
int hasvideo = 0;
ast_mutex_lock(&sub->lock);
/* Allocate the RTP */
sub->rtp = ast_rtp_new(sched, io, 1, 0);
sub->rtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, bindaddr.sin_addr);
if (hasvideo)
sub->vrtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, bindaddr.sin_addr);
if (sub->rtp && sub->owner) {
sub->owner->fds[0] = ast_rtp_fd(sub->rtp);
sub->owner->fds[1] = ast_rtcp_fd(sub->rtp);
}
if (hasvideo && sub->vrtp && sub->owner) {
sub->owner->fds[2] = ast_rtp_fd(sub->vrtp);
sub->owner->fds[3] = ast_rtcp_fd(sub->vrtp);
}
if (sub->rtp) {
ast_rtp_setnat(sub->rtp, l->nat);
}
if (sub->vrtp) {
ast_rtp_setnat(sub->vrtp, l->nat);
}
/* Create the RTP connection */
transmit_connect(d->session, sub);
ast_mutex_unlock(&sub->lock);
}
static void *skinny_newcall(void *data)
{
struct ast_channel *c = data;
struct skinny_subchannel *sub = c->tech_pvt;
struct skinny_line *l = sub->parent;
struct skinny_device *d = l->parent;
struct skinnysession *s = d->session;
int res = 0;
ast_copy_string(l->lastnumberdialed, c->exten, sizeof(l->lastnumberdialed));
ast_set_callerid(c,
l->hidecallerid ? "" : l->cid_num,
l->hidecallerid ? "" : l->cid_name,
c->cid.cid_ani ? NULL : l->cid_num);
ast_setstate(c, AST_STATE_RING);
res = ast_pbx_run(c);
if (res) {
ast_log(LOG_WARNING, "PBX exited non-zero\n");
transmit_tone(s, SKINNY_REORDER);
}
return NULL;
}
static void *skinny_ss(void *data)
{
struct ast_channel *chan = data;
struct skinny_subchannel *sub = chan->tech_pvt;
struct ast_channel *c = data;
struct skinny_subchannel *sub = c->tech_pvt;
struct skinny_line *l = sub->parent;
struct skinny_device *d = l->parent;
struct skinnysession *s = d->session;
@ -2056,53 +2092,44 @@ static void *skinny_ss(void *data)
if (option_verbose > 2)
ast_verbose( VERBOSE_PREFIX_3 "Starting simple switch on '%s@%s'\n", l->name, d->name);
while (len < AST_MAX_EXTENSION-1) {
res = ast_waitfordigit(chan, timeout);
res = ast_waitfordigit(c, timeout);
timeout = 0;
if (res < 0) {
if (skinnydebug)
ast_verbose("Skinny(%s@%s): waitfordigit returned < 0\n", l->name, d->name);
ast_indicate(chan, -1);
ast_hangup(chan);
ast_indicate(c, -1);
ast_hangup(c);
return NULL;
} else if (res) {
exten[len++]=res;
exten[len] = '\0';
}
if (!ast_ignore_pattern(chan->context, exten)) {
if (!ast_ignore_pattern(c->context, exten)) {
transmit_tone(s, SKINNY_SILENCE);
}
if (ast_exists_extension(chan, chan->context, exten, 1, l->cid_num)) {
if (!res || !ast_matchmore_extension(chan, chan->context, exten, 1, l->cid_num)) {
if (ast_exists_extension(c, c->context, exten, 1, l->cid_num)) {
if (!res || !ast_matchmore_extension(c, c->context, exten, 1, l->cid_num)) {
if (getforward) {
/* Record this as the forwarding extension */
ast_copy_string(l->call_forward, exten, sizeof(l->call_forward));
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Setting call forward to '%s' on channel %s\n",
l->call_forward, chan->name);
l->call_forward, c->name);
transmit_tone(s, SKINNY_DIALTONE);
if (res) {
break;
}
ast_safe_sleep(chan, 500);
ast_indicate(chan, -1);
ast_safe_sleep(chan, 1000);
ast_safe_sleep(c, 500);
ast_indicate(c, -1);
ast_safe_sleep(c, 1000);
memset(exten, 0, sizeof(exten));
transmit_tone(s, SKINNY_DIALTONE);
len = 0;
getforward = 0;
} else {
ast_copy_string(chan->exten, exten, sizeof(chan->exten));
ast_copy_string(c->exten, exten, sizeof(c->exten));
ast_copy_string(l->lastnumberdialed, exten, sizeof(l->lastnumberdialed));
ast_set_callerid(chan,
l->hidecallerid ? "" : l->cid_num,
l->hidecallerid ? "" : l->cid_name,
chan->cid.cid_ani ? NULL : l->cid_num);
ast_setstate(chan, AST_STATE_RING);
res = ast_pbx_run(chan);
if (res) {
ast_log(LOG_WARNING, "PBX exited non-zero\n");
transmit_tone(s, SKINNY_REORDER);
}
skinny_newcall(c);
return NULL;
}
} else {
@ -2113,24 +2140,24 @@ static void *skinny_ss(void *data)
} else if (res == 0) {
ast_log(LOG_DEBUG, "Not enough digits (and no ambiguous match)...\n");
transmit_tone(s, SKINNY_REORDER);
ast_hangup(chan);
ast_hangup(c);
return NULL;
} else if (!ast_canmatch_extension(chan, chan->context, exten, 1, chan->cid.cid_num) &&
} else if (!ast_canmatch_extension(c, c->context, exten, 1, c->cid.cid_num) &&
((exten[0] != '*') || (!ast_strlen_zero(exten) > 2))) {
ast_log(LOG_WARNING, "Can't match [%s] from '%s' in context %s\n", exten, chan->cid.cid_num ? chan->cid.cid_num : "<Unknown Caller>", chan->context);
ast_log(LOG_WARNING, "Can't match [%s] from '%s' in context %s\n", exten, c->cid.cid_num ? c->cid.cid_num : "<Unknown Caller>", c->context);
transmit_tone(s, SKINNY_REORDER);
/* hang out for 3 seconds to let congestion play */
ast_safe_sleep(chan, 3000);
ast_safe_sleep(c, 3000);
break;
}
if (!timeout) {
timeout = gendigittimeout;
}
if (len && !ast_ignore_pattern(chan->context, exten)) {
ast_indicate(chan, -1);
if (len && !ast_ignore_pattern(c->context, exten)) {
ast_indicate(c, -1);
}
}
ast_hangup(chan);
ast_hangup(c);
return NULL;
}
@ -2143,7 +2170,7 @@ static int skinny_call(struct ast_channel *ast, char *dest, int timeout)
struct skinny_subchannel *sub = ast->tech_pvt;
struct skinny_line *l = sub->parent;
struct skinny_device *d = l->parent;
struct skinnysession *session = d->session;
struct skinnysession *s = d->session;
if (!d->registered) {
ast_log(LOG_ERROR, "Device not registered, cannot call %s\n", dest);
@ -2175,14 +2202,14 @@ static int skinny_call(struct ast_channel *ast, char *dest, int timeout)
break;
}
transmit_lamp_indication(session, STIMULUS_LINE, l->instance, SKINNY_LAMP_BLINK);
transmit_ringer_mode(session, SKINNY_RING_INSIDE);
transmit_lamp_indication(s, STIMULUS_LINE, l->instance, SKINNY_LAMP_BLINK);
transmit_ringer_mode(s, SKINNY_RING_INSIDE);
transmit_tone(session, tone);
transmit_callstate(session, l->instance, SKINNY_RINGIN, sub->callid);
transmit_displaypromptstatus(session, "Ring-In", 0, l->instance, sub->callid);
transmit_callinfo(session, ast->cid.cid_name, ast->cid.cid_num, l->cid_name, l->cid_num, l->instance, sub->callid, 1);
transmit_selectsoftkeys(session, l->instance, sub->callid, KEYDEF_RINGIN);
transmit_tone(s, tone);
transmit_callinfo(s, ast->cid.cid_name, ast->cid.cid_num, l->cid_name, l->cid_num, l->instance, sub->callid, 1);
transmit_callstate(s, l->instance, SKINNY_RINGIN, sub->callid);
transmit_displaypromptstatus(s, "Ring-In", 0, l->instance, sub->callid);
transmit_selectsoftkeys(s, l->instance, sub->callid, KEYDEF_RINGIN);
ast_setstate(ast, AST_STATE_RINGING);
ast_queue_control(ast, AST_CONTROL_RINGING);
@ -2269,7 +2296,34 @@ static struct ast_frame *skinny_rtp_read(struct skinny_subchannel *sub)
struct ast_channel *ast = sub->owner;
struct ast_frame *f;
f = ast_rtp_read(sub->rtp);
if (!sub->rtp) {
/* We have no RTP allocated for this channel */
return &ast_null_frame;
}
switch(ast->fdno) {
case 0:
f = ast_rtp_read(sub->rtp); /* RTP Audio */
break;
case 1:
f = ast_rtcp_read(sub->rtp); /* RTCP Control Channel */
break;
case 2:
f = ast_rtp_read(sub->vrtp); /* RTP Video */
break;
case 3:
f = ast_rtcp_read(sub->vrtp); /* RTCP Control Channel for video */
break;
#if 0
case 5:
/* Not yet supported */
f = ast_udptl_read(sub->udptl); /* UDPTL for T.38 */
break;
#endif
default:
f = &ast_null_frame;
}
if (ast) {
/* We already hold the channel lock */
if (f->frametype == AST_FRAME_VOICE) {
@ -2614,6 +2668,7 @@ static int handle_keypad_button_message(skinny_req *req, struct skinnysession *s
digit = letohl(req->data.keypad.button);
lineInstance = letohl(req->data.keypad.lineInstance);
callReference = letohl(req->data.keypad.callReference);
f.frametype = AST_FRAME_DTMF;
if (digit == 14) {
dgt = '*';
@ -2690,17 +2745,15 @@ static int handle_stimulus_message(skinny_req *req, struct skinnysession *s)
switch(event) {
case STIMULUS_REDIAL:
/* If we can keep an array of dialed frames we can implement a quick
and dirty redial, feeding the frames we last got into the queue
function */
if (skinnydebug)
ast_verbose("Received Stimulus: Redial(%d)\n", instance);
#if 0
c = skinny_new(l, AST_STATE_DOWN);
if(c) {
if(!c) {
ast_log(LOG_WARNING, "Unable to create channel for %s@%s\n", l->name, d->name);
} else {
sub = c->tech_pvt;
l = sub->parent;
transmit_callstate(s, l->instance, SKINNY_OFFHOOK, sub->callid);
if (skinnydebug)
ast_verbose("Attempting to Clear display on Skinny %s@%s\n", l->name, d->name);
@ -2714,24 +2767,11 @@ static int handle_stimulus_message(skinny_req *req, struct skinnysession *s)
if (!ast_ignore_pattern(c->context, l->lastnumberdialed)) {
transmit_tone(s, SKINNY_SILENCE);
}
if (ast_exists_extension(c, c->context, l->lastnumberdialed, 1, l->cid_num)) {
if (!ast_matchmore_extension(c, c->context, l->lastnumberdialed, 1, l->cid_num)) {
ast_copy_string(c->exten, l->lastnumberdialed, sizeof(c->exten));
ast_set_callerid(c,
l->hidecallerid ? "" : l->cid_num,
l->hidecallerid ? "" : l->cid_name,
c->cid.cid_ani ? NULL : l->cid_num);
ast_setstate(c, AST_STATE_RING);
res = ast_pbx_run(c);
if (res) {
ast_log(LOG_WARNING, "PBX exited non-zero\n");
transmit_tone(s, SKINNY_REORDER);
}
break;
}
ast_copy_string(c->exten, l->lastnumberdialed, sizeof(c->exten));
if (ast_pthread_create(&t, NULL, skinny_newcall, c)) {
ast_log(LOG_WARNING, "Unable to create new call thread: %s\n", strerror(errno));
ast_hangup(c);
}
} else {
ast_log(LOG_WARNING, "Unable to create channel for %s@%s\n", l->name, d->name);
}
#endif
break;
@ -2761,16 +2801,7 @@ static int handle_stimulus_message(skinny_req *req, struct skinnysession *s)
if (!ast_matchmore_extension(c, c->context, sd->exten, 1, l->cid_num)) {
ast_copy_string(c->exten, sd->exten, sizeof(c->exten));
ast_copy_string(l->lastnumberdialed, sd->exten, sizeof(l->lastnumberdialed));
ast_set_callerid(c,
l->hidecallerid ? "" : l->cid_num,
l->hidecallerid ? "" : l->cid_name,
c->cid.cid_ani ? NULL : l->cid_num);
ast_setstate(c, AST_STATE_RING);
res = ast_pbx_run(c);
if (res) {
ast_log(LOG_WARNING, "PBX exited non-zero\n");
transmit_tone(s, SKINNY_REORDER);
}
skinny_newcall(c);
break;
}
}
@ -3356,7 +3387,6 @@ static int handle_soft_key_event_message(skinny_req *req, struct skinnysession *
int event;
int instance;
int reference;
/*int res;*/
event = letohl(req->data.softkeyeventmessage.softKeyEvent);
instance = letohl(req->data.softkeyeventmessage.instance);
@ -3389,21 +3419,22 @@ static int handle_soft_key_event_message(skinny_req *req, struct skinnysession *
ast_verbose("Received Softkey Event: Redial(%d)\n", instance);
#if 0
if (sub)
transmit_callstate(s, l->instance, SKINNY_OFFHOOK, sub->callid);
if (skinnydebug)
ast_verbose("Attempting to Clear display on Skinny %s@%s\n", l->name, d->name);
transmit_displaymessage(s, NULL); /* clear display */
transmit_tone(s, SKINNY_DIALTONE);
if (!sub) {
if (!sub || !sub->owner) {
c = skinny_new(l, AST_STATE_DOWN);
} else {
c = sub->owner;
}
if(c) {
if(!c) {
ast_log(LOG_WARNING, "Unable to create channel for %s@%s\n", l->name, d->name);
} else {
sub = c->tech_pvt;
transmit_callstate(s, l->instance, SKINNY_OFFHOOK, sub->callid);
if (skinnydebug)
ast_verbose("Attempting to Clear display on Skinny %s@%s\n", l->name, d->name);
transmit_displaymessage(s, NULL); /* clear display */
transmit_tone(s, SKINNY_DIALTONE);
if (ast_strlen_zero(l->lastnumberdialed)) {
ast_log(LOG_WARNING, "Attempted redial, but no previously dialed number found.\n");
return 0;
@ -3411,25 +3442,11 @@ static int handle_soft_key_event_message(skinny_req *req, struct skinnysession *
if (!ast_ignore_pattern(c->context, l->lastnumberdialed)) {
transmit_tone(s, SKINNY_SILENCE);
}
start_rtp(sub);
if (ast_exists_extension(c, c->context, l->lastnumberdialed, 1, l->cid_num)) {
if (!ast_matchmore_extension(c, c->context, l->lastnumberdialed, 1, l->cid_num)) {
ast_copy_string(c->exten, l->lastnumberdialed, sizeof(c->exten));
ast_set_callerid(c,
l->hidecallerid ? "" : l->cid_num,
l->hidecallerid ? "" : l->cid_name,
c->cid.cid_ani ? NULL : l->cid_num);
ast_setstate(c, AST_STATE_RING);
res = ast_pbx_run(c);
if (res) {
ast_log(LOG_WARNING, "PBX exited non-zero\n");
transmit_tone(s, SKINNY_REORDER);
}
break;
}
ast_copy_string(c->exten, l->lastnumberdialed, sizeof(c->exten));
if (ast_pthread_create(&t, NULL, skinny_newcall, c)) {
ast_log(LOG_WARNING, "Unable to create new call thread: %s\n", strerror(errno));
ast_hangup(c);
}
} else {
ast_log(LOG_WARNING, "Unable to create channel for %s@%s\n", l->name, d->name);
}
#endif
break;
@ -4289,8 +4306,7 @@ static int load_module(void *mod)
static int unload_module(void *mod)
{
#if 0
struct skinnysession *session, s;
struct skinny_line *l = session;
struct skinnysession *s;
/* close all IP connections */
if (!ast_mutex_lock(&devicelock)) {