attrs.h 3.54 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
/*
 *	BIRD Internet Routing Daemon -- Attribute Operations
 *
 *	(c) 2000 Martin Mares <mj@ucw.cz>
 *
 *	Can be freely distributed and used under the terms of the GNU GPL.
 */

#ifndef _BIRD_ATTRS_H_
#define _BIRD_ATTRS_H_

12 13
#include <stdint.h>

14 15
/* a-path.c */

16 17
#define AS_PATH_SET		1	/* Types of path segments */
#define AS_PATH_SEQUENCE	2
18 19
#define AS_PATH_CONFED_SEQUENCE	3
#define AS_PATH_CONFED_SET	4
20

21 22 23 24 25 26 27
#define AS_PATH_MAXLEN		10000

#define AS_TRANS		23456
/* AS_TRANS is used when we need to store 32bit ASN larger than 0xFFFF
 * to 16bit slot (like in 16bit AS_PATH). See RFC 4893 for details
 */

28 29
struct f_tree;

30 31 32
struct adata *as_path_prepend(struct linpool *pool, struct adata *olda, u32 as);
int as_path_convert_to_old(struct adata *path, byte *dst, int *new_used);
int as_path_convert_to_new(struct adata *path, byte *dst, int req_as);
33 34
void as_path_format(struct adata *path, byte *buf, unsigned int size);
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 41
struct adata *as_path_filter(struct linpool *pool, struct adata *path, struct f_tree *set, u32 key, int pos);

42

43 44 45
#define PM_ASN		0
#define PM_QUESTION	1
#define PM_ASTERISK	2
46
#define PM_ASN_EXPR	3
47

Pavel Machek's avatar
Pavel Machek committed
48 49
struct f_path_mask {
  struct f_path_mask *next;
50
  int kind;
51
  uintptr_t val;
Pavel Machek's avatar
Pavel Machek committed
52
};
53

Pavel Machek's avatar
Pavel Machek committed
54 55
int as_path_match(struct adata *path, struct f_path_mask *mask);

56 57
/* a-set.c */

Ondřej Zajíček's avatar
Ondřej Zajíček committed
58 59 60 61 62 63 64 65 66 67 68 69 70 71

/* Extended Community subtypes (kinds) */
#define EC_RT 0x0002
#define EC_RO 0x0003

#define EC_GENERIC 0xFFFF

/* Transitive bit (for first u32 half of EC) */
#define EC_TBIT 0x40000000


static inline int int_set_get_size(struct adata *list)
{ return list->length / 4; }

72 73 74
static inline int ec_set_get_size(struct adata *list)
{ return list->length / 8; }

Ondřej Zajíček's avatar
Ondřej Zajíček committed
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
static inline u32 *int_set_get_data(struct adata *list)
{ return (u32 *) list->data; }

static inline u32 ec_hi(u64 ec) { return ec >> 32; }
static inline u32 ec_lo(u64 ec) { return ec; }
static inline u64 ec_get(const u32 *l, int i)
{ return (((u64) l[i]) << 32) | l[i+1]; }

/* RFC 4360 3.1.  Two-Octet AS Specific Extended Community */
static inline u64 ec_as2(u64 kind, u64 key, u64 val)
{ return ((kind | 0x0000) << 48) | (key << 32) | val; }

/* RFC 5668  4-Octet AS Specific BGP Extended Community */
static inline u64 ec_as4(u64 kind, u64 key, u64 val)
{ return ((kind | 0x0200) << 48) | (key << 16) | val; }

/* RFC 4360 3.2.  IPv4 Address Specific Extended Community */
static inline u64 ec_ip4(u64 kind, u64 key, u64 val)
{ return ((kind | 0x0100) << 48) | (key << 16) | val; }

static inline u64 ec_generic(u64 key, u64 val)
{ return (key << 32) | val; }

98
int int_set_format(struct adata *set, int way, int from, byte *buf, unsigned int size);
Ondřej Zajíček's avatar
Ondřej Zajíček committed
99 100
int ec_format(byte *buf, u64 ec);
int ec_set_format(struct adata *set, int from, byte *buf, unsigned int size);
101
int int_set_contains(struct adata *list, u32 val);
Ondřej Zajíček's avatar
Ondřej Zajíček committed
102 103 104
int ec_set_contains(struct adata *list, u64 val);
struct adata *int_set_add(struct linpool *pool, struct adata *list, u32 val);
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);
Ondřej Zajíček's avatar
Ondřej Zajíček committed
106
struct adata *ec_set_del(struct linpool *pool, struct adata *list, u64 val);
107 108
struct adata *int_set_union(struct linpool *pool, struct adata *l1, struct adata *l2);
struct adata *ec_set_union(struct linpool *pool, struct adata *l1, struct adata *l2);
109

110

111
#endif