]>
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 |
684c6f5a | 48 | |
2a40efa5 PM |
49 | struct f_path_mask { |
50 | struct f_path_mask *next; | |
c8a6b9a3 | 51 | int kind; |
92a72a4c | 52 | uintptr_t val; |
2a40efa5 | 53 | }; |
11cb6202 | 54 | |
2a40efa5 PM |
55 | int as_path_match(struct adata *path, struct f_path_mask *mask); |
56 | ||
c6add07f MM |
57 | /* a-set.c */ |
58 | ||
42a0c054 OZ |
59 | |
60 | /* Extended Community subtypes (kinds) */ | |
61 | #define EC_RT 0x0002 | |
62 | #define EC_RO 0x0003 | |
63 | ||
64 | #define EC_GENERIC 0xFFFF | |
65 | ||
66 | /* Transitive bit (for first u32 half of EC) */ | |
67 | #define EC_TBIT 0x40000000 | |
68 | ||
69 | ||
70 | static inline int int_set_get_size(struct adata *list) | |
71 | { return list->length / 4; } | |
72 | ||
7ccb36d3 OZ |
73 | static inline int ec_set_get_size(struct adata *list) |
74 | { return list->length / 8; } | |
75 | ||
42a0c054 OZ |
76 | static inline u32 *int_set_get_data(struct adata *list) |
77 | { return (u32 *) list->data; } | |
78 | ||
79 | static inline u32 ec_hi(u64 ec) { return ec >> 32; } | |
80 | static inline u32 ec_lo(u64 ec) { return ec; } | |
81 | static inline u64 ec_get(const u32 *l, int i) | |
82 | { return (((u64) l[i]) << 32) | l[i+1]; } | |
83 | ||
84 | /* RFC 4360 3.1. Two-Octet AS Specific Extended Community */ | |
85 | static inline u64 ec_as2(u64 kind, u64 key, u64 val) | |
86 | { return ((kind | 0x0000) << 48) | (key << 32) | val; } | |
87 | ||
88 | /* RFC 5668 4-Octet AS Specific BGP Extended Community */ | |
89 | static inline u64 ec_as4(u64 kind, u64 key, u64 val) | |
90 | { return ((kind | 0x0200) << 48) | (key << 16) | val; } | |
91 | ||
92 | /* RFC 4360 3.2. IPv4 Address Specific Extended Community */ | |
93 | static inline u64 ec_ip4(u64 kind, u64 key, u64 val) | |
94 | { return ((kind | 0x0100) << 48) | (key << 16) | val; } | |
95 | ||
96 | static inline u64 ec_generic(u64 key, u64 val) | |
97 | { return (key << 32) | val; } | |
98 | ||
ae80a2de | 99 | int int_set_format(struct adata *set, int way, int from, byte *buf, uint size); |
42a0c054 | 100 | int ec_format(byte *buf, u64 ec); |
ae80a2de | 101 | int ec_set_format(struct adata *set, int from, byte *buf, uint size); |
9c400ec9 | 102 | int int_set_contains(struct adata *list, u32 val); |
42a0c054 OZ |
103 | int ec_set_contains(struct adata *list, u64 val); |
104 | struct adata *int_set_add(struct linpool *pool, struct adata *list, u32 val); | |
105 | struct adata *ec_set_add(struct linpool *pool, struct adata *list, u64 val); | |
9c400ec9 | 106 | struct adata *int_set_del(struct linpool *pool, struct adata *list, u32 val); |
42a0c054 | 107 | struct adata *ec_set_del(struct linpool *pool, struct adata *list, u64 val); |
0888a737 OZ |
108 | struct adata *int_set_union(struct linpool *pool, struct adata *l1, struct adata *l2); |
109 | struct adata *ec_set_union(struct linpool *pool, struct adata *l1, struct adata *l2); | |
9c400ec9 | 110 | |
4847a894 | 111 | |
c0668f36 | 112 | #endif |