aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_iax2.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2005-11-06 05:52:26 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2005-11-06 05:52:26 +0000
commit5e884c9971ecb4d8f8ef76652d3359898d8f4d0e (patch)
tree755c54ddddccabc85b40cc04ae951bad453a65b1 /channels/chan_iax2.c
parentfcb15a4b4fc921db8dde736ba7a797bcf1718ad2 (diff)
use enum's for iax user/peer flags, and for pvt state
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6976 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax2.c')
-rwxr-xr-xchannels/chan_iax2.c122
1 files changed, 63 insertions, 59 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 151318bf2..ca3d162ed 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -224,38 +224,42 @@ static struct ast_flags globalflags = { 0 };
static pthread_t netthreadid = AST_PTHREADT_NULL;
-#define IAX_STATE_STARTED (1 << 0)
-#define IAX_STATE_AUTHENTICATED (1 << 1)
-#define IAX_STATE_TBD (1 << 2)
+enum {
+ IAX_STATE_STARTED = (1 << 0),
+ IAX_STATE_AUTHENTICATED = (1 << 1),
+ IAX_STATE_TBD = (1 << 2)
+} iax2_state;
struct iax2_context {
char context[AST_MAX_CONTEXT];
struct iax2_context *next;
};
-#define IAX_HASCALLERID (1 << 0) /*!< CallerID has been specified */
-#define IAX_DELME (1 << 1) /*!< Needs to be deleted */
-#define IAX_TEMPONLY (1 << 2) /*!< Temporary (realtime) */
-#define IAX_TRUNK (1 << 3) /*!< Treat as a trunk */
-#define IAX_NOTRANSFER (1 << 4) /*!< Don't native bridge */
-#define IAX_USEJITTERBUF (1 << 5) /*!< Use jitter buffer */
-#define IAX_DYNAMIC (1 << 6) /*!< dynamic peer */
-#define IAX_SENDANI (1 << 7) /*!< Send ANI along with CallerID */
-#define IAX_MESSAGEDETAIL (1 << 8) /*!< Show exact numbers */
-#define IAX_ALREADYGONE (1 << 9) /*!< Already disconnected */
-#define IAX_PROVISION (1 << 10) /*!< This is a provisioning request */
-#define IAX_QUELCH (1 << 11) /*!< Whether or not we quelch audio */
-#define IAX_ENCRYPTED (1 << 12) /*!< Whether we should assume encrypted tx/rx */
-#define IAX_KEYPOPULATED (1 << 13) /*!< Whether we have a key populated */
-#define IAX_CODEC_USER_FIRST (1 << 14) /*!< are we willing to let the other guy choose the codec? */
-#define IAX_CODEC_NOPREFS (1 << 15) /*!< Force old behaviour by turning off prefs */
-#define IAX_CODEC_NOCAP (1 << 16) /*!< only consider requested format and ignore capabilities*/
-#define IAX_RTCACHEFRIENDS (1 << 17) /*!< let realtime stay till your reload */
-#define IAX_RTUPDATE (1 << 18) /*!< Send a realtime update */
-#define IAX_RTAUTOCLEAR (1 << 19) /*!< erase me on expire */
-#define IAX_FORCEJITTERBUF (1 << 20) /*!< Force jitterbuffer, even when bridged to a channel that can take jitter */
-#define IAX_RTIGNOREREGEXPIRE (1 << 21) /*!< When using realtime, ignore registration expiration */
-#define IAX_TRUNKTIMESTAMPS (1 << 22) /*!< Send trunk timestamps */
+enum {
+ IAX_HASCALLERID = (1 << 0), /*!< CallerID has been specified */
+ IAX_DELME = (1 << 1), /*!< Needs to be deleted */
+ IAX_TEMPONLY = (1 << 2), /*!< Temporary (realtime) */
+ IAX_TRUNK = (1 << 3), /*!< Treat as a trunk */
+ IAX_NOTRANSFER = (1 << 4), /*!< Don't native bridge */
+ IAX_USEJITTERBUF = (1 << 5), /*!< Use jitter buffer */
+ IAX_DYNAMIC = (1 << 6), /*!< dynamic peer */
+ IAX_SENDANI = (1 << 7), /*!< Send ANI along with CallerID */
+ IAX_MESSAGEDETAIL = (1 << 8), /*!< Show exact numbers */
+ IAX_ALREADYGONE = (1 << 9), /*!< Already disconnected */
+ IAX_PROVISION = (1 << 10), /*!< This is a provisioning request */
+ IAX_QUELCH = (1 << 11), /*!< Whether or not we quelch audio */
+ IAX_ENCRYPTED = (1 << 12), /*!< Whether we should assume encrypted tx/rx */
+ IAX_KEYPOPULATED = (1 << 13), /*!< Whether we have a key populated */
+ IAX_CODEC_USER_FIRST = (1 << 14), /*!< are we willing to let the other guy choose the codec? */
+ IAX_CODEC_NOPREFS = (1 << 15), /*!< Force old behaviour by turning off prefs */
+ IAX_CODEC_NOCAP = (1 << 16), /*!< only consider requested format and ignore capabilities*/
+ IAX_RTCACHEFRIENDS = (1 << 17), /*!< let realtime stay till your reload */
+ IAX_RTUPDATE = (1 << 18), /*!< Send a realtime update */
+ IAX_RTAUTOCLEAR = (1 << 19), /*!< erase me on expire */
+ IAX_FORCEJITTERBUF = (1 << 20), /*!< Force jitterbuffer, even when bridged to a channel that can take jitter */
+ IAX_RTIGNOREREGEXPIRE = (1 << 21), /*!< When using realtime, ignore registration expiration */
+ IAX_TRUNKTIMESTAMPS = (1 << 22) /*!< Send trunk timestamps */
+} iax2_flags;
static int global_rtautoclear = 120;
@@ -489,7 +493,7 @@ struct chan_iax2_pvt {
/*! Owner if we have one */
struct ast_channel *owner;
/*! What's our state? */
- int state;
+ struct ast_flags state;
/*! Expiry (optional) */
int expiry;
/*! Next outgoing sequence number */
@@ -4600,7 +4604,7 @@ static int iax2_write(struct ast_channel *c, struct ast_frame *f)
res = 0;
else if ((f->frametype == AST_FRAME_VOICE) && ast_test_flag(iaxs[callno], IAX_QUELCH))
res = 0;
- else if (!(iaxs[callno]->state & IAX_STATE_STARTED))
+ else if (!ast_test_flag(&iaxs[callno]->state, IAX_STATE_STARTED))
res = 0;
else
/* Simple, just queue for transmission */
@@ -4928,7 +4932,7 @@ static int authenticate_verify(struct chan_iax2_pvt *p, struct iax_ies *ies)
int res = -1;
int x;
- if (!(p->state & IAX_STATE_AUTHENTICATED))
+ if (!ast_test_flag(&p->state, IAX_STATE_AUTHENTICATED))
return res;
if (ies->password)
ast_copy_string(secret, ies->password, sizeof(secret));
@@ -4995,7 +4999,7 @@ static int register_verify(int callno, struct sockaddr_in *sin, struct iax_ies *
int x;
int expire = 0;
- iaxs[callno]->state &= ~IAX_STATE_AUTHENTICATED;
+ ast_clear_flag(&iaxs[callno]->state, IAX_STATE_AUTHENTICATED);
iaxs[callno]->peer[0] = '\0';
if (ies->username)
ast_copy_string(peer, ies->username, sizeof(peer));
@@ -5053,7 +5057,7 @@ static int register_verify(int callno, struct sockaddr_in *sin, struct iax_ies *
while(keyn) {
key = ast_key_get(keyn, AST_KEY_PUBLIC);
if (key && !ast_check_signature(key, iaxs[callno]->challenge, rsasecret)) {
- iaxs[callno]->state |= IAX_STATE_AUTHENTICATED;
+ ast_set_flag(&iaxs[callno]->state, IAX_STATE_AUTHENTICATED);
break;
} else if (!key)
ast_log(LOG_WARNING, "requested inkey '%s' does not exist\n", keyn);
@@ -5082,7 +5086,7 @@ static int register_verify(int callno, struct sockaddr_in *sin, struct iax_ies *
destroy_peer(p);
return -1;
} else
- iaxs[callno]->state |= IAX_STATE_AUTHENTICATED;
+ ast_set_flag(&iaxs[callno]->state, IAX_STATE_AUTHENTICATED);
} else if (!ast_strlen_zero(md5secret) && (p->authmethods & IAX_AUTH_MD5) && !ast_strlen_zero(iaxs[callno]->challenge)) {
struct MD5Context md5;
unsigned char digest[16];
@@ -5101,7 +5105,7 @@ static int register_verify(int callno, struct sockaddr_in *sin, struct iax_ies *
break;
}
if (tmppw) {
- iaxs[callno]->state |= IAX_STATE_AUTHENTICATED;
+ ast_set_flag(&iaxs[callno]->state, IAX_STATE_AUTHENTICATED);
} else {
if (authdebug)
ast_log(LOG_NOTICE, "Host %s failed MD5 authentication for '%s' (%s != %s)\n", ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr), p->name, requeststr, md5secret);
@@ -5630,14 +5634,14 @@ static int update_registry(char *name, struct sockaddr_in *sin, int callno, char
ast_db_put("IAX/Registry", p->name, data);
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Registered IAX2 '%s' (%s) at %s:%d\n", p->name,
- iaxs[callno]->state & IAX_STATE_AUTHENTICATED ? "AUTHENTICATED" : "UNAUTHENTICATED", ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr), ntohs(sin->sin_port));
+ ast_test_flag(&iaxs[callno]->state, IAX_STATE_AUTHENTICATED) ? "AUTHENTICATED" : "UNAUTHENTICATED", ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr), ntohs(sin->sin_port));
manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "Peer: IAX2/%s\r\nPeerStatus: Registered\r\n", p->name);
register_peer_exten(p, 1);
ast_device_state_changed("IAX2/%s", p->name); /* Activate notification */
} else if (!ast_test_flag(p, IAX_TEMPONLY)) {
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Unregistered IAX2 '%s' (%s)\n", p->name,
- iaxs[callno]->state & IAX_STATE_AUTHENTICATED ? "AUTHENTICATED" : "UNAUTHENTICATED");
+ ast_test_flag(&iaxs[callno]->state, IAX_STATE_AUTHENTICATED) ? "AUTHENTICATED" : "UNAUTHENTICATED");
manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "Peer: IAX2/%s\r\nPeerStatus: Unregistered\r\n", p->name);
register_peer_exten(p, 0);
ast_db_del("IAX/Registry", p->name);
@@ -6359,7 +6363,7 @@ static int socket_read(int *id, int fd, short events, void *cbdata)
} else
fr.ts = fix_peerts(&rxtrunktime, fr.callno, ts);
/* Don't pass any packets until we're started */
- if ((iaxs[fr.callno]->state & IAX_STATE_STARTED)) {
+ if (ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED)) {
/* Common things */
f.src = "IAX2";
f.mallocd = 0;
@@ -6691,7 +6695,7 @@ retryowner:
/* Do nothing */
break;
case IAX_COMMAND_QUELCH:
- if (iaxs[fr.callno]->state & IAX_STATE_STARTED) {
+ if (ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED)) {
/* Generate Manager Hold event, if necessary*/
if (iaxs[fr.callno]->owner) {
manager_event(EVENT_FLAG_CALL, "Hold",
@@ -6709,8 +6713,8 @@ retryowner:
}
}
break;
- case IAX_COMMAND_UNQUELCH:
- if (iaxs[fr.callno]->state & IAX_STATE_STARTED) {
+ case IAX_COMMAND_UNQUELCH:
+ if (ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED)) {
/* Generate Manager Unhold event, if necessary*/
if (iaxs[fr.callno]->owner && ast_test_flag(iaxs[fr.callno], IAX_QUELCH)) {
manager_event(EVENT_FLAG_CALL, "Unhold",
@@ -6744,7 +6748,7 @@ retryowner:
break;
case IAX_COMMAND_NEW:
/* Ignore if it's already up */
- if (iaxs[fr.callno]->state & (IAX_STATE_STARTED | IAX_STATE_TBD))
+ if (ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED | IAX_STATE_TBD))
break;
if (ies.provverpres && ies.serviceident && sin.sin_addr.s_addr)
check_provisioning(&sin, fd, ies.serviceident, ies.provver);
@@ -6870,7 +6874,7 @@ retryowner:
iax_ie_append_int(&ied1, IAX_IE_FORMAT, format);
send_command(iaxs[fr.callno], AST_FRAME_IAX, IAX_COMMAND_ACCEPT, 0, ied1.buf, ied1.pos, -1);
if (strcmp(iaxs[fr.callno]->exten, "TBD")) {
- iaxs[fr.callno]->state |= IAX_STATE_STARTED;
+ ast_set_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED);
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Accepting UNAUTHENTICATED call from %s:\n"
"%srequested format = %s,\n"
@@ -6893,7 +6897,7 @@ retryowner:
if(!(c = ast_iax2_new(fr.callno, AST_STATE_RING, format)))
iax2_destroy_nolock(fr.callno);
} else {
- iaxs[fr.callno]->state |= IAX_STATE_TBD;
+ ast_set_flag(&iaxs[fr.callno]->state, IAX_STATE_TBD);
/* If this is a TBD call, we're ready but now what... */
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Accepted unauthenticated TBD call from %s\n", ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr));
@@ -6907,12 +6911,12 @@ retryowner:
else
iaxs[fr.callno]->encmethods = 0;
authenticate_request(iaxs[fr.callno]);
- iaxs[fr.callno]->state |= IAX_STATE_AUTHENTICATED;
+ ast_set_flag(&iaxs[fr.callno]->state, IAX_STATE_AUTHENTICATED);
break;
case IAX_COMMAND_DPREQ:
/* Request status in the dialplan */
- if ((iaxs[fr.callno]->state & IAX_STATE_TBD) &&
- !(iaxs[fr.callno]->state & IAX_STATE_STARTED) && ies.called_number) {
+ if (ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_TBD) &&
+ !ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED) && ies.called_number) {
if (iaxcompat) {
/* Spawn a thread for the lookup */
spawn_dp_lookup(fr.callno, iaxs[fr.callno]->context, ies.called_number, iaxs[fr.callno]->cid_num);
@@ -6978,7 +6982,7 @@ retryowner:
break;
case IAX_COMMAND_ACCEPT:
/* Ignore if call is already up or needs authentication or is a TBD */
- if (iaxs[fr.callno]->state & (IAX_STATE_STARTED | IAX_STATE_TBD | IAX_STATE_AUTHENTICATED))
+ if (ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED | IAX_STATE_TBD | IAX_STATE_AUTHENTICATED))
break;
if (ast_test_flag(iaxs[fr.callno], IAX_PROVISION)) {
/* Send ack immediately, before we destroy */
@@ -7004,7 +7008,7 @@ retryowner:
if (authdebug)
ast_log(LOG_NOTICE, "Rejected call to %s, format 0x%x incompatible with our capability 0x%x.\n", ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr), iaxs[fr.callno]->peerformat, iaxs[fr.callno]->capability);
} else {
- iaxs[fr.callno]->state |= IAX_STATE_STARTED;
+ ast_set_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED);
if (iaxs[fr.callno]->owner) {
/* Switch us to use a compatible format */
iaxs[fr.callno]->owner->nativeformats = iaxs[fr.callno]->peerformat;
@@ -7145,7 +7149,7 @@ retryowner2:
#endif
break;
case IAX_COMMAND_AUTHREQ:
- if (iaxs[fr.callno]->state & (IAX_STATE_STARTED | IAX_STATE_TBD)) {
+ if (ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED | IAX_STATE_TBD)) {
ast_log(LOG_WARNING, "Call on %s is already up, can't start on it\n", iaxs[fr.callno]->owner ? iaxs[fr.callno]->owner->name : "<Unknown>");
break;
}
@@ -7160,7 +7164,7 @@ retryowner2:
if (delayreject)
send_command_immediate(iaxs[fr.callno], AST_FRAME_IAX, IAX_COMMAND_ACK, fr.ts, NULL, 0,fr.iseqno);
/* Ignore once we've started */
- if (iaxs[fr.callno]->state & (IAX_STATE_STARTED | IAX_STATE_TBD)) {
+ if (ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED | IAX_STATE_TBD)) {
ast_log(LOG_WARNING, "Call on %s is already up, can't start on it\n", iaxs[fr.callno]->owner ? iaxs[fr.callno]->owner->name : "<Unknown>");
break;
}
@@ -7278,7 +7282,7 @@ retryowner2:
iax_ie_append_int(&ied1, IAX_IE_FORMAT, format);
send_command(iaxs[fr.callno], AST_FRAME_IAX, IAX_COMMAND_ACCEPT, 0, ied1.buf, ied1.pos, -1);
if (strcmp(iaxs[fr.callno]->exten, "TBD")) {
- iaxs[fr.callno]->state |= IAX_STATE_STARTED;
+ ast_set_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED);
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Accepting AUTHENTICATED call from %s:\n"
"%srequested format = %s,\n"
@@ -7298,11 +7302,11 @@ retryowner2:
VERBOSE_PREFIX_4,
using_prefs);
- iaxs[fr.callno]->state |= IAX_STATE_STARTED;
+ ast_set_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED);
if(!(c = ast_iax2_new(fr.callno, AST_STATE_RING, format)))
iax2_destroy_nolock(fr.callno);
} else {
- iaxs[fr.callno]->state |= IAX_STATE_TBD;
+ ast_set_flag(&iaxs[fr.callno]->state, IAX_STATE_TBD);
/* If this is a TBD call, we're ready but now what... */
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Accepted AUTHENTICATED TBD call from %s\n", ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr));
@@ -7311,8 +7315,8 @@ retryowner2:
}
break;
case IAX_COMMAND_DIAL:
- if (iaxs[fr.callno]->state & IAX_STATE_TBD) {
- iaxs[fr.callno]->state &= ~IAX_STATE_TBD;
+ if (ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_TBD)) {
+ ast_clear_flag(&iaxs[fr.callno]->state, IAX_STATE_TBD);
ast_copy_string(iaxs[fr.callno]->exten, ies.called_number ? ies.called_number : "s", sizeof(iaxs[fr.callno]->exten));
if (!ast_exists_extension(NULL, iaxs[fr.callno]->context, iaxs[fr.callno]->exten, 1, iaxs[fr.callno]->cid_num)) {
if (authdebug)
@@ -7322,10 +7326,10 @@ retryowner2:
iax_ie_append_byte(&ied0, IAX_IE_CAUSECODE, AST_CAUSE_NO_ROUTE_DESTINATION);
send_command_final(iaxs[fr.callno], AST_FRAME_IAX, IAX_COMMAND_REJECT, 0, ied0.buf, ied0.pos, -1);
} else {
- iaxs[fr.callno]->state |= IAX_STATE_STARTED;
+ ast_set_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED);
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Accepting DIAL from %s, formats = 0x%x\n", ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr), iaxs[fr.callno]->peerformat);
- iaxs[fr.callno]->state |= IAX_STATE_STARTED;
+ ast_set_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED);
send_command(iaxs[fr.callno], AST_FRAME_CONTROL, AST_CONTROL_PROGRESS, 0, NULL, 0, -1);
if(!(c = ast_iax2_new(fr.callno, AST_STATE_RING, iaxs[fr.callno]->peerformat)))
iax2_destroy_nolock(fr.callno);
@@ -7354,7 +7358,7 @@ retryowner2:
auth_fail(fr.callno, IAX_COMMAND_REGREJ);
break;
}
- if ((ast_strlen_zero(iaxs[fr.callno]->secret) && ast_strlen_zero(iaxs[fr.callno]->inkeys)) || (iaxs[fr.callno]->state & IAX_STATE_AUTHENTICATED)) {
+ if ((ast_strlen_zero(iaxs[fr.callno]->secret) && ast_strlen_zero(iaxs[fr.callno]->inkeys)) || ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_AUTHENTICATED)) {
if (f.subclass == IAX_COMMAND_REGREL)
memset(&sin, 0, sizeof(sin));
if (update_registry(iaxs[fr.callno]->peer, &sin, fr.callno, ies.devicetype, fd, ies.refresh))
@@ -7539,7 +7543,7 @@ retryowner2:
/* FIXME? Surely right here would be the right place to undo timestamp wraparound? */
}
/* Don't pass any packets until we're started */
- if (!(iaxs[fr.callno]->state & IAX_STATE_STARTED)) {
+ if (!ast_test_flag(&iaxs[fr.callno]->state, IAX_STATE_STARTED)) {
ast_mutex_unlock(&iaxsl[fr.callno]);
return 1;
}
@@ -8958,7 +8962,7 @@ static struct iax2_dpcache *find_cache(struct ast_channel *chan, const char *dat
dp->peer = iaxs[callno]->dpentries;
iaxs[callno]->dpentries = dp;
/* Send the request if we're already up */
- if (iaxs[callno]->state & IAX_STATE_STARTED)
+ if (ast_test_flag(&iaxs[callno]->state, IAX_STATE_STARTED))
iax2_dprequest(dp, callno);
ast_mutex_unlock(&iaxsl[callno]);
}