Pārlūkot izejas kodu

core: support for parsing the Reason header

Andrei Pelinescu-Onciul 15 gadi atpakaļ
vecāks
revīzija
14babe144d
8 mainītis faili ar 128 papildinājumiem un 51 dzēšanām
  1. 71 0
      parser/case_reas.h
  2. 6 8
      parser/hf.c
  3. 16 15
      parser/hf.h
  4. 8 4
      parser/keys.h
  5. 11 8
      parser/msg_parser.c
  6. 8 9
      parser/parse_hname2.c
  7. 2 2
      parser/parse_hname2.h
  8. 6 5
      sip_msg_clone.c

+ 71 - 0
parser/case_reas.h

@@ -0,0 +1,71 @@
+/* 
+ * $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.
+ */
+/*
+ * parser/case_reas.h
+ */
+/*
+ * History:
+ * --------
+ *  2010-02-18  initial version (andrei)
+*/
+
+/** Parser :: Reason Header Name Parsing Macros.
+ * @file 
+ *
+ * @ingroup parser
+ */
+#ifndef __case_reas_h
+#define __case_reas_h
+
+
+#define ON_CASE							\
+	switch(LOWER_DWORD(val)) {			\
+		case _on1_:						\
+			hdr->type = HDR_REASON_T;	\
+			hdr->name.len = 6;			\
+			return (p + 3);				\
+		case _on2_:						\
+			hdr->type = HDR_REASON_T;	\
+			hdr->name.len = 7;			\
+			return (p + 4);				\
+		case _on3_:						\
+			hdr->type = HDR_REASON_T;	\
+			p+=4;						\
+			goto dc_end;				\
+	}									\
+	if ((LOWER_DWORD(val)&0x00ffffff) ==\
+				(_on1_&0x00ffffff)){	\
+			hdr->type = HDR_REASON_T;	\
+			hdr->name.len = 6;			\
+			return (p+3);				\
+	}
+
+
+
+#define reas_CASE		\
+	p += 4;				\
+	val = READ(p);		\
+	ON_CASE;			\
+	goto other;
+
+
+
+
+#endif /*__case_reas_h*/
+
+/* vi: set ts=4 sw=4 tw=79:ai:cindent: */

+ 6 - 8
parser/hf.c

@@ -33,10 +33,9 @@
  * 2007-07-27 added HDR_RETRY_AFTER_T (andrei)
  */
 
-/*! \file 
- * \brief Parser :: 
- *
- * \ingroup parser
+/** Parser :: parse header files
+ * @file
+ * @ingroup parser
  */
 
 
@@ -61,8 +60,7 @@
 #include "parse_allow.h"
 #include "../ut.h"
 
-/*! \brief
- * Frees a hdr_field structure,
+/** Frees a hdr_field structure.
  * WARNING: it frees only parsed (and not name.s, body.s)
  */
 void clean_hdr_field(struct hdr_field* hf)
@@ -220,6 +218,7 @@ void clean_hdr_field(struct hdr_field* hf)
 		case HDR_PROXY_AUTHENTICATE_T:
 		case HDR_PATH_T:
 		case HDR_PRIVACY_T:
+		case HDR_REASON_T:
 			break;
 
 		case HDR_PPI_T:
@@ -239,8 +238,7 @@ void clean_hdr_field(struct hdr_field* hf)
 }
 
 
-/*! \brief
- * Frees a hdr_field list,
+/** Frees a hdr_field list.
  * WARNING: frees only ->parsed and ->next*/
 void free_hdr_field_lst(struct hdr_field* hf)
 {

+ 16 - 15
parser/hf.h

@@ -35,10 +35,10 @@
  * 2007-07-27 HDR_RETRY_AFTER_[TF] added (andrei)
  */
 
-/*! \file 
- * \brief Parser :: ???
+/** Parser :: parse headers.
+ * @file 
  *
- * \ingroup parser
+ * @ingroup parser
  */
 
 
@@ -51,9 +51,9 @@
 
 
 
-/*! \brief header type enum
+/** header types enum.
  * 
- * \note
+ * @note
  * if you add a new type:
  *  - make sure it's not greater than 63
  *  - make sure you add the corresponding flag to the hdr_flags_t defs below
@@ -116,25 +116,26 @@ enum _hdr_types_t {
 	HDR_IDENTITY_T			       /*!< Identity header field */,
 	HDR_IDENTITY_INFO_T		       /*!< Identity-info header field */,
 	HDR_RETRY_AFTER_T		           /*!< Retry-After header field */,
-	HDR_PPI_T                          /*!< P-Preferred-Identity header field */,
-	HDR_PAI_T                          /*!< P-Asserted-Identity header field */,
+	HDR_PPI_T                          /*!< P-Preferred-Identity header field*/,
+	HDR_PAI_T                          /*!< P-Asserted-Identity header field*/,
 	HDR_PATH_T                         /*!< Path header field */,
 	HDR_PRIVACY_T				       /*!< Privacy header field */,
+	HDR_REASON_T				       /**< Reason header field */,
 	HDR_EOH_T					       /*!< End of message header */
 };
 
 
 typedef unsigned long long hdr_flags_t;
 
-/*! \brief type to flag conversion
+/** type to flag conversion.
  * WARNING: HDR_ERROR_T has no corresponding FLAG ! */
 #define HDR_T2F(type)	\
 		(((type)!=HDR_EOH_T)?((hdr_flags_t)1<<(type)):(~(hdr_flags_t)0))
 
-/*! \brief helper macro for easy defining and keeping in sync. the flags enum */
+/** helper macro for easy defining and keeping in sync the flags enum. */
 #define HDR_F_DEF(name)		HDR_T2F(HDR_##name##_T)
 
-/*! \name flags definitions
+/** @name flags definitions.
  * (enum won't work with all the compiler (e.g. icc) due to the 64bit size) */
 /*!{ */
 #define HDR_EOH_F					HDR_F_DEF(EOH)
@@ -192,6 +193,7 @@ typedef unsigned long long hdr_flags_t;
 #define HDR_PAI_F                   HDR_F_DEF(PAI)
 #define HDR_PATH_F                  HDR_F_DEF(PATH)
 #define HDR_PRIVACY_F               HDR_F_DEF(PRIVACY)
+#define HDR_REASON_F				HDR_F_DEF(REASON)
 
 #define HDR_OTHER_F					HDR_F_DEF(OTHER)
 
@@ -199,8 +201,7 @@ typedef unsigned long long hdr_flags_t;
 
 typedef enum _hdr_types_t hdr_types_t;
 
-/*! \brief
- * Format: name':' body
+/** Format: name':' body.
  */
 typedef struct hdr_field {
 	hdr_types_t type;       /*!< Header field type */
@@ -213,7 +214,7 @@ typedef struct hdr_field {
 
 
 
-/*! \brief returns true if the header links allocated memory on parse field */
+/** returns true if the header links allocated memory on parse field. */
 static inline int hdr_allocs_parse(struct hdr_field* hdr)
 {
 	switch(hdr->type){
@@ -239,13 +240,13 @@ static inline int hdr_allocs_parse(struct hdr_field* hdr)
 	}
 }
 
-/*! \brief frees a hdr_field structure,
+/** frees a hdr_field structure.
  * WARNING: it frees only parsed (and not name.s, body.s)
  */
 void clean_hdr_field(struct hdr_field* hf);
 
 
-/*! \brief frees a hdr_field list,
+/** frees a hdr_field list.
  * WARNING: frees only ->parsed and ->next
  */
 void free_hdr_field_lst(struct hdr_field* hf);

+ 8 - 4
parser/keys.h

@@ -29,10 +29,9 @@
  * 2007-01-26 Macros for Identity, Identity-info, Date added (gergo)
  */
 
-/*! \file 
- * \brief Parser :: Fast 32-bit Header Field Name Parser -- keys
- *
- * \ingroup parser
+/** Parser :: Fast 32-bit Header Field Name Parser -- keys .
+ * @file
+ * @ingroup parser
  */
 
 #ifndef KEYS_H
@@ -190,6 +189,11 @@
 #define _acy2_ 0x20796361   /* "acy " */
 #define _acy1_ 0x3a796361   /* "acy:" */
 
+#define _reas_ 0x73616572  /* "reas" */
+#define _on1_ 0x203a6e6f  /* "on: " */
+#define _on2_ 0x3a206e6f  /* "on :" */
+#define _on3_ 0x20206e6f  /* "on  " */
+
 /*!} */
 
 #endif /* KEYS_H */

+ 11 - 8
parser/msg_parser.c

@@ -41,10 +41,9 @@
  *		header fields (gergo)
  */
 
-/*! \file 
- * \brief Parser :: SIP Message header proxy parser
- *
- * \ingroup parser
+/** Parser :: SIP Message header proxy parser.
+ * @file
+ * @ingroup parser
  */
 
 /*! \defgroup parser SIP-router SIP message parser
@@ -254,10 +253,11 @@ char* get_hdr_field(char* buf, char* end, struct hdr_field* hdr)
 		case HDR_REQUESTDISPOSITION_T:
 		case HDR_WWW_AUTHENTICATE_T:
 		case HDR_PROXY_AUTHENTICATE_T:
-	    case HDR_PATH_T:
-	    case HDR_PRIVACY_T:
-	    case HDR_PAI_T:
-	    case HDR_PPI_T:
+		case HDR_PATH_T:
+		case HDR_PRIVACY_T:
+		case HDR_PAI_T:
+		case HDR_PPI_T:
+		case HDR_REASON_T:
 		case HDR_OTHER_T:
 			/* just skip over it */
 			hdr->body.s=tmp;
@@ -553,6 +553,9 @@ int parse_headers(struct sip_msg* msg, hdr_flags_t flags, int next)
 				if (msg->ppi==0) msg->ppi=hf;
 				msg->parsed_flag|=HDR_PPI_F;
 				break;
+		    case HDR_REASON_T:
+				msg->parsed_flag|=HDR_REASON_F;
+				break;
 			default:
 				LOG(L_CRIT, "BUG: parse_headers: unknown header type %d\n",
 							hf->type);

+ 8 - 9
parser/parse_hname2.c

@@ -35,10 +35,9 @@
  * 2007-07-27 added support for Retry-After (andrei)
  */
 
-/*! \file
- * \brief Parser :: Fast 32-bit Header Field Name Parser
- *
- * \ingroup parser
+/** Parser :: Fast 32-bit Header Field Name Parser.
+ * @file
+ * @ingroup parser
  */
 
 #include "../comp_defs.h"
@@ -49,9 +48,7 @@
 #define LOWER_BYTE(b) ((b) | 0x20)
 #define LOWER_DWORD(d) ((d) | 0x20202020)
 
-/*! \brief
- * Skip all white-chars and return position of the first
- * non-white char
+/** Skip all white-chars and return position of the first non-white char.
  */
 static inline char* skip_ws(char* p, unsigned int size)
 {
@@ -106,6 +103,7 @@ static inline char* skip_ws(char* p, unsigned int size)
 #include "case_retr.h"     /* Retry-After */
 #include "case_path.h"     /* Path */
 #include "case_priv.h"
+#include "case_reas.h"
 
 /*@} */
 
@@ -152,8 +150,9 @@ static inline char* skip_ws(char* p, unsigned int size)
 	case _date_: date_CASE; \
 	case _iden_: iden_CASE; \
 	case _retr_: retr_CASE; \
-    case _path_: path_CASE; \
-	case _priv_: priv_CASE;
+	case _path_: path_CASE; \
+	case _priv_: priv_CASE; \
+	case _reas_: reas_CASE;
 
 
 #define PARSE_COMPACT(id)          \

+ 2 - 2
parser/parse_hname2.h

@@ -34,8 +34,8 @@
 #include "hf.h"
 
 
-/*! \brief
- * Fast 32-bit header field name parser
+/** Fast 32-bit header field name parser.
+ * @file
  */
 char* parse_hname2(char* begin, char* end, struct hdr_field* hdr);
 

+ 6 - 5
sip_msg_clone.c

@@ -24,11 +24,10 @@
  *  2009-07-22  initial version: functions moved from tm/sip_msg.c (andrei)
 */
 
-/*!
- * \file
- * \brief SIP-router core :: 
- * \ingroup core
- * Module: \ref core
+/** SIP-router core :: sip message shared memory cloner.
+ * @file
+ * @ingroup core
+ * Module: @ref core
  */
 
 #include "sip_msg_clone.h"
@@ -488,6 +487,7 @@ struct sip_msg*  sip_msg_shm_clone( struct sip_msg *org_msg, int *sip_msg_len,
 		case HDR_PAI_T:
 		case HDR_PATH_T:
 		case HDR_PRIVACY_T:
+		case HDR_REASON_T:
 			/* we ignore them for now even if they have something parsed*/
 			break;
 		}/*switch*/
@@ -617,6 +617,7 @@ struct sip_msg*  sip_msg_shm_clone( struct sip_msg *org_msg, int *sip_msg_len,
 		case HDR_IDENTITY_T:
 		case HDR_IDENTITY_INFO_T:
 		case HDR_RETRY_AFTER_T:
+		case HDR_REASON_T:
 			break;
 
 		case HDR_VIA_T: