]>
Commit | Line | Data |
---|---|---|
c0668f36 MM |
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 | ||
46eb80d5 OZ |
12 | #include <stdint.h> |
13 | ||
c0668f36 MM |
14 | /* a-path.c */ |
15 | ||
c6add07f MM |
16 | #define AS_PATH_SET 1 /* Types of path segments */ |
17 | #define AS_PATH_SEQUENCE 2 | |
48d79d52 OZ |
18 | #define AS_PATH_CONFED_SEQUENCE 3 |
19 | #define AS_PATH_CONFED_SET 4 | |
c6add07f | 20 | |
11cb6202 OZ |
21 | #define AS_PATH_MAXLEN 10000 |
22 | ||
23 | #define AS_TRANS 23456 | |
24 | /* AS_TRANS is used when we need to store 32bit ASN larger than 0xFFFF | |
25 | * to 16bit slot (like in 16bit AS_PATH). See RFC 4893 for details | |
26 | */ | |
27 | ||
cc31b75a OZ |
28 | struct f_tree; |
29 | ||
11cb6202 OZ |
30 | struct adata *as_path_prepend(struct linpool *pool, struct adata *olda, u32 as); |
31 | int as_path_convert_to_old(struct adata *path, byte *dst, int *new_used); | |
32 | int as_path_convert_to_new(struct adata *path, byte *dst, int req_as); | |
ae80a2de | 33 | void as_path_format(struct adata *path, byte *buf, uint size); |
684c6f5a | 34 | int as_path_getlen(struct adata *path); |
949bd34e | 35 | int as_path_getlen_int(struct adata *path, int bs); |
11cb6202 | 36 | int as_path_get_first(struct adata *path, u32 *orig_as); |
b6bf284a | 37 | int as_path_get_last(struct adata *path, u32 *last_as); |
9c9cc35c | 38 | u32 as_path_get_last_nonaggregated(struct adata *path); |
a15dab76 | 39 | int as_path_contains(struct adata *path, u32 as, int min); |
cc31b75a | 40 | int as_path_match_set(struct adata *path, struct f_tree *set); |
bff9ce51 OZ |
41 | struct adata *as_path_filter(struct linpool *pool, struct adata *path, struct f_tree *set, u32 key, int pos); |
42 | ||
11cb6202 | 43 | |
c8a6b9a3 OZ |
44 | #define PM_ASN 0 |
45 | #define PM_QUESTION 1 | |
46 | #define PM_ASTERISK 2 | |
92a72a4c | 47 | #define PM_ASN_EXPR 3 |
a0fe1944 | 48 | #define PM_ASN_RANGE 4 |
684c6f5a | 49 | |
2a40efa5 PM |
50 | struct f_path_mask { |
51 | struct f_path_mask *next; | |
c8a6b9a3 | 52 | int kind; |
92a72a4c | 53 | uintptr_t val; |
a0fe1944 | 54 | uintptr_t val2; |
2a40efa5 | 55 | }; |
11cb6202 | 56 | |
2a40efa5 PM |
57 | int as_path_match(struct adata *path, struct f_path_mask *mask); |
58 | ||
c6add07f MM |
59 | /* a-set.c */ |
60 | ||
42a0c054 OZ |
61 | |
62 | /* Extended Community subtypes (kinds) */ | |
63 | #define EC_RT 0x0002 | |
64 | #define EC_RO 0x0003 | |
65 | ||
66 | #define EC_GENERIC 0xFFFF | |
67 | ||
68 | /* Transitive bit (for first u32 half of EC) */ | |
69 | #define EC_TBIT 0x40000000 | |
70 | ||
66dbdbd9 | 71 | #define ECOMM_LENGTH 8 |
42a0c054 OZ |
72 | |
73 | static inline int int_set_get_size(struct adata *list) | |
74 | { return list->length / 4; } | |
75 | ||
7ccb36d3 OZ |
76 | static inline int ec_set_get_size(struct adata *list) |
77 | { return list->length / 8; } | |
78 | ||
66dbdbd9 OZ |
79 | static inline int lc_set_get_size(struct adata *list) |
80 | { return list->length / 12; } | |
81 | ||
42a0c054 OZ |
82 | static inline u32 *int_set_get_data(struct adata *list) |
83 | { return (u32 *) list->data; } | |
84 | ||
85 | static inline u32 ec_hi(u64 ec) { return ec >> 32; } | |
86 | static inline u32 ec_lo(u64 ec) { return ec; } | |
87 | static inline u64 ec_get(const u32 *l, int i) | |
88 | { return (((u64) l[i]) << 32) | l[i+1]; } | |
89 | ||
90 | /* RFC 4360 3.1. Two-Octet AS Specific Extended Community */ | |
91 | static inline u64 ec_as2(u64 kind, u64 key, u64 val) | |
92 | { return ((kind | 0x0000) << 48) | (key << 32) | val; } | |
93 | ||
94 | /* RFC 5668 4-Octet AS Specific BGP Extended Community */ | |
95 | static inline u64 ec_as4(u64 kind, u64 key, u64 val) | |
96 | { return ((kind | 0x0200) << 48) | (key << 16) | val; } | |
97 | ||
98 | /* RFC 4360 3.2. IPv4 Address Specific Extended Community */ | |
99 | static inline u64 ec_ip4(u64 kind, u64 key, u64 val) | |
100 | { return ((kind | 0x0100) << 48) | (key << 16) | val; } | |
101 | ||
102 | static inline u64 ec_generic(u64 key, u64 val) | |
103 | { return (key << 32) | val; } | |
104 | ||
66dbdbd9 OZ |
105 | /* Large community value */ |
106 | typedef struct lcomm { | |
107 | u32 asn; | |
108 | u32 ldp1; | |
109 | u32 ldp2; | |
110 | } lcomm; | |
111 | ||
112 | #define LCOMM_LENGTH 12 | |
113 | ||
114 | static inline lcomm lc_get(const u32 *l, int i) | |
115 | { return (lcomm) { l[i], l[i+1], l[i+2] }; } | |
116 | ||
117 | static inline void lc_put(u32 *l, lcomm v) | |
118 | { l[0] = v.asn; l[1] = v.ldp1; l[2] = v.ldp2; } | |
119 | ||
120 | static inline int lc_match(const u32 *l, int i, lcomm v) | |
121 | { return (l[i] == v.asn && l[i+1] == v.ldp1 && l[i+2] == v.ldp2); } | |
122 | ||
123 | static inline u32 *lc_copy(u32 *dst, const u32 *src) | |
124 | { memcpy(dst, src, LCOMM_LENGTH); return dst + 3; } | |
125 | ||
126 | ||
ae80a2de | 127 | int int_set_format(struct adata *set, int way, int from, byte *buf, uint size); |
42a0c054 | 128 | int ec_format(byte *buf, u64 ec); |
ae80a2de | 129 | int ec_set_format(struct adata *set, int from, byte *buf, uint size); |
66dbdbd9 OZ |
130 | int lc_format(byte *buf, lcomm lc); |
131 | int lc_set_format(struct adata *set, int from, byte *buf, uint size); | |
9c400ec9 | 132 | int int_set_contains(struct adata *list, u32 val); |
42a0c054 | 133 | int ec_set_contains(struct adata *list, u64 val); |
66dbdbd9 | 134 | int lc_set_contains(struct adata *list, lcomm val); |
42a0c054 OZ |
135 | struct adata *int_set_add(struct linpool *pool, struct adata *list, u32 val); |
136 | struct adata *ec_set_add(struct linpool *pool, struct adata *list, u64 val); | |
66dbdbd9 | 137 | struct adata *lc_set_add(struct linpool *pool, struct adata *list, lcomm val); |
9c400ec9 | 138 | struct adata *int_set_del(struct linpool *pool, struct adata *list, u32 val); |
42a0c054 | 139 | struct adata *ec_set_del(struct linpool *pool, struct adata *list, u64 val); |
66dbdbd9 | 140 | struct adata *lc_set_del(struct linpool *pool, struct adata *list, lcomm val); |
0888a737 OZ |
141 | struct adata *int_set_union(struct linpool *pool, struct adata *l1, struct adata *l2); |
142 | struct adata *ec_set_union(struct linpool *pool, struct adata *l1, struct adata *l2); | |
66dbdbd9 | 143 | struct adata *lc_set_union(struct linpool *pool, struct adata *l1, struct adata *l2); |
9c400ec9 | 144 | |
4847a894 | 145 | |
c0668f36 | 146 | #endif |