浏览代码

AVP track searching resolution
------------------------------
new AVP prefixes registered fu - FROM USER and tu - TO USER
$avp and $f.avp now searches in from track
$t.avp searches in to track

specify fu, tu, fd, td, g if you want to search in one list only

Michal Matyska 19 年之前
父节点
当前提交
fd6d4dc97a
共有 4 个文件被更改,包括 28 次插入12 次删除
  1. 6 2
      cfg.lex
  2. 6 2
      cfg.y
  3. 4 0
      route.c
  4. 12 8
      usr_avp.c

+ 6 - 2
cfg.lex

@@ -200,8 +200,10 @@ MINUS	"-"
 /* Attribute specification */
 ATTR_MARK   "$"|"%"
 SELECT_MARK  "@"
-ATTR_FROMUSER     "f"
-ATTR_TOUSER       "t"
+ATTR_FROM         "f"
+ATTR_TO           "t"
+ATTR_FROMUSER     "fu"
+ATTR_TOUSER       "tu"
 ATTR_FROMDOMAIN   "fd"
 ATTR_TODOMAIN     "td"
 ATTR_GLOBAL       "g"
@@ -506,6 +508,8 @@ EAT_ABLE	[\ \t\b\r]
 
 
 <INITIAL>{ATTR_MARK}    { count(); state = ATTR_S; BEGIN(ATTR); return ATTR_MARK; }
+<ATTR>{ATTR_FROM}       { count(); return ATTR_FROM; }
+<ATTR>{ATTR_TO}         { count(); return ATTR_TO; }
 <ATTR>{ATTR_FROMUSER}   { count(); return ATTR_FROMUSER; }
 <ATTR>{ATTR_TOUSER}     { count(); return ATTR_TOUSER; }
 <ATTR>{ATTR_FROMDOMAIN} { count(); return ATTR_FROMDOMAIN; }

+ 6 - 2
cfg.y

@@ -282,6 +282,8 @@ static struct socket_id* mk_listen_id(char*, int, int);
 
 %token ATTR_MARK
 %token SELECT_MARK
+%token ATTR_FROM
+%token ATTR_TO
 %token ATTR_FROMUSER
 %token ATTR_TOUSER
 %token ATTR_FROMDOMAIN
@@ -1202,7 +1204,7 @@ exp_elem:
 	| exp_stm	{ $$=mk_elem( NO_OP, ACTION_O, 0, ACTIONS_ST, $1);  }
 	| NUMBER	{ $$=mk_elem( NO_OP, NUMBER_O, 0, NUMBER_ST, (void*)$1 ); }
 
-	| attr_id_val			{$$=mk_elem( NO_OP, AVP_O, (void*)$1, 0, 0); }
+	| attr_id_any				{$$=mk_elem( NO_OP, AVP_O, (void*)$1, 0, 0); }
 	| attr_id_val strop STRING	{$$=mk_elem( $2, AVP_O, (void*)$1, STRING_ST, $3); }
 	| attr_id_val strop select_id	{$$=mk_elem( $2, AVP_O, (void*)$1, SELECT_ST, $3); }
 	| attr_id_val intop NUMBER	{$$=mk_elem( $2, AVP_O, (void*)$1, NUMBER_ST, (void*)$3); }
@@ -1348,7 +1350,9 @@ select_id:
 	}
 	;
 attr_class_spec:
-	ATTR_FROMUSER { s_attr->type |= AVP_TRACK_FROM | AVP_CLASS_USER; }
+	ATTR_FROM { s_attr->type |= AVP_TRACK_FROM; }
+	| ATTR_TO { s_attr->type |= AVP_TRACK_TO; }
+	| ATTR_FROMUSER { s_attr->type |= AVP_TRACK_FROM | AVP_CLASS_USER; }
 	| ATTR_TOUSER { s_attr->type |= AVP_TRACK_TO | AVP_CLASS_USER; }
 	| ATTR_FROMDOMAIN { s_attr->type |= AVP_TRACK_FROM | AVP_CLASS_DOMAIN; }
 	| ATTR_TODOMAIN { s_attr->type |= AVP_TRACK_TO | AVP_CLASS_DOMAIN; }

+ 4 - 0
route.c

@@ -713,6 +713,10 @@ inline static int comp_avp(int op, avp_spec_t* spec, int rtype, union exp_op* r,
 	avp_t* avp;
 	int_str val;
 
+	if (spec->type & AVP_INDEX_ALL) {
+		avp = search_first_avp(spec->type & ~AVP_INDEX_ALL, spec->name, NULL, NULL);
+		return (avp!=0);
+	}
 	avp = search_avp_by_index(spec->type, spec->name, &val, spec->index);
 	if (!avp) return 0;
 

+ 12 - 8
usr_avp.c

@@ -417,12 +417,10 @@ avp_t *search_avp (avp_ident_t ident, avp_value_t* val, struct search_state* sta
 		ident.flags |= AVP_CLASS_ALL;
 		
 		if ((ident.flags & AVP_TRACK_ALL) == 0) {
-		    /* The caller did not specify even the track to search in, so try
-		     * track_from first, and if not found try track_to
+		    /* The caller did not specify even the track to search in, so search
+		     * in the track_from
 		     */
-		     	ident.flags |= AVP_TRACK_FROM;
-		     	if ((ret = search_avp(ident, val, state))) return ret;
-		     	ident.flags = (ident.flags & ~AVP_TRACK_ALL) | AVP_TRACK_TO;
+			ident.flags |= AVP_TRACK_FROM;
 		}
 	}
 
@@ -837,15 +835,21 @@ int parse_avp_ident( str *name, avp_ident_t* attr)
 		}
 		switch (id) {
 			case 'f':
-				attr->flags = AVP_TRACK_FROM | AVP_CLASS_USER;
+				attr->flags = AVP_TRACK_FROM;
 				break;
 			case 't':
+				attr->flags = AVP_TRACK_TO;
+				break;
+			case 0x6675: /* 'fu' */
+				attr->flags = AVP_TRACK_FROM | AVP_CLASS_USER;
+				break;
+			case 0x7475: /* 'tu' */
 				attr->flags = AVP_TRACK_TO | AVP_CLASS_USER;
 				break;
-			case 0x6664: //'fd'
+			case 0x6664: /* 'fd' */
 				attr->flags = AVP_TRACK_FROM | AVP_CLASS_DOMAIN;
 				break;
-			case 0x7464: // 'td'
+			case 0x7464: /* 'td' */
 				attr->flags = AVP_TRACK_TO | AVP_CLASS_DOMAIN;
 				break;
 			case 'g':