]>
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 | ||
71 | ||
72 | static inline int int_set_get_size(struct adata *list) | |
73 | { return list->length / 4; } | |
74 | ||
7ccb36d3 OZ |
75 | static inline int ec_set_get_size(struct adata *list) |
76 | { return list->length / 8; } | |
77 | ||
42a0c054 OZ |
78 | static inline u32 *int_set_get_data(struct adata *list) |
79 | { return (u32 *) list->data; } | |
80 | ||
81 | static inline u32 ec_hi(u64 ec) { return ec >> 32; } | |
82 | static inline u32 ec_lo(u64 ec) { return ec; } | |
83 | static inline u64 ec_get(const u32 *l, int i) | |
84 | { return (((u64) l[i]) << 32) | l[i+1]; } | |
85 | ||
86 | /* RFC 4360 3.1. Two-Octet AS Specific Extended Community */ | |
87 | static inline u64 ec_as2(u64 kind, u64 key, u64 val) | |
88 | { return ((kind | 0x0000) << 48) | (key << 32) | val; } | |
89 | ||
90 | /* RFC 5668 4-Octet AS Specific BGP Extended Community */ | |
91 | static inline u64 ec_as4(u64 kind, u64 key, u64 val) | |
92 | { return ((kind | 0x0200) << 48) | (key << 16) | val; } | |
93 | ||
94 | /* RFC 4360 3.2. IPv4 Address Specific Extended Community */ | |
95 | static inline u64 ec_ip4(u64 kind, u64 key, u64 val) | |
96 | { return ((kind | 0x0100) << 48) | (key << 16) | val; } | |
97 | ||
98 | static inline u64 ec_generic(u64 key, u64 val) | |
99 | { return (key << 32) | val; } | |
100 | ||
ae80a2de | 101 | int int_set_format(struct adata *set, int way, int from, byte *buf, uint size); |
42a0c054 | 102 | int ec_format(byte *buf, u64 ec); |
ae80a2de | 103 | int ec_set_format(struct adata *set, int from, byte *buf, uint size); |
9c400ec9 | 104 | int int_set_contains(struct adata *list, u32 val); |
42a0c054 OZ |
105 | int ec_set_contains(struct adata *list, u64 val); |
106 | struct adata *int_set_add(struct linpool *pool, struct adata *list, u32 val); | |
107 | struct adata *ec_set_add(struct linpool *pool, struct adata *list, u64 val); | |
9c400ec9 | 108 | struct adata *int_set_del(struct linpool *pool, struct adata *list, u32 val); |
42a0c054 | 109 | struct adata *ec_set_del(struct linpool *pool, struct adata *list, u64 val); |
0888a737 OZ |
110 | struct adata *int_set_union(struct linpool *pool, struct adata *l1, struct adata *l2); |
111 | struct adata *ec_set_union(struct linpool *pool, struct adata *l1, struct adata *l2); | |
9c400ec9 | 112 | |
4847a894 | 113 | |
c0668f36 | 114 | #endif |