iof-bird-daemon / nest / attrs.h @ ae80a2de
History | View | Annotate | Download (3.51 KB)
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 |
|
14 |
/* a-path.c */
|
15 |
|
16 |
#define AS_PATH_SET 1 /* Types of path segments */ |
17 |
#define AS_PATH_SEQUENCE 2 |
18 |
#define AS_PATH_CONFED_SEQUENCE 3 |
19 |
#define AS_PATH_CONFED_SET 4 |
20 |
|
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 |
|
28 |
struct f_tree;
|
29 |
|
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); |
33 |
void as_path_format(struct adata *path, byte *buf, uint size); |
34 |
int as_path_getlen(struct adata *path); |
35 |
int as_path_getlen_int(struct adata *path, int bs); |
36 |
int as_path_get_first(struct adata *path, u32 *orig_as); |
37 |
int as_path_get_last(struct adata *path, u32 *last_as); |
38 |
int as_path_contains(struct adata *path, u32 as, int min); |
39 |
int as_path_match_set(struct adata *path, struct f_tree *set); |
40 |
struct adata *as_path_filter(struct linpool *pool, struct adata *path, struct f_tree *set, u32 key, int pos); |
41 |
|
42 |
|
43 |
#define PM_ASN 0 |
44 |
#define PM_QUESTION 1 |
45 |
#define PM_ASTERISK 2 |
46 |
#define PM_ASN_EXPR 3 |
47 |
|
48 |
struct f_path_mask {
|
49 |
struct f_path_mask *next;
|
50 |
int kind;
|
51 |
uintptr_t val; |
52 |
}; |
53 |
|
54 |
int as_path_match(struct adata *path, struct f_path_mask *mask); |
55 |
|
56 |
/* a-set.c */
|
57 |
|
58 |
|
59 |
/* Extended Community subtypes (kinds) */
|
60 |
#define EC_RT 0x0002 |
61 |
#define EC_RO 0x0003 |
62 |
|
63 |
#define EC_GENERIC 0xFFFF |
64 |
|
65 |
/* Transitive bit (for first u32 half of EC) */
|
66 |
#define EC_TBIT 0x40000000 |
67 |
|
68 |
|
69 |
static inline int int_set_get_size(struct adata *list) |
70 |
{ return list->length / 4; } |
71 |
|
72 |
static inline int ec_set_get_size(struct adata *list) |
73 |
{ return list->length / 8; } |
74 |
|
75 |
static inline u32 *int_set_get_data(struct adata *list) |
76 |
{ return (u32 *) list->data; }
|
77 |
|
78 |
static inline u32 ec_hi(u64 ec) { return ec >> 32; } |
79 |
static inline u32 ec_lo(u64 ec) { return ec; } |
80 |
static inline u64 ec_get(const u32 *l, int i) |
81 |
{ return (((u64) l[i]) << 32) | l[i+1]; } |
82 |
|
83 |
/* RFC 4360 3.1. Two-Octet AS Specific Extended Community */
|
84 |
static inline u64 ec_as2(u64 kind, u64 key, u64 val) |
85 |
{ return ((kind | 0x0000) << 48) | (key << 32) | val; } |
86 |
|
87 |
/* RFC 5668 4-Octet AS Specific BGP Extended Community */
|
88 |
static inline u64 ec_as4(u64 kind, u64 key, u64 val) |
89 |
{ return ((kind | 0x0200) << 48) | (key << 16) | val; } |
90 |
|
91 |
/* RFC 4360 3.2. IPv4 Address Specific Extended Community */
|
92 |
static inline u64 ec_ip4(u64 kind, u64 key, u64 val) |
93 |
{ return ((kind | 0x0100) << 48) | (key << 16) | val; } |
94 |
|
95 |
static inline u64 ec_generic(u64 key, u64 val) |
96 |
{ return (key << 32) | val; } |
97 |
|
98 |
int int_set_format(struct adata *set, int way, int from, byte *buf, uint size); |
99 |
int ec_format(byte *buf, u64 ec);
|
100 |
int ec_set_format(struct adata *set, int from, byte *buf, uint size); |
101 |
int int_set_contains(struct adata *list, u32 val); |
102 |
int ec_set_contains(struct adata *list, u64 val); |
103 |
struct adata *int_set_add(struct linpool *pool, struct adata *list, u32 val); |
104 |
struct adata *ec_set_add(struct linpool *pool, struct adata *list, u64 val); |
105 |
struct adata *int_set_del(struct linpool *pool, struct adata *list, u32 val); |
106 |
struct adata *ec_set_del(struct linpool *pool, struct adata *list, u64 val); |
107 |
struct adata *int_set_union(struct linpool *pool, struct adata *l1, struct adata *l2); |
108 |
struct adata *ec_set_union(struct linpool *pool, struct adata *l1, struct adata *l2); |
109 |
|
110 |
|
111 |
#endif
|