aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-02-13 18:40:50 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-02-13 18:40:50 +0000
commita0c5eed1935f7e8b3d1c38c6a5703f06f78ba719 (patch)
tree4a6f11187f8e4111024709069a706bc43409f911
parente997212e0a571dee82c5b28c3d55e284467ff69c (diff)
Merge limits patch (bug #3581)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5021 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xchannels/chan_sip.c79
1 files changed, 62 insertions, 17 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 91de845e1..691fe8f50 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -303,9 +303,10 @@ struct sip_history {
#define SIP_OSPAUTH_YES (1 << 26)
#define SIP_OSPAUTH_EXCLUSIVE (2 << 26)
/* Call states */
-#define SIP_CALL_ONHOLD (1 << 28)
+#define SIP_CALL_ONHOLD (1 << 28)
+#define SIP_CALL_LIMIT (1 << 29)
-/* a new page of flags */
+/* a new page of flags for peer */
#define SIP_PAGE2_RTCACHEFRIENDS (1 << 0)
#define SIP_PAGE2_RTNOUPDATE (1 << 1)
#define SIP_PAGE2_RTAUTOCLEAR (1 << 2)
@@ -361,8 +362,8 @@ static struct sip_pvt {
char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
char rdnis[256]; /* Referring DNIS */
char theirtag[256]; /* Their tag */
- char username[256];
- char peername[256];
+ char username[256]; /* [user] name */
+ char peername[256]; /* [peer] name, not set if [user] */
char authname[256]; /* Who we use for authentication */
char uri[256]; /* Original requested URI */
char okcontacturi[256]; /* URI from the 200 OK on INVITE */
@@ -409,7 +410,7 @@ static struct sip_pvt {
struct ast_rtp *vrtp; /* Video RTP session */
struct sip_pkt *packets; /* Packets scheduled for re-transmission */
struct sip_history *history; /* History of this SIP dialog */
- struct ast_variable *chanvars;
+ struct ast_variable *chanvars; /* Channel variables to set for call */
struct sip_pvt *next; /* Next call in chain */
} *iflist = NULL;
@@ -1610,6 +1611,11 @@ static int update_user_counter(struct sip_pvt *fup, int event)
struct sip_peer *p;
int *inuse, *incominglimit;
+ /* Test if we need to check call limits, in order to avoid
+ realtime lookups if we do not need it */
+ if (!ast_test_flag(fup, SIP_CALL_LIMIT))
+ return 0;
+
strncpy(name, fup->username, sizeof(name) - 1);
/* Check the list of users */
@@ -5725,6 +5731,9 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, char *cmd
if (!(res = check_auth(p, req, p->randdata, sizeof(p->randdata), user->name, user->secret, user->md5secret, cmd, uri, reliable, ignore))) {
sip_cancel_destroy(p);
ast_copy_flags(p, user, SIP_PROMISCREDIR | SIP_DTMF | SIP_REINVITE);
+ /* If we have a call limit, set flag */
+ if (user->incominglimit)
+ ast_set_flag(p, SIP_CALL_LIMIT);
if (!ast_strlen_zero(user->context))
strncpy(p->context, user->context, sizeof(p->context) - 1);
if (!ast_strlen_zero(user->cid_num) && !ast_strlen_zero(p->cid_num)) {
@@ -5802,6 +5811,9 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, char *cmd
}
if (!(res = check_auth(p, req, p->randdata, sizeof(p->randdata), peer->name, p->peersecret, p->peermd5secret, cmd, uri, reliable, ignore))) {
ast_copy_flags(p, peer, SIP_PROMISCREDIR | SIP_DTMF | SIP_REINVITE);
+ /* If we have a call limit, set flag */
+ if (peer->incominglimit)
+ ast_set_flag(p, SIP_CALL_LIMIT);
strncpy(p->peername, peer->name, sizeof(p->peername) - 1);
strncpy(p->authname, peer->name, sizeof(p->authname) - 1);
/* copy channel vars */
@@ -5919,33 +5931,61 @@ static void receive_message(struct sip_pvt *p, struct sip_request *req)
}
/*--- sip_show_inuse: CLI Command to show calls within limits set by
- outgoinglimit and incominglimit ---*/
+ incominglimit ---*/
static int sip_show_inuse(int fd, int argc, char *argv[]) {
-#define FORMAT "%-25.25s %-15.15s %-15.15s %-15.15s %-15.15s\n"
-#define FORMAT2 "%-25.25s %-15.15s %-15.15s %-15.15s %-15.15s\n"
+#define FORMAT "%-25.25s %-15.15s %-15.15s \n"
+#define FORMAT2 "%-25.25s %-15.15s %-15.15s \n"
char ilimits[40] = "";
- char olimits[40] = "";
char iused[40];
- char oused[40];
+ int showall = 0;
- if (argc != 3)
+ if (argc < 3)
return RESULT_SHOWUSAGE;
- ast_cli(fd, FORMAT, "Username", "incoming", "Limit","outgoing","Limit");
+
+ if (argc == 4 && !strcmp(argv[3],"all"))
+ showall = 1;
+
+ ast_cli(fd, FORMAT, "* User name", "In use", "Limit");
ASTOBJ_CONTAINER_TRAVERSE(&userl, 1, do {
ASTOBJ_RDLOCK(iterator);
if (iterator->incominglimit)
snprintf(ilimits, sizeof(ilimits), "%d", iterator->incominglimit);
- else
+ else
strncpy(ilimits, "N/A", sizeof(ilimits) - 1);
+ /* Code disabled ----------------------------
if (iterator->outgoinglimit)
snprintf(olimits, sizeof(olimits), "%d", iterator->outgoinglimit);
else
strncpy(olimits, "N/A", sizeof(olimits) - 1);
+ snprintf(oused, sizeof(oused), "%d", iterator->outUse);
+ ---------------------------------------------*/
snprintf(iused, sizeof(iused), "%d", iterator->inUse);
+ if (showall || iterator->incominglimit)
+ ast_cli(fd, FORMAT2, iterator->name, iused, ilimits);
+ ASTOBJ_UNLOCK(iterator);
+ } while (0) );
+
+ ast_cli(fd, FORMAT, "* Peer name", "In use", "Limit");
+
+ ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do {
+ ASTOBJ_RDLOCK(iterator);
+ if (iterator->incominglimit)
+ snprintf(ilimits, sizeof(ilimits), "%d", iterator->incominglimit);
+ else
+ strncpy(ilimits, "N/A", sizeof(ilimits) - 1);
+ /* Code disabled ----------------------------
+ if (iterator->outgoinglimit)
+ snprintf(olimits, sizeof(olimits), "%d", iterator->outgoinglimit);
+ else
+ strncpy(olimits, "N/A", sizeof(olimits) - 1);
snprintf(oused, sizeof(oused), "%d", iterator->outUse);
- ast_cli(fd, FORMAT2, iterator->name, iused, ilimits,oused,olimits);
+ ---------------------------------------------*/
+ snprintf(iused, sizeof(iused), "%d", iterator->inUse);
+ if (showall || iterator->incominglimit)
+ ast_cli(fd, FORMAT2, iterator->name, iused, ilimits);
ASTOBJ_UNLOCK(iterator);
} while (0) );
+
return RESULT_SUCCESS;
#undef FORMAT
#undef FORMAT2
@@ -7102,8 +7142,9 @@ static char show_user_usage[] =
" Option \"load\" forces lookup of peer in realtime storage.\n";
static char show_inuse_usage[] =
-"Usage: sip show inuse\n"
-" List all users known to the SIP (Session Initiation Protocol) subsystem usage counters and limits.\n";
+"Usage: sip show inuse [all]\n"
+" List all SIP users and peers usage counters and limits.\n"
+" Add option \"all\" to show all devices, not only those with a limit.\n";
static char show_channels_usage[] =
"Usage: sip show channels\n"
@@ -7199,7 +7240,7 @@ static struct ast_cli_entry cli_show_peers =
static struct ast_cli_entry cli_prune_realtime =
{ { "sip", "prune", "realtime", NULL }, sip_prune_realtime, "Prune a cached realtime lookup", prune_realtime_usage, complete_sip_show_peer };
static struct ast_cli_entry cli_inuse_show =
- { { "sip", "show", "inuse", NULL }, sip_show_inuse, "List all inuse/limit", show_inuse_usage };
+ { { "sip", "show", "inuse", NULL }, sip_show_inuse, "List all inuse/limits", show_inuse_usage };
static struct ast_cli_entry cli_show_registry =
{ { "sip", "show", "registry", NULL }, sip_show_registry, "Show SIP registration status", show_reg_usage };
static struct ast_cli_entry cli_debug =
@@ -7995,6 +8036,10 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
if (res) {
if (res < 0) {
ast_log(LOG_DEBUG, "Failed to place call for user %s, too many calls\n", p->username);
+ if (ignore)
+ transmit_response(p, "480 Temporarily Unavailable (Call limit)", req);
+ else
+ transmit_response_reliable(p, "480 Temporarily Unavailable (Call limit) ", req, 1);
ast_set_flag(p, SIP_NEEDDESTROY);
}
return 0;