瀏覽代碼

core: keep a stack of msg env data

- GH #4258

(cherry picked from commit c10c1d7f0214105c01a300b4a69c58219e4c970a)
Daniel-Constantin Mierla 3 月之前
父節點
當前提交
fd054f531e
共有 2 個文件被更改,包括 68 次插入21 次删除
  1. 50 17
      src/core/srapi.c
  2. 18 4
      src/core/srapi.h

+ 50 - 17
src/core/srapi.c

@@ -75,29 +75,60 @@ sr_cfgenv_t *sr_cfgenv_get(void)
 /**
 /**
  *
  *
  */
  */
-void ksr_msg_env_push(ksr_msg_env_t *menv)
+#define KSR_MSG_ENV_STACK_SIZE 8
+static ksr_msg_env_data_t _ksr_msg_env_stack[KSR_MSG_ENV_STACK_SIZE];
+static int _ksr_msg_env_stack_idx = 0;
+
+/**
+ *
+ */
+int ksr_msg_env_push(ksr_msg_env_links_t *oenv)
 {
 {
-	menv->route_type = get_route_type();
-
-	menv->avps_uri_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, NULL);
-	menv->avps_uri_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_URI, NULL);
-	menv->avps_user_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, NULL);
-	menv->avps_user_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, NULL);
-	menv->avps_domain_from =
-			set_avp_list(AVP_TRACK_FROM | AVP_CLASS_DOMAIN, NULL);
-	menv->avps_domain_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN, NULL);
-	menv->xavps = xavp_set_list(NULL);
-	menv->xavus = xavu_set_list(NULL);
-	menv->xavis = xavi_set_list(NULL);
-
-	return;
+	ksr_msg_env_data_t *senv = NULL;
+
+	if(_ksr_msg_env_stack_idx >= KSR_MSG_ENV_STACK_SIZE) {
+		LM_ERR("msg env stack size exceeded\n");
+		return -1;
+	}
+	senv = &_ksr_msg_env_stack[_ksr_msg_env_stack_idx];
+	memset(&_ksr_msg_env_stack[_ksr_msg_env_stack_idx], 0,
+			sizeof(ksr_msg_env_data_t));
+
+	oenv->route_type = get_route_type();
+
+	oenv->avps_uri_from =
+			set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, &senv->avps_uri_from);
+	oenv->avps_uri_to =
+			set_avp_list(AVP_TRACK_TO | AVP_CLASS_URI, &senv->avps_uri_to);
+	oenv->avps_user_from = set_avp_list(
+			AVP_TRACK_FROM | AVP_CLASS_USER, &senv->avps_user_from);
+	oenv->avps_user_to =
+			set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, &senv->avps_user_to);
+	oenv->avps_domain_from = set_avp_list(
+			AVP_TRACK_FROM | AVP_CLASS_DOMAIN, &senv->avps_domain_from);
+	oenv->avps_domain_to = set_avp_list(
+			AVP_TRACK_TO | AVP_CLASS_DOMAIN, &senv->avps_domain_to);
+	oenv->xavps = xavp_set_list(&senv->xavps);
+	oenv->xavus = xavu_set_list(&senv->xavus);
+	oenv->xavis = xavi_set_list(&senv->xavis);
+
+	_ksr_msg_env_stack_idx++;
+
+	return 0;
 }
 }
 
 
 /**
 /**
  *
  *
  */
  */
-void ksr_msg_env_pop(ksr_msg_env_t *menv)
+int ksr_msg_env_pop(ksr_msg_env_links_t *menv)
 {
 {
+	if(_ksr_msg_env_stack_idx <= 0) {
+		LM_ERR("invalid msg env stack index\n");
+		return -1;
+	}
+
+	/* current msg x/avp lists are expected to be cleaned up
+	 * - just replace and pop */
 	set_route_type(menv->route_type);
 	set_route_type(menv->route_type);
 
 
 	set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, menv->avps_uri_from);
 	set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, menv->avps_uri_from);
@@ -110,5 +141,7 @@ void ksr_msg_env_pop(ksr_msg_env_t *menv)
 	xavu_set_list(menv->xavus);
 	xavu_set_list(menv->xavus);
 	xavi_set_list(menv->xavis);
 	xavi_set_list(menv->xavis);
 
 
-	return;
+	_ksr_msg_env_stack_idx--;
+
+	return 0;
 }
 }

+ 18 - 4
src/core/srapi.h

@@ -41,7 +41,21 @@ typedef struct sr_cfgenv
 void sr_cfgenv_init(void);
 void sr_cfgenv_init(void);
 sr_cfgenv_t *sr_cfgenv_get(void);
 sr_cfgenv_t *sr_cfgenv_get(void);
 
 
-typedef struct ksr_msg_env
+typedef struct ksr_msg_env_data
+{
+	int route_type;
+	avp_list_t avps_user_from;
+	avp_list_t avps_user_to;
+	avp_list_t avps_domain_from;
+	avp_list_t avps_domain_to;
+	avp_list_t avps_uri_from;
+	avp_list_t avps_uri_to;
+	sr_xavp_t *xavps;
+	sr_xavp_t *xavus;
+	sr_xavp_t *xavis;
+} ksr_msg_env_data_t;
+
+typedef struct ksr_msg_env_links
 {
 {
 	int route_type;
 	int route_type;
 	avp_list_t *avps_user_from;
 	avp_list_t *avps_user_from;
@@ -53,9 +67,9 @@ typedef struct ksr_msg_env
 	sr_xavp_t **xavps;
 	sr_xavp_t **xavps;
 	sr_xavp_t **xavus;
 	sr_xavp_t **xavus;
 	sr_xavp_t **xavis;
 	sr_xavp_t **xavis;
-} ksr_msg_env_t;
+} ksr_msg_env_links_t;
 
 
-void ksr_msg_env_push(ksr_msg_env_t *menv);
-void ksr_msg_env_pop(ksr_msg_env_t *menv);
+int ksr_msg_env_links_push(ksr_msg_env_links_t *menv);
+int ksr_msg_env_links_pop(ksr_msg_env_links_t *menv);
 
 
 #endif
 #endif