Exemple #1
0
/*
 * Search for exact match in given @head.
 * Assume host bits are cleared in @v_arg if @m_arg is not NULL
 * Note that prefixes with /32 or /128 masks are treated differently
 * from host routes.
 */
struct radix_node *
rn_lookup(void *v_arg, void *m_arg, struct radix_node_head *head)
{
	struct radix_node *x;
	caddr_t netmask;

	if (m_arg != NULL) {
		/*
		 * Most common case: search exact prefix/mask
		 */
		x = rn_addmask(m_arg, head->rnh_masks, 1,
		    head->rnh_treetop->rn_offset);
		if (x == NULL)
			return (NULL);
		netmask = x->rn_key;

		x = rn_match(v_arg, head);

		while (x != NULL && x->rn_mask != netmask)
			x = x->rn_dupedkey;

		return (x);
	}

	/*
	 * Search for host address.
	 */
	if ((x = rn_match(v_arg, head)) == NULL)
		return (NULL);

	/* Check if found key is the same */
	if (LEN(x->rn_key) != LEN(v_arg) || bcmp(x->rn_key, v_arg, LEN(v_arg)))
		return (NULL);

	/* Check if this is not host route */
	if (x->rn_mask != NULL)
		return (NULL);

	return (x);
}
Exemple #2
0
static struct radix_node *
at_matroute(void *v_arg, struct radix_node_head * head)
{
	struct radix_node *rn;

	printf("at_matroute: v=%s\n", prsockaddr(v_arg));
	printf("at_matroute: head=%x\n", head);

	rn = rn_match(v_arg, head);

	printf("at_matroute: returns rn=%x\n", rn);

	return rn;
}
Exemple #3
0
/*
 * This code is the inverse of in6_clsroute: on first reference, if we
 * were managing the route, stop doing so and set the expiration timer
 * back off again.
 */
static struct radix_node *
in6_matroute(void *v_arg, struct radix_node_head *head)
{
	struct radix_node *rn = rn_match(v_arg, head);
	struct rtentry *rt = (struct rtentry *)rn;

	if (rt && rt->rt_refcnt == 0) { /* this is first reference */
		if (rt->rt_flags & RTPRF_OURS) {
			rt->rt_flags &= ~RTPRF_OURS;
			rt->rt_rmx.rmx_expire = 0;
		}
	}
	return rn;
}
Exemple #4
0
/*
 * This code is the inverse of in_clsroute: on first reference, if we
 * were managing the route, stop doing so and set the expiration timer
 * back off again.
 */
static struct radix_node *
in_matroute(void *v_arg, struct radix_node_head *head)
{
	struct radix_node *rn = rn_match(v_arg, head);
	struct rtentry *rt = (struct rtentry *)rn;

	if (rt) {
		RT_LOCK(rt);
		if (rt->rt_flags & RTPRF_OURS) {
			rt->rt_flags &= ~RTPRF_OURS;
			rt->rt_rmx.rmx_expire = 0;
		}
		RT_UNLOCK(rt);
	}
	return rn;
}
Exemple #5
0
struct radix_node *
rn_lookup(void *v_arg, void *m_arg, struct radix_node_head *head)
{
	struct radix_node *x;
	caddr_t netmask = 0;

	if (m_arg) {
		if ((x = rn_addmask(m_arg, 1, head->rnh_treetop->rn_off)) == 0)
			return (0);
		netmask = x->rn_key;
	}
	x = rn_match(v_arg, head);
	if (x && netmask) {
		while (x && x->rn_mask != netmask)
			x = x->rn_dupedkey;
	}
	return x;
}
Exemple #6
0
struct radix_node *
rn_lookup(void *v_arg, void *m_arg, struct radix_node_head *head)
{
	register struct radix_node *x;
	uint8 *netmask = NULL;

	if (m_arg) {
		x = rn_addmask(m_arg, 1, head->rnh_treetop->rn_offset);
		if (x == 0)
			return 0;
		netmask = x->rn_key;
	}
	x = rn_match(v_arg, head);
	if (x && netmask) {
		while (x && x->rn_mask != netmask)
			x = x->rn_dupedkey;
	}
	return x;
}
Exemple #7
0
struct radix_node *
rn_lookup(void *v_arg, void *m_arg, struct radix_node_head *head)
{
	struct radix_node *x, *tm;
	caddr_t netmask = 0;

	if (m_arg) {
		tm = rn_addmask(m_arg, 1, head->rnh_treetop->rn_off);
		if (tm == NULL)
			return (NULL);
		netmask = tm->rn_key;
	}
	x = rn_match(v_arg, head);
	if (x && netmask) {
		while (x && x->rn_mask != netmask)
			x = x->rn_dupedkey;
	}
	return x;
}
Exemple #8
0
struct radix_node *
rn_lookup(char *key, char *mask, struct radix_node_head *head)
{
	struct radix_node *x;
	char *netmask = NULL;

	if (mask != NULL) {
		x = rn_addmask(mask, TRUE, head->rnh_treetop->rn_offset,
			       head->rnh_maskhead);
		if (x == NULL)
			return (NULL);
		netmask = x->rn_key;
	}
	x = rn_match(key, head);
	if (x != NULL && netmask != NULL) {
		while (x != NULL && x->rn_mask != netmask)
			x = x->rn_dupedkey;
	}
	return x;
}
Exemple #9
0
struct radix_node *
rn_lookup(
	const void *v_arg,
	const void *m_arg,
	struct radix_node_head *head)
{
	struct radix_node *x;
	const char *netmask = NULL;

	if (m_arg) {
		if ((x = rn_addmask(m_arg, 1, head->rnh_treetop->rn_off)) == 0)
			return NULL;
		netmask = x->rn_key;
	}
	x = rn_match(v_arg, head);
	if (x != NULL && netmask != NULL) {
		while (x != NULL && x->rn_mask != netmask)
			x = x->rn_dupedkey;
	}
	return x;
}
static struct radix_node *
at_matroute(void *v_arg, struct radix_node_head *head)
{

	return (rn_match(v_arg, head));
}
Exemple #11
0
static struct radix_node *
mpls_rn_match(void *v_arg, struct radix_node_head *rnh)
{

	return (rn_match(v_arg, rnh));
}