Pārlūkot izejas kodu

Merge branch 'master' of ssh://[email protected]/sip-router into sr

* 'master' of ssh://[email protected]/sip-router:
  New function to return the To tag for local reply
  Allow parser syn'ced with kamailio version
  New functions that can be used to search for a header with given type
Jan Janak 16 gadi atpakaļ
vecāks
revīzija
9b63900b14

+ 13 - 0
modules/tm/t_reply.c

@@ -170,6 +170,19 @@ static unsigned short resp_class_prio[]={
 };
 
 
+int t_get_reply_totag(struct sip_msg *msg, str *totag)
+{
+	if(msg==NULL || totag==NULL) {
+		return -1;
+	}
+
+    calc_crc_suffix(msg, tm_tag_suffix);
+	*totag = tm_tag;
+	
+	return 1;
+}
+
+
 
 /* we store the reply_route # in private memory which is
    then processed during t_relay; we cannot set this value

+ 3 - 0
modules/tm/t_reply.h

@@ -73,6 +73,9 @@ typedef int (*treply_wb_f)( struct cell* trans,
 /* wrapper function needed after changes in w_t_reply */
 int w_t_reply_wrp(struct sip_msg *m, unsigned int code, char *txt);
 
+typedef int (*tget_reply_totag_f)(struct sip_msg *, str *);
+int t_get_reply_totag(struct sip_msg *msg, str *totag);
+
 #define LOCK_REPLIES(_t) lock(&(_t)->reply_mutex )
 #define UNLOCK_REPLIES(_t) unlock(&(_t)->reply_mutex )
 

+ 2 - 0
modules/tm/tm_load.c

@@ -225,5 +225,7 @@ int load_tm( struct tm_binds *tmb)
 		LOG( L_ERR, LOAD_ERROR "'t_continue' not found\n");
 		return -1;
 	}
+
+	tmb->t_get_reply_totag = t_get_reply_totag;
 	return 1;
 }

+ 1 - 0
modules/tm/tm_load.h

@@ -132,6 +132,7 @@ struct tm_binds {
 #endif
 	t_suspend_f	t_suspend;
 	t_continue_f	t_continue;
+	tget_reply_totag_f t_get_reply_totag;
 };
 
 extern int tm_init;

+ 2 - 0
parser/hf.c

@@ -52,6 +52,7 @@
 #include "parse_subscription_state.h"
 #include "contact/parse_contact.h"
 #include "parse_disposition.h"
+#include "parse_allow.h"
 #include "../ut.h"
 
 
@@ -138,6 +139,7 @@ void clean_hdr_field(struct hdr_field* hf)
 			break;
 
 		case HDR_ALLOW_T:
+			free_allow_header(hf);
 			break;
 
 		case HDR_EVENT_T:

+ 22 - 0
parser/msg_parser.c

@@ -743,3 +743,25 @@ void reset_dst_uri(struct sip_msg* msg)
 	msg->dst_uri.s = 0;
 	msg->dst_uri.len = 0;
 }
+
+
+struct hdr_field* get_hdr(struct sip_msg *msg, enum _hdr_types_t ht)
+{
+	struct hdr_field *hdr;
+
+	for(hdr = msg->headers; hdr; hdr = hdr->next) {
+		if(hdr->type == ht) return hdr;
+	}
+	return NULL;
+}
+
+
+struct hdr_field* next_sibling_hdr(struct hdr_field *hf)
+{	
+	struct hdr_field *hdr;
+	
+	for(hdr = hf->next; hdr; hdr = hdr->next) {
+		if(hdr->type == hf->type) return hdr;
+	}
+	return NULL;
+}

+ 3 - 0
parser/msg_parser.h

@@ -411,4 +411,7 @@ int set_dst_uri(struct sip_msg* msg, str* uri);
 /* If the dst_uri is set to an URI then reset it */
 void reset_dst_uri(struct sip_msg* msg);
 
+struct hdr_field* get_hdr(struct sip_msg *msg, enum _hdr_types_t ht);
+struct hdr_field* next_sibling_hdr(struct hdr_field *hf);
+
 #endif

+ 65 - 18
parser/parse_allow.c

@@ -43,41 +43,88 @@
  */
 int parse_allow_header(struct hdr_field* _hf)
 {
-	unsigned int* methods;
-	
+	struct allow_body* ab = 0;
+
 	if (!_hf) {
 		LOG(L_ERR, "parse_allow_header: Invalid parameter value\n");
 		return -1;
 	}
 	
-	     /* maybe the header is already parsed! */
+	/* maybe the header is already parsed! */
  	if (_hf->parsed) {
  		return 0;
 	}
 
-	     /* bad luck! :-( - we have to parse it */
-	methods = pkg_malloc(sizeof(unsigned int));
- 	if (methods == 0) {
- 		LOG(L_ERR, "ERROR:parse_allow_header: Out of pkg_memory\n");
- 		return -1;
- 	}
+	ab = (struct allow_body*)pkg_malloc(sizeof(struct allow_body));
+	if (ab == 0) {
+		LOG(L_ERR, "ERROR:parse_allow_header: out of pkg_memory\n");
+		return -1;
+	}
+	memset(ab,'\0', sizeof(struct allow_body));
+	
+	if (parse_methods(&(_hf->body), &(ab->allow)) !=0 ) {
+		LOG(L_ERR, "ERROR:parse_allow_header: bad allow body header\n");		
+		goto error;
+	}
+	
+	ab->allow_all = 0;	
+	_hf->parsed = (void*)ab;
+ 	return 0;
+
+error:
+	if (ab) pkg_free(ab);
+	return -1;
+}
+
+/*!
+ * \brief This method is used to parse all Allow HF body.
+ * \param msg sip msg
+ * \return 0 on success,-1 on failure.
+ */
+int parse_allow(struct sip_msg *msg)
+{       
+	unsigned int allow;
+	struct hdr_field  *hdr;
+
+	/* maybe the header is already parsed! */
+	if (msg->allow && msg->allow->parsed) {
+		return 0;
+	}
 
-	if (!parse_methods(&(_hf->body), methods)) {
- 		LOG(L_ERR, "ERROR:parse_allow_header: Bad allow header\n"); 
- 		pkg_free(methods);
+	/* parse to the end in order to get all ALLOW headers */
+	if (parse_headers(msg,HDR_EOH_F,0)==-1 || !msg->allow) {
 		return -1;
- 	}
+	}
+	allow = 0;
 
- 	_hf->parsed = methods;
- 	return 0;
+	for(hdr = msg->allow ; hdr ; hdr = next_sibling_hdr(hdr)) {
+		if (hdr->parsed == 0) {
+			if(parse_allow_header(hdr) < 0) {
+				return -1;
+			}
+		}
+
+		allow |= ((struct allow_body*)hdr->parsed)->allow;
+	}
+	
+	((struct allow_body*)msg->allow->parsed)->allow_all = allow;
+    return 0;
 }
 
 
 /*
  * Release memory
  */
-void free_allow(unsigned int** _methods)
+void free_allow_body(struct allow_body **ab)
+{
+	if (ab && *ab) {	
+		pkg_free(*ab);		
+		*ab = 0;
+	}
+}
+
+
+void free_allow_header(struct hdr_field* hf)
 {
-	if (_methods && *_methods) pkg_free(*_methods);
-	*_methods = 0;
+	free_allow_body((struct allow_body**)(void*)(&(hf->parsed)));
 }

+ 24 - 4
parser/parse_allow.h

@@ -29,23 +29,43 @@
 #define PARSE_ALLOW_H
  
 #include "hf.h"
+#include "msg_parser.h"
 
  
 /* 
- * casting macro for accessing RPID body 
+ * casting macro for accessing Allow body 
  */
-#define get_allow_methods(p_msg) (unsigned int)(p_msg)->allow->parsed)
+#define get_allow_methods(p_msg)							\
+	(((struct allow_body*)(p_msg)->allow->parsed)->allow_all)
+
+
+struct allow_body {
+	unsigned int allow;     /* allow mask for the current hdr */
+	unsigned int allow_all; /* allow mask for the all allow hdr - it's
+							 * set only for the first hdr in sibling
+							 * list*/
+};
+
+
+/*
+ * Parse all Allow HFs
+ */
+int parse_allow(struct sip_msg *msg);
 
 
 /*
  * Parse Allow HF body
  */
-int parse_allow(struct hdr_field* _h);
+int parse_allow_header(struct hdr_field* _h);
 
 
 /*
  * Release memory
  */
-void free_allow(unsigned int** _methods);
+void free_allow_body(struct allow_body **ab);
+
+void free_allow_header(struct hdr_field* hf);
+
+
 
 #endif /* PARSE_ALLOW_H */