Annotation of embedaddon/bird2/nest/attrs.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *     BIRD Internet Routing Daemon -- Attribute Operations
                      3:  *
                      4:  *     (c) 2000 Martin Mares <mj@ucw.cz>
                      5:  *
                      6:  *     Can be freely distributed and used under the terms of the GNU GPL.
                      7:  */
                      8: 
                      9: #ifndef _BIRD_ATTRS_H_
                     10: #define _BIRD_ATTRS_H_
                     11: 
                     12: #include <stdint.h>
                     13: #include "lib/unaligned.h"
                     14: #include "nest/route.h"
                     15: 
                     16: 
                     17: /* a-path.c */
                     18: 
                     19: #define AS_PATH_SET            1       /* Types of path segments */
                     20: #define AS_PATH_SEQUENCE       2
                     21: #define AS_PATH_CONFED_SEQUENCE        3
                     22: #define AS_PATH_CONFED_SET     4
                     23: 
                     24: #define AS_PATH_MAXLEN         10000
                     25: 
                     26: #define AS_TRANS               23456
                     27: /* AS_TRANS is used when we need to store 32bit ASN larger than 0xFFFF
                     28:  * to 16bit slot (like in 16bit AS_PATH). See RFC 4893 for details
                     29:  */
                     30: 
                     31: struct f_tree;
                     32: 
                     33: int as_path_valid(byte *data, uint len, int bs, int confed, char *err, uint elen);
                     34: int as_path_16to32(byte *dst, const byte *src, uint len);
                     35: int as_path_32to16(byte *dst, const byte *src, uint len);
                     36: int as_path_contains_as4(const struct adata *path);
                     37: int as_path_contains_confed(const struct adata *path);
                     38: struct adata *as_path_strip_confed(struct linpool *pool, const struct adata *op);
                     39: struct adata *as_path_prepend2(struct linpool *pool, const struct adata *op, int seq, u32 as);
                     40: struct adata *as_path_to_old(struct linpool *pool, const struct adata *path);
                     41: struct adata *as_path_cut(struct linpool *pool, const struct adata *path, uint num);
                     42: const struct adata *as_path_merge(struct linpool *pool, const struct adata *p1, const struct adata *p2);
                     43: void as_path_format(const struct adata *path, byte *buf, uint size);
                     44: int as_path_getlen(const struct adata *path);
                     45: int as_path_getlen_int(const struct adata *path, int bs);
                     46: int as_path_get_first(const struct adata *path, u32 *orig_as);
                     47: int as_path_get_first_regular(const struct adata *path, u32 *last_as);
                     48: int as_path_get_last(const struct adata *path, u32 *last_as);
                     49: u32 as_path_get_last_nonaggregated(const struct adata *path);
                     50: int as_path_contains(const struct adata *path, u32 as, int min);
                     51: int as_path_match_set(const struct adata *path, const struct f_tree *set);
                     52: const struct adata *as_path_filter(struct linpool *pool, const struct adata *path, const struct f_tree *set, u32 key, int pos);
                     53: 
                     54: static inline struct adata *as_path_prepend(struct linpool *pool, const struct adata *path, u32 as)
                     55: { return as_path_prepend2(pool, path, AS_PATH_SEQUENCE, as); }
                     56: 
                     57: 
                     58: #define PM_ASN         0
                     59: #define PM_QUESTION    1
                     60: #define PM_ASTERISK    2
                     61: #define PM_ASN_EXPR    3
                     62: #define PM_ASN_RANGE   4
                     63: #define PM_ASN_SET     5
                     64: 
                     65: struct f_path_mask_item {
                     66:   union {
                     67:     u32 asn; /* PM_ASN */
                     68:     const struct f_line *expr; /* PM_ASN_EXPR */
                     69:     const struct f_tree *set; /* PM_ASN_SET */
                     70:     struct { /* PM_ASN_RANGE */
                     71:       u32 from;
                     72:       u32 to;
                     73:     };
                     74:   };
                     75:   int kind;
                     76: };
                     77: 
                     78: struct f_path_mask {
                     79:   uint len;
                     80:   struct f_path_mask_item item[0];
                     81: };
                     82: 
                     83: int as_path_match(const struct adata *path, const struct f_path_mask *mask);
                     84: 
                     85: 
                     86: /* Counterparts to appropriate as_path_* functions */
                     87: 
                     88: static inline int
                     89: aggregator_16to32(byte *dst, const byte *src)
                     90: {
                     91:   put_u32(dst, get_u16(src));
                     92:   memcpy(dst+4, src+2, 4);
                     93:   return 8;
                     94: }
                     95: 
                     96: static inline int
                     97: aggregator_32to16(byte *dst, const byte *src)
                     98: {
                     99:   put_u16(dst, get_u32(src));
                    100:   memcpy(dst+2, src+4, 4);
                    101:   return 6;
                    102: }
                    103: 
                    104: static inline int
                    105: aggregator_contains_as4(const struct adata *a)
                    106: {
                    107:   return get_u32(a->data) > 0xFFFF;
                    108: }
                    109: 
                    110: static inline struct adata *
                    111: aggregator_to_old(struct linpool *pool, const struct adata *a)
                    112: {
                    113:   struct adata *d = lp_alloc_adata(pool, 8);
                    114:   put_u32(d->data, 0xFFFF);
                    115:   memcpy(d->data + 4, a->data + 4, 4);
                    116:   return d;
                    117: }
                    118: 
                    119: 
                    120: /* a-set.c */
                    121: 
                    122: 
                    123: /* Extended Community subtypes (kinds) */
                    124: enum ec_subtype {
                    125:   EC_RT = 0x0002,
                    126:   EC_RO = 0x0003,
                    127:   EC_GENERIC = 0xFFFF,
                    128: };
                    129: 
                    130: static inline const char *ec_subtype_str(const enum ec_subtype ecs) {
                    131:   switch (ecs) {
                    132:     case EC_RT: return "rt";
                    133:     case EC_RO: return "ro";
                    134:     default: return NULL;
                    135:   }
                    136: }
                    137: 
                    138: /* Transitive bit (for first u32 half of EC) */
                    139: #define EC_TBIT 0x40000000
                    140: 
                    141: #define ECOMM_LENGTH 8
                    142: 
                    143: static inline int int_set_get_size(const struct adata *list)
                    144: { return list->length / 4; }
                    145: 
                    146: static inline int ec_set_get_size(const struct adata *list)
                    147: { return list->length / 8; }
                    148: 
                    149: static inline int lc_set_get_size(const struct adata *list)
                    150: { return list->length / 12; }
                    151: 
                    152: static inline u32 *int_set_get_data(const struct adata *list)
                    153: { return (u32 *) list->data; }
                    154: 
                    155: static inline u32 ec_hi(u64 ec) { return ec >> 32; }
                    156: static inline u32 ec_lo(u64 ec) { return ec; }
                    157: static inline u64 ec_get(const u32 *l, int i)
                    158: { return (((u64) l[i]) << 32) | l[i+1]; }
                    159: 
                    160: /* RFC 4360 3.1.  Two-Octet AS Specific Extended Community */
                    161: static inline u64 ec_as2(enum ec_subtype kind, u64 key, u64 val)
                    162: { return (((u64) kind | 0x0000) << 48) | (key << 32) | val; }
                    163: 
                    164: /* RFC 5668  4-Octet AS Specific BGP Extended Community */
                    165: static inline u64 ec_as4(enum ec_subtype kind, u64 key, u64 val)
                    166: { return (((u64) kind | 0x0200) << 48) | (key << 16) | val; }
                    167: 
                    168: /* RFC 4360 3.2.  IPv4 Address Specific Extended Community */
                    169: static inline u64 ec_ip4(enum ec_subtype kind, u64 key, u64 val)
                    170: { return (((u64) kind | 0x0100) << 48) | (key << 16) | val; }
                    171: 
                    172: static inline u64 ec_generic(u64 key, u64 val)
                    173: { return (key << 32) | val; }
                    174: 
                    175: /* Large community value */
                    176: typedef struct lcomm {
                    177:   u32 asn;
                    178:   u32 ldp1;
                    179:   u32 ldp2;
                    180: } lcomm;
                    181: 
                    182: #define LCOMM_LENGTH 12
                    183: 
                    184: static inline lcomm lc_get(const u32 *l, int i)
                    185: { return (lcomm) { l[i], l[i+1], l[i+2] }; }
                    186: 
                    187: static inline void lc_put(u32 *l, lcomm v)
                    188: { l[0] = v.asn; l[1] = v.ldp1; l[2] = v.ldp2; }
                    189: 
                    190: static inline int lc_match(const u32 *l, int i, lcomm v)
                    191: { return (l[i] == v.asn && l[i+1] == v.ldp1 && l[i+2] == v.ldp2); }
                    192: 
                    193: static inline u32 *lc_copy(u32 *dst, const u32 *src)
                    194: { memcpy(dst, src, LCOMM_LENGTH); return dst + 3; }
                    195: 
                    196: 
                    197: int int_set_format(const struct adata *set, int way, int from, byte *buf, uint size);
                    198: int ec_format(byte *buf, u64 ec);
                    199: int ec_set_format(const struct adata *set, int from, byte *buf, uint size);
                    200: int lc_format(byte *buf, lcomm lc);
                    201: int lc_set_format(const struct adata *set, int from, byte *buf, uint size);
                    202: int int_set_contains(const struct adata *list, u32 val);
                    203: int ec_set_contains(const struct adata *list, u64 val);
                    204: int lc_set_contains(const struct adata *list, lcomm val);
                    205: const struct adata *int_set_prepend(struct linpool *pool, const struct adata *list, u32 val);
                    206: const struct adata *int_set_add(struct linpool *pool, const struct adata *list, u32 val);
                    207: const struct adata *ec_set_add(struct linpool *pool, const struct adata *list, u64 val);
                    208: const struct adata *lc_set_add(struct linpool *pool, const struct adata *list, lcomm val);
                    209: const struct adata *int_set_del(struct linpool *pool, const struct adata *list, u32 val);
                    210: const struct adata *ec_set_del(struct linpool *pool, const struct adata *list, u64 val);
                    211: const struct adata *lc_set_del(struct linpool *pool, const struct adata *list, lcomm val);
                    212: const struct adata *int_set_union(struct linpool *pool, const struct adata *l1, const struct adata *l2);
                    213: const struct adata *ec_set_union(struct linpool *pool, const struct adata *l1, const struct adata *l2);
                    214: const struct adata *lc_set_union(struct linpool *pool, const struct adata *l1, const struct adata *l2);
                    215: 
                    216: struct adata *ec_set_del_nontrans(struct linpool *pool, const struct adata *set);
                    217: struct adata *int_set_sort(struct linpool *pool, const struct adata *src);
                    218: struct adata *ec_set_sort(struct linpool *pool, const struct adata *src);
                    219: struct adata *lc_set_sort(struct linpool *pool, const struct adata *src);
                    220: 
                    221: void ec_set_sort_x(struct adata *set); /* Sort in place */
                    222: 
                    223: #endif

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