[asterisk-commits] branch oej/t38passthrough r15184 - in
/team/oej/t38passthrough: ./ channels/ ...
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Sun Mar 26 21:21:08 MST 2006
Author: oej
Date: Sun Mar 26 22:21:06 2006
New Revision: 15184
URL: http://svn.digium.com/view/asterisk?rev=15184&view=rev
Log:
Resolve, reset, go
Modified:
team/oej/t38passthrough/ (props changed)
team/oej/t38passthrough/channels/chan_sip.c
team/oej/t38passthrough/configs/sip.conf.sample
Propchange: team/oej/t38passthrough/
------------------------------------------------------------------------------
automerge = http://edvina.net/training/
Propchange: team/oej/t38passthrough/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Sun Mar 26 22:21:06 2006
@@ -1,1 +1,1 @@
-/trunk:1-15097
+/trunk:1-15182
Modified: team/oej/t38passthrough/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/oej/t38passthrough/channels/chan_sip.c?rev=15184&r1=15183&r2=15184&view=diff
==============================================================================
--- team/oej/t38passthrough/channels/chan_sip.c (original)
+++ team/oej/t38passthrough/channels/chan_sip.c Sun Mar 26 22:21:06 2006
@@ -368,7 +368,6 @@
#define DEFAULT_NOTIFYMIME "application/simple-message-summary"
#define DEFAULT_MWITIME 10
#define DEFAULT_ALLOWGUEST TRUE
-#define DEFAULT_VIDEOSUPPORT FALSE
#define DEFAULT_SRVLOOKUP FALSE /*!< Recommended setting is ON */
#define DEFAULT_COMPACTHEADERS FALSE
#define DEFAULT_TOS FALSE
@@ -379,9 +378,11 @@
#define DEFAULT_AUTOCREATEPEER FALSE
#define DEFAULT_QUALIFY FALSE
#define DEFAULT_T1MIN 100 /*!< 100 MS for minimal roundtrip time */
+#define DEFAULT_MAX_CALL_BITRATE (384) /*!< Max bitrate for video */
#ifndef DEFAULT_USERAGENT
#define DEFAULT_USERAGENT "Asterisk PBX" /*!< Default Useragent: header unless re-defined in sip.conf */
#endif
+
/* Default setttings are used as a channel setting and as a default when
configuring devices */
@@ -394,6 +395,7 @@
static int default_qualify; /*!< Default Qualify= setting */
static char default_vmexten[AST_MAX_EXTENSION];
static char default_musicclass[MAX_MUSICCLASS]; /*!< Global music on hold class */
+static int default_maxcallbitrate; /*!< Maximum bitrate for call */
static struct ast_codec_pref default_prefs; /*!< Default codec prefs */
/* Global settings only apply to the channel */
@@ -409,9 +411,10 @@
static int global_reg_timeout;
static int global_regattempts_max; /*!< Registration attempts before giving up */
static int global_allowguest; /*!< allow unauthenticated users/peers to connect? */
+static int global_allowsubscribe; /*!< Flag for disabling ALL subscriptions, this is FALSE only if all peers are FALSE
+ the global setting is in globals_flag_page2 */
static int global_mwitime; /*!< Time between MWI checks for peers */
static int global_tos; /*!< IP Type of service */
-static int global_videosupport; /*!< Videosupport on or off */
static int compactheaders; /*!< send compact sip headers */
static int recordhistory; /*!< Record SIP history. Off by default */
static int dumphistory; /*!< Dump history to verbose before destroying SIP dialog */
@@ -658,14 +661,17 @@
#define SIP_PAGE2_DEBUG_CONSOLE (1 << 6)
#define SIP_PAGE2_DYNAMIC (1 << 7) /*!< Dynamic Peers register with Asterisk */
#define SIP_PAGE2_SELFDESTRUCT (1 << 8) /*!< Automatic peers need to destruct themselves */
-/* GAP for other patches in the bug tracker */
+#define SIP_PAGE2_VIDEOSUPPORT (1 << 9)
+#define SIP_PAGE2_ALLOWSUBSCRIBE (1 << 10) /*!< Allow subscriptions from this peer? */
+#define SIP_PAGE2_ALLOWOVERLAP (1 << 11) /*!< Allow overlap dialing ? */
#define SIP_PAGE2_T38SUPPORT (7 << 14) /*!< T38 Fax Passthrough Support */
#define SIP_PAGE2_T38SUPPORT_UDPTL (1 << 14) /*!< 14: T38 Fax Passthrough Support */
#define SIP_PAGE2_T38SUPPORT_RTP (2 << 14) /*!< 15: T38 Fax Passthrough Support */
#define SIP_PAGE2_T38SUPPORT_TCP (4 << 14) /*!< 16: T38 Fax Passthrough Support */
+
#define SIP_PAGE2_FLAGS_TO_COPY \
- (SIP_PAGE2_T38SUPPORT)
+ (SIP_PAGE2_ALLOWSUBSCRIBE | SIP_PAGE2_ALLOWOVERLAP | SIP_PAGE2_VIDEOSUPPORT | SIP_PAGE2_T38SUPPORT)
/* SIP packet flags */
#define SIP_PKT_DEBUG (1 << 0) /*!< Debug this packet */
@@ -726,6 +732,7 @@
ast_group_t pickupgroup; /*!< Pickup group */
int lastinvite; /*!< Last Cseq of invite */
unsigned int flags; /*!< SIP_ flags */
+ struct ast_flags flags_page2; /*!< SIP PAGE2 flags */
int timer_t1; /*!< SIP timer T1, ms rtt */
unsigned int sipoptions; /*!< Supported SIP sipoptions on the other end */
int capability; /*!< Special capability (codec) */
@@ -736,6 +743,7 @@
struct t38properties t38; /*!< T38 settings */
struct sockaddr_in udptlredirip; /*!< Where our T.38 UDPTL should be going if not to us */
struct ast_udptl *udptl; /*!< T.38 UDPTL session */
+ int maxcallbitrate; /*!< Maximum Call Bitrate for Video Calls */
int callingpres; /*!< Calling presentation */
int authtries; /*!< Times we've tried to authenticate */
int expiry; /*!< How long we take to expire */
@@ -836,6 +844,7 @@
int call_limit; /*!< Limit of concurrent calls */
struct ast_ha *ha; /*!< ACL setting */
struct ast_variable *chanvars; /*!< Variables to set for channel created by user */
+ int maxcallbitrate; /*!< Maximum Bitrate for a video call */
};
/*! \brief Structure for SIP peer data, we place calls to peers if registered or fixed IP address (host) */
@@ -880,7 +889,8 @@
ast_group_t pickupgroup; /*!< Pickup group */
struct ast_dnsmgr_entry *dnsmgr;/*!< DNS refresh manager for peer */
struct sockaddr_in addr; /*!< IP address of peer */
-
+ int maxcallbitrate; /*!< Maximum Bitrate for a video call */
+
/* Qualification */
struct sip_pvt *call; /*!< Call pointer */
int pokeexpire; /*!< When to expire poke (qualify= checking) */
@@ -2000,7 +2010,12 @@
}
ast_copy_flags(r, peer, SIP_FLAGS_TO_COPY);
+ ast_copy_flags((&r->flags_page2),(&peer->flags_page2), SIP_PAGE2_FLAGS_TO_COPY);
r->capability = peer->capability;
+ if (!ast_test_flag((&r->flags_page2), SIP_PAGE2_VIDEOSUPPORT) && r->vrtp) {
+ ast_rtp_destroy(r->vrtp);
+ r->vrtp = NULL;
+ }
r->prefs = peer->prefs;
if (ast_test_flag(&peer->flags_page2, SIP_PAGE2_T38SUPPORT)) {
ast_copy_flags(&r->t38.t38support, &peer->flags_page2, SIP_PAGE2_T38SUPPORT);
@@ -2084,7 +2099,8 @@
r->rtpkeepalive = peer->rtpkeepalive;
if (peer->call_limit)
ast_set_flag(r, SIP_CALL_LIMIT);
-
+ r->maxcallbitrate = peer->maxcallbitrate;
+
return 0;
}
@@ -2981,6 +2997,7 @@
case AST_CONTROL_VIDUPDATE: /* Request a video frame update */
if (p->vrtp && !ast_test_flag(p, SIP_NOVIDEO)) {
transmit_info_with_vidupdate(p);
+ /* ast_rtcp_send_h261fur(p->vrtp); */
res = 0;
} else
res = -1;
@@ -3420,6 +3437,9 @@
} else {
memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
}
+
+ ast_copy_flags(p, &global_flags, SIP_FLAGS_TO_COPY);
+ ast_copy_flags((&p->flags_page2),(&global_flags_page2), SIP_PAGE2_FLAGS_TO_COPY);
p->branch = thread_safe_rand();
make_our_tag(p->tag, sizeof(p->tag));
@@ -3428,14 +3448,14 @@
if (sip_methods[intended_method].need_rtp) {
p->rtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, bindaddr.sin_addr);
- if (global_videosupport)
+ if (ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT))
p->vrtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, bindaddr.sin_addr);
if (ast_test_flag(&p->t38.t38support, SIP_PAGE2_T38SUPPORT_UDPTL) )
p->udptl = ast_udptl_new_with_bindaddr(sched, io, 0, bindaddr.sin_addr);
/* TODO: Need to check for error - or ?? */
- if (!p->rtp || (global_videosupport && !p->vrtp)) {
- ast_log(LOG_WARNING, "Unable to create RTP audio %s session: %s\n", global_videosupport ? "and video" : "", strerror(errno));
+ if (!p->rtp || (ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT) && !p->vrtp)) {
+ ast_log(LOG_WARNING, "Unable to create RTP audio %s session: %s\n", ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT) ? "and video" : "", strerror(errno));
ast_mutex_destroy(&p->lock);
if (p->chanvars) {
ast_variables_destroy(p->chanvars);
@@ -3452,6 +3472,7 @@
p->rtptimeout = global_rtptimeout;
p->rtpholdtimeout = global_rtpholdtimeout;
p->rtpkeepalive = global_rtpkeepalive;
+ p->maxcallbitrate = default_maxcallbitrate;
}
if (useglobal_nat && sin) {
@@ -3473,7 +3494,6 @@
build_callid_pvt(p);
else
ast_string_field_set(p, callid, callid);
- ast_copy_flags(p, &global_flags, SIP_FLAGS_TO_COPY);
/* Assign default music on hold class */
ast_string_field_set(p, musicclass, default_musicclass);
p->capability = global_capability;
@@ -5017,6 +5037,7 @@
char o[256];
char c[256];
char t[256];
+ char b[256];
char m_audio[256];
char m_video[256];
char a_audio[1024];
@@ -5087,6 +5108,8 @@
snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", p->sessionid, p->sessionversion, ast_inet_ntoa(iabuf, sizeof(iabuf), dest.sin_addr));
snprintf(s, sizeof(s), "s=session\r\n");
snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", ast_inet_ntoa(iabuf, sizeof(iabuf), dest.sin_addr));
+ if ((p->vrtp) && (!ast_test_flag(p, SIP_NOVIDEO)) && (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
+ snprintf(b, sizeof(b), "b=CT:%d\r\n", p->maxcallbitrate);
snprintf(t, sizeof(t), "t=0 0\r\n");
ast_build_string(&m_audio_next, &m_audio_left, "m=audio %d RTP/AVP", ntohs(dest.sin_port));
@@ -5137,7 +5160,7 @@
}
/* Now send any other common codecs, and non-codec formats: */
- for (x = 1; x <= ((global_videosupport && p->vrtp) ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO); x <<= 1) {
+ for (x = 1; x <= ((ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO); x <<= 1) {
if (!(capability & x))
continue;
@@ -5176,7 +5199,7 @@
len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m_audio) + strlen(a_audio);
if ((p->vrtp) && (!ast_test_flag(p, SIP_NOVIDEO)) && (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
- len += strlen(m_video) + strlen(a_video);
+ len += strlen(m_video) + strlen(a_video) + strlen(b);
add_header(resp, "Content-Type", "application/sdp");
add_header_contentLength(resp, len);
@@ -5184,6 +5207,8 @@
add_line(resp, o);
add_line(resp, s);
add_line(resp, c);
+ if ((p->vrtp) && (!ast_test_flag(p, SIP_NOVIDEO)) && (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
+ add_line(resp, b);
add_line(resp, t);
add_line(resp, m_audio);
add_line(resp, a_audio);
@@ -7781,6 +7806,7 @@
if (!(res = check_auth(p, req, user->name, user->secret, user->md5secret, sipmethod, uri, reliable, ignore))) {
sip_cancel_destroy(p);
ast_copy_flags(p, user, SIP_FLAGS_TO_COPY);
+ ast_copy_flags((&p->flags_page2),(&user->flags_page2), SIP_PAGE2_FLAGS_TO_COPY);
/* Copy SIP extensions profile from INVITE */
if (p->sipoptions)
user->sipoptions = p->sipoptions;
@@ -7814,6 +7840,11 @@
p->callingpres = user->callingpres;
p->capability = user->capability;
p->jointcapability = user->capability;
+ p->maxcallbitrate = user->maxcallbitrate;
+ if (!ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) {
+ ast_rtp_destroy(p->vrtp);
+ p->vrtp = NULL;
+ }
if (p->peercapability)
p->jointcapability &= p->peercapability;
if ((ast_test_flag(p, SIP_DTMF) == SIP_DTMF_RFC2833) || (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_AUTO))
@@ -7942,6 +7973,11 @@
p->jointcapability = peer->capability;
if (p->peercapability)
p->jointcapability &= p->peercapability;
+ p->maxcallbitrate = peer->maxcallbitrate;
+ if (!ast_test_flag((&p->flags_page2), SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) {
+ ast_rtp_destroy(p->vrtp);
+ p->vrtp = NULL;
+ }
if ((ast_test_flag(p, SIP_DTMF) == SIP_DTMF_RFC2833) || (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_AUTO))
p->noncodeccapability |= AST_RTP_DTMF;
else
@@ -8330,6 +8366,7 @@
"Dynamic: %s\r\n"
"Natsupport: %s\r\n"
T38FMT
+ "Video Support: %s\r\n"
"ACL: %s\r\n"
"Status: %s\r\n"
"RealtimeDevice: %s\r\n\r\n",
@@ -8340,6 +8377,7 @@
ast_test_flag((&iterator->flags_page2), SIP_PAGE2_DYNAMIC) ? "yes" : "no", /* Dynamic or not? */
(ast_test_flag(iterator, SIP_NAT) & SIP_NAT_ROUTE) ? "yes" : "no", /* NAT=yes? */
T38ARGS
+ ast_test_flag((&iterator->flags_page2), SIP_PAGE2_VIDEOSUPPORT) ? "yes" : "no", /* VIDEOSUPPORT=yes? */
iterator->ha ? "yes" : "no", /* permit/deny */
status,
realtimepeers ? (ast_test_flag(iterator, SIP_REALTIME) ? "yes":"no") : "no");
@@ -8721,6 +8759,7 @@
ast_cli(fd, " Call limit : %d\n", peer->call_limit);
ast_cli(fd, " Dynamic : %s\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC)?"Yes":"No"));
ast_cli(fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
+ ast_cli(fd, " MaxCallBR : %dkbps\n", peer->maxcallbitrate);
ast_cli(fd, " Expire : %d\n", peer->expire);
ast_cli(fd, " Insecure : %s\n", insecure2str(ast_test_flag(peer, SIP_INSECURE_PORT), ast_test_flag(peer, SIP_INSECURE_INVITE)));
ast_cli(fd, " Nat : %s\n", nat2str(ast_test_flag(peer, SIP_NAT)));
@@ -8728,11 +8767,14 @@
ast_cli(fd, " CanReinvite : %s\n", (ast_test_flag(peer, SIP_CAN_REINVITE)?"Yes":"No"));
ast_cli(fd, " PromiscRedir : %s\n", (ast_test_flag(peer, SIP_PROMISCREDIR)?"Yes":"No"));
ast_cli(fd, " User=Phone : %s\n", (ast_test_flag(peer, SIP_USEREQPHONE)?"Yes":"No"));
+ ast_cli(fd, " Video Support: %s\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_VIDEOSUPPORT)?"Yes":"No"));
ast_cli(fd, " Trust RPID : %s\n", (ast_test_flag(peer, SIP_TRUSTRPID) ? "Yes" : "No"));
ast_cli(fd, " Send RPID : %s\n", (ast_test_flag(peer, SIP_SENDRPID) ? "Yes" : "No"));
ast_cli(fd, " T38 pt UDPTL: %s\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_T38SUPPORT_UDPTL)?"Yes":"No"));
ast_cli(fd, " T38 pt RTP : %s\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_T38SUPPORT_RTP)?"Yes":"No"));
ast_cli(fd, " T38 pt TCP : %s\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_T38SUPPORT_TCP)?"Yes":"No"));
+ ast_cli(fd, " Subscriptions: %s\n", ast_test_flag(&peer->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE) ? "Yes" : "No");
+ ast_cli(fd, " Overlap dial : %s\n", ast_test_flag(&peer->flags_page2, SIP_PAGE2_ALLOWOVERLAP) ? "Yes" : "No");
/* - is enumerated */
ast_cli(fd, " DTMFmode : %s\n", dtmfmode2str(ast_test_flag(peer, SIP_DTMF)));
@@ -8800,6 +8842,7 @@
astman_append(s, "VoiceMailbox: %s\r\n", peer->mailbox);
astman_append(s, "LastMsgsSent: %d\r\n", peer->lastmsgssent);
astman_append(s, "Call limit: %d\r\n", peer->call_limit);
+ astman_append(s, "MaxCallBR: %dkbps\r\n", peer->maxcallbitrate);
astman_append(s, "Dynamic: %s\r\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC)?"Y":"N"));
astman_append(s, "Callerid: %s\r\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, ""));
astman_append(s, "RegExpire: %ld seconds\r\n", ast_sched_when(sched,peer->expire));
@@ -8812,6 +8855,7 @@
ast_cli(fd, "SIP-T38pt-support-udptl: %s\r\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_T38SUPPORT_UDPTL)?"Y":"N"));
ast_cli(fd, "SIP-T38pt-support-rtp: %s\r\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_T38SUPPORT_RTP)?"Y":"N"));
ast_cli(fd, "SIP-T38pt-support-tcp: %s\r\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_T38SUPPORT_TCP)?"Y":"N"));
+ astman_append(s, "SIP-VideoSupport: %s\r\n", (ast_test_flag((&peer->flags_page2), SIP_PAGE2_VIDEOSUPPORT)?"Y":"N"));
/* - is enumerated */
astman_append(s, "SIP-DTMFmode %s\r\n", dtmfmode2str(ast_test_flag(peer, SIP_DTMF)));
@@ -8960,9 +9004,11 @@
ast_cli(fd, "----------------\n");
ast_cli(fd, " SIP Port: %d\n", ntohs(bindaddr.sin_port));
ast_cli(fd, " Bindaddress: %s\n", ast_inet_ntoa(tmp, sizeof(tmp), bindaddr.sin_addr));
- ast_cli(fd, " Videosupport: %s\n", global_videosupport ? "Yes" : "No");
+ ast_cli(fd, " Videosupport: %s\n", ast_test_flag((&global_flags_page2), SIP_PAGE2_VIDEOSUPPORT) ? "Yes" : "No");
ast_cli(fd, " AutoCreatePeer: %s\n", autocreatepeer ? "Yes" : "No");
ast_cli(fd, " Allow unknown access: %s\n", global_allowguest ? "Yes" : "No");
+ ast_cli(fd, " Allow subscriptions: %s\n", ast_test_flag(&global_flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE) ? "Yes" : "No");
+ ast_cli(fd, " Allow overlap dialing: %s\n", ast_test_flag(&global_flags_page2, SIP_PAGE2_ALLOWOVERLAP) ? "Yes" : "No");
ast_cli(fd, " Promsic. redir: %s\n", ast_test_flag(&global_flags, SIP_PROMISCREDIR) ? "Yes" : "No");
ast_cli(fd, " SIP domain support: %s\n", AST_LIST_EMPTY(&domain_list) ? "No" : "Yes");
ast_cli(fd, " Call to non-local dom.: %s\n", allow_external_domains ? "Yes" : "No");
@@ -9009,6 +9055,7 @@
ast_cli(fd, " Outbound reg. timeout: %d secs\n", global_reg_timeout);
ast_cli(fd, " Outbound reg. attempts: %d\n", global_regattempts_max);
ast_cli(fd, " Notify ringing state: %s\n", global_notifyringing ? "Yes" : "No");
+ ast_cli(fd, " Max Call Bitrate: %dkbps\r\n", default_maxcallbitrate);
ast_cli(fd, "\nDefault Settings:\n");
ast_cli(fd, "-----------------\n");
ast_cli(fd, " Context: %s\n", default_context);
@@ -11074,8 +11121,6 @@
ast_string_field_set(p, context, default_context);
if (res < 0)
transmit_response_with_allow(p, "404 Not Found", req, 0);
- else if (res > 0)
- transmit_response_with_allow(p, "484 Address Incomplete", req, 0);
else
transmit_response_with_allow(p, "200 OK", req, 0);
/* Destroy if this OPTIONS was the opening request, but not if
@@ -11208,11 +11253,11 @@
build_contact(p); /* Build our contact header */
if (gotdest) {
- if (gotdest < 0) {
- transmit_response_reliable(p, "404 Not Found", req);
+ if (gotdest == 1 && ast_test_flag(&p->flags_page2, SIP_PAGE2_ALLOWOVERLAP)) {
+ transmit_response_reliable(p, "484 Address Incomplete", req);
update_call_counter(p, DEC_CALL_LIMIT);
} else {
- transmit_response_reliable(p, "484 Address Incomplete", req);
+ transmit_response_reliable(p, "404 Not Found", req);
update_call_counter(p, DEC_CALL_LIMIT);
}
ast_set_flag(p, SIP_NEEDDESTROY);
@@ -11423,10 +11468,13 @@
if (ast_strlen_zero(p->context))
ast_string_field_set(p, context, default_context);
res = get_refer_info(p, req);
- if (res < 0)
+ if (res > 0) {
+ if (ast_test_flag(&p->flags_page2, SIP_PAGE2_ALLOWOVERLAP))
+ transmit_response_with_allow(p, "484 Address Incomplete", req, 1);
+ else
+ transmit_response_with_allow(p, "404 Not Found", req, 1);
+ } else if (res < 0)
transmit_response_with_allow(p, "404 Not Found", req, 1);
- else if (res > 0)
- transmit_response_with_allow(p, "484 Address Incomplete", req, 1);
else {
int nobye = 0;
if (!ignore) {
@@ -11601,6 +11649,17 @@
ast_log(LOG_DEBUG, "Got a re-subscribe on existing subscription %s\n", p->callid);
}
}
+
+ /* Check if we have a global disallow setting on subscriptions.
+ if so, we don't have to check peer/user settings after auth, which saves a lot of processing
+ */
+ if (!global_allowsubscribe) {
+ transmit_response(p, "403 Forbidden (policy)", req);
+ ast_set_flag(p, SIP_NEEDDESTROY);
+ return 0;
+
+ }
+
if (!ignore && !p->initreq.headers) {
/* Use this as the basis */
if (debug)
@@ -11641,6 +11700,14 @@
}
return 0;
}
+
+ /* Check if this user/peer is allowed to subscribe at all */
+ if (! ast_test_flag(&p->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE)) {
+ transmit_response(p, "403 Forbidden (policy)", req);
+ ast_set_flag(p, SIP_NEEDDESTROY);
+ return 0;
+ }
+
/* Initialize the context if it hasn't been already */
if (!ast_strlen_zero(p->subscribecontext))
ast_string_field_set(p, context, p->subscribecontext);
@@ -11650,10 +11717,7 @@
gotdest = get_destination(p, NULL);
build_contact(p);
if (gotdest) {
- if (gotdest < 0)
- transmit_response(p, "404 Not Found", req);
- else
- transmit_response(p, "484 Address Incomplete", req); /* Overlap dialing on SUBSCRIBE?? */
+ transmit_response(p, "404 Not Found", req);
ast_set_flag(p, SIP_NEEDDESTROY);
} else {
@@ -12837,6 +12901,17 @@
ast_copy_string(user->musicclass, v->value, sizeof(user->musicclass));
} else if (!strcasecmp(v->name, "accountcode")) {
ast_copy_string(user->accountcode, v->value, sizeof(user->accountcode));
+ } else if (!strcasecmp(v->name, "allowsubscribe")) {
+ if (ast_true(v->value)) {
+ global_allowsubscribe = TRUE; /* No global ban any more */
+ ast_set_flag(&user->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
+ } else
+ ast_clear_flag(&user->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
+ } else if (!strcasecmp(v->name, "allowoverlap")) {
+ if (ast_true(v->value)) {
+ ast_set_flag(&user->flags_page2, SIP_PAGE2_ALLOWOVERLAP);
+ } else
+ ast_clear_flag(&user->flags_page2, SIP_PAGE2_ALLOWOVERLAP);
} else if (!strcasecmp(v->name, "call-limit")) {
user->call_limit = atoi(v->value);
if (user->call_limit < 0)
@@ -12872,6 +12947,18 @@
} else
ast_clear_flag(&user->flags_page2, SIP_PAGE2_T38SUPPORT_TCP);
}
+ } else if (!strcasecmp(v->name, "maxcallbitrate")) {
+ user->maxcallbitrate = atoi(v->value);
+ if (user->maxcallbitrate < 0)
+ user->maxcallbitrate = default_maxcallbitrate;
+ } else if (!strcasecmp(v->name, "videosupport")) {
+ if (ast_test_flag((&global_flags_page2), SIP_PAGE2_VIDEOSUPPORT)) {
+ if (ast_true(v->value))
+ ast_set_flag((&user->flags_page2), SIP_PAGE2_VIDEOSUPPORT);
+ else
+ ast_clear_flag((&user->flags_page2), SIP_PAGE2_VIDEOSUPPORT);
+ }
+ }
}
ast_copy_flags(user, &userflags, mask.flags);
ast_free_ha(oldha);
@@ -12889,8 +12976,8 @@
peer->pokeexpire = -1;
peer->addr.sin_port = htons(DEFAULT_SIP_PORT);
}
+ ast_copy_flags((&peer->flags_page2), &global_flags_page2, SIP_PAGE2_FLAGS_TO_COPY);
ast_copy_flags(peer, &global_flags, SIP_FLAGS_TO_COPY);
- ast_copy_flags((&peer->flags_page2), &global_flags_page2, SIP_PAGE2_FLAGS_TO_COPY);
strcpy(peer->context, default_context);
strcpy(peer->subscribecontext, default_subscribecontext);
strcpy(peer->language, default_language);
@@ -12898,6 +12985,7 @@
peer->addr.sin_family = AF_INET;
peer->defaddr.sin_family = AF_INET;
peer->capability = global_capability;
+ peer->maxcallbitrate = default_maxcallbitrate;
peer->rtptimeout = global_rtptimeout;
peer->rtpholdtimeout = global_rtpholdtimeout;
peer->rtpkeepalive = global_rtpkeepalive;
@@ -13014,11 +13102,29 @@
ast_copy_string(peer->context, v->value, sizeof(peer->context));
} else if (!strcasecmp(v->name, "subscribecontext")) {
ast_copy_string(peer->subscribecontext, v->value, sizeof(peer->subscribecontext));
+ } else if (!strcasecmp(v->name, "allowsubscribe")) {
+ if (ast_true(v->value)) {
+ global_allowsubscribe = TRUE; /* No global ban any more */
+ ast_set_flag(&peer->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
+ } else
+ ast_clear_flag(&peer->flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
+ } else if (!strcasecmp(v->name, "allowoverlap")) {
+ if (ast_true(v->value)) {
+ ast_set_flag(&peer->flags_page2, SIP_PAGE2_ALLOWOVERLAP);
+ } else
+ ast_clear_flag(&peer->flags_page2, SIP_PAGE2_ALLOWOVERLAP);
} else if (!strcasecmp(v->name, "fromdomain"))
ast_copy_string(peer->fromdomain, v->value, sizeof(peer->fromdomain));
else if (!strcasecmp(v->name, "usereqphone"))
ast_set2_flag(peer, ast_true(v->value), SIP_USEREQPHONE);
- else if (!strcasecmp(v->name, "fromuser"))
+ else if (!strcasecmp(v->name, "videosupport")) {
+ if (ast_test_flag((&global_flags_page2), SIP_PAGE2_VIDEOSUPPORT)) {
+ if (ast_true(v->value))
+ ast_set_flag((&peer->flags_page2), SIP_PAGE2_VIDEOSUPPORT);
+ else
+ ast_clear_flag((&peer->flags_page2), SIP_PAGE2_VIDEOSUPPORT);
+ }
+ } else if (!strcasecmp(v->name, "fromuser"))
ast_copy_string(peer->fromuser, v->value, sizeof(peer->fromuser));
else if (!strcasecmp(v->name, "host") || !strcasecmp(v->name, "outboundproxy")) {
if (!strcasecmp(v->value, "dynamic")) {
@@ -13157,6 +13263,10 @@
ast_log(LOG_WARNING, "Qualification of peer '%s' should be 'yes', 'no', or a number of milliseconds at line %d of sip.conf\n", peer->name, v->lineno);
peer->maxms = 0;
}
+ } else if (!strcasecmp(v->name, "maxcallbitrate")) {
+ peer->maxcallbitrate = atoi(v->value);
+ if (peer->maxcallbitrate < 0)
+ peer->maxcallbitrate = default_maxcallbitrate;
}
}
if (!ast_test_flag((&global_flags_page2), SIP_PAGE2_IGNOREREGEXPIRE) && ast_test_flag((&peer->flags_page2), SIP_PAGE2_DYNAMIC) && realtime) {
@@ -13236,11 +13346,11 @@
global_regcontext[0] = '\0';
expiry = DEFAULT_EXPIRY;
global_notifyringing = DEFAULT_NOTIFYRINGING;
+ global_allowsubscribe = TRUE;
ast_copy_string(global_useragent, DEFAULT_USERAGENT, sizeof(global_useragent));
ast_copy_string(default_notifymime, DEFAULT_NOTIFYMIME, sizeof(default_notifymime));
ast_copy_string(global_realm, DEFAULT_REALM, sizeof(global_realm));
ast_copy_string(default_callerid, DEFAULT_CALLERID, sizeof(default_callerid));
- global_videosupport = DEFAULT_VIDEOSUPPORT;
compactheaders = DEFAULT_COMPACTHEADERS;
global_reg_timeout = DEFAULT_REGISTRATION_TIMEOUT;
global_regattempts_max = 0;
@@ -13252,6 +13362,10 @@
global_rtpholdtimeout = 0;
global_rtpkeepalive = 0;
global_rtautoclear = 120;
+ global_allowsubscribe = TRUE; /* Global flag, default = TRUE */
+ ast_set_flag(&global_flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE); /* Default for peers, users: TRUE */
+ ast_set_flag(&global_flags_page2, SIP_PAGE2_ALLOWOVERLAP); /* Default for peers, users: TRUE */
+
ast_set_flag(&global_flags_page2, SIP_PAGE2_RTUPDATE);
/* Initialize some reasonable defaults at SIP reload (used both for channel and as default for peers and users */
@@ -13260,6 +13374,7 @@
default_language[0] = '\0';
default_fromdomain[0] = '\0';
default_qualify = DEFAULT_QUALIFY;
+ default_maxcallbitrate = DEFAULT_MAX_CALL_BITRATE;
ast_copy_string(default_musicclass, DEFAULT_MUSICCLASS, sizeof(default_musicclass));
ast_copy_string(default_vmexten, DEFAULT_VMEXTEN, sizeof(default_vmexten));
ast_set_flag(&global_flags, SIP_DTMF_RFC2833); /*!< Default DTMF setting: RFC2833 */
@@ -13275,6 +13390,7 @@
global_relaxdtmf = FALSE;
global_callevents = FALSE;
global_t1min = DEFAULT_T1MIN;
+ ast_clear_flag(&global_flags_page2, SIP_PAGE2_VIDEOSUPPORT);
/* Read the [general] config section of sip.conf (or from realtime config) */
for (v = ast_variable_browse(cfg, "general"); v; v = v->next) {
@@ -13331,7 +13447,7 @@
global_rtpkeepalive = 0;
}
} else if (!strcasecmp(v->name, "videosupport")) {
- global_videosupport = ast_true(v->value);
+ ast_set2_flag((&global_flags_page2), ast_true(v->value), SIP_PAGE2_VIDEOSUPPORT);
} else if (!strcasecmp(v->name, "t38pt_udptl")) {
if (ast_true(v->value)) {
ast_set_flag(&global_flags_page2, SIP_PAGE2_T38SUPPORT_UDPTL);
@@ -13437,6 +13553,24 @@
ast_parse_allow_disallow(&default_prefs, &global_capability, v->value, 1);
} else if (!strcasecmp(v->name, "disallow")) {
ast_parse_allow_disallow(&default_prefs, &global_capability, v->value, 0);
+ } else if (!strcasecmp(v->name, "allowsubscribe")) {
+ if (ast_true(v->value)) {
+ ast_log(LOG_DEBUG, "Turning on global subscription support!\n");
+ global_allowsubscribe = TRUE;
+ ast_set_flag(&global_flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
+ } else {
+ global_allowsubscribe = FALSE;
+ ast_log(LOG_DEBUG, "Turning off global subscription support!\n");
+ ast_clear_flag(&global_flags_page2, SIP_PAGE2_ALLOWSUBSCRIBE);
+ }
+ } else if (!strcasecmp(v->name, "allowoverlap")) {
+ if (ast_true(v->value)) {
+ ast_log(LOG_DEBUG, "Turning on global overlap support!\n");
+ ast_set_flag(&global_flags_page2, SIP_PAGE2_ALLOWOVERLAP);
+ } else {
+ ast_log(LOG_DEBUG, "Turning off global overlap support!\n");
+ ast_clear_flag(&global_flags_page2, SIP_PAGE2_ALLOWOVERLAP);
+ }
} else if (!strcasecmp(v->name, "allowexternaldomains")) {
allow_external_domains = ast_true(v->value);
} else if (!strcasecmp(v->name, "autodomain")) {
@@ -13477,6 +13611,10 @@
}
} else if (!strcasecmp(v->name, "callevents")) {
global_callevents = ast_true(v->value);
+ } else if (!strcasecmp(v->name, "maxcallbitrate")) {
+ default_maxcallbitrate = atoi(v->value);
+ if (default_maxcallbitrate < 0)
+ default_maxcallbitrate = DEFAULT_MAX_CALL_BITRATE;
}
}
Modified: team/oej/t38passthrough/configs/sip.conf.sample
URL: http://svn.digium.com/view/asterisk/team/oej/t38passthrough/configs/sip.conf.sample?rev=15184&r1=15183&r2=15184&view=diff
==============================================================================
--- team/oej/t38passthrough/configs/sip.conf.sample (original)
+++ team/oej/t38passthrough/configs/sip.conf.sample Sun Mar 26 22:21:06 2006
@@ -26,7 +26,9 @@
[general]
context=default ; Default context for incoming calls
;allowguest=no ; Allow or reject guest calls (default is yes, this can also be set to 'osp'
- ; if asterisk was compiled with OSP support.
+ ; if asterisk was compiled with OSP support.)
+allowoverlap=no ; Disable overlap dialing support. (Default is yes)
+;allowsubscribe=no ; Disable support for subscriptions. (Default is yes)
;realm=mydomain.tld ; Realm for digest authentication
; defaults to "asterisk"
; Realms MUST be globally unique according to RFC 3261
@@ -68,7 +70,6 @@
;vmexten=voicemail ; dialplan extension to reach mailbox sets the
; Message-Account in the MWI notify message
; defaults to "asterisk"
-;videosupport=yes ; Turn on support for SIP video
;recordhistory=yes ; Record SIP history by default
; (see sip history / sip no history)
@@ -110,6 +111,11 @@
; Useful to limit subscriptions to local extensions
; Settable per peer/user also
;notifyringing = yes ; Notify subscriptions on RINGING state
+;
+;videosupport=yes ; Turn on support for SIP video
+;maxcallbitrate=384 ; Maximum bitrate for video calls (default 384 kb/s)
+ ; Videosupport and maxcallbitrate is settable
+ ; for peers and users as well
;callevents=no ; generate manager events when sip ua performs events (e.g. hold)
;
@@ -318,7 +324,11 @@
; amaflags amaflags
; call-limit call-limit
; restrictcid restrictcid
+; allowoverlap allowoverlap
+; allowsubscribe allowsubscribe
; subscribecontext subscribecontext
+; videosupport videosupport
+; maxcallbitrate maxcallbitrate
; mailbox
; username
; template
More information about the asterisk-commits
mailing list