--- chan_mgcp.c.orig 2012-05-14 21:44:27.000000000 +0200 +++ chan_mgcp.c 2014-01-06 17:11:15.561305190 +0100 @@ -200,7 +200,8 @@ static int adsi = 0; -static unsigned int oseq; +static unsigned int oseq_global = 0; +AST_MUTEX_DEFINE_STATIC(oseq_lock); /*! Wait up to 16 seconds for first digit (FXO logic) */ static int firstdigittimeout = 16000; @@ -2111,7 +2112,7 @@ return 0; } -static int init_req(struct mgcp_endpoint *p, struct mgcp_request *req, char *verb) +static int init_req(struct mgcp_endpoint *p, struct mgcp_request *req, char *verb, unsigned int oseq) { /* Initialize a response */ if (req->headers || req->len) { @@ -2144,13 +2145,17 @@ static int reqprep(struct mgcp_request *req, struct mgcp_endpoint *p, char *verb) { + unsigned int oseq; memset(req, 0, sizeof(struct mgcp_request)); - oseq++; - if (oseq > 999999999) { - oseq = 1; - } - init_req(p, req, verb); - return 0; + ast_mutex_lock(&oseq_lock); + oseq_global++; + if (oseq_global > 999999999) { + oseq_global = 1; + } + oseq = oseq_global; + ast_mutex_unlock(&oseq_lock); + init_req(p, req, verb, oseq); + return oseq; } static int transmit_response(struct mgcp_subchannel *sub, char *msg, struct mgcp_request *req, char *msgrest) @@ -2288,6 +2293,7 @@ struct mgcp_endpoint *p = sub->parent; struct ast_format tmpfmt; struct ast_sockaddr sub_tmpdest_tmp; + unsigned int oseq; if (ast_strlen_zero(sub->cxident) && rtp) { /* We don't have a CXident yet, store the destination and @@ -2324,7 +2330,7 @@ } - reqprep(&resp, p, "MDCX"); + oseq = reqprep(&resp, p, "MDCX"); add_header(&resp, "C", sub->callid); add_header(&resp, "L", local); add_header(&resp, "M", mgcp_cxmodes[sub->cxmode]); @@ -2346,6 +2352,7 @@ char tmp[80]; struct ast_format tmpfmt; struct mgcp_endpoint *p = sub->parent; + unsigned int oseq; ast_debug(3, "Creating connection for %s@%s-%d in cxmode: %s callid: %s\n", p->name, p->parent->name, sub->id, mgcp_cxmodes[sub->cxmode], sub->callid); @@ -2372,7 +2379,7 @@ } } sub->sdpsent = 1; - reqprep(&resp, p, "CRCX"); + oseq = reqprep(&resp, p, "CRCX"); add_header(&resp, "C", sub->callid); add_header(&resp, "L", local); add_header(&resp, "M", mgcp_cxmodes[sub->cxmode]); @@ -2443,6 +2450,7 @@ char tmp[80]; struct ast_format tmpfmt; struct mgcp_endpoint *p = sub->parent; + unsigned int oseq; ast_copy_string(local, "p:20, s:off, e:on", sizeof(local)); @@ -2458,7 +2466,7 @@ ast_debug(3, "Creating connection for %s@%s-%d in cxmode: %s callid: %s\n", p->name, p->parent->name, sub->id, mgcp_cxmodes[sub->cxmode], sub->callid); sub->sdpsent = 0; - reqprep(&resp, p, "CRCX"); + oseq = reqprep(&resp, p, "CRCX"); add_header(&resp, "C", sub->callid); add_header(&resp, "L", local); add_header(&resp, "M", "inactive"); @@ -2475,11 +2483,12 @@ { struct mgcp_request resp; struct mgcp_endpoint *p = sub->parent; + unsigned int oseq; ast_debug(3, "MGCP Asked to indicate tone: %s on %s@%s-%d in cxmode: %s\n", tone, p->name, p->parent->name, sub->id, mgcp_cxmodes[sub->cxmode]); ast_copy_string(p->curtone, tone, sizeof(p->curtone)); - reqprep(&resp, p, "RQNT"); + oseq = reqprep(&resp, p, "RQNT"); add_header(&resp, "X", p->rqnt_ident); switch (p->hookstate) { case MGCP_ONHOOK: @@ -2506,6 +2515,7 @@ struct timeval t = ast_tvnow(); struct ast_tm tm; struct mgcp_endpoint *p = sub->parent; + unsigned int oseq; ast_localtime(&t, &tm, NULL); n = callername; @@ -2521,7 +2531,7 @@ snprintf(tone2, sizeof(tone2), "%s,L/ci(%02d/%02d/%02d/%02d,%s,%s)", tone, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, l, n); ast_copy_string(p->curtone, tone, sizeof(p->curtone)); - reqprep(&resp, p, "RQNT"); + oseq = reqprep(&resp, p, "RQNT"); add_header(&resp, "X", p->rqnt_ident); switch (p->hookstate) { case MGCP_ONHOOK: @@ -2550,6 +2560,7 @@ int fc = 1; char local[256]; char tmp[80]; + unsigned int oseq; if (ast_strlen_zero(sub->cxident)) { /* We don't have a CXident yet, store the destination and @@ -2585,7 +2596,7 @@ } } - reqprep(&resp, p, "MDCX"); + oseq = reqprep(&resp, p, "MDCX"); add_header(&resp, "C", sub->callid); if (!sub->sdpsent) { add_header(&resp, "L", local); @@ -2644,7 +2655,8 @@ static int transmit_audit_endpoint(struct mgcp_endpoint *p) { struct mgcp_request resp; - reqprep(&resp, p, "AUEP"); + unsigned int oseq; + oseq = reqprep(&resp, p, "AUEP"); /* removed unknown param VS */ /*add_header(&resp, "F", "A,R,D,S,X,N,I,T,O,ES,E,MD,M");*/ add_header(&resp, "F", "A"); @@ -2658,10 +2670,11 @@ { struct mgcp_endpoint *p = sub->parent; struct mgcp_request resp; + unsigned int oseq; ast_debug(3, "Delete connection %s %s@%s-%d with new mode: %s on callid: %s\n", sub->cxident, p->name, p->parent->name, sub->id, mgcp_cxmodes[sub->cxmode], sub->callid); - reqprep(&resp, p, "DLCX"); + oseq = reqprep(&resp, p, "DLCX"); /* check if call id is avail */ if (sub->callid[0]) add_header(&resp, "C", sub->callid); @@ -2679,10 +2692,11 @@ static int transmit_connection_del_w_params(struct mgcp_endpoint *p, char *callid, char *cxident) { struct mgcp_request resp; + unsigned int oseq; ast_debug(3, "Delete connection %s %s@%s on callid: %s\n", cxident ? cxident : "", p->name, p->parent->name, callid ? callid : ""); - reqprep(&resp, p, "DLCX"); + oseq = reqprep(&resp, p, "DLCX"); /* check if call id is avail */ if (callid && *callid) add_header(&resp, "C", callid);