Added ipa_absolutize() which converts link-scope addresses to global scope
ones according to prefix assigned to the corresponding interface.
This commit is contained in:
parent
69a20d2eff
commit
cfa6ab0593
2 changed files with 13 additions and 0 deletions
11
lib/ipv6.c
11
lib/ipv6.c
|
@ -322,6 +322,17 @@ ip_pton(char *a, ip_addr *o)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ipv6_absolutize(ip_addr *a, ip_addr *ifa)
|
||||||
|
{
|
||||||
|
if ((a->addr[0] & 0xffc00000) == 0xfe800000 && /* a is link-scope */
|
||||||
|
((ifa->addr[0] & 0xe0000000) == 0x20000000 | /* ifa is AGU ... */
|
||||||
|
(ifa->addr[0] & 0xffc00000) == 0xfec00000)) /* ... or site-scope */
|
||||||
|
{
|
||||||
|
a->addr[0] = ifa->addr[0]; /* Copy the prefix, leave interface ID */
|
||||||
|
a->addr[1] = ifa->addr[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef TEST
|
#ifdef TEST
|
||||||
|
|
||||||
#include "bitops.c"
|
#include "bitops.c"
|
||||||
|
|
|
@ -55,6 +55,7 @@ typedef struct ipv6_addr {
|
||||||
/* ipa_from_u32 and ipa_to_u32 replaced by ipa_build */
|
/* ipa_from_u32 and ipa_to_u32 replaced by ipa_build */
|
||||||
#define ipa_build(a,b,c,d) _MI(a,b,c,d)
|
#define ipa_build(a,b,c,d) _MI(a,b,c,d)
|
||||||
#define ipa_compare(x,y) ipv6_compare(x,y)
|
#define ipa_compare(x,y) ipv6_compare(x,y)
|
||||||
|
#define ipa_absolutize(x,y) ipv6_absolutize(x,y)
|
||||||
|
|
||||||
ip_addr ipv6_mkmask(unsigned);
|
ip_addr ipv6_mkmask(unsigned);
|
||||||
unsigned ipv6_mklen(ip_addr *);
|
unsigned ipv6_mklen(ip_addr *);
|
||||||
|
@ -63,6 +64,7 @@ void ipv6_hton(ip_addr *);
|
||||||
void ipv6_ntoh(ip_addr *);
|
void ipv6_ntoh(ip_addr *);
|
||||||
int ipv6_compare(ip_addr, ip_addr);
|
int ipv6_compare(ip_addr, ip_addr);
|
||||||
int ipv4_pton_u32(char *, u32 *);
|
int ipv4_pton_u32(char *, u32 *);
|
||||||
|
void ipv6_absolutize(ip_addr *, ip_addr *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This hash function looks well, but once IPv6 enters
|
* This hash function looks well, but once IPv6 enters
|
||||||
|
|
Loading…
Reference in a new issue