diff options
Diffstat (limited to 'lib/prefix.h')
| -rw-r--r-- | lib/prefix.h | 309 |
1 files changed, 149 insertions, 160 deletions
diff --git a/lib/prefix.h b/lib/prefix.h index 549798e92e..ce13dcfa0a 100644 --- a/lib/prefix.h +++ b/lib/prefix.h @@ -23,13 +23,13 @@ #define _ZEBRA_PREFIX_H #ifdef SUNOS_5 -# include <sys/ethernet.h> +#include <sys/ethernet.h> #else -# ifdef GNU_LINUX -# include <net/ethernet.h> -# else -# include <netinet/if_ether.h> -# endif +#ifdef GNU_LINUX +#include <net/ethernet.h> +#else +#include <netinet/if_ether.h> +#endif #endif #include "sockunion.h" #include "ipaddr.h" @@ -48,11 +48,11 @@ * own to simplify internal handling */ struct ethaddr { - u_char octet[ETHER_ADDR_LEN]; -} __attribute__ ((packed)); + u_char octet[ETHER_ADDR_LEN]; +} __attribute__((packed)); -/* length is the number of valuable bits of prefix structure +/* length is the number of valuable bits of prefix structure * 18 bytes is current length in structure, if address is ipv4 * 30 bytes is in case of ipv6 */ @@ -60,13 +60,12 @@ struct ethaddr { #define PREFIX_LEN_ROUTE_TYPE_5_IPV6 (30*8) /* EVPN address (RFC 7432) */ -struct evpn_addr -{ - u_char route_type; - u_char ip_prefix_length; - struct ethaddr mac; - uint32_t eth_tag; - struct ipaddr ip; +struct evpn_addr { + u_char route_type; + u_char ip_prefix_length; + struct ethaddr mac; + uint32_t eth_tag; + struct ipaddr ip; #if 0 union { @@ -100,89 +99,78 @@ struct evpn_addr #endif /* IPv4 and IPv6 unified prefix structure. */ -struct prefix -{ - u_char family; - u_char prefixlen; - union - { - u_char prefix; - struct in_addr prefix4; - struct in6_addr prefix6; - struct - { - struct in_addr id; - struct in_addr adv_router; - } lp; - struct ethaddr prefix_eth; /* AF_ETHERNET */ - u_char val[8]; - uintptr_t ptr; - struct evpn_addr prefix_evpn; - } u __attribute__ ((aligned (8))); +struct prefix { + u_char family; + u_char prefixlen; + union { + u_char prefix; + struct in_addr prefix4; + struct in6_addr prefix6; + struct { + struct in_addr id; + struct in_addr adv_router; + } lp; + struct ethaddr prefix_eth; /* AF_ETHERNET */ + u_char val[8]; + uintptr_t ptr; + struct evpn_addr prefix_evpn; + } u __attribute__((aligned(8))); }; /* IPv4 prefix structure. */ -struct prefix_ipv4 -{ - u_char family; - u_char prefixlen; - struct in_addr prefix __attribute__ ((aligned (8))); +struct prefix_ipv4 { + u_char family; + u_char prefixlen; + struct in_addr prefix __attribute__((aligned(8))); }; /* IPv6 prefix structure. */ -struct prefix_ipv6 -{ - u_char family; - u_char prefixlen; - struct in6_addr prefix __attribute__ ((aligned (8))); +struct prefix_ipv6 { + u_char family; + u_char prefixlen; + struct in6_addr prefix __attribute__((aligned(8))); }; -struct prefix_ls -{ - u_char family; - u_char prefixlen; - struct in_addr id __attribute__ ((aligned (8))); - struct in_addr adv_router; +struct prefix_ls { + u_char family; + u_char prefixlen; + struct in_addr id __attribute__((aligned(8))); + struct in_addr adv_router; }; /* Prefix for routing distinguisher. */ -struct prefix_rd -{ - u_char family; - u_char prefixlen; - u_char val[8] __attribute__ ((aligned (8))); +struct prefix_rd { + u_char family; + u_char prefixlen; + u_char val[8] __attribute__((aligned(8))); }; /* Prefix for ethernet. */ -struct prefix_eth -{ - u_char family; - u_char prefixlen; - struct ethaddr eth_addr __attribute__ ((aligned (8))); /* AF_ETHERNET */ +struct prefix_eth { + u_char family; + u_char prefixlen; + struct ethaddr eth_addr __attribute__((aligned(8))); /* AF_ETHERNET */ }; /* EVPN prefix structure. */ -struct prefix_evpn -{ - u_char family; - u_char prefixlen; - struct evpn_addr prefix __attribute__ ((aligned (8))); +struct prefix_evpn { + u_char family; + u_char prefixlen; + struct evpn_addr prefix __attribute__((aligned(8))); }; /* Prefix for a generic pointer */ -struct prefix_ptr -{ - u_char family; - u_char prefixlen; - uintptr_t prefix __attribute__ ((aligned (8))); +struct prefix_ptr { + u_char family; + u_char prefixlen; + uintptr_t prefix __attribute__((aligned(8))); }; -struct prefix_sg -{ - u_char family; - u_char prefixlen; - struct in_addr src __attribute__ ((aligned (8))); - struct in_addr grp; +struct prefix_sg { + u_char family; + u_char prefixlen; + struct in_addr src __attribute__((aligned(8))); + struct in_addr grp; }; /* helper to get type safety/avoid casts on calls @@ -190,21 +178,19 @@ struct prefix_sg * side, which strips type safety since the cast will accept any pointer * type.) */ -union prefixptr -{ - struct prefix *p; - struct prefix_ipv4 *p4; - struct prefix_ipv6 *p6; - struct prefix_evpn *evp; -} __attribute__ ((transparent_union)); - -union prefixconstptr -{ - const struct prefix *p; - const struct prefix_ipv4 *p4; - const struct prefix_ipv6 *p6; - const struct prefix_evpn *evp; -} __attribute__ ((transparent_union)); +union prefixptr { + struct prefix *p; + struct prefix_ipv4 *p4; + struct prefix_ipv6 *p6; + struct prefix_evpn *evp; +} __attribute__((transparent_union)); + +union prefixconstptr { + const struct prefix *p; + const struct prefix_ipv4 *p4; + const struct prefix_ipv6 *p6; + const struct prefix_evpn *evp; +} __attribute__((transparent_union)); #ifndef INET_ADDRSTRLEN #define INET_ADDRSTRLEN 16 @@ -262,115 +248,118 @@ union prefixconstptr /* Prototypes. */ extern int str2family(const char *); -extern int afi2family (afi_t); -extern afi_t family2afi (int); +extern int afi2family(afi_t); +extern afi_t family2afi(int); extern const char *safi2str(safi_t safi); extern const char *afi2str(afi_t afi); /* Check bit of the prefix. */ -extern unsigned int prefix_bit (const u_char *prefix, const u_char prefixlen); -extern unsigned int prefix6_bit (const struct in6_addr *prefix, const u_char prefixlen); +extern unsigned int prefix_bit(const u_char *prefix, const u_char prefixlen); +extern unsigned int prefix6_bit(const struct in6_addr *prefix, + const u_char prefixlen); -extern struct prefix *prefix_new (void); -extern void prefix_free (struct prefix *); -extern const char *prefix_family_str (const struct prefix *); -extern int prefix_blen (const struct prefix *); -extern int str2prefix (const char *, struct prefix *); +extern struct prefix *prefix_new(void); +extern void prefix_free(struct prefix *); +extern const char *prefix_family_str(const struct prefix *); +extern int prefix_blen(const struct prefix *); +extern int str2prefix(const char *, struct prefix *); #define PREFIX2STR_BUFFER PREFIX_STRLEN -extern const char *prefix2str (union prefixconstptr, char *, int); -extern int prefix_match (const struct prefix *, const struct prefix *); -extern int prefix_match_network_statement (const struct prefix *, const struct prefix *); -extern int prefix_same (const struct prefix *, const struct prefix *); -extern int prefix_cmp (const struct prefix *, const struct prefix *); -extern int prefix_common_bits (const struct prefix *, const struct prefix *); -extern void prefix_copy (struct prefix *dest, const struct prefix *src); -extern void apply_mask (struct prefix *); - -extern struct prefix *sockunion2prefix (const union sockunion *dest, - const union sockunion *mask); -extern struct prefix *sockunion2hostprefix (const union sockunion *, struct prefix *p); -extern void prefix2sockunion (const struct prefix *, union sockunion *); - -extern int str2prefix_eth (const char *, struct prefix_eth *); - -extern struct prefix_ipv4 *prefix_ipv4_new (void); -extern void prefix_ipv4_free (struct prefix_ipv4 *); -extern int str2prefix_ipv4 (const char *, struct prefix_ipv4 *); -extern void apply_mask_ipv4 (struct prefix_ipv4 *); - -#define PREFIX_COPY_IPV4(DST, SRC) \ +extern const char *prefix2str(union prefixconstptr, char *, int); +extern int prefix_match(const struct prefix *, const struct prefix *); +extern int prefix_match_network_statement(const struct prefix *, + const struct prefix *); +extern int prefix_same(const struct prefix *, const struct prefix *); +extern int prefix_cmp(const struct prefix *, const struct prefix *); +extern int prefix_common_bits(const struct prefix *, const struct prefix *); +extern void prefix_copy(struct prefix *dest, const struct prefix *src); +extern void apply_mask(struct prefix *); + +extern struct prefix *sockunion2prefix(const union sockunion *dest, + const union sockunion *mask); +extern struct prefix *sockunion2hostprefix(const union sockunion *, + struct prefix *p); +extern void prefix2sockunion(const struct prefix *, union sockunion *); + +extern int str2prefix_eth(const char *, struct prefix_eth *); + +extern struct prefix_ipv4 *prefix_ipv4_new(void); +extern void prefix_ipv4_free(struct prefix_ipv4 *); +extern int str2prefix_ipv4(const char *, struct prefix_ipv4 *); +extern void apply_mask_ipv4(struct prefix_ipv4 *); + +#define PREFIX_COPY_IPV4(DST, SRC) \ *((struct prefix_ipv4 *)(DST)) = *((const struct prefix_ipv4 *)(SRC)); -extern int prefix_ipv4_any (const struct prefix_ipv4 *); -extern void apply_classful_mask_ipv4 (struct prefix_ipv4 *); +extern int prefix_ipv4_any(const struct prefix_ipv4 *); +extern void apply_classful_mask_ipv4(struct prefix_ipv4 *); -extern u_char ip_masklen (struct in_addr); -extern void masklen2ip (const int, struct in_addr *); +extern u_char ip_masklen(struct in_addr); +extern void masklen2ip(const int, struct in_addr *); /* returns the network portion of the host address */ -extern in_addr_t ipv4_network_addr (in_addr_t hostaddr, int masklen); +extern in_addr_t ipv4_network_addr(in_addr_t hostaddr, int masklen); /* given the address of a host on a network and the network mask length, * calculate the broadcast address for that network; * special treatment for /31: returns the address of the other host * on the network by flipping the host bit */ -extern in_addr_t ipv4_broadcast_addr (in_addr_t hostaddr, int masklen); +extern in_addr_t ipv4_broadcast_addr(in_addr_t hostaddr, int masklen); -extern int netmask_str2prefix_str (const char *, const char *, char *); +extern int netmask_str2prefix_str(const char *, const char *, char *); -extern struct prefix_ipv6 *prefix_ipv6_new (void); -extern void prefix_ipv6_free (struct prefix_ipv6 *); -extern int str2prefix_ipv6 (const char *, struct prefix_ipv6 *); -extern void apply_mask_ipv6 (struct prefix_ipv6 *); +extern struct prefix_ipv6 *prefix_ipv6_new(void); +extern void prefix_ipv6_free(struct prefix_ipv6 *); +extern int str2prefix_ipv6(const char *, struct prefix_ipv6 *); +extern void apply_mask_ipv6(struct prefix_ipv6 *); -#define PREFIX_COPY_IPV6(DST, SRC) \ +#define PREFIX_COPY_IPV6(DST, SRC) \ *((struct prefix_ipv6 *)(DST)) = *((const struct prefix_ipv6 *)(SRC)); -extern int ip6_masklen (struct in6_addr); -extern void masklen2ip6 (const int, struct in6_addr *); +extern int ip6_masklen(struct in6_addr); +extern void masklen2ip6(const int, struct in6_addr *); -extern const char *inet6_ntoa (struct in6_addr); +extern const char *inet6_ntoa(struct in6_addr); extern int prefix_str2mac(const char *str, struct ethaddr *mac); extern char *prefix_mac2str(const struct ethaddr *mac, char *buf, int size); -static inline int ipv6_martian (struct in6_addr *addr) +static inline int ipv6_martian(struct in6_addr *addr) { - struct in6_addr localhost_addr; + struct in6_addr localhost_addr; - inet_pton (AF_INET6, "::1", &localhost_addr); + inet_pton(AF_INET6, "::1", &localhost_addr); - if (IPV6_ADDR_SAME(&localhost_addr, addr)) - return 1; + if (IPV6_ADDR_SAME(&localhost_addr, addr)) + return 1; - return 0; + return 0; } -extern int all_digit (const char *); +extern int all_digit(const char *); /* NOTE: This routine expects the address argument in network byte order. */ -static inline int ipv4_martian (struct in_addr *addr) +static inline int ipv4_martian(struct in_addr *addr) { - in_addr_t ip = ntohl(addr->s_addr); + in_addr_t ip = ntohl(addr->s_addr); - if (IPV4_NET0(ip) || IPV4_NET127(ip) || IPV4_CLASS_DE(ip)) { - return 1; - } - return 0; + if (IPV4_NET0(ip) || IPV4_NET127(ip) || IPV4_CLASS_DE(ip)) { + return 1; + } + return 0; } -static inline int -is_default_prefix (struct prefix *p) +static inline int is_default_prefix(struct prefix *p) { - if (!p) - return 0; + if (!p) + return 0; - if (((p->family == AF_INET) && (p->u.prefix4.s_addr == INADDR_ANY)) - || ((p->family == AF_INET6) && - !memcmp(&p->u.prefix6, &in6addr_any, sizeof (struct in6_addr)))) - return 1; + if (((p->family == AF_INET) && (p->u.prefix4.s_addr == INADDR_ANY)) + || ((p->family == AF_INET6) + && !memcmp(&p->u.prefix6, &in6addr_any, + sizeof(struct in6_addr)))) + return 1; - return 0; + return 0; } #endif /* _ZEBRA_PREFIX_H */ |
