]>
git.ipfire.org Git - thirdparty/bird.git/blob - nest/attrs.h
2 * BIRD Internet Routing Daemon -- Attribute Operations
4 * (c) 2000 Martin Mares <mj@ucw.cz>
6 * Can be freely distributed and used under the terms of the GNU GPL.
10 #define _BIRD_ATTRS_H_
13 #include "lib/unaligned.h"
14 #include "nest/route.h"
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
24 #define AS_PATH_MAXLEN 10000
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
33 int as_path_valid(byte
*data
, uint len
, int bs
, int confed
, char *err
, uint elen
);
34 int as_path_16to32(byte
*dst
, byte
*src
, uint len
);
35 int as_path_32to16(byte
*dst
, 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 void as_path_cut(struct adata
*path
, uint num
);
42 struct adata
*as_path_merge(struct linpool
*pool
, struct adata
*p1
, 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
, struct f_tree
*set
);
52 struct adata
*as_path_filter(struct linpool
*pool
, struct adata
*path
, struct f_tree
*set
, u32 key
, int pos
);
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
); }
62 #define PM_ASN_RANGE 4
65 struct f_path_mask
*next
;
71 int as_path_match(const struct adata
*path
, struct f_path_mask
*mask
);
74 /* Counterparts to appropriate as_path_* functions */
77 aggregator_16to32(byte
*dst
, byte
*src
)
79 put_u32(dst
, get_u16(src
));
80 memcpy(dst
+4, src
+2, 4);
85 aggregator_32to16(byte
*dst
, byte
*src
)
87 put_u16(dst
, get_u32(src
));
88 memcpy(dst
+2, src
+4, 4);
93 aggregator_contains_as4(struct adata
*a
)
95 return get_u32(a
->data
) > 0xFFFF;
98 static inline struct adata
*
99 aggregator_to_old(struct linpool
*pool
, struct adata
*a
)
101 struct adata
*d
= lp_alloc_adata(pool
, 8);
102 put_u32(d
->data
, 0xFFFF);
103 memcpy(d
->data
+ 4, a
->data
+ 4, 4);
111 /* Extended Community subtypes (kinds) */
115 #define EC_GENERIC 0xFFFF
117 /* Transitive bit (for first u32 half of EC) */
118 #define EC_TBIT 0x40000000
120 #define ECOMM_LENGTH 8
122 static inline int int_set_get_size(struct adata
*list
)
123 { return list
->length
/ 4; }
125 static inline int ec_set_get_size(struct adata
*list
)
126 { return list
->length
/ 8; }
128 static inline int lc_set_get_size(struct adata
*list
)
129 { return list
->length
/ 12; }
131 static inline u32
*int_set_get_data(struct adata
*list
)
132 { return (u32
*) list
->data
; }
134 static inline u32
ec_hi(u64 ec
) { return ec
>> 32; }
135 static inline u32
ec_lo(u64 ec
) { return ec
; }
136 static inline u64
ec_get(const u32
*l
, int i
)
137 { return (((u64
) l
[i
]) << 32) | l
[i
+1]; }
139 /* RFC 4360 3.1. Two-Octet AS Specific Extended Community */
140 static inline u64
ec_as2(u64 kind
, u64 key
, u64 val
)
141 { return ((kind
| 0x0000) << 48) | (key
<< 32) | val
; }
143 /* RFC 5668 4-Octet AS Specific BGP Extended Community */
144 static inline u64
ec_as4(u64 kind
, u64 key
, u64 val
)
145 { return ((kind
| 0x0200) << 48) | (key
<< 16) | val
; }
147 /* RFC 4360 3.2. IPv4 Address Specific Extended Community */
148 static inline u64
ec_ip4(u64 kind
, u64 key
, u64 val
)
149 { return ((kind
| 0x0100) << 48) | (key
<< 16) | val
; }
151 static inline u64
ec_generic(u64 key
, u64 val
)
152 { return (key
<< 32) | val
; }
154 /* Large community value */
155 typedef struct lcomm
{
161 #define LCOMM_LENGTH 12
163 static inline lcomm
lc_get(const u32
*l
, int i
)
164 { return (lcomm
) { l
[i
], l
[i
+1], l
[i
+2] }; }
166 static inline void lc_put(u32
*l
, lcomm v
)
167 { l
[0] = v
.asn
; l
[1] = v
.ldp1
; l
[2] = v
.ldp2
; }
169 static inline int lc_match(const u32
*l
, int i
, lcomm v
)
170 { return (l
[i
] == v
.asn
&& l
[i
+1] == v
.ldp1
&& l
[i
+2] == v
.ldp2
); }
172 static inline u32
*lc_copy(u32
*dst
, const u32
*src
)
173 { memcpy(dst
, src
, LCOMM_LENGTH
); return dst
+ 3; }
176 int int_set_format(struct adata
*set
, int way
, int from
, byte
*buf
, uint size
);
177 int ec_format(byte
*buf
, u64 ec
);
178 int ec_set_format(struct adata
*set
, int from
, byte
*buf
, uint size
);
179 int lc_format(byte
*buf
, lcomm lc
);
180 int lc_set_format(struct adata
*set
, int from
, byte
*buf
, uint size
);
181 int int_set_contains(struct adata
*list
, u32 val
);
182 int ec_set_contains(struct adata
*list
, u64 val
);
183 int lc_set_contains(struct adata
*list
, lcomm val
);
184 struct adata
*int_set_prepend(struct linpool
*pool
, struct adata
*list
, u32 val
);
185 struct adata
*int_set_add(struct linpool
*pool
, struct adata
*list
, u32 val
);
186 struct adata
*ec_set_add(struct linpool
*pool
, struct adata
*list
, u64 val
);
187 struct adata
*lc_set_add(struct linpool
*pool
, struct adata
*list
, lcomm val
);
188 struct adata
*int_set_del(struct linpool
*pool
, struct adata
*list
, u32 val
);
189 struct adata
*ec_set_del(struct linpool
*pool
, struct adata
*list
, u64 val
);
190 struct adata
*lc_set_del(struct linpool
*pool
, struct adata
*list
, lcomm val
);
191 struct adata
*int_set_union(struct linpool
*pool
, struct adata
*l1
, struct adata
*l2
);
192 struct adata
*ec_set_union(struct linpool
*pool
, struct adata
*l1
, struct adata
*l2
);
193 struct adata
*lc_set_union(struct linpool
*pool
, struct adata
*l1
, struct adata
*l2
);
195 struct adata
*ec_set_del_nontrans(struct linpool
*pool
, struct adata
*set
);
196 struct adata
*int_set_sort(struct linpool
*pool
, struct adata
*src
);
197 struct adata
*ec_set_sort(struct linpool
*pool
, struct adata
*src
);
198 struct adata
*lc_set_sort(struct linpool
*pool
, struct adata
*src
);