Merge comment/formatting fixes from OEJ
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4255 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
parent
9b78337c6e
commit
4dbfcb6556
|
@ -76,11 +76,17 @@
|
|||
/* guard limit must be larger than guard secs */
|
||||
/* guard min must be < 1000, and should be >= 250 */
|
||||
#define EXPIRY_GUARD_SECS 15 /* How long before expiry do we reregister */
|
||||
#define EXPIRY_GUARD_LIMIT 30 /* Below here, we use EXPIRY_GUARD_PCT instead of EXPIRY_GUARD_SECS */
|
||||
#define EXPIRY_GUARD_MIN 500 /* This is the minimum guard time applied. If GUARD_PCT turns out
|
||||
to be lower than this, it will use this time instead. This is in
|
||||
milliseconds. */
|
||||
#define EXPIRY_GUARD_PCT 0.20 /* Percentage of expires timeout to use when below EXPIRY_GUARD_LIMIT */
|
||||
#define EXPIRY_GUARD_LIMIT 30 /* Below here, we use EXPIRY_GUARD_PCT instead of
|
||||
EXPIRY_GUARD_SECS */
|
||||
#define EXPIRY_GUARD_MIN 500 /* This is the minimum guard time applied. If
|
||||
GUARD_PCT turns out to be lower than this, it
|
||||
will use this time instead.
|
||||
This is in milliseconds. */
|
||||
#define EXPIRY_GUARD_PCT 0.20 /* Percentage of expires timeout to use when
|
||||
below EXPIRY_GUARD_LIMIT */
|
||||
|
||||
static int max_expiry = DEFAULT_MAX_EXPIRY;
|
||||
static int default_expiry = DEFAULT_DEFAULT_EXPIRY;
|
||||
|
||||
#ifndef MAX
|
||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||
|
@ -89,23 +95,21 @@
|
|||
#define CALLERID_UNKNOWN "Unknown"
|
||||
|
||||
/* --- Choices for DTMF support in SIP channel */
|
||||
#define SIP_DTMF_RFC2833 (1 << 0)
|
||||
#define SIP_DTMF_INBAND (1 << 1)
|
||||
#define SIP_DTMF_INFO (1 << 2)
|
||||
#define SIP_DTMF_RFC2833 (1 << 0) /* RTP DTMF */
|
||||
#define SIP_DTMF_INBAND (1 << 1) /* Inband audio, only for ULAW/ALAW */
|
||||
#define SIP_DTMF_INFO (1 << 2) /* SIP Info messages */
|
||||
|
||||
static int max_expiry = DEFAULT_MAX_EXPIRY;
|
||||
static int default_expiry = DEFAULT_DEFAULT_EXPIRY;
|
||||
|
||||
#define DEFAULT_MAXMS 2000 /* Must be faster than 2 seconds by default */
|
||||
#define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
|
||||
#define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
|
||||
#define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
|
||||
#define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
|
||||
|
||||
#define DEFAULT_RETRANS 1000 /* How frequently to retransmit */
|
||||
#define MAX_RETRANS 5 /* Try only 5 times for retransmissions */
|
||||
#define DEFAULT_RETRANS 1000 /* How frequently to retransmit */
|
||||
#define MAX_RETRANS 5 /* Try only 5 times for retransmissions */
|
||||
|
||||
/* SIP Debug */
|
||||
#define DEBUG_READ 0 /* Recieved data */
|
||||
#define DEBUG_SEND 1 /* Transmit data */
|
||||
/* SIP Debug */
|
||||
#define DEBUG_READ 0 /* Recieved data */
|
||||
#define DEBUG_SEND 1 /* Transmit data */
|
||||
|
||||
static char *desc = "Session Initiation Protocol (SIP)";
|
||||
static char *type = "SIP";
|
||||
|
@ -113,7 +117,7 @@ static char *tdesc = "Session Initiation Protocol (SIP)";
|
|||
static char *config = "sip.conf";
|
||||
|
||||
#define DEFAULT_SIP_PORT 5060 /* From RFC 2543 */
|
||||
#define SIP_MAX_PACKET 4096 /* Also from RFC 2543, should sub headers tho */
|
||||
#define SIP_MAX_PACKET 4096 /* Also from RFC 2543, should sub headers tho */
|
||||
|
||||
#define ALLOWED_METHODS "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER"
|
||||
|
||||
|
@ -146,7 +150,7 @@ static int global_trustrpid = 0; /* Trust RPID headers? Default off. */
|
|||
static int global_progressinband = 0;
|
||||
|
||||
#ifdef OSP_SUPPORT
|
||||
static int global_ospauth = 0;
|
||||
static int global_ospauth = 0; /* OSP = Open Settlement Protocol */
|
||||
#endif
|
||||
|
||||
#define DEFAULT_MWITIME 10
|
||||
|
@ -187,11 +191,11 @@ static int videosupport = 0;
|
|||
|
||||
static int global_dtmfmode = SIP_DTMF_RFC2833; /* DTMF mode default */
|
||||
static int recordhistory = 0;
|
||||
static int global_promiscredir;
|
||||
static int global_promiscredir; /* Support of 302 REDIR - Default off */
|
||||
|
||||
static char global_musicclass[MAX_LANGUAGE] = ""; /* Global music on hold class */
|
||||
static char global_realm[AST_MAX_EXTENSION] = "asterisk"; /* Default realm */
|
||||
static char regcontext[AST_MAX_EXTENSION] = "";
|
||||
static char regcontext[AST_MAX_EXTENSION] = ""; /* Context for auto-extensions */
|
||||
|
||||
/* Expire slowly */
|
||||
static int expiry = 900;
|
||||
|
@ -216,10 +220,10 @@ static struct sip_codec_pref {
|
|||
|
||||
/* sip_request: The data grabbed from the UDP socket */
|
||||
struct sip_request {
|
||||
char *rlPart1; /* SIP Method Name or "SIP/2.0" protocol version */
|
||||
char *rlPart2; /* The Request URI or Response Status */
|
||||
int len;
|
||||
int headers; /* SIP Headers */
|
||||
char *rlPart1; /* SIP Method Name or "SIP/2.0" protocol version */
|
||||
char *rlPart2; /* The Request URI or Response Status */
|
||||
int len; /* Length */
|
||||
int headers; /* # of SIP Headers */
|
||||
char *header[SIP_MAX_HEADERS];
|
||||
int lines; /* SDP Content */
|
||||
char *line[SIP_MAX_LINES];
|
||||
|
@ -273,7 +277,7 @@ static struct sip_pvt {
|
|||
struct sockaddr_in sa; /* Our peer */
|
||||
struct sockaddr_in redirip; /* Where our RTP should be going if not to us */
|
||||
struct sockaddr_in vredirip; /* Where our Video RTP should be going if not to us */
|
||||
int redircodecs; /* Redirect codecs */
|
||||
int redircodecs; /* Redirect codecs */
|
||||
struct sockaddr_in recv; /* Received as */
|
||||
struct in_addr ourip; /* Our IP */
|
||||
struct ast_channel *owner; /* Who owns us */
|
||||
|
@ -298,12 +302,12 @@ static struct sip_pvt {
|
|||
char peername[256];
|
||||
char authname[256]; /* Who we use for authentication */
|
||||
char uri[256]; /* Original requested URI */
|
||||
char peersecret[256];
|
||||
char peersecret[256]; /* Password */
|
||||
char peermd5secret[256];
|
||||
char cid_num[256]; /* Caller*ID */
|
||||
char cid_name[256]; /* Caller*ID */
|
||||
char via[256];
|
||||
char fullcontact[128]; /* Extra parameters to go in the "To" header */
|
||||
char via[256]; /* Via: header */
|
||||
char fullcontact[128]; /* The Contact: that the UA registers with us */
|
||||
char accountcode[20]; /* Account code */
|
||||
char our_contact[256]; /* Our contact header */
|
||||
char realm[256]; /* Authorization realm */
|
||||
|
@ -331,15 +335,15 @@ static struct sip_pvt {
|
|||
int rtptimeout; /* RTP timeout time */
|
||||
int rtpholdtimeout; /* RTP timeout when on hold */
|
||||
|
||||
int subscribed;
|
||||
int subscribed; /* Is this call a subscription? */
|
||||
int stateid;
|
||||
int dialogver;
|
||||
int promiscredir; /* Promiscuous redirection */
|
||||
|
||||
int trustrpid;
|
||||
int trustrpid; /* Trust RPID headers? */
|
||||
int progressinband;
|
||||
|
||||
int dtmfmode;
|
||||
int dtmfmode; /* DTMF to use for this call */
|
||||
struct ast_dsp *vad;
|
||||
|
||||
struct sip_peer *peerpoke; /* If this calls is to poke a peer, which one */
|
||||
|
@ -347,7 +351,7 @@ static struct sip_pvt {
|
|||
struct ast_rtp *rtp; /* RTP Session */
|
||||
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 sip_history *history; /* History of this SIP dialog */
|
||||
struct sip_pvt *next; /* Next call in chain */
|
||||
} *iflist = NULL;
|
||||
|
||||
|
@ -357,104 +361,104 @@ static struct sip_pvt {
|
|||
/* sip packet - read in sipsock_read, transmitted in send_request */
|
||||
struct sip_pkt {
|
||||
struct sip_pkt *next; /* Next packet */
|
||||
int retrans; /* Retransmission number */
|
||||
int seqno; /* Sequence number */
|
||||
int flags; /* non-zero if this is a response packet (e.g. 200 OK) */
|
||||
int retrans; /* Retransmission number */
|
||||
int seqno; /* Sequence number */
|
||||
int flags; /* non-zero if this is a response packet (e.g. 200 OK) */
|
||||
struct sip_pvt *owner; /* Owner call */
|
||||
int retransid; /* Retransmission ID */
|
||||
int packetlen; /* Length of packet */
|
||||
int retransid; /* Retransmission ID */
|
||||
int packetlen; /* Length of packet */
|
||||
char data[0];
|
||||
};
|
||||
|
||||
/* Structure for SIP user data. User's place calls to us */
|
||||
struct sip_user {
|
||||
/* Users who can access various contexts */
|
||||
char name[80];
|
||||
char secret[80];
|
||||
char md5secret[80];
|
||||
char context[80];
|
||||
char cid_num[80];
|
||||
char cid_name[80];
|
||||
char accountcode[20];
|
||||
char language[MAX_LANGUAGE];
|
||||
char name[80]; /* The name in sip.conf */
|
||||
char secret[80]; /* Password */
|
||||
char md5secret[80]; /* Password in md5 */
|
||||
char context[80]; /* Default context for incoming calls */
|
||||
char cid_num[80]; /* Caller ID num */
|
||||
char cid_name[80]; /* Caller ID name */
|
||||
char accountcode[20]; /* Account code */
|
||||
char language[MAX_LANGUAGE]; /* Default language for this user */
|
||||
char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
|
||||
char useragent[256]; /* User agent in SIP request */
|
||||
unsigned int callgroup;
|
||||
unsigned int pickupgroup;
|
||||
int nat;
|
||||
int amaflags;
|
||||
int callingpres;
|
||||
int insecure;
|
||||
int canreinvite;
|
||||
int capability;
|
||||
unsigned int callgroup; /* Call group */
|
||||
unsigned int pickupgroup; /* Pickup Group */
|
||||
int nat; /* NAT setting */
|
||||
int amaflags; /* AMA flags for billing */
|
||||
int callingpres; /* Calling id presentation */
|
||||
int insecure; /* Insecure means don't check password */
|
||||
int canreinvite; /* Do we support re-invites ? */
|
||||
int capability; /* Codec capability */
|
||||
#ifdef OSP_SUPPORT
|
||||
int ospauth; /* Allow OSP Authentication */
|
||||
int ospauth; /* Allow OSP Authentication */
|
||||
#endif
|
||||
int dtmfmode;
|
||||
int dtmfmode; /* DTMF setting */
|
||||
int inUse;
|
||||
int incominglimit;
|
||||
int outUse;
|
||||
int outgoinglimit;
|
||||
int promiscredir;
|
||||
int useclientcode;
|
||||
int trustrpid;
|
||||
int promiscredir; /* Support of 302 redirect */
|
||||
int useclientcode; /* SNOM clientcode support */
|
||||
int trustrpid; /* Trust remote party ID from this UA */
|
||||
int progressinband;
|
||||
struct ast_ha *ha;
|
||||
int temponly;
|
||||
struct ast_ha *ha; /* ACL setting */
|
||||
int temponly; /* Flag for temporary users (realtime) */
|
||||
struct sip_user *next;
|
||||
};
|
||||
|
||||
/* Structure for SIP peer data, we place calls to peers if registred or fixed IP address (host) */
|
||||
struct sip_peer {
|
||||
char name[80];
|
||||
char secret[80];
|
||||
char md5secret[80];
|
||||
char context[80]; /* JK02: peers need context too to allow parking etc */
|
||||
char username[80];
|
||||
char tohost[80];
|
||||
char regexten[AST_MAX_EXTENSION]; /* Extension to register (if regcontext is used) */
|
||||
char fromuser[80];
|
||||
char fromdomain[80];
|
||||
char fullcontact[128];
|
||||
char cid_num[80];
|
||||
char cid_name[80];
|
||||
char mailbox[AST_MAX_EXTENSION];
|
||||
char language[MAX_LANGUAGE];
|
||||
char name[80]; /* Peer name in sip.conf */
|
||||
char secret[80]; /* Password */
|
||||
char md5secret[80]; /* Password in MD5 */
|
||||
char context[80]; /* Default context for incoming calls */
|
||||
char username[80]; /* Temporary username until registration */
|
||||
char tohost[80]; /* If not dynamic, IP address */
|
||||
char regexten[AST_MAX_EXTENSION]; /* Extension to register (if regcontext is used) */
|
||||
char fromuser[80]; /* From: user when calling this peer */
|
||||
char fromdomain[80]; /* From: domain when calling this peer */
|
||||
char fullcontact[128]; /* Contact registred with us (not in sip.conf) */
|
||||
char cid_num[80]; /* Caller ID num */
|
||||
char cid_name[80]; /* Caller ID name */
|
||||
char mailbox[AST_MAX_EXTENSION]; /* Mailbox setting for MWI checks */
|
||||
char language[MAX_LANGUAGE]; /* Default language for prompts */
|
||||
char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
|
||||
char useragent[256]; /* User agent in SIP request */
|
||||
char useragent[256]; /* User agent in SIP request (saved from registration) */
|
||||
int lastmsgssent;
|
||||
time_t lastmsgcheck;
|
||||
int dynamic;
|
||||
int expire;
|
||||
time_t lastmsgcheck; /* Last time we checked for MWI */
|
||||
int dynamic; /* Dynamic? Yes or no. Dynamic hosts register with us */
|
||||
int expire; /* Registration expiration */
|
||||
int expiry;
|
||||
int capability;
|
||||
int capability; /* Codec capability */
|
||||
int rtptimeout;
|
||||
int rtpholdtimeout;
|
||||
int insecure;
|
||||
int insecure; /* Do we want to authenticate this peer? */
|
||||
#ifdef OSP_SUPPORT
|
||||
int ospauth; /* Allow OSP Authentication */
|
||||
int ospauth; /* Allow OSP Authentication */
|
||||
#endif
|
||||
int nat;
|
||||
int canreinvite;
|
||||
unsigned int callgroup;
|
||||
unsigned int pickupgroup;
|
||||
int promiscredir;
|
||||
int dtmfmode;
|
||||
int trustrpid;
|
||||
int useclientcode;
|
||||
int nat; /* NAT support needed? */
|
||||
int canreinvite; /* Does the peer support re-invites? */
|
||||
unsigned int callgroup; /* Call group */
|
||||
unsigned int pickupgroup; /* Pickup group */
|
||||
int promiscredir; /* Support of 302 redirect? */
|
||||
int dtmfmode; /* DTMF mode */
|
||||
int trustrpid; /* Trust Remote Party ID headers? */
|
||||
int useclientcode; /* SNOM clientcode support */
|
||||
int progressinband;
|
||||
struct sockaddr_in addr;
|
||||
struct sockaddr_in addr; /* IP address of peer */
|
||||
struct in_addr mask;
|
||||
|
||||
/* Qualification */
|
||||
struct sip_pvt *call; /* Call pointer */
|
||||
int pokeexpire; /* When to expire poke */
|
||||
int lastms; /* How long last response took (in ms), or -1 for no response */
|
||||
int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
|
||||
struct timeval ps; /* Ping send time */
|
||||
int pokeexpire; /* When to expire poke (qualify= checking) */
|
||||
int lastms; /* How long last response took (in ms), or -1 for no response */
|
||||
int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
|
||||
struct timeval ps; /* Ping send time */
|
||||
|
||||
struct sockaddr_in defaddr;
|
||||
struct ast_ha *ha;
|
||||
struct sockaddr_in defaddr; /* Default IP address, used until registration */
|
||||
struct ast_ha *ha; /* Access control list */
|
||||
int delme;
|
||||
int selfdestruct;
|
||||
int lastmsg;
|
||||
|
@ -465,25 +469,27 @@ struct sip_peer {
|
|||
AST_MUTEX_DEFINE_STATIC(sip_reload_lock);
|
||||
static int sip_reloading = 0;
|
||||
|
||||
#define REG_STATE_UNREGISTERED 0
|
||||
#define REG_STATE_REGSENT 1
|
||||
#define REG_STATE_AUTHSENT 2
|
||||
#define REG_STATE_REGISTERED 3
|
||||
#define REG_STATE_REJECTED 4
|
||||
#define REG_STATE_TIMEOUT 5
|
||||
#define REG_STATE_NOAUTH 6
|
||||
/* States for outbound registrations (with register= lines in sip.conf */
|
||||
#define REG_STATE_UNREGISTERED 0
|
||||
#define REG_STATE_REGSENT 1
|
||||
#define REG_STATE_AUTHSENT 2
|
||||
#define REG_STATE_REGISTERED 3
|
||||
#define REG_STATE_REJECTED 4
|
||||
#define REG_STATE_TIMEOUT 5
|
||||
#define REG_STATE_NOAUTH 6
|
||||
|
||||
#define SIP_NAT_NEVER 0
|
||||
/* NAT settings */
|
||||
#define SIP_NAT_NEVER 0 /* No nat support */
|
||||
#define SIP_NAT_RFC3581 (1 << 0)
|
||||
#define SIP_NAT_ROUTE (1 << 2)
|
||||
#define SIP_NAT_ALWAYS (SIP_NAT_ROUTE | SIP_NAT_RFC3581)
|
||||
|
||||
/* sip_registry: Registrations with other SIP proxies */
|
||||
struct sip_registry {
|
||||
int portno; /* Optional port override */
|
||||
int portno; /* Optional port override */
|
||||
char username[80]; /* Who we are registering as */
|
||||
char authuser[80]; /* Who we *authenticate* as */
|
||||
char hostname[80];
|
||||
char hostname[80]; /* Domain or host we register to */
|
||||
char secret[80]; /* Password or key name in []'s */
|
||||
char md5secret[80];
|
||||
char contact[80]; /* Contact extension */
|
||||
|
@ -492,7 +498,7 @@ struct sip_registry {
|
|||
int timeout; /* sched id of sip_reg_timeout */
|
||||
int refresh; /* How often to refresh */
|
||||
struct sip_pvt *call; /* create a sip_pvt structure for each outbound "registration call" in progress */
|
||||
int regstate;
|
||||
int regstate; /* Registration state (see above) */
|
||||
int callid_valid; /* 0 means we haven't chosen callid for this registry yet. */
|
||||
char callid[80]; /* Global CallID for this registry */
|
||||
unsigned int ocseq; /* Sequence number we got to for REGISTERs for this registry */
|
||||
|
@ -5262,7 +5268,7 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, char *cmd
|
|||
rpid = get_header(req, "Remote-Party-ID");
|
||||
memset(rpid_num,0,sizeof(rpid_num));
|
||||
if(!ast_strlen_zero(rpid))
|
||||
p->callingpres = get_rpid_num(rpid,rpid_num, sizeof(rpid_num));
|
||||
p->callingpres = get_rpid_num(rpid,rpid_num, sizeof(rpid_num));
|
||||
|
||||
of = ditch_braces(from);
|
||||
if (ast_strlen_zero(p->exten)) {
|
||||
|
@ -5290,7 +5296,7 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, char *cmd
|
|||
if (*calleridname)
|
||||
strncpy(p->cid_name, calleridname, sizeof(p->cid_name) - 1);
|
||||
if (ast_strlen_zero(of))
|
||||
return 0;
|
||||
return 0;
|
||||
ast_mutex_lock(&userl.lock);
|
||||
user = find_user(of);
|
||||
/* Find user based on user name in the from header */
|
||||
|
@ -5304,10 +5310,10 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, char *cmd
|
|||
p->progressinband = user->progressinband;
|
||||
/* replace callerid if rpid found, and not restricted */
|
||||
if(!ast_strlen_zero(rpid_num) && p->trustrpid) {
|
||||
if (*calleridname)
|
||||
strncpy(p->cid_name, calleridname, sizeof(p->cid_name) - 1);
|
||||
strncpy(p->cid_num, rpid_num, sizeof(p->cid_num) - 1);
|
||||
ast_shrink_phone_number(p->cid_num);
|
||||
if (*calleridname)
|
||||
strncpy(p->cid_name, calleridname, sizeof(p->cid_name) - 1);
|
||||
strncpy(p->cid_num, rpid_num, sizeof(p->cid_num) - 1);
|
||||
ast_shrink_phone_number(p->cid_num);
|
||||
}
|
||||
|
||||
if (p->rtp) {
|
||||
|
@ -5383,10 +5389,10 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, char *cmd
|
|||
p->progressinband = peer->progressinband;
|
||||
/* replace callerid if rpid found, and not restricted */
|
||||
if(!ast_strlen_zero(rpid_num) && p->trustrpid) {
|
||||
if (*calleridname)
|
||||
strncpy(p->cid_name, calleridname, sizeof(p->cid_name) - 1);
|
||||
strncpy(p->cid_num, rpid_num, sizeof(p->cid_num) - 1);
|
||||
ast_shrink_phone_number(p->cid_num);
|
||||
if (*calleridname)
|
||||
strncpy(p->cid_name, calleridname, sizeof(p->cid_name) - 1);
|
||||
strncpy(p->cid_num, rpid_num, sizeof(p->cid_num) - 1);
|
||||
ast_shrink_phone_number(p->cid_num);
|
||||
}
|
||||
#ifdef OSP_SUPPORT
|
||||
p->ospauth = peer->ospauth;
|
||||
|
@ -5459,11 +5465,14 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, char *cmd
|
|||
|
||||
return res;
|
||||
}
|
||||
|
||||
/*--- check_user: Find user ---*/
|
||||
static int check_user(struct sip_pvt *p, struct sip_request *req, char *cmd, char *uri, int reliable, struct sockaddr_in *sin, int ignore)
|
||||
{
|
||||
return check_user_full(p, req, cmd, uri, reliable, sin, ignore, NULL, 0);
|
||||
}
|
||||
/*--- get_msg_text: Get text out of a SIP MESSAGE ---*/
|
||||
|
||||
/*--- get_msg_text: Get text out of a SIP MESSAGE packet ---*/
|
||||
static int get_msg_text(char *buf, int len, struct sip_request *req)
|
||||
{
|
||||
int x;
|
||||
|
@ -5491,6 +5500,7 @@ static void receive_message(struct sip_pvt *p, struct sip_request *req)
|
|||
{
|
||||
char buf[1024];
|
||||
struct ast_frame f;
|
||||
|
||||
if (get_msg_text(buf, sizeof(buf), req)) {
|
||||
ast_log(LOG_WARNING, "Unable to retrieve text from %s\n", p->callid);
|
||||
return;
|
||||
|
@ -5498,13 +5508,13 @@ static void receive_message(struct sip_pvt *p, struct sip_request *req)
|
|||
if (p->owner) {
|
||||
if (sip_debug_test_pvt(p))
|
||||
ast_verbose("Message received: '%s'\n", buf);
|
||||
memset(&f, 0, sizeof(f));
|
||||
f.frametype = AST_FRAME_TEXT;
|
||||
f.subclass = 0;
|
||||
f.offset = 0;
|
||||
f.data = buf;
|
||||
f.datalen = strlen(buf);
|
||||
ast_queue_frame(p->owner, &f);
|
||||
memset(&f, 0, sizeof(f));
|
||||
f.frametype = AST_FRAME_TEXT;
|
||||
f.subclass = 0;
|
||||
f.offset = 0;
|
||||
f.data = buf;
|
||||
f.datalen = strlen(buf);
|
||||
ast_queue_frame(p->owner, &f);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5518,6 +5528,7 @@ static int sip_show_inuse(int fd, int argc, char *argv[]) {
|
|||
char olimits[40] = "";
|
||||
char iused[40];
|
||||
char oused[40];
|
||||
|
||||
if (argc != 3)
|
||||
return RESULT_SHOWUSAGE;
|
||||
ast_mutex_lock(&userl.lock);
|
||||
|
@ -5678,20 +5689,20 @@ static int sip_show_peers(int fd, int argc, char *argv[])
|
|||
/*--- print_group: Print call group and pickup group ---*/
|
||||
static void print_group(int fd, unsigned int group)
|
||||
{
|
||||
unsigned int i;
|
||||
int first=1;
|
||||
unsigned int i;
|
||||
int first=1;
|
||||
|
||||
for (i=0; i<=31; i++) { /* Max group is 31 */
|
||||
if (group & (1 << i)) {
|
||||
if (!first) {
|
||||
ast_cli(fd, ", ");
|
||||
} else {
|
||||
first=0;
|
||||
}
|
||||
ast_cli(fd, "%u", i);
|
||||
}
|
||||
}
|
||||
ast_cli(fd, " (%u)\n", group);
|
||||
for (i=0; i<=31; i++) { /* Max group is 31 */
|
||||
if (group & (1 << i)) {
|
||||
if (!first) {
|
||||
ast_cli(fd, ", ");
|
||||
} else {
|
||||
first=0;
|
||||
}
|
||||
ast_cli(fd, "%u", i);
|
||||
}
|
||||
}
|
||||
ast_cli(fd, " (%u)\n", group);
|
||||
}
|
||||
|
||||
/*--- sip_show_peer: Show one peer in detail ---*/
|
||||
|
@ -5811,6 +5822,7 @@ static int sip_show_registry(int fd, int argc, char *argv[])
|
|||
#define FORMAT "%-30.30s %-12.12s %8d %-20.20s\n"
|
||||
struct sip_registry *reg;
|
||||
char host[80];
|
||||
|
||||
if (argc != 3)
|
||||
return RESULT_SHOWUSAGE;
|
||||
ast_mutex_lock(®l.lock);
|
||||
|
@ -5854,31 +5866,31 @@ static int __sip_show_channels(int fd, int argc, char *argv[], int subscriptions
|
|||
ast_mutex_lock(&iflock);
|
||||
cur = iflist;
|
||||
if (!subscriptions)
|
||||
ast_cli(fd, FORMAT2, "Peer", "User/ANR", "Call ID", "Seq (Tx/Rx)", "Format");
|
||||
ast_cli(fd, FORMAT2, "Peer", "User/ANR", "Call ID", "Seq (Tx/Rx)", "Format");
|
||||
else
|
||||
ast_cli(fd, FORMAT3, "Peer", "User", "Call ID", "URI");
|
||||
ast_cli(fd, FORMAT3, "Peer", "User", "Call ID", "URI");
|
||||
while (cur) {
|
||||
if (!cur->subscribed && !subscriptions) {
|
||||
ast_cli(fd, FORMAT, ast_inet_ntoa(iabuf, sizeof(iabuf), cur->sa.sin_addr),
|
||||
ast_strlen_zero(cur->username) ? ( ast_strlen_zero(cur->cid_num) ? "(None)" : cur->cid_num ) : cur->username,
|
||||
cur->callid,
|
||||
cur->ocseq, cur->icseq,
|
||||
ast_getformatname(cur->owner ? cur->owner->nativeformats : 0), cur->needdestroy ? "(d)" : "" );
|
||||
numchans++;
|
||||
ast_cli(fd, FORMAT, ast_inet_ntoa(iabuf, sizeof(iabuf), cur->sa.sin_addr),
|
||||
ast_strlen_zero(cur->username) ? ( ast_strlen_zero(cur->cid_num) ? "(None)" : cur->cid_num ) : cur->username,
|
||||
cur->callid,
|
||||
cur->ocseq, cur->icseq,
|
||||
ast_getformatname(cur->owner ? cur->owner->nativeformats : 0), cur->needdestroy ? "(d)" : "" );
|
||||
numchans++;
|
||||
}
|
||||
if (cur->subscribed && subscriptions) {
|
||||
ast_cli(fd, FORMAT3, ast_inet_ntoa(iabuf, sizeof(iabuf), cur->sa.sin_addr),
|
||||
ast_strlen_zero(cur->username) ? ( ast_strlen_zero(cur->cid_num) ? "(None)" : cur->cid_num ) : cur->username,
|
||||
cur->callid, cur->uri);
|
||||
ast_cli(fd, FORMAT3, ast_inet_ntoa(iabuf, sizeof(iabuf), cur->sa.sin_addr),
|
||||
ast_strlen_zero(cur->username) ? ( ast_strlen_zero(cur->cid_num) ? "(None)" : cur->cid_num ) : cur->username,
|
||||
cur->callid, cur->uri);
|
||||
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
ast_mutex_unlock(&iflock);
|
||||
if (!subscriptions)
|
||||
ast_cli(fd, "%d active SIP channel(s)\n", numchans);
|
||||
ast_cli(fd, "%d active SIP channel(s)\n", numchans);
|
||||
else
|
||||
ast_cli(fd, "%d active SIP subscriptions(s)\n", numchans);
|
||||
ast_cli(fd, "%d active SIP subscriptions(s)\n", numchans);
|
||||
return RESULT_SUCCESS;
|
||||
#undef FORMAT
|
||||
#undef FORMAT2
|
||||
|
@ -5891,6 +5903,7 @@ static char *complete_sipch(char *line, char *word, int pos, int state)
|
|||
int which=0;
|
||||
struct sip_pvt *cur;
|
||||
char *c = NULL;
|
||||
|
||||
ast_mutex_lock(&iflock);
|
||||
cur = iflist;
|
||||
while(cur) {
|
||||
|
@ -5914,6 +5927,7 @@ static int sip_show_channel(int fd, int argc, char *argv[])
|
|||
char iabuf[INET_ADDRSTRLEN];
|
||||
size_t len;
|
||||
int found = 0;
|
||||
|
||||
if (argc != 4)
|
||||
return RESULT_SHOWUSAGE;
|
||||
len = strlen(argv[3]);
|
||||
|
@ -5923,9 +5937,9 @@ static int sip_show_channel(int fd, int argc, char *argv[])
|
|||
if (!strncasecmp(cur->callid, argv[3],len)) {
|
||||
ast_cli(fd,"\n");
|
||||
if (cur->subscribed)
|
||||
ast_cli(fd, " * Subscription\n");
|
||||
ast_cli(fd, " * Subscription\n");
|
||||
else
|
||||
ast_cli(fd, " * SIP Call\n");
|
||||
ast_cli(fd, " * SIP Call\n");
|
||||
ast_cli(fd, " Direction: %s\n", cur->outgoing?"Outgoing":"Incoming");
|
||||
ast_cli(fd, " Call-ID: %s\n", cur->callid);
|
||||
ast_cli(fd, " Our Codec Capability: %d\n", cur->capability);
|
||||
|
@ -5940,13 +5954,13 @@ static int sip_show_channel(int fd, int argc, char *argv[])
|
|||
ast_cli(fd, " Their Tag: %s\n", cur->theirtag);
|
||||
ast_cli(fd, " SIP User agent: %s\n", cur->useragent);
|
||||
if (!ast_strlen_zero(cur->username))
|
||||
ast_cli(fd, " Username: %s\n", cur->username);
|
||||
ast_cli(fd, " Username: %s\n", cur->username);
|
||||
if (!ast_strlen_zero(cur->peername))
|
||||
ast_cli(fd, " Peername: %s\n", cur->peername);
|
||||
ast_cli(fd, " Peername: %s\n", cur->peername);
|
||||
if (!ast_strlen_zero(cur->uri))
|
||||
ast_cli(fd, " Original uri: %s\n", cur->uri);
|
||||
ast_cli(fd, " Original uri: %s\n", cur->uri);
|
||||
if (!ast_strlen_zero(cur->cid_num))
|
||||
ast_cli(fd, " Caller-ID: %s\n", cur->cid_num);
|
||||
ast_cli(fd, " Caller-ID: %s\n", cur->cid_num);
|
||||
ast_cli(fd, " Need Destroy: %d\n", cur->needdestroy);
|
||||
ast_cli(fd, " Last Message: %s\n", cur->lastmsg);
|
||||
ast_cli(fd, " Promiscuous Redir: %s\n", cur->promiscredir ? "Yes" : "No");
|
||||
|
@ -5977,6 +5991,7 @@ static int sip_show_history(int fd, int argc, char *argv[])
|
|||
size_t len;
|
||||
int x;
|
||||
int found = 0;
|
||||
|
||||
if (argc != 4)
|
||||
return RESULT_SHOWUSAGE;
|
||||
if (!recordhistory)
|
||||
|
@ -5988,9 +6003,9 @@ static int sip_show_history(int fd, int argc, char *argv[])
|
|||
if (!strncasecmp(cur->callid, argv[3],len)) {
|
||||
ast_cli(fd,"\n");
|
||||
if (cur->subscribed)
|
||||
ast_cli(fd, " * Subscription\n");
|
||||
ast_cli(fd, " * Subscription\n");
|
||||
else
|
||||
ast_cli(fd, " * SIP Call\n");
|
||||
ast_cli(fd, " * SIP Call\n");
|
||||
x = 0;
|
||||
hist = cur->history;
|
||||
while(hist) {
|
||||
|
@ -6027,43 +6042,43 @@ static void receive_info(struct sip_pvt *p, struct sip_request *req)
|
|||
|
||||
/* Try getting the "signal=" part */
|
||||
if (ast_strlen_zero(c = get_sdp(req, "Signal")) && ast_strlen_zero(c = get_sdp(req, "d"))) {
|
||||
ast_log(LOG_WARNING, "Unable to retrieve DTMF signal from INFO message from %s\n", p->callid);
|
||||
transmit_response(p, "200 OK", req); /* Should return error */
|
||||
return;
|
||||
ast_log(LOG_WARNING, "Unable to retrieve DTMF signal from INFO message from %s\n", p->callid);
|
||||
transmit_response(p, "200 OK", req); /* Should return error */
|
||||
return;
|
||||
} else {
|
||||
strncpy(buf, c, sizeof(buf) - 1);
|
||||
strncpy(buf, c, sizeof(buf) - 1);
|
||||
}
|
||||
|
||||
if (p->owner) { /* PBX call */
|
||||
if (!ast_strlen_zero(buf)) {
|
||||
if (sipdebug)
|
||||
ast_verbose("* DTMF received: '%c'\n", buf[0]);
|
||||
if (buf[0] == '*')
|
||||
event = 10;
|
||||
else if (buf[0] == '#')
|
||||
event = 11;
|
||||
else
|
||||
event = atoi(buf);
|
||||
if (event < 10) {
|
||||
resp = '0' + event;
|
||||
} else if (event < 11) {
|
||||
resp = '*';
|
||||
} else if (event < 12) {
|
||||
resp = '#';
|
||||
} else if (event < 16) {
|
||||
resp = 'A' + (event - 12);
|
||||
}
|
||||
/* Build DTMF frame and deliver to PBX for transmission to other call leg*/
|
||||
memset(&f, 0, sizeof(f));
|
||||
f.frametype = AST_FRAME_DTMF;
|
||||
f.subclass = resp;
|
||||
f.offset = 0;
|
||||
f.data = NULL;
|
||||
f.datalen = 0;
|
||||
ast_queue_frame(p->owner, &f);
|
||||
}
|
||||
transmit_response(p, "200 OK", req);
|
||||
return;
|
||||
if (!ast_strlen_zero(buf)) {
|
||||
if (sipdebug)
|
||||
ast_verbose("* DTMF received: '%c'\n", buf[0]);
|
||||
if (buf[0] == '*')
|
||||
event = 10;
|
||||
else if (buf[0] == '#')
|
||||
event = 11;
|
||||
else
|
||||
event = atoi(buf);
|
||||
if (event < 10) {
|
||||
resp = '0' + event;
|
||||
} else if (event < 11) {
|
||||
resp = '*';
|
||||
} else if (event < 12) {
|
||||
resp = '#';
|
||||
} else if (event < 16) {
|
||||
resp = 'A' + (event - 12);
|
||||
}
|
||||
/* Build DTMF frame and deliver to PBX for transmission to other call leg*/
|
||||
memset(&f, 0, sizeof(f));
|
||||
f.frametype = AST_FRAME_DTMF;
|
||||
f.subclass = resp;
|
||||
f.offset = 0;
|
||||
f.data = NULL;
|
||||
f.datalen = 0;
|
||||
ast_queue_frame(p->owner, &f);
|
||||
}
|
||||
transmit_response(p, "200 OK", req);
|
||||
return;
|
||||
} else {
|
||||
transmit_response(p, "481 Call leg/transaction does not exist", req);
|
||||
p->needdestroy = 1;
|
||||
|
@ -6098,6 +6113,7 @@ static int sip_do_debug_ip(int fd, int argc, char *argv[])
|
|||
char iabuf[INET_ADDRSTRLEN];
|
||||
int port = 0;
|
||||
char *p, *arg;
|
||||
|
||||
if (argc != 4)
|
||||
return RESULT_SHOWUSAGE;
|
||||
arg = argv[3];
|
||||
|
@ -6169,6 +6185,7 @@ static int sip_do_debug(int fd, int argc, char *argv[])
|
|||
return RESULT_SUCCESS;
|
||||
}
|
||||
|
||||
/*--- sip_do_history: Enable SIP History logging (CLI) ---*/
|
||||
static int sip_do_history(int fd, int argc, char *argv[])
|
||||
{
|
||||
if (argc != 2) {
|
||||
|
@ -6179,6 +6196,7 @@ static int sip_do_history(int fd, int argc, char *argv[])
|
|||
return RESULT_SUCCESS;
|
||||
}
|
||||
|
||||
/*--- sip_no_history: Disable SIP History logging (CLI) ---*/
|
||||
static int sip_no_history(int fd, int argc, char *argv[])
|
||||
{
|
||||
if (argc != 3) {
|
||||
|
@ -6531,6 +6549,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
|
|||
struct timeval tv;
|
||||
int seqno=0;
|
||||
char iabuf[INET_ADDRSTRLEN];
|
||||
|
||||
c = get_header(req, "Cseq");
|
||||
if (sscanf(c, "%d ", &seqno) != 1) {
|
||||
ast_log(LOG_WARNING, "Unable to determine sequence number\n");
|
||||
|
@ -6613,12 +6632,12 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
|
|||
p->initid = -1;
|
||||
}
|
||||
switch(resp) {
|
||||
case 100:
|
||||
case 100: /* 100 Trying */
|
||||
if (!strcasecmp(msg, "INVITE")) {
|
||||
sip_cancel_destroy(p);
|
||||
}
|
||||
break;
|
||||
case 183:
|
||||
case 183: /* 183 Session Progress */
|
||||
if (!strcasecmp(msg, "INVITE")) {
|
||||
sip_cancel_destroy(p);
|
||||
if (!ast_strlen_zero(get_header(req, "Content-Type")))
|
||||
|
@ -6629,7 +6648,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
|
|||
}
|
||||
}
|
||||
break;
|
||||
case 180:
|
||||
case 180: /* 180 Ringing */
|
||||
if (!strcasecmp(msg, "INVITE")) {
|
||||
sip_cancel_destroy(p);
|
||||
if (p->owner) {
|
||||
|
@ -6639,7 +6658,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
|
|||
}
|
||||
}
|
||||
break;
|
||||
case 200:
|
||||
case 200: /* 200 OK */
|
||||
if (!strcasecmp(msg, "NOTIFY")) {
|
||||
/* They got the notify, this is the end */
|
||||
if (p->owner) {
|
||||
|
@ -6651,6 +6670,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
|
|||
}
|
||||
}
|
||||
} else if (!strcasecmp(msg, "INVITE")) {
|
||||
/* 200 OK on invite - someone's answering our call */
|
||||
sip_cancel_destroy(p);
|
||||
if (!ast_strlen_zero(get_header(req, "Content-Type")))
|
||||
process_sdp(p, req);
|
||||
|
@ -6751,7 +6771,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
|
|||
} else
|
||||
p->needdestroy = 1;
|
||||
break;
|
||||
case 407:
|
||||
case 407: /* 407 Proxy Authentication Required */
|
||||
if (!strcasecmp(msg, "INVITE")) {
|
||||
/* First we ACK */
|
||||
transmit_request(p, "ACK", seqno, 0, 0);
|
||||
|
@ -6919,6 +6939,7 @@ static void *sip_park_thread(void *stuff)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/*--- sip_park: Park a call ---*/
|
||||
static int sip_park(struct ast_channel *chan1, struct ast_channel *chan2, struct sip_request *req)
|
||||
{
|
||||
struct sip_dual *d;
|
||||
|
@ -7087,7 +7108,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
|
|||
cmd = req->header[0];
|
||||
/* Must have Cseq */
|
||||
if (ast_strlen_zero(cmd) || ast_strlen_zero(cseq))
|
||||
return -1;
|
||||
return -1;
|
||||
if (sscanf(cseq, "%i%n", &seqno, &len) != 1) {
|
||||
ast_log(LOG_DEBUG, "No seqno in '%s'\n", cmd);
|
||||
return -1;
|
||||
|
@ -7681,6 +7702,7 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer)
|
|||
char name[256] = "";
|
||||
char iabuf[INET_ADDRSTRLEN];
|
||||
int newmsgs, oldmsgs;
|
||||
|
||||
/* Check for messages */
|
||||
ast_app_messagecount(peer->mailbox, &newmsgs, &oldmsgs);
|
||||
|
||||
|
@ -7733,6 +7755,7 @@ static void *do_monitor(void *data)
|
|||
int lastpeernum = -1;
|
||||
int curpeernum;
|
||||
int reloading;
|
||||
|
||||
/* Add an I/O event to our UDP socket */
|
||||
if (sipsock > -1)
|
||||
ast_io_add(io, sipsock, sipsock_read, AST_IO_IN, NULL);
|
||||
|
@ -8277,6 +8300,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
|
|||
int maskfound=0;
|
||||
int format;
|
||||
int found=0;
|
||||
|
||||
prev = NULL;
|
||||
ast_mutex_lock(&peerl.lock);
|
||||
if (temponly) {
|
||||
|
@ -8515,7 +8539,7 @@ static int reload_config(void)
|
|||
struct sip_user *user;
|
||||
struct ast_hostent ahp;
|
||||
char *cat;
|
||||
char *utype;
|
||||
char *utype;
|
||||
struct hostent *hp;
|
||||
int format;
|
||||
int oldport = ntohs(bindaddr.sin_port);
|
||||
|
|
Loading…
Reference in New Issue