]>
git.ipfire.org Git - thirdparty/bird.git/blob - lib/net.c
6 const u16 net_addr_length
[] = {
7 [NET_IP4
] = sizeof(net_addr_ip4
),
8 [NET_IP6
] = sizeof(net_addr_ip6
),
9 [NET_VPN4
] = sizeof(net_addr_vpn4
),
10 [NET_VPN6
] = sizeof(net_addr_vpn6
)
14 net_format(const net_addr
*N
, char *buf
, int buflen
)
16 net_addr_union
*n
= (void *) N
;
18 /* FIXME: quick hack */
22 return bsnprintf(buf
, buflen
, "%I/%d", n
->ip4
.prefix
, n
->ip4
.pxlen
);
24 return bsnprintf(buf
, buflen
, "%I/%d", n
->ip6
.prefix
, n
->ip6
.pxlen
);
26 return bsnprintf(buf
, buflen
, "%u:%u %I/%d", (u32
) (n
->vpn4
.rd
>> 32), (u32
) n
->vpn4
.rd
, n
->vpn4
.prefix
, n
->vpn4
.pxlen
);
28 return bsnprintf(buf
, buflen
, "%u:%u %I/%d", (u32
) (n
->vpn6
.rd
>> 32), (u32
) n
->vpn6
.rd
, n
->vpn6
.prefix
, n
->vpn6
.pxlen
);
36 net_pxmask(const net_addr
*a
)
42 return ipa_from_ip4(ip4_mkmask(net4_pxlen(a
)));
46 return ipa_from_ip6(ip6_mkmask(net6_pxlen(a
)));
54 static inline int net_validate_ip4(const net_addr_ip4
*n
)
56 return (n
->pxlen
<= IP4_MAX_PREFIX_LENGTH
) &&
57 ip4_zero(ip4_and(n
->prefix
, ip4_not(ip4_mkmask(n
->pxlen
))));
60 static inline int net_validate_ip6(const net_addr_ip6
*n
)
62 return (n
->pxlen
<= IP6_MAX_PREFIX_LENGTH
) &&
63 ip6_zero(ip6_and(n
->prefix
, ip6_not(ip6_mkmask(n
->pxlen
))));
67 net_validate(const net_addr
*N
)
73 return net_validate_ip4((net_addr_ip4
*) N
);
77 return net_validate_ip6((net_addr_ip6
*) N
);
85 net_classify(const net_addr
*N
)
87 net_addr_union
*n
= (void *) N
;
93 return ip4_zero(n
->ip4
.prefix
) ? (IADDR_HOST
| SCOPE_UNIVERSE
) : ip4_classify(n
->ip4
.prefix
);
97 return ip6_zero(n
->ip6
.prefix
) ? (IADDR_HOST
| SCOPE_UNIVERSE
) : ip6_classify(&n
->ip6
.prefix
);