123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- /*
- * $Id$
- *
- * Copyright (C) 2010 iptelorg GmbH
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
- /*
- * char_msg_val.h
- */
- /*
- * History:
- * --------
- * 2010-02-10 moved from parser/msg_parser.h and added tag only mode
- * by default (andrei)
- */
- /** compute the characteristic value of a message.
- * @file
- * @ingroup core
- */
- /* Defines:
- * BRANCH_INCLUDE_FROMTO_BODY - if defined the old (pre 3.1) mode of
- * including the full from & to bodies will be used (instead of only the
- * tags).
- * BRANCH_IGNORE_3261_VIA - if defined, no check and special/simpler handling
- * of messages with 3261 cookies in the via branch will be made (same
- * behaviour as in pre 3.1 versions).
- */
- #ifndef __char_msg_val_h
- #define __char_msg_val_h
- #include "comp_defs.h"
- #include "compiler_opt.h"
- #include "str.h"
- #include "parser/msg_parser.h"
- #include "parser/parse_to.h"
- #include "parser/parse_from.h"
- #include "md5utils.h"
- /*! \brief calculate characteristic value of a message -- this value
- is used to identify a transaction during the process of
- reply matching
- */
- inline static int char_msg_val( struct sip_msg *msg, char *cv )
- {
- str src[8];
- if (unlikely(!check_transaction_quadruple(msg))) {
- LM_ERR("can't calculate char_value due to a parsing error\n");
- memset( cv, '0', MD5_LEN );
- return 0;
- }
- #ifndef BRANCH_IGNORE_3261_VIA
- if (likely(msg->via1->branch && msg->via1->branch->value.len>MCOOKIE_LEN &&
- memcmp(msg->via1->branch->value.s, MCOOKIE, MCOOKIE_LEN)==0)){
- /* 3261 branch cookie present => hash only the received branch ID */
- src[0]=msg->via1->branch->value;
- MD5StringArray ( cv, src, 1 );
- return 1; /* success */
- }
- #endif /* BRANCH_IGNORE_3261_VIA */
- #ifdef BRANCH_INCLUDE_FROMTO_BODY
- /* use the from & to full bodies */
- src[0]= msg->from->body;
- src[1]= msg->to->body;
- #else
- /* to body is automatically parsed (via check_transactionquadruple /
- parse_header), but the from body has to be parsed manually */
- if (msg->from->parsed==0){
- /* parse from body */
- if (unlikely(parse_from_header(msg) == -1)){
- LM_ERR("error while parsing From header\n");
- return 0;
- }
- }
- /* use only the from & to tags */
- src[0]=get_from(msg)->tag_value;
- src[1]=get_to(msg)->tag_value;
- #endif /* BRANCH_INCLUDE_FROMTO_BODY */
- src[2]= msg->callid->body;
- src[3]= msg->first_line.u.request.uri;
- src[4]= get_cseq( msg )->number;
- /* topmost Via is part of transaction key as well ! */
- src[5]= msg->via1->host;
- src[6]= msg->via1->port_str;
- if (likely(msg->via1->branch)) {
- src[7]= msg->via1->branch->value;
- MD5StringArray ( cv, src, 8 );
- } else {
- MD5StringArray( cv, src, 7 );
- }
- return 1;
- }
- #endif /*__char_msg_val_h*/
- /* vi: set ts=4 sw=4 tw=79:ai:cindent: */
|