}
}
-static int
+int
clist_match_set(const struct adata *clist, const struct f_tree *set)
{
if (!clist)
return 0;
}
-static int
+int
eclist_match_set(const struct adata *list, const struct f_tree *set)
{
if (!list)
return 0;
}
-static int
+int
lclist_match_set(const struct adata *list, const struct f_tree *set)
{
if (!list)
struct f_tree *build_tree(struct f_tree *);
const struct f_tree *find_tree(const struct f_tree *t, const struct f_val *val);
int same_tree(const struct f_tree *t0, const struct f_tree *t2);
+int tree_node_count(const struct f_tree *t);
void tree_format(const struct f_tree *t, buffer *buf);
void tree_walk(const struct f_tree *t, void (*hook)(const struct f_tree *, void *), void *data);
static inline int path_set_type(const struct f_tree *set)
{ return !set || set->from.type == T_INT; }
+int clist_match_set(const struct adata *clist, const struct f_tree *set);
+int eclist_match_set(const struct adata *list, const struct f_tree *set);
+int lclist_match_set(const struct adata *list, const struct f_tree *set);
+
const struct adata *clist_filter(struct linpool *pool, const struct adata *list, const struct f_val *set, int pos);
const struct adata *eclist_filter(struct linpool *pool, const struct adata *list, const struct f_val *set, int pos);
const struct adata *lclist_filter(struct linpool *pool, const struct adata *list, const struct f_val *set, int pos);
return 1;
}
+int
+tree_node_count(const struct f_tree *t)
+{
+ if (t == NULL)
+ return 0;
+
+ return 1 + tree_node_count(t->left) + tree_node_count(t->right);
+}
static void
tree_node_format(const struct f_tree *t, buffer *buf)
}
}
+/* Check for EC_RT subtype within different types (0-2) */
+static inline int ec_type_is_rt(uint type)
+{ return (type == EC_RT) || (type == (0x0100 | EC_RT)) || (type == (0x0200 | EC_RT)); }
+
+
/* Transitive bit (for first u32 half of EC) */
#define EC_TBIT 0x40000000
static inline u32 ec_hi(u64 ec) { return ec >> 32; }
static inline u32 ec_lo(u64 ec) { return ec; }
+
static inline u64 ec_get(const u32 *l, int i)
{ return (((u64) l[i]) << 32) | l[i+1]; }
+static inline void ec_put(u32 *l, int i, u64 val)
+{ l[i] = ec_hi(val); l[i+1] = ec_lo(val); }
+
/* RFC 4360 3.1. Two-Octet AS Specific Extended Community */
static inline u64 ec_as2(enum ec_subtype kind, u64 key, u64 val)
{ return (((u64) kind | 0x0000) << 48) | (key << 32) | val; }