mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-06-13 22:18:29 +02:00
libnm-glib-aux: add nm_ip6_addr_rfc6724_label()
This commit is contained in:
parent
1589346de4
commit
7f2745f3b1
2 changed files with 66 additions and 0 deletions
|
|
@ -189,6 +189,70 @@ nm_ip6_addr_common_prefix_len(const struct in6_addr *a, const struct in6_addr *b
|
|||
return 128;
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_ip6_addr_rfc6724_label:
|
||||
* @addr: an IPv6 address
|
||||
*
|
||||
* Returns the label for @addr from the default policy table defined
|
||||
* in RFC 6724, Section 2.1:
|
||||
*
|
||||
* Prefix Precedence Label
|
||||
* ::1/128 50 0
|
||||
* ::/0 40 1
|
||||
* ::ffff:0:0/96 35 4
|
||||
* 2002::/16 30 2
|
||||
* 2001::/32 5 5
|
||||
* fc00::/7 3 13
|
||||
* ::/96 1 3
|
||||
* fec0::/10 1 11
|
||||
* 3ffe::/16 1 12
|
||||
*
|
||||
* Returns: the label value (0-13). It can be used in the Source
|
||||
* Address Selection algorithm to prefer a source whose label
|
||||
* matches with the label of the destination.
|
||||
*/
|
||||
guint
|
||||
nm_ip6_addr_rfc6724_label(const struct in6_addr *addr)
|
||||
{
|
||||
/* Checked from most-specific to least-specific prefix length. */
|
||||
|
||||
/* ::1/128 (loopback) */
|
||||
if (IN6_IS_ADDR_LOOPBACK(addr))
|
||||
return 0;
|
||||
|
||||
/* ::ffff:0:0/96 (IPv4-mapped) */
|
||||
if (IN6_IS_ADDR_V4MAPPED(addr))
|
||||
return 4;
|
||||
|
||||
/* ::/96 (IPv4-compatible, deprecated) */
|
||||
if (addr->s6_addr32[0] == 0 && addr->s6_addr32[1] == 0 && addr->s6_addr32[2] == 0
|
||||
&& !IN6_IS_ADDR_UNSPECIFIED(addr))
|
||||
return 3;
|
||||
|
||||
/* 2001::/32 (Teredo) */
|
||||
if (addr->s6_addr32[0] == htonl(0x20010000u))
|
||||
return 5;
|
||||
|
||||
/* 2002::/16 (6to4) */
|
||||
if ((addr->s6_addr32[0] & htonl(0xFFFF0000u)) == htonl(0x20020000u))
|
||||
return 2;
|
||||
|
||||
/* 3ffe::/16 (deprecated 6bone) */
|
||||
if ((addr->s6_addr32[0] & htonl(0xFFFF0000u)) == htonl(0x3FFE0000u))
|
||||
return 12;
|
||||
|
||||
/* fec0::/10 (deprecated site-local) */
|
||||
if ((addr->s6_addr32[0] & htonl(0xFFC00000u)) == htonl(0xFEC00000u))
|
||||
return 11;
|
||||
|
||||
/* fc00::/7 (ULA) */
|
||||
if (nm_ip6_addr_is_ula(addr))
|
||||
return 13;
|
||||
|
||||
/* ::/0 (default) */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
gconstpointer
|
||||
|
|
|
|||
|
|
@ -282,6 +282,8 @@ gboolean nm_ip6_addr_is_ula(const struct in6_addr *address);
|
|||
|
||||
guint nm_ip6_addr_common_prefix_len(const struct in6_addr *a, const struct in6_addr *b);
|
||||
|
||||
guint nm_ip6_addr_rfc6724_label(const struct in6_addr *addr);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define NM_IPV4LL_NETWORK ((in_addr_t) htonl(0xA9FE0000lu)) /* 169.254.0.0 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue