Annotation of embedaddon/quagga/lib/prefix.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Prefix structure.
! 3: * Copyright (C) 1998 Kunihiro Ishiguro
! 4: *
! 5: * This file is part of GNU Zebra.
! 6: *
! 7: * GNU Zebra is free software; you can redistribute it and/or modify it
! 8: * under the terms of the GNU General Public License as published by the
! 9: * Free Software Foundation; either version 2, or (at your option) any
! 10: * later version.
! 11: *
! 12: * GNU Zebra is distributed in the hope that it will be useful, but
! 13: * WITHOUT ANY WARRANTY; without even the implied warranty of
! 14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 15: * General Public License for more details.
! 16: *
! 17: * You should have received a copy of the GNU General Public License
! 18: * along with GNU Zebra; see the file COPYING. If not, write to the Free
! 19: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 20: * 02111-1307, USA.
! 21: */
! 22:
! 23: #ifndef _ZEBRA_PREFIX_H
! 24: #define _ZEBRA_PREFIX_H
! 25:
! 26: #include "sockunion.h"
! 27:
! 28: /*
! 29: * A struct prefix contains an address family, a prefix length, and an
! 30: * address. This can represent either a 'network prefix' as defined
! 31: * by CIDR, where the 'host bits' of the prefix are 0
! 32: * (e.g. AF_INET:10.0.0.0/8), or an address and netmask
! 33: * (e.g. AF_INET:10.0.0.9/8), such as might be configured on an
! 34: * interface.
! 35: */
! 36:
! 37: /* IPv4 and IPv6 unified prefix structure. */
! 38: struct prefix
! 39: {
! 40: u_char family;
! 41: u_char prefixlen;
! 42: union
! 43: {
! 44: u_char prefix;
! 45: struct in_addr prefix4;
! 46: #ifdef HAVE_IPV6
! 47: struct in6_addr prefix6;
! 48: #endif /* HAVE_IPV6 */
! 49: struct
! 50: {
! 51: struct in_addr id;
! 52: struct in_addr adv_router;
! 53: } lp;
! 54: u_char val[8];
! 55: } u __attribute__ ((aligned (8)));
! 56: };
! 57:
! 58: /* IPv4 prefix structure. */
! 59: struct prefix_ipv4
! 60: {
! 61: u_char family;
! 62: u_char prefixlen;
! 63: struct in_addr prefix __attribute__ ((aligned (8)));
! 64: };
! 65:
! 66: /* IPv6 prefix structure. */
! 67: #ifdef HAVE_IPV6
! 68: struct prefix_ipv6
! 69: {
! 70: u_char family;
! 71: u_char prefixlen;
! 72: struct in6_addr prefix __attribute__ ((aligned (8)));
! 73: };
! 74: #endif /* HAVE_IPV6 */
! 75:
! 76: struct prefix_ls
! 77: {
! 78: u_char family;
! 79: u_char prefixlen;
! 80: struct in_addr id __attribute__ ((aligned (8)));
! 81: struct in_addr adv_router;
! 82: };
! 83:
! 84: /* Prefix for routing distinguisher. */
! 85: struct prefix_rd
! 86: {
! 87: u_char family;
! 88: u_char prefixlen;
! 89: u_char val[8] __attribute__ ((aligned (8)));
! 90: };
! 91:
! 92: #ifndef INET_ADDRSTRLEN
! 93: #define INET_ADDRSTRLEN 16
! 94: #endif /* INET_ADDRSTRLEN */
! 95:
! 96: #ifndef INET6_ADDRSTRLEN
! 97: #define INET6_ADDRSTRLEN 46
! 98: #endif /* INET6_ADDRSTRLEN */
! 99:
! 100: #ifndef INET6_BUFSIZ
! 101: #define INET6_BUFSIZ 51
! 102: #endif /* INET6_BUFSIZ */
! 103:
! 104: /* Max bit/byte length of IPv4 address. */
! 105: #define IPV4_MAX_BYTELEN 4
! 106: #define IPV4_MAX_BITLEN 32
! 107: #define IPV4_MAX_PREFIXLEN 32
! 108: #define IPV4_ADDR_CMP(D,S) memcmp ((D), (S), IPV4_MAX_BYTELEN)
! 109: #define IPV4_ADDR_SAME(D,S) (memcmp ((D), (S), IPV4_MAX_BYTELEN) == 0)
! 110: #define IPV4_ADDR_COPY(D,S) memcpy ((D), (S), IPV4_MAX_BYTELEN)
! 111:
! 112: #define IPV4_NET0(a) ((((u_int32_t) (a)) & 0xff000000) == 0x00000000)
! 113: #define IPV4_NET127(a) ((((u_int32_t) (a)) & 0xff000000) == 0x7f000000)
! 114: #define IPV4_LINKLOCAL(a) ((((u_int32_t) (a)) & 0xffff0000) == 0xa9fe0000)
! 115:
! 116: /* Max bit/byte length of IPv6 address. */
! 117: #define IPV6_MAX_BYTELEN 16
! 118: #define IPV6_MAX_BITLEN 128
! 119: #define IPV6_MAX_PREFIXLEN 128
! 120: #define IPV6_ADDR_CMP(D,S) memcmp ((D), (S), IPV6_MAX_BYTELEN)
! 121: #define IPV6_ADDR_SAME(D,S) (memcmp ((D), (S), IPV6_MAX_BYTELEN) == 0)
! 122: #define IPV6_ADDR_COPY(D,S) memcpy ((D), (S), IPV6_MAX_BYTELEN)
! 123:
! 124: /* Count prefix size from mask length */
! 125: #define PSIZE(a) (((a) + 7) / (8))
! 126:
! 127: /* Prefix's family member. */
! 128: #define PREFIX_FAMILY(p) ((p)->family)
! 129:
! 130: /* Check bit of the prefix. */
! 131: static inline unsigned int
! 132: prefix_bit (const u_char *prefix, const u_char prefixlen)
! 133: {
! 134: unsigned int offset = prefixlen / 8;
! 135: unsigned int shift = 7 - (prefixlen % 8);
! 136:
! 137: return (prefix[offset] >> shift) & 1;
! 138: }
! 139:
! 140: static inline unsigned int
! 141: prefix6_bit (const struct in6_addr *prefix, const u_char prefixlen)
! 142: {
! 143: return prefix_bit((const u_char *) &prefix->s6_addr, prefixlen);
! 144: }
! 145:
! 146: /* Prototypes. */
! 147: extern int afi2family (afi_t);
! 148: extern afi_t family2afi (int);
! 149:
! 150: extern struct prefix *prefix_new (void);
! 151: extern void prefix_free (struct prefix *);
! 152: extern const char *prefix_family_str (const struct prefix *);
! 153: extern int prefix_blen (const struct prefix *);
! 154: extern int str2prefix (const char *, struct prefix *);
! 155: extern int prefix2str (const struct prefix *, char *, int);
! 156: extern int prefix_match (const struct prefix *, const struct prefix *);
! 157: extern int prefix_same (const struct prefix *, const struct prefix *);
! 158: extern int prefix_cmp (const struct prefix *, const struct prefix *);
! 159: extern void prefix_copy (struct prefix *dest, const struct prefix *src);
! 160: extern void apply_mask (struct prefix *);
! 161:
! 162: extern struct prefix *sockunion2prefix (const union sockunion *dest,
! 163: const union sockunion *mask);
! 164: extern struct prefix *sockunion2hostprefix (const union sockunion *);
! 165:
! 166: extern struct prefix_ipv4 *prefix_ipv4_new (void);
! 167: extern void prefix_ipv4_free (struct prefix_ipv4 *);
! 168: extern int str2prefix_ipv4 (const char *, struct prefix_ipv4 *);
! 169: extern void apply_mask_ipv4 (struct prefix_ipv4 *);
! 170:
! 171: #define PREFIX_COPY_IPV4(DST, SRC) \
! 172: *((struct prefix_ipv4 *)(DST)) = *((const struct prefix_ipv4 *)(SRC));
! 173:
! 174: extern int prefix_ipv4_any (const struct prefix_ipv4 *);
! 175: extern void apply_classful_mask_ipv4 (struct prefix_ipv4 *);
! 176:
! 177: extern u_char ip_masklen (struct in_addr);
! 178: extern void masklen2ip (int, struct in_addr *);
! 179: /* returns the network portion of the host address */
! 180: extern in_addr_t ipv4_network_addr (in_addr_t hostaddr, int masklen);
! 181: /* given the address of a host on a network and the network mask length,
! 182: * calculate the broadcast address for that network;
! 183: * special treatment for /31: returns the address of the other host
! 184: * on the network by flipping the host bit */
! 185: extern in_addr_t ipv4_broadcast_addr (in_addr_t hostaddr, int masklen);
! 186:
! 187: extern int netmask_str2prefix_str (const char *, const char *, char *);
! 188:
! 189: #ifdef HAVE_IPV6
! 190: extern struct prefix_ipv6 *prefix_ipv6_new (void);
! 191: extern void prefix_ipv6_free (struct prefix_ipv6 *);
! 192: extern int str2prefix_ipv6 (const char *, struct prefix_ipv6 *);
! 193: extern void apply_mask_ipv6 (struct prefix_ipv6 *);
! 194:
! 195: #define PREFIX_COPY_IPV6(DST, SRC) \
! 196: *((struct prefix_ipv6 *)(DST)) = *((const struct prefix_ipv6 *)(SRC));
! 197:
! 198: extern int ip6_masklen (struct in6_addr);
! 199: extern void masklen2ip6 (int, struct in6_addr *);
! 200:
! 201: extern void str2in6_addr (const char *, struct in6_addr *);
! 202: extern const char *inet6_ntoa (struct in6_addr);
! 203:
! 204: #endif /* HAVE_IPV6 */
! 205:
! 206: extern int all_digit (const char *);
! 207:
! 208: #endif /* _ZEBRA_PREFIX_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>