Revision 42a0c054 nest/attrs.h

View differences:

nest/attrs.h
50 50

  
51 51
/* a-set.c */
52 52

  
53

  
54
/* Extended Community subtypes (kinds) */
55
#define EC_RT 0x0002
56
#define EC_RO 0x0003
57

  
58
#define EC_GENERIC 0xFFFF
59

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

  
63

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

  
67
static inline u32 *int_set_get_data(struct adata *list)
68
{ return (u32 *) list->data; }
69

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

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

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

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

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

  
53 90
int int_set_format(struct adata *set, int way, int from, byte *buf, unsigned int size);
54
struct adata *int_set_add(struct linpool *pool, struct adata *list, u32 val);
91
int ec_format(byte *buf, u64 ec);
92
int ec_set_format(struct adata *set, int from, byte *buf, unsigned int size);
55 93
int int_set_contains(struct adata *list, u32 val);
94
int ec_set_contains(struct adata *list, u64 val);
95
struct adata *int_set_add(struct linpool *pool, struct adata *list, u32 val);
96
struct adata *ec_set_add(struct linpool *pool, struct adata *list, u64 val);
56 97
struct adata *int_set_del(struct linpool *pool, struct adata *list, u32 val);
98
struct adata *ec_set_del(struct linpool *pool, struct adata *list, u64 val);
57 99

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

  
61 101
#endif

Also available in: Unified diff