Re: [homenet] on prefix comparison

Pierre Pfister <pierre.pfister@darou.fr> Wed, 08 October 2014 12:25 UTC

Return-Path: <SRS0=W1if=67=darou.fr=pierre.pfister@bounces.m4x.org>
X-Original-To: homenet@ietfa.amsl.com
Delivered-To: homenet@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id D6C0F1A0307 for <homenet@ietfa.amsl.com>; Wed, 8 Oct 2014 05:25:44 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -3.002
X-Spam-Level:
X-Spam-Status: No, score=-3.002 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, J_CHICKENPOX_24=0.6, J_CHICKENPOX_61=0.6, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001] autolearn=ham
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id npC9emOlXOq1 for <homenet@ietfa.amsl.com>; Wed, 8 Oct 2014 05:25:42 -0700 (PDT)
Received: from mx1.polytechnique.org (mx1.polytechnique.org [129.104.30.34]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 05FFD1A00AE for <homenet@ietf.org>; Wed, 8 Oct 2014 05:25:41 -0700 (PDT)
Received: from [192.168.0.15] (roo49-3-88-173-49-87.fbx.proxad.net [88.173.49.87]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 0AB71140000B3; Wed, 8 Oct 2014 14:25:39 +0200 (CEST)
Content-Type: text/plain; charset="windows-1252"
Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\))
From: Pierre Pfister <pierre.pfister@darou.fr>
In-Reply-To: <54352A62.2040605@gmail.com>
Date: Wed, 08 Oct 2014 14:25:42 +0200
Content-Transfer-Encoding: quoted-printable
Message-Id: <4BCB9E4C-31F2-4769-A994-32F58490BD2B@darou.fr>
References: <A0C73AEC-6D0F-498B-9BDD-D6AF91202CCB@darou.fr> <54350D62.5050706@gmail.com> <048F40EB-A1D5-4D70-986B-9DDE55FF7C22@darou.fr> <543526D9.2020107@gmail.com> <54352A62.2040605@gmail.com>
To: Alexandru Petrescu <alexandru.petrescu@gmail.com>
X-Mailer: Apple Mail (2.1878.6)
X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Wed Oct 8 14:25:40 2014 +0200 (CEST))
Archived-At: http://mailarchive.ietf.org/arch/msg/homenet/FC_y8673n69enxtYNEWZ67LEltY
Cc: homenet@ietf.org
Subject: Re: [homenet] on prefix comparison
X-BeenThere: homenet@ietf.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: <homenet.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/homenet>, <mailto:homenet-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/homenet/>
List-Post: <mailto:homenet@ietf.org>
List-Help: <mailto:homenet-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/homenet>, <mailto:homenet-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 08 Oct 2014 12:25:45 -0000

A prefix can only contain another prefix if its prefix length is smaller.

Here is some C-code that provides what you are looking for.

Cheers,

- Pierre


/* Tell whether a prefix contains an address */
uint8_t prefix_contains(const struct in6_addr *p, uint8_t plen, const struct in6_addr *addr)
{
	int blen = plen >> 3;
	if(blen && memcmp(p, addr, blen))
		return 0;

	int rem = plen & 0x07;
	if(rem && ((p->s6_addr[blen] ^ addr->s6_addr[blen]) >> (8 - rem)))
		return 0;

	return 1;
}

/* Tell whether a prefix contains another prefix */
uint8_t prefix_include(const struct in6_addr *p1, uint8_t plen1, const struct in6_addr *p2, uint8_t plen2)
{
	if(plen1 > plen2)
		return 0;
	
	return prefix_contains(p1, plen1, p2);
}

/* Tell whether two prefixes are colliding */
uint8_t prefix_collision(const struct in6_addr *p1, uint8_t plen1, const struct in6_addr *p2, uint8_t plen2)
{
	return prefix_include(p1, plen1, p2, plen2) || prefix_include(p2, plen2, p1, plen1);
}


Le 8 oct. 2014 à 14:13, Alexandru Petrescu <alexandru.petrescu@gmail.com> a écrit :

> Pierre, just a small doubt, but I agree with you in general.
> 
> Le 08/10/2014 13:58, Alexandru Petrescu a écrit :
> [...]
>>> Equality is never considered alone. Actually, most of the time, you
>>> will find considerations such as: The prefix is not included or does
>>> not include any other Assigned Prefix with a higher precedence.
> 
> It is hard to say whether a prefix is included into another or not.  We do not have a published algorithm to say what it means for a prefix to include another.
> 
> In general, we have a common understanding (and not published algorithm) about what it means 'longest prefix match'.  But that compares an address to a prefix, not a prefix to a prefix.
> 
> Sure, one could assume that an address is just a /128 prefix and execute longest prefix match with it as if it were an address.
> 
> But then again which prefix has the role of the address and which is the role of the prefix?  In other words, when hearing two prefixes on a link and want to compare them, which of them should be compared against the other by using the longest-prefix match?  There are two possibilities and two different outputs for a particular tuple of prefixes, depending on the order of this longest prefix match.
> 
> Of course, I do not mention the easy case which compares two prefixes of precisely same length.
> 
> Just because the length is different may make think that the prefixes are different.  Or otherwise one could be aggregated into another.  But there are several types of aggregation: matching up to the shortest length, matching up to middle, up to longest length, beyond the longest length.
> 
> These cases are not documented and people may implement them in many different ways with different outputs when trying to tell whether this or that prefix are equal or included into one another.
> 
> Alex
> 
>