diff --git a/src/core/receive.c b/src/core/receive.c index bb9342a4145..77294673ef7 100644 --- a/src/core/receive.c +++ b/src/core/receive.c @@ -50,7 +50,7 @@ #endif #include "select_buf.h" -#include "tcp_server.h" /* for tcpconn_add_alias */ +#include "tcp_server.h" /* for tcpconn_add_alias */ #include "tcp_options.h" /* for access to tcp_accept_aliases*/ #include "cfg/cfg.h" #include "core_stats.h" @@ -62,12 +62,12 @@ int _sr_ip_free_bind = 0; -unsigned int msg_no=0; +unsigned int msg_no = 0; /* address preset vars */ -str default_global_address={0,0}; -str default_global_port={0,0}; -str default_via_address={0,0}; -str default_via_port={0,0}; +str default_global_address = {0, 0}; +str default_global_port = {0, 0}; +str default_via_address = {0, 0}; +str default_via_port = {0, 0}; /** * increment msg_no and return the new value @@ -80,27 +80,30 @@ unsigned int inc_msg_no(void) /** * */ -int sip_check_fline(char* buf, unsigned int len) +int sip_check_fline(char *buf, unsigned int len) { char *p; int m; m = 0; - for(p=buf; p=buf) { - if(strncmp(p-8, " SIP/2.0", 8)==0) { + if(*p != '\r' && *p != '\n') + continue; + if(p - 10 >= buf) { + if(strncmp(p - 8, " SIP/2.0", 8) == 0) { LM_DBG("first line indicates a SIP request\n"); return 0; } @@ -115,9 +118,9 @@ int sip_check_fline(char* buf, unsigned int len) * WARNING: buf must be 0 terminated (buf[len]=0) or some things might * break (e.g.: modules/textops) */ -int receive_msg(char* buf, unsigned int len, struct receive_info* rcv_info) +int receive_msg(char *buf, unsigned int len, struct receive_info *rcv_info) { - struct sip_msg* msg; + struct sip_msg *msg; struct run_act_ctx ctx; struct run_act_ctx *bctx; int ret; @@ -136,68 +139,70 @@ int receive_msg(char* buf, unsigned int len, struct receive_info* rcv_info) sr_event_param_t evp = {0}; if(sr_event_enabled(SREV_NET_DATA_RECV)) { - if(sip_check_fline(buf, len)==0) { + if(sip_check_fline(buf, len) == 0) { memset(&netinfo, 0, sizeof(sr_net_info_t)); netinfo.data.s = buf; netinfo.data.len = len; netinfo.rcv = rcv_info; - evp.data = (void*)&netinfo; + evp.data = (void *)&netinfo; sr_event_exec(SREV_NET_DATA_RECV, &evp); } } inb.s = buf; inb.len = len; - evp.data = (void*)&inb; + evp.data = (void *)&inb; evp.rcv = rcv_info; sr_event_exec(SREV_NET_DATA_IN, &evp); len = inb.len; - msg=pkg_malloc(sizeof(struct sip_msg)); - if (msg==0) { + msg = pkg_malloc(sizeof(struct sip_msg)); + if(msg == 0) { LM_ERR("no mem for sip_msg\n"); goto error00; } msg_no++; /* number of vias parsed -- good for diagnostic info in replies */ - via_cnt=0; + via_cnt = 0; - memset(msg,0, sizeof(struct sip_msg)); /* init everything to 0 */ + memset(msg, 0, sizeof(struct sip_msg)); /* init everything to 0 */ /* fill in msg */ - msg->buf=buf; - msg->len=len; + msg->buf = buf; + msg->len = len; /* zero termination (termination of orig message bellow not that * useful as most of the work is done with scratch-pad; -jiri */ /* buf[len]=0; */ /* WARNING: zero term removed! */ - msg->rcv=*rcv_info; - msg->id=msg_no; - msg->pid=my_pid(); - msg->set_global_address=default_global_address; - msg->set_global_port=default_global_port; - - if(likely(sr_msg_time==1)) msg_set_time(msg); - - if (parse_msg(buf,len, msg)!=0){ - evp.data = (void*)msg; - if((ret=sr_event_exec(SREV_RCV_NOSIP, &evp))rcv = *rcv_info; + msg->id = msg_no; + msg->pid = my_pid(); + msg->set_global_address = default_global_address; + msg->set_global_port = default_global_port; + + if(likely(sr_msg_time == 1)) + msg_set_time(msg); + + if(parse_msg(buf, len, msg) != 0) { + evp.data = (void *)msg; + if((ret = sr_event_exec(SREV_RCV_NOSIP, &evp)) < NONSIP_MSG_DROP) { LOG(cfg_get(core, core_cfg, corelog), - "core parsing of SIP message failed (%s:%d/%d)\n", - ip_addr2a(&msg->rcv.src_ip), (int)msg->rcv.src_port, - (int)msg->rcv.proto); + "core parsing of SIP message failed (%s:%d/%d)\n", + ip_addr2a(&msg->rcv.src_ip), (int)msg->rcv.src_port, + (int)msg->rcv.proto); sr_core_ert_run(msg, SR_CORE_ERT_RECEIVE_PARSE_ERROR); - } - else if(ret == NONSIP_MSG_DROP) goto error02; + } else if(ret == NONSIP_MSG_DROP) + goto error02; } - if(parse_headers(msg, HDR_FROM_F|HDR_TO_F|HDR_CALLID_F|HDR_CSEQ_F, 0)<0) { + if(parse_headers(msg, HDR_FROM_F | HDR_TO_F | HDR_CALLID_F | HDR_CSEQ_F, 0) + < 0) { LM_WARN("parsing relevant headers failed\n"); } LM_DBG("--- received sip message - %s - call-id: [%.*s] - cseq: [%.*s]\n", - (msg->first_line.type==SIP_REQUEST)?"request":"reply", - (msg->callid && msg->callid->body.s)?msg->callid->body.len:0, - (msg->callid && msg->callid->body.s)?msg->callid->body.s:"", - (msg->cseq && msg->cseq->body.s)?msg->cseq->body.len:0, - (msg->cseq && msg->cseq->body.s)?msg->cseq->body.s:""); + (msg->first_line.type == SIP_REQUEST) ? "request" : "reply", + (msg->callid && msg->callid->body.s) ? msg->callid->body.len : 0, + (msg->callid && msg->callid->body.s) ? msg->callid->body.s : "", + (msg->cseq && msg->cseq->body.s) ? msg->cseq->body.len : 0, + (msg->cseq && msg->cseq->body.s) ? msg->cseq->body.s : ""); /* set log prefix */ log_prefix_set(msg); @@ -205,45 +210,45 @@ int receive_msg(char* buf, unsigned int len, struct receive_info* rcv_info) /* ... clear branches from previous message */ clear_branches(); - if (msg->first_line.type==SIP_REQUEST){ + if(msg->first_line.type == SIP_REQUEST) { ruri_mark_new(); /* ruri is usable for forking (not consumed yet) */ - if (!IS_SIP(msg)){ - if ((ret=nonsip_msg_run_hooks(msg))!=NONSIP_MSG_ACCEPT){ - if (unlikely(ret==NONSIP_MSG_ERROR)) + if(!IS_SIP(msg)) { + if((ret = nonsip_msg_run_hooks(msg)) != NONSIP_MSG_ACCEPT) { + if(unlikely(ret == NONSIP_MSG_ERROR)) goto error03; goto end; /* drop the message */ } } /* sanity checks */ - if ((msg->via1==0) || (msg->via1->error!=PARSE_OK)){ + if((msg->via1 == 0) || (msg->via1->error != PARSE_OK)) { /* no via, send back error ? */ LM_ERR("no via found in request\n"); STATS_BAD_MSG(); goto error02; } - /* check if necessary to add receive?->moved to forward_req */ - /* check for the alias stuff */ +/* check if necessary to add receive?->moved to forward_req */ +/* check for the alias stuff */ #ifdef USE_TCP - if (msg->via1->alias && cfg_get(tcp, tcp_cfg, accept_aliases) && - (((rcv_info->proto==PROTO_TCP) && !tcp_disable) + if(msg->via1->alias && cfg_get(tcp, tcp_cfg, accept_aliases) + && (((rcv_info->proto == PROTO_TCP) && !tcp_disable) #ifdef USE_TLS - || ((rcv_info->proto==PROTO_TLS) && !tls_disable) + || ((rcv_info->proto == PROTO_TLS) && !tls_disable) #endif - ) - ){ - if (tcpconn_add_alias(rcv_info->proto_reserved1, msg->via1->port, - rcv_info->proto)!=0){ + )) { + if(tcpconn_add_alias(rcv_info->proto_reserved1, msg->via1->port, + rcv_info->proto) + != 0) { LM_ERR("tcp alias failed\n"); /* continue */ } } #endif - /* skip: */ + /* skip: */ LM_DBG("preparing to run routing scripts...\n"); if(is_printable(cfg_get(core, core_cfg, latency_cfg_log)) - || stats_on==1) { - gettimeofday( & tvb, &tz ); + || stats_on == 1) { + gettimeofday(&tvb, &tz); } /* execute pre-script callbacks, if any; -jiri */ /* if some of the callbacks said not to continue with @@ -252,48 +257,48 @@ int receive_msg(char* buf, unsigned int len, struct receive_info* rcv_info) * (like presence of at least one via), so you can count * on via1 being parsed in a pre-script callback --andrei */ - if (exec_pre_script_cb(msg, REQUEST_CB_TYPE)==0 ) - { + if(exec_pre_script_cb(msg, REQUEST_CB_TYPE) == 0) { STATS_REQ_FWD_DROP(); goto end; /* drop the request */ } set_route_type(REQUEST_ROUTE); /* exec the routing script */ - if(unlikely(main_rt.rlist[DEFAULT_RT]==NULL)) { + if(unlikely(main_rt.rlist[DEFAULT_RT] == NULL)) { keng = sr_kemi_eng_get(); - if(keng==NULL) { + if(keng == NULL) { LM_ERR("no config routing engine registered\n"); goto error_req; } - if(keng->froute(msg, REQUEST_ROUTE, NULL, NULL)<0) { + if(keng->froute(msg, REQUEST_ROUTE, NULL, NULL) < 0) { LM_NOTICE("negative return code from engine function\n"); } } else { - if (run_top_route(main_rt.rlist[DEFAULT_RT], msg, 0)<0){ + if(run_top_route(main_rt.rlist[DEFAULT_RT], msg, 0) < 0) { LM_WARN("error while trying script\n"); goto error_req; } } if(is_printable(cfg_get(core, core_cfg, latency_cfg_log)) - || stats_on==1) { - gettimeofday( & tve, &tz ); - diff = (tve.tv_sec-tvb.tv_sec)*1000000+(tve.tv_usec-tvb.tv_usec); + || stats_on == 1) { + gettimeofday(&tve, &tz); + diff = (tve.tv_sec - tvb.tv_sec) * 1000000 + + (tve.tv_usec - tvb.tv_usec); LOG(cfg_get(core, core_cfg, latency_cfg_log), "request-route executed in: %d usec\n", diff); #ifdef STATS stats->processed_requests++; stats->acc_req_time += diff; - STATS_RX_REQUEST( msg->first_line.u.request.method_value ); + STATS_RX_REQUEST(msg->first_line.u.request.method_value); #endif } /* execute post request-script callbacks */ exec_post_script_cb(msg, REQUEST_CB_TYPE); - }else if (msg->first_line.type==SIP_REPLY){ + } else if(msg->first_line.type == SIP_REPLY) { /* sanity checks */ - if ((msg->via1==0) || (msg->via1->error!=PARSE_OK)){ + if((msg->via1 == 0) || (msg->via1->error != PARSE_OK)) { /* no via, send back error ? */ LM_ERR("no via found in reply\n"); STATS_BAD_RPL(); @@ -301,11 +306,11 @@ int receive_msg(char* buf, unsigned int len, struct receive_info* rcv_info) } if(is_printable(cfg_get(core, core_cfg, latency_cfg_log)) - || stats_on==1) { - gettimeofday( & tvb, &tz ); + || stats_on == 1) { + gettimeofday(&tvb, &tz); } #ifdef STATS - STATS_RX_RESPONSE ( msg->first_line.u.reply.statuscode / 100 ); + STATS_RX_RESPONSE(msg->first_line.u.reply.statuscode / 100); #endif /* execute pre-script callbacks, if any; -jiri */ @@ -315,33 +320,32 @@ int receive_msg(char* buf, unsigned int len, struct receive_info* rcv_info) * (like presence of at least one via), so you can count * on via1 being parsed in a pre-script callback --andrei */ - if (exec_pre_script_cb(msg, ONREPLY_CB_TYPE)==0 ) - { + if(exec_pre_script_cb(msg, ONREPLY_CB_TYPE) == 0) { STATS_RPL_FWD_DROP(); goto end; /* drop the reply */ } /* exec the onreply routing script */ keng = sr_kemi_eng_get(); - if (onreply_rt.rlist[DEFAULT_RT]!=NULL || keng!=NULL){ + if(onreply_rt.rlist[DEFAULT_RT] != NULL || keng != NULL) { set_route_type(CORE_ONREPLY_ROUTE); ret = 1; - if(unlikely(keng!=NULL)) { + if(unlikely(keng != NULL)) { bctx = sr_kemi_act_ctx_get(); init_run_actions_ctx(&ctx); sr_kemi_act_ctx_set(&ctx); ret = keng->froute(msg, CORE_ONREPLY_ROUTE, NULL, NULL); sr_kemi_act_ctx_set(bctx); } else { - ret=run_top_route(onreply_rt.rlist[DEFAULT_RT], msg, &ctx); + ret = run_top_route(onreply_rt.rlist[DEFAULT_RT], msg, &ctx); } #ifndef NO_ONREPLY_ROUTE_ERROR - if (unlikely(ret<0)){ + if(unlikely(ret < 0)) { LM_WARN("error while trying onreply script\n"); goto error_rpl; - }else + } else #endif /* NO_ONREPLY_ROUTE_ERROR */ - if (unlikely(ret==0 || (ctx.run_flags&DROP_R_F))){ + if(unlikely(ret == 0 || (ctx.run_flags & DROP_R_F))) { STATS_RPL_FWD_DROP(); goto skip_send_reply; /* drop the message, no error */ } @@ -350,14 +354,15 @@ int receive_msg(char* buf, unsigned int len, struct receive_info* rcv_info) forward_reply(msg); skip_send_reply: if(is_printable(cfg_get(core, core_cfg, latency_cfg_log)) - || stats_on==1) { - gettimeofday( & tve, &tz ); - diff = (tve.tv_sec-tvb.tv_sec)*1000000+(tve.tv_usec-tvb.tv_usec); + || stats_on == 1) { + gettimeofday(&tve, &tz); + diff = (tve.tv_sec - tvb.tv_sec) * 1000000 + + (tve.tv_usec - tvb.tv_usec); LOG(cfg_get(core, core_cfg, latency_cfg_log), "reply-route executed in: %d usec\n", diff); #ifdef STATS stats->processed_responses++; - stats->acc_res_time+=diff; + stats->acc_res_time += diff; #endif } @@ -374,7 +379,8 @@ int receive_msg(char* buf, unsigned int len, struct receive_info* rcv_info) free_sip_msg(msg); pkg_free(msg); #ifdef STATS - if (skipped) STATS_RX_DROPS; + if(skipped) + STATS_RX_DROPS; #endif /* reset log prefix */ log_prefix_set(NULL); @@ -411,5 +417,4 @@ void ksr_msg_env_reset(void) #ifdef WITH_XAVP xavp_reset_list(); #endif - }