Annotation of embedaddon/quagga/bgpd/bgp_attr.h, revision 1.1

1.1     ! misho       1: /* BGP attributes. 
        !             2:    Copyright (C) 1996, 97, 98 Kunihiro Ishiguro
        !             3: 
        !             4: This file is part of GNU Zebra.
        !             5: 
        !             6: GNU Zebra is free software; you can redistribute it and/or modify it
        !             7: under the terms of the GNU General Public License as published by the
        !             8: Free Software Foundation; either version 2, or (at your option) any
        !             9: later version.
        !            10: 
        !            11: GNU Zebra is distributed in the hope that it will be useful, but
        !            12: WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            14: General Public License for more details.
        !            15: 
        !            16: You should have received a copy of the GNU General Public License
        !            17: along with GNU Zebra; see the file COPYING.  If not, write to the Free
        !            18: Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
        !            19: 02111-1307, USA.  */
        !            20: 
        !            21: #ifndef _QUAGGA_BGP_ATTR_H
        !            22: #define _QUAGGA_BGP_ATTR_H
        !            23: 
        !            24: /* Simple bit mapping. */
        !            25: #define BITMAP_NBBY 8
        !            26: 
        !            27: #define SET_BITMAP(MAP, NUM) \
        !            28:         SET_FLAG (MAP[(NUM) / BITMAP_NBBY], 1 << ((NUM) % BITMAP_NBBY))
        !            29: 
        !            30: #define CHECK_BITMAP(MAP, NUM) \
        !            31:         CHECK_FLAG (MAP[(NUM) / BITMAP_NBBY], 1 << ((NUM) % BITMAP_NBBY))
        !            32: 
        !            33: #define BGP_MED_MAX UINT32_MAX
        !            34: 
        !            35: 
        !            36: /* BGP Attribute type range. */
        !            37: #define BGP_ATTR_TYPE_RANGE     256
        !            38: #define BGP_ATTR_BITMAP_SIZE    (BGP_ATTR_TYPE_RANGE / BITMAP_NBBY)
        !            39: 
        !            40: /* BGP Attribute flags. */
        !            41: #define BGP_ATTR_FLAG_OPTIONAL  0x80   /* Attribute is optional. */
        !            42: #define BGP_ATTR_FLAG_TRANS     0x40   /* Attribute is transitive. */
        !            43: #define BGP_ATTR_FLAG_PARTIAL   0x20   /* Attribute is partial. */
        !            44: #define BGP_ATTR_FLAG_EXTLEN    0x10   /* Extended length flag. */
        !            45: 
        !            46: /* BGP attribute header must bigger than 2. */
        !            47: #define BGP_ATTR_MIN_LEN        3       /* Attribute flag, type length. */
        !            48: #define BGP_ATTR_DEFAULT_WEIGHT 32768
        !            49: 
        !            50: /* Additional/uncommon BGP attributes.
        !            51:  * lazily allocated as and when a struct attr
        !            52:  * requires it.
        !            53:  */
        !            54: struct attr_extra
        !            55: {
        !            56:   /* Multi-Protocol Nexthop, AFI IPv6 */
        !            57: #ifdef HAVE_IPV6
        !            58:   struct in6_addr mp_nexthop_global;
        !            59:   struct in6_addr mp_nexthop_local;
        !            60: #endif /* HAVE_IPV6 */
        !            61: 
        !            62:   /* Extended Communities attribute. */
        !            63:   struct ecommunity *ecommunity;
        !            64:   
        !            65:   /* Route-Reflector Cluster attribute */
        !            66:   struct cluster_list *cluster;
        !            67:   
        !            68:   /* Unknown transitive attribute. */
        !            69:   struct transit *transit;
        !            70: 
        !            71:   struct in_addr mp_nexthop_global_in;
        !            72:   struct in_addr mp_nexthop_local_in;
        !            73:   
        !            74:   /* Aggregator Router ID attribute */
        !            75:   struct in_addr aggregator_addr;
        !            76:   
        !            77:   /* Route Reflector Originator attribute */
        !            78:   struct in_addr originator_id;
        !            79:   
        !            80:   /* Local weight, not actually an attribute */
        !            81:   u_int32_t weight;
        !            82:   
        !            83:   /* Aggregator ASN */
        !            84:   as_t aggregator_as;
        !            85:   
        !            86:   /* MP Nexthop length */
        !            87:   u_char mp_nexthop_len;
        !            88: };
        !            89: 
        !            90: /* BGP core attribute structure. */
        !            91: struct attr
        !            92: {
        !            93:   /* AS Path structure */
        !            94:   struct aspath *aspath;
        !            95: 
        !            96:   /* Community structure */
        !            97:   struct community *community; 
        !            98:   
        !            99:   /* Lazily allocated pointer to extra attributes */
        !           100:   struct attr_extra *extra;
        !           101:   
        !           102:   /* Reference count of this attribute. */
        !           103:   unsigned long refcnt;
        !           104: 
        !           105:   /* Flag of attribute is set or not. */
        !           106:   u_int32_t flag;
        !           107:   
        !           108:   /* Apart from in6_addr, the remaining static attributes */
        !           109:   struct in_addr nexthop;
        !           110:   u_int32_t med;
        !           111:   u_int32_t local_pref;
        !           112:   
        !           113:   /* Path origin attribute */
        !           114:   u_char origin;
        !           115: };
        !           116: 
        !           117: /* Router Reflector related structure. */
        !           118: struct cluster_list
        !           119: {
        !           120:   unsigned long refcnt;
        !           121:   int length;
        !           122:   struct in_addr *list;
        !           123: };
        !           124: 
        !           125: /* Unknown transit attribute. */
        !           126: struct transit
        !           127: {
        !           128:   unsigned long refcnt;
        !           129:   int length;
        !           130:   u_char *val;
        !           131: };
        !           132: 
        !           133: #define ATTR_FLAG_BIT(X)  (1 << ((X) - 1))
        !           134: 
        !           135: typedef enum {
        !           136:  BGP_ATTR_PARSE_PROCEED = 0,
        !           137:  BGP_ATTR_PARSE_ERROR = -1,
        !           138:  BGP_ATTR_PARSE_WITHDRAW = -2,
        !           139: } bgp_attr_parse_ret_t;
        !           140: 
        !           141: /* Prototypes. */
        !           142: extern void bgp_attr_init (void);
        !           143: extern void bgp_attr_finish (void);
        !           144: extern bgp_attr_parse_ret_t bgp_attr_parse (struct peer *, struct attr *,
        !           145:                                            bgp_size_t, struct bgp_nlri *,
        !           146:                                            struct bgp_nlri *);
        !           147: extern int bgp_attr_check (struct peer *, struct attr *);
        !           148: extern struct attr_extra *bgp_attr_extra_get (struct attr *);
        !           149: extern void bgp_attr_extra_free (struct attr *);
        !           150: extern void bgp_attr_dup (struct attr *, struct attr *);
        !           151: extern struct attr *bgp_attr_intern (struct attr *attr);
        !           152: extern void bgp_attr_unintern_sub (struct attr *);
        !           153: extern void bgp_attr_unintern (struct attr **);
        !           154: extern void bgp_attr_flush (struct attr *);
        !           155: extern struct attr *bgp_attr_default_set (struct attr *attr, u_char);
        !           156: extern struct attr *bgp_attr_default_intern (u_char);
        !           157: extern struct attr *bgp_attr_aggregate_intern (struct bgp *, u_char,
        !           158:                                         struct aspath *, 
        !           159:                                         struct community *, int as_set);
        !           160: extern bgp_size_t bgp_packet_attribute (struct bgp *bgp, struct peer *, 
        !           161:                                  struct stream *, struct attr *, 
        !           162:                                  struct prefix *, afi_t, safi_t, 
        !           163:                                  struct peer *, struct prefix_rd *, u_char *);
        !           164: extern bgp_size_t bgp_packet_withdraw (struct peer *peer, struct stream *s, 
        !           165:                                 struct prefix *p, afi_t, safi_t, 
        !           166:                                 struct prefix_rd *, u_char *);
        !           167: extern void bgp_dump_routes_attr (struct stream *, struct attr *,
        !           168:                                  struct prefix *);
        !           169: extern int attrhash_cmp (const void *, const void *);
        !           170: extern unsigned int attrhash_key_make (void *);
        !           171: extern void attr_show_all (struct vty *);
        !           172: extern unsigned long int attr_count (void);
        !           173: extern unsigned long int attr_unknown_count (void);
        !           174: 
        !           175: /* Cluster list prototypes. */
        !           176: extern int cluster_loop_check (struct cluster_list *, struct in_addr);
        !           177: extern void cluster_unintern (struct cluster_list *);
        !           178: 
        !           179: /* Transit attribute prototypes. */
        !           180: void transit_unintern (struct transit *);
        !           181: 
        !           182: /* Exported for unit-test purposes only */
        !           183: extern int bgp_mp_reach_parse (struct peer *, bgp_size_t, struct attr *,
        !           184:                               struct bgp_nlri *);
        !           185: extern int bgp_mp_unreach_parse (struct peer *, bgp_size_t, struct bgp_nlri *);
        !           186: 
        !           187: #endif /* _QUAGGA_BGP_ATTR_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>