Jelajahi Sumber

- finish migration to the gparam type and the core fixup functions,
remove/ refactor the module fixup functions
- use gparam_p instead of the PV structure in route functions, to be
able to use the generic fixup_get_svalue printing function


git-svn-id: https://openser.svn.sourceforge.net/svnroot/openser/trunk@5150 689a6050-402a-0410-94f2-e92a70836424

Henning Westerholt 17 tahun lalu
induk
melakukan
c5778c89d7
3 mengubah file dengan 120 tambahan dan 229 penghapusan
  1. 29 147
      modules/carrierroute/cr_fixup.c
  2. 83 74
      modules/carrierroute/cr_func.c
  3. 8 8
      modules/carrierroute/cr_func.h

+ 29 - 147
modules/carrierroute/cr_fixup.c

@@ -60,161 +60,60 @@ static enum hash_source hash_fixup(const char * my_hash_source) {
 }
 
 
-/**
- * fixes the module functions' parameters with generic pseudo variable support.
- *
- * @param param the parameter
- *
- * @return 0 on success, -1 on failure
- */
-static int pv_fixup(void ** param) {
-	pv_elem_t *model;
-	str s;
-
-	s.s = (char *)(*param);
-	s.len = strlen(s.s);
-	if (s.len <= 0) return -1;
-	/* Check the format */
-	if(pv_parse_format(&s, &model)<0) {
-		LM_ERR("pv_parse_format failed for '%s'\n", (char *)(*param));
-		return -1;
-	}
-	*param = (void*)model;
-
-	return 0;
-}
-
-
 /**
  * fixes the module functions' parameters if it is a carrier.
- * supports name string, pseudo-variables and AVPs.
+ * supports name string and PVs.
  *
  * @param param the parameter
  *
  * @return 0 on success, -1 on failure
  */
 static int carrier_fixup(void ** param) {
-	pv_spec_t avp_spec;
-	gparam_t *gp;
-	str s;
 
-	gp = (gparam_t *)pkg_malloc(sizeof(gparam_t));
-	if (gp == NULL) {
-		LM_ERR("no more memory\n");
+	if (fixup_spve_null(param, 1) !=0) {
+		LM_ERR("could not fixup parameter");
 		return -1;
 	}
-	memset(gp, 0, sizeof(gparam_t));
-	
-	s.s = (char *)(*param);
-	s.len = strlen(s.s);
 
-	if (s.s[0]!='$') {
-		/* This is a name string */
-		gp->type=GPARAM_TYPE_INT;
-		
-		/* get carrier id */
-		if ((gp->v.ival = find_carrier(s)) < 0) {
-			LM_ERR("could not find carrier '%s'\n", (char *)(*param));
-			pkg_free(gp);
-			return -1;
-		}
-		LM_INFO("carrier %s has id %i\n", (char *)*param, gp->v.ival);
-		
-		pkg_free(*param);
-		*param = (void *)gp;
-	}
-	else {
-		/* This is a pseudo-variable */
-		if (pv_parse_spec(&s, &avp_spec)==0) {
-			LM_ERR("pv_parse_spec failed for '%s'\n", (char *)(*param));
-			pkg_free(gp);
+	if (((gparam_p)(*param))->type == GPARAM_TYPE_STR) {
+		/* This is a name string, convert to a int */
+		((gparam_p)(*param))->type=GPARAM_TYPE_INT;
+		/* get domain id */
+		if ((((gparam_p)(*param))->v.ival = find_carrier(((gparam_p)(*param))->v.sval)) < 0) {
+			LM_ERR("could not add carrier\n");
+			pkg_free(*param);
 			return -1;
 		}
-		if (avp_spec.type==PVT_AVP) {
-			/* This is an AVP - could be an id or name */
-			gp->type=GPARAM_TYPE_AVP;
-			if(pv_get_avp_name(0, &(avp_spec.pvp), &(gp->v.avp.name), &(gp->v.avp.flags))!=0) {
-				LM_ERR("Invalid AVP definition <%s>\n", (char *)(*param));
-				pkg_free(gp);
-				return -1;
-			}
-		} else {
-			gp->type=GPARAM_TYPE_PVE;
-			if(pv_parse_format(&s, &(gp->v.pve))<0) {
-				LM_ERR("pv_parse_format failed for '%s'\n", (char *)(*param));
-				pkg_free(gp);
-				return -1;
-			}
-		}
 	}
-	*param = (void*)gp;
-
 	return 0;
 }
 
 
 /**
  * fixes the module functions' parameters if it is a domain.
- * supports name string, and AVPs.
+ * supports name string, and PVs.
  *
  * @param param the parameter
  *
  * @return 0 on success, -1 on failure
  */
 static int domain_fixup(void ** param) {
-	pv_spec_t avp_spec;
-	gparam_t *gp;
-	str s;
-
-	gp = (gparam_t *)pkg_malloc(sizeof(gparam_t));
-	if (gp == NULL) {
-		LM_ERR("no more memory\n");
+	
+	if (fixup_spve_null(param, 1) !=0) {
+		LM_ERR("could not fixup parameter");
 		return -1;
 	}
-	memset(gp, 0, sizeof(gparam_t));
-	
-	s.s = (char *)(*param);
-	s.len = strlen(s.s);
-	
-	if (s.s[0]!='$') {
-		/* This is a name string */
-		gp->type=GPARAM_TYPE_INT;
-		
+
+	if (((gparam_p)(*param))->type == GPARAM_TYPE_STR) {
+		/* This is a name string, convert to a int */
+		((gparam_p)(*param))->type=GPARAM_TYPE_INT;
 		/* get domain id */
-		if ((gp->v.ival = add_domain(&s)) < 0) {
+		if ((((gparam_p)(*param))->v.ival = add_domain(&(((gparam_p)(*param))->v.sval))) < 0) {
 			LM_ERR("could not add domain\n");
-			pkg_free(gp);
+			pkg_free(*param);
 			return -1;
 		}
-		pkg_free(*param);
-		*param = (void *)gp;
 	}
-	else {
-		/* This is a pseudo-variable */
-		if (pv_parse_spec(&s, &avp_spec)==0) {
-			LM_ERR("pv_parse_spec failed for '%s'\n", (char *)(*param));
-			pkg_free(gp);
-			return -1;
-		}
-		if (avp_spec.type==PVT_AVP) {
-			/* This is an AVP - could be an id or name */
-			gp->type=GPARAM_TYPE_AVP;
-			if(pv_get_avp_name(0, &(avp_spec.pvp), &(gp->v.avp.name), &(gp->v.avp.flags))!=0) {
-				LM_ERR("Invalid AVP definition <%s>\n", (char *)(*param));
-				pkg_free(gp);
-				return -1;
-			}
-		} else {
-			gp->type=GPARAM_TYPE_PVE;
-			if(pv_parse_format(&s, &(gp->v.pve))<0) {
-				LM_ERR("pv_parse_format failed for '%s'\n", (char *)(*param));
-				pkg_free(gp);
-				return -1;
-			}
-		}	
-	}
-	*param = (void*)gp;
-
 	return 0;
 }
 
@@ -227,34 +126,17 @@ static int domain_fixup(void ** param) {
  * @return 0 on success, -1 on failure
  */
 static int avp_name_fixup(void ** param) {
-	pv_spec_t avp_spec;
-	gparam_t *gp;
-	str s;
 
-	s.s = (char *)(*param);
-	s.len = strlen(s.s);
-	if (s.len <= 0) return -1;
-	if (pv_parse_spec(&s, &avp_spec)==0 || avp_spec.type!=PVT_AVP) {
-		LM_ERR("Malformed or non AVP definition <%s>\n", (char *)(*param));
+	if (fixup_spve_null(param, 1) !=0) {
+		LM_ERR("could not fixup parameter");
 		return -1;
 	}
-	
-	gp = (gparam_t *)pkg_malloc(sizeof(gparam_t));
-	if (gp == NULL) {
-		LM_ERR("no more memory\n");
+	if (((gparam_p)(*param))->v.pve->spec.type == PVT_AVP &&
+			((gparam_p)(*param))->v.pve->spec.pvp.pvn.u.isname.name.s.len == 0 &&
+			((gparam_p)(*param))->v.pve->spec.pvp.pvn.u.isname.name.s.s == 0) {
+		LM_ERR("malformed or non AVP type definition\n");
 		return -1;
 	}
-	memset(gp, 0, sizeof(gparam_t));
-	
-	gp->type=GPARAM_TYPE_AVP;
-	if(pv_get_avp_name(0, &(avp_spec.pvp), &(gp->v.avp.name), &(gp->v.avp.flags))!=0) {
-		LM_ERR("Invalid AVP definition <%s>\n", (char *)(*param));
-		pkg_free(gp);
-		return -1;
-	}
-
-	*param = (void*)gp;
-	
 	return 0;
 }
 
@@ -289,7 +171,7 @@ int cr_route_fixup(void ** param, int param_no) {
 	else if ((param_no == 3) || (param_no == 4)){
 		/* prefix matching */
 		/* rewrite user */
-		if (pv_fixup(param) < 0) {
+		if (fixup_spve_null(param, 1) != 0) {
 			LM_ERR("cannot fixup parameter %d\n", param_no);
 			return -1;
 		}
@@ -344,7 +226,7 @@ int cr_load_next_domain_fixup(void ** param, int param_no) {
 		/* prefix matching */
 		/* host */
 		/* reply code */
-		if (pv_fixup(param) < 0) {
+		if (fixup_spve_null(param, 1) != 0) {
 			LM_ERR("cannot fixup parameter %d\n", param_no);
 			return -1;
 		}
@@ -370,7 +252,7 @@ int cr_load_user_carrier_fixup(void ** param, int param_no) {
 	if ((param_no == 1) || (param_no == 2)) {
 		/* user */
 		/* domain */
-		if (pv_fixup(param) < 0) {
+		if (fixup_spve_null(param, 1) != 0) {
 			LM_ERR("cannot fixup parameter %d\n", param_no);
 			return -1;
 		}

+ 83 - 74
modules/carrierroute/cr_func.c

@@ -80,36 +80,40 @@ int gp2carrier_id(struct sip_msg * _msg, gparam_t *gp) {
 	case GPARAM_TYPE_INT:
 		return gp->v.ival;
 		break;
-	case GPARAM_TYPE_AVP:
-		avp = search_first_avp(gp->v.avp.flags, gp->v.avp.name, &avp_val, 0);
-		if (!avp) {
-			LM_ERR("cannot find AVP '%.*s'\n", gp->v.avp.name.s.len, gp->v.avp.name.s.s);
-			return -1;
-		}
-		if ((avp->flags&AVP_VAL_STR)==0) {
-			return avp_val.n;
-		}
-		else {
-			carrier_id = find_carrier(avp_val.s);
+	case GPARAM_TYPE_PVE:
+		if (gp->v.pve->spec.type==PVT_AVP) {
+			avp = search_first_avp(gp->v.pve->spec.pvp.pvn.u.isname.type,
+						gp->v.pve->spec.pvp.pvn.u.isname.name, &avp_val, 0);
+			if (!avp) {
+				LM_ERR("cannot find AVP '%.*s'\n", gp->v.pve->spec.pvp.pvn.u.isname.name.s.len,
+						gp->v.pve->spec.pvp.pvn.u.isname.name.s.s);
+				return -1;
+			}
+			if ((avp->flags&AVP_VAL_STR)==0) {
+				return avp_val.n;
+			} else {
+				carrier_id = find_carrier(avp_val.s);
+				if (carrier_id < 0) {
+					LM_ERR("could not find carrier '%.*s' from AVP\n",
+							gp->v.pve->spec.pvp.pvn.u.isname.name.s.len,
+							gp->v.pve->spec.pvp.pvn.u.isname.name.s.s);
+					return -1;
+				}
+				return carrier_id;
+			}
+		} else {
+			/* retrieve carrier name from parameter */
+			if (fixup_get_svalue(_msg, gp, &tmp)<0) {
+				LM_ERR("cannot print the carrier\n");
+				return -1;
+			}
+			carrier_id = find_carrier(tmp);
 			if (carrier_id < 0) {
-				LM_WARN("could not find carrier '%.*s'\n", avp_val.s.len, avp_val.s.s);
+				LM_WARN("could not find carrier '%.*s' from PV\n", tmp.len, tmp.s);
 				/* might be using fallback later... */
 			}
 			return carrier_id;
 		}
-		break;
-	case GPARAM_TYPE_PVE:
-		/* retrieve carrier name from parameter */
-		if (pv_printf_s(_msg, gp->v.pve, &tmp)<0) {
-			LM_ERR("cannot print the carrier\n");
-			return -1;
-		}
-		carrier_id = find_carrier(tmp);
-		if (carrier_id < 0) {
-			LM_WARN("could not find carrier '%.*s'\n", tmp.len, tmp.s);
-			/* might be using fallback later... */
-		}
-		return carrier_id;
 	default:
 		LM_ERR("invalid carrier type\n");
 		return -1;
@@ -136,36 +140,41 @@ int gp2domain_id(struct sip_msg * _msg, gparam_t *gp) {
 	case GPARAM_TYPE_INT:
 		return gp->v.ival;
 		break;
-	case GPARAM_TYPE_AVP:
-		avp = search_first_avp(gp->v.avp.flags, gp->v.avp.name, &avp_val, 0);
-		if (!avp) {
-			LM_ERR("cannot find AVP '%.*s'\n", gp->v.avp.name.s.len, gp->v.avp.name.s.s);
-			return -1;
-		}
-		if ((avp->flags&AVP_VAL_STR)==0) {
-			return avp_val.n;
-		}
-		else {
-			domain_id = add_domain(&avp_val.s);
+	case GPARAM_TYPE_PVE:
+		/* does this PV hold an AVP? */
+		if (gp->v.pve->spec.type==PVT_AVP) {
+			avp = search_first_avp(gp->v.pve->spec.pvp.pvn.u.isname.type,
+						gp->v.pve->spec.pvp.pvn.u.isname.name, &avp_val, 0);
+			if (!avp) {
+				LM_ERR("cannot find AVP '%.*s'\n", gp->v.pve->spec.pvp.pvn.u.isname.name.s.len,
+						gp->v.pve->spec.pvp.pvn.u.isname.name.s.s);
+				return -1;
+			}
+			if ((avp->flags&AVP_VAL_STR)==0) {
+				return avp_val.n;
+			} else {
+				domain_id = add_domain(&avp_val.s);
+				if (domain_id < 0) {
+					LM_ERR("could not find domain '%.*s' from AVP\n",
+							gp->v.pve->spec.pvp.pvn.u.isname.name.s.len,
+							gp->v.pve->spec.pvp.pvn.u.isname.name.s.s);
+					return -1;
+				}
+				return domain_id;
+			}
+		} else {
+			/* retrieve domain name from parameter */
+			if (fixup_get_svalue(_msg, gp, &tmp)<0) {
+				LM_ERR("cannot print the domain\n");
+				return -1;
+			}
+			domain_id = add_domain(&tmp);
 			if (domain_id < 0) {
-				LM_ERR("could not find domain '%.*s'\n", avp_val.s.len, avp_val.s.s);
+				LM_ERR("could not find domain '%.*s' from PV\n", tmp.len, tmp.s);
 				return -1;
 			}
 			return domain_id;
 		}
-		break;
-	case GPARAM_TYPE_PVE:
-		/* retrieve domain name from parameter */
-		if (pv_printf_s(_msg, gp->v.pve, &tmp)<0) {
-			LM_ERR("cannot print the domain\n");
-			return -1;
-		}
-		domain_id = add_domain(&tmp);
-		if (domain_id < 0) {
-			LM_ERR("could not find domain '%.*s'\n", tmp.len, tmp.s);
-			return -1;
-		}
-		return domain_id;
 	default:
 		LM_ERR("invalid domain type\n");
 		return -1;
@@ -228,7 +237,8 @@ static int set_next_domain_on_rule(struct failure_route_rule *frr_head,
 				((rr->host.len == 0) || (str_strcmp(host, &rr->host)==0)) &&
 				(reply_code_matcher(&(rr->reply_code), reply_code)==0)) {
 			avp_val.n = rr->next_domain;
-			if (add_avp(dstavp->v.avp.flags, dstavp->v.avp.name, avp_val)<0) {
+			if (add_avp(dstavp->v.pve->spec.pvp.pvn.u.isname.type,
+					dstavp->v.pve->spec.pvp.pvn.u.isname.name, avp_val)<0) {
 				LM_ERR("set AVP failed\n");
 				return -1;
 			}
@@ -377,7 +387,8 @@ static int actually_rewrite(const struct route_rule *rs, str *dest,
 
 	if (dstavp) {
 		avp_val.s = rs->host;
-		if (add_avp(AVP_VAL_STR | dstavp->v.avp.flags, dstavp->v.avp.name, avp_val)<0) {
+		if (add_avp(AVP_VAL_STR | dstavp->v.pve->spec.pvp.pvn.u.isname.type,
+					dstavp->v.pve->spec.pvp.pvn.u.isname.name, avp_val)<0) {
 			LM_ERR("set AVP failed\n");
 			pkg_free(dest->s);
 			return -1;
@@ -529,8 +540,8 @@ static int rewrite_uri_recursor(struct dtrie_node_t * node,
  * @return 1 on success, -1 on failure
  */
 int cr_do_route(struct sip_msg * _msg, gparam_t *_carrier,
-		gparam_t *_domain, pv_elem_t *_prefix_matching,
-		pv_elem_t *_rewrite_user, enum hash_source _hsrc,
+		gparam_t *_domain, gparam_t *_prefix_matching,
+		gparam_t *_rewrite_user, enum hash_source _hsrc,
 		enum hash_algorithm _halg, gparam_t *_dstavp) {
 
 	int carrier_id, domain_id, ret = -1;
@@ -548,12 +559,12 @@ int cr_do_route(struct sip_msg * _msg, gparam_t *_carrier,
 		return -1;
 	}
 
-	if (pv_printf_s(_msg, _rewrite_user, &rewrite_user)<0)	{
+	if (fixup_get_svalue(_msg, _rewrite_user, &rewrite_user)<0) {
 		LM_ERR("cannot print the rewrite_user\n");
 		return -1;
 	}
 
-	if (pv_printf_s(_msg, _prefix_matching, &prefix_matching)<0)	{
+	if (fixup_get_svalue(_msg, _prefix_matching, &prefix_matching)<0) {
 		LM_ERR("cannot print the prefix_matching\n");
 		return -1;
 	}
@@ -629,16 +640,16 @@ unlock_and_out:
  *
  * @return 1 on success, -1 on failure
  */
-int cr_load_user_carrier(struct sip_msg * _msg, pv_elem_t *_user, pv_elem_t *_domain, gparam_t *_dstavp) {
+int cr_load_user_carrier(struct sip_msg * _msg, gparam_t *_user, gparam_t *_domain, gparam_t *_dstavp) {
 	str user, domain;
 	int_str avp_val;
 	
-	if (pv_printf_s(_msg, _user, &user)<0)	{
+	if (fixup_get_svalue(_msg, _user, &user)<0) {
 		LM_ERR("cannot print the user\n");
 		return -1;
 	}
 
-	if (pv_printf_s(_msg, _domain, &domain)<0)	{
+	if (fixup_get_svalue(_msg, _domain, &domain)<0) {
 		LM_ERR("cannot print the domain\n");
 		return -1;
 	}
@@ -647,10 +658,10 @@ int cr_load_user_carrier(struct sip_msg * _msg, pv_elem_t *_user, pv_elem_t *_do
 	if ((avp_val.n = load_user_carrier(&user, &domain)) < 0) {
 		LM_ERR("error in load user carrier");
 		return -1;
-	}
-	else {
-		/* set avp ! */
-		if (add_avp(_dstavp->v.avp.flags, _dstavp->v.avp.name, avp_val)<0) {
+	} else {
+		/* set avp */
+		if (add_avp(_dstavp->v.pve->spec.pvp.pvn.u.isname.type,
+					_dstavp->v.pve->spec.pvp.pvn.u.isname.name, avp_val)<0) {
 			LM_ERR("add AVP failed\n");
 			return -1;
 		}
@@ -674,8 +685,8 @@ int cr_load_user_carrier(struct sip_msg * _msg, pv_elem_t *_user, pv_elem_t *_do
  * @return 1 on success, -1 on failure
  */
 int cr_route(struct sip_msg * _msg, gparam_t *_carrier,
-		gparam_t *_domain, pv_elem_t *_prefix_matching,
-		pv_elem_t *_rewrite_user, enum hash_source _hsrc,
+		gparam_t *_domain, gparam_t *_prefix_matching,
+		gparam_t *_rewrite_user, enum hash_source _hsrc,
 		gparam_t *_dstavp)
 {
 	return cr_do_route(_msg, _carrier, _domain, _prefix_matching,
@@ -698,8 +709,8 @@ int cr_route(struct sip_msg * _msg, gparam_t *_carrier,
  * @return 1 on success, -1 on failure
  */
 int cr_prime_route(struct sip_msg * _msg, gparam_t *_carrier,
-		gparam_t *_domain, pv_elem_t *_prefix_matching,
-		pv_elem_t *_rewrite_user, enum hash_source _hsrc,
+		gparam_t *_domain, gparam_t *_prefix_matching,
+		gparam_t *_rewrite_user, enum hash_source _hsrc,
 		gparam_t *_dstavp)
 {
 	return cr_do_route(_msg, _carrier, _domain, _prefix_matching,
@@ -721,8 +732,8 @@ int cr_prime_route(struct sip_msg * _msg, gparam_t *_carrier,
  * @return 1 on success, -1 on failure
  */
 int cr_load_next_domain(struct sip_msg * _msg, gparam_t *_carrier,
-		gparam_t *_domain, pv_elem_t *_prefix_matching,
-		pv_elem_t *_host, pv_elem_t *_reply_code, gparam_t *_dstavp) {
+		gparam_t *_domain, gparam_t *_prefix_matching,
+		gparam_t *_host, gparam_t *_reply_code, gparam_t *_dstavp) {
 
 	int carrier_id, domain_id, ret = -1;
 	str prefix_matching, host, reply_code;
@@ -738,17 +749,15 @@ int cr_load_next_domain(struct sip_msg * _msg, gparam_t *_carrier,
 		return -1;
 	}
 
-	if (pv_printf_s(_msg, _prefix_matching, &prefix_matching)<0)	{
+	if (fixup_get_svalue(_msg, _prefix_matching, &prefix_matching)<0) {
 		LM_ERR("cannot print the prefix_matching\n");
 		return -1;
 	}
-
-	if (pv_printf_s(_msg, _host, &host)<0)	{
+	if (fixup_get_svalue(_msg, _host, &host)<0) {
 		LM_ERR("cannot print the host\n");
 		return -1;
 	}
-
-	if (pv_printf_s(_msg, _reply_code, &reply_code)<0)	{
+	if (fixup_get_svalue(_msg, _reply_code, &reply_code)<0) {
 		LM_ERR("cannot print the reply_code\n");
 		return -1;
 	}

+ 8 - 8
modules/carrierroute/cr_func.h

@@ -47,8 +47,8 @@
  *
  * @return 1 on success, -1 on failure
  */
-int cr_load_user_carrier(struct sip_msg * _msg, pv_elem_t *_user,
-		pv_elem_t *_domain, gparam_t *_dstavp);
+int cr_load_user_carrier(struct sip_msg * _msg, gparam_t *_user,
+		gparam_t *_domain, gparam_t *_dstavp);
 
 
 /**
@@ -66,8 +66,8 @@ int cr_load_user_carrier(struct sip_msg * _msg, pv_elem_t *_user,
  * @return 1 on success, -1 on failure
  */
 int cr_route(struct sip_msg * _msg, gparam_t *_carrier,
-		gparam_t *_domain, pv_elem_t *_prefix_matching,
-		pv_elem_t *_rewrite_user, enum hash_source _hsrc,
+		gparam_t *_domain, gparam_t *_prefix_matching,
+		gparam_t *_rewrite_user, enum hash_source _hsrc,
 		gparam_t *_dstavp);
 
 
@@ -86,8 +86,8 @@ int cr_route(struct sip_msg * _msg, gparam_t *_carrier,
  * @return 1 on success, -1 on failure
  */
 int cr_prime_route(struct sip_msg * _msg, gparam_t *_carrier,
-		gparam_t *_domain, pv_elem_t *_prefix_matching,
-		pv_elem_t *_rewrite_user, enum hash_source _hsrc,
+		gparam_t *_domain, gparam_t *_prefix_matching,
+		gparam_t *_rewrite_user, enum hash_source _hsrc,
 		gparam_t *_dstavp);
 
 
@@ -105,7 +105,7 @@ int cr_prime_route(struct sip_msg * _msg, gparam_t *_carrier,
  * @return 1 on success, -1 on failure
  */
 int cr_load_next_domain(struct sip_msg * _msg, gparam_t *_carrier,
-		gparam_t *_domain, pv_elem_t *_prefix_matching, pv_elem_t *_host,
-		pv_elem_t *_reply_code, gparam_t *_dstavp);
+		gparam_t *_domain, gparam_t *_prefix_matching, gparam_t *_host,
+		gparam_t *_reply_code, gparam_t *_dstavp);
 
 #endif