Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
BIRD Internet Routing Daemon
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
3
Merge Requests
3
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
labs
BIRD Internet Routing Daemon
Commits
ee7e2ffd
Commit
ee7e2ffd
authored
May 07, 2018
by
Jan Maria Matejka
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Protocol: Introducing an enum protocol_class
This supersedes the EAP_* constants.
parent
c3becfe1
Changes
27
Hide whitespace changes
Inline
Side-by-side
Showing
27 changed files
with
115 additions
and
106 deletions
+115
-106
filter/filter.c
filter/filter.c
+1
-1
nest/proto.c
nest/proto.c
+4
-5
nest/protocol.h
nest/protocol.h
+20
-1
nest/route.h
nest/route.h
+2
-14
nest/rt-attr.c
nest/rt-attr.c
+1
-4
nest/rt-dev.c
nest/rt-dev.c
+1
-0
proto/babel/babel.c
proto/babel/babel.c
+1
-1
proto/babel/babel.h
proto/babel/babel.h
+2
-2
proto/bfd/bfd.c
proto/bfd/bfd.c
+1
-0
proto/bgp/attrs.c
proto/bgp/attrs.c
+28
-28
proto/bgp/bgp.c
proto/bgp/bgp.c
+1
-1
proto/bgp/bgp.h
proto/bgp/bgp.h
+1
-1
proto/bgp/config.Y
proto/bgp/config.Y
+12
-12
proto/ospf/ospf.c
proto/ospf/ospf.c
+1
-1
proto/ospf/ospf.h
proto/ospf/ospf.h
+4
-4
proto/pipe/pipe.c
proto/pipe/pipe.c
+1
-0
proto/radv/radv.c
proto/radv/radv.c
+1
-1
proto/radv/radv.h
proto/radv/radv.h
+2
-2
proto/rip/rip.c
proto/rip/rip.c
+1
-1
proto/rip/rip.h
proto/rip/rip.h
+2
-2
proto/rpki/rpki.c
proto/rpki/rpki.c
+1
-0
proto/static/static.c
proto/static/static.c
+1
-0
sysdep/linux/krt-sys.h
sysdep/linux/krt-sys.h
+19
-19
sysdep/linux/netlink.c
sysdep/linux/netlink.c
+1
-1
sysdep/unix/krt.c
sysdep/unix/krt.c
+2
-1
sysdep/unix/krt.h
sysdep/unix/krt.h
+2
-2
test/bt-utils.c
test/bt-utils.c
+2
-2
No files found.
filter/filter.c
View file @
ee7e2ffd
...
...
@@ -1522,7 +1522,7 @@ interpret(struct f_inst *what)
/* We ignore temporary attributes, probably not a problem here */
/* 0x02 is a value of BA_AS_PATH, we don't want to include BGP headers */
eattr
*
e
=
ea_find
((
*
f_rte
)
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
0x02
));
eattr
*
e
=
ea_find
((
*
f_rte
)
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
0x02
));
if
(
!
e
||
e
->
type
!=
EAF_TYPE_AS_PATH
)
runtime
(
"Missing AS_PATH attribute"
);
...
...
nest/proto.c
View file @
ee7e2ffd
...
...
@@ -25,6 +25,7 @@ pool *proto_pool;
list
proto_list
;
static
list
protocol_list
;
struct
protocol
*
class_to_protocol
[
PROTOCOL__MAX
];
#define PD(pr, msg, args...) do { if (pr->debug & D_STATES) { log(L_TRACE "%s: " msg, pr->name , ## args); } } while(0)
...
...
@@ -1256,11 +1257,9 @@ void
proto_build
(
struct
protocol
*
p
)
{
add_tail
(
&
protocol_list
,
&
p
->
n
);
if
(
p
->
attr_class
)
{
ASSERT
(
!
attr_class_to_protocol
[
p
->
attr_class
]);
attr_class_to_protocol
[
p
->
attr_class
]
=
p
;
}
ASSERT
(
p
->
class
);
ASSERT
(
!
class_to_protocol
[
p
->
class
]);
class_to_protocol
[
p
->
class
]
=
p
;
}
/* FIXME: convert this call to some protocol hook */
...
...
nest/protocol.h
View file @
ee7e2ffd
...
...
@@ -37,12 +37,31 @@ struct symbol;
* Routing Protocol
*/
enum
protocol_class
{
PROTOCOL_NONE
,
PROTOCOL_BABEL
,
PROTOCOL_BFD
,
PROTOCOL_BGP
,
PROTOCOL_DEVICE
,
PROTOCOL_DIRECT
,
PROTOCOL_KERNEL
,
PROTOCOL_OSPF
,
PROTOCOL_PIPE
,
PROTOCOL_RADV
,
PROTOCOL_RIP
,
PROTOCOL_RPKI
,
PROTOCOL_STATIC
,
PROTOCOL__MAX
};
extern
struct
protocol
*
class_to_protocol
[
PROTOCOL__MAX
];
struct
protocol
{
node
n
;
char
*
name
;
char
*
template
;
/* Template for automatic generation of names */
int
name_counter
;
/* Counter for automatic name generation */
int
attr_class
;
/* Attribute class known to this protocol
*/
enum
protocol_class
class
;
/* Machine readable protocol class
*/
uint
preference
;
/* Default protocol preference */
uint
channel_mask
;
/* Mask of accepted channel types (NB_*) */
uint
proto_size
;
/* Size of protocol data structure */
...
...
nest/route.h
View file @
ee7e2ffd
...
...
@@ -457,7 +457,7 @@ static inline int rte_is_reachable(rte *r)
*/
typedef
struct
eattr
{
word
id
;
/* EA_CODE(
EAP
_..., protocol-dependent ID) */
word
id
;
/* EA_CODE(
PROTOCOL
_..., protocol-dependent ID) */
byte
flags
;
/* Protocol-dependent flags */
byte
type
;
/* Attribute type and several flags (EAF_...) */
union
{
...
...
@@ -466,20 +466,11 @@ typedef struct eattr {
}
u
;
}
eattr
;
#define EAP_GENERIC 0
/* Generic attributes */
#define EAP_BGP 1
/* BGP attributes */
#define EAP_RIP 2
/* RIP */
#define EAP_OSPF 3
/* OSPF */
#define EAP_KRT 4
/* Kernel route attributes */
#define EAP_BABEL 5
/* Babel attributes */
#define EAP_RADV 6
/* Router advertisment attributes */
#define EAP_MAX 7
#define EA_CODE(proto,id) (((proto) << 8) | (id))
#define EA_PROTO(ea) ((ea) >> 8)
#define EA_ID(ea) ((ea) & 0xff)
#define EA_GEN_IGP_METRIC EA_CODE(
EAP_GENERIC
, 0)
#define EA_GEN_IGP_METRIC EA_CODE(
PROTOCOL_NONE
, 0)
#define EA_CODE_MASK 0xffff
#define EA_ALLOW_UNDEF 0x10000
/* ea_find: allow EAF_TYPE_UNDEF */
...
...
@@ -656,9 +647,6 @@ rta_set_recursive_next_hop(rtable *dep, rta *a, rtable *tab, ip_addr gw, ip_addr
static
inline
void
rt_lock_hostentry
(
struct
hostentry
*
he
)
{
if
(
he
)
he
->
uc
++
;
}
static
inline
void
rt_unlock_hostentry
(
struct
hostentry
*
he
)
{
if
(
he
)
he
->
uc
--
;
}
extern
struct
protocol
*
attr_class_to_protocol
[
EAP_MAX
];
/*
* Default protocol preferences
*/
...
...
nest/rt-attr.c
View file @
ee7e2ffd
...
...
@@ -88,9 +88,6 @@ static struct idm src_ids;
static
HASH
(
struct
rte_src
)
src_hash
;
struct
protocol
*
attr_class_to_protocol
[
EAP_MAX
];
static
void
rte_src_init
(
void
)
{
...
...
@@ -851,7 +848,7 @@ ea_show(struct cli *c, eattr *e)
byte
buf
[
CLI_MSG_SIZE
];
byte
*
pos
=
buf
,
*
end
=
buf
+
sizeof
(
buf
);
if
(
p
=
attr_
class_to_protocol
[
EA_PROTO
(
e
->
id
)])
if
(
p
=
class_to_protocol
[
EA_PROTO
(
e
->
id
)])
{
pos
+=
bsprintf
(
pos
,
"%s."
,
p
->
name
);
if
(
p
->
get_attr
)
...
...
nest/rt-dev.c
View file @
ee7e2ffd
...
...
@@ -185,6 +185,7 @@ dev_copy_config(struct proto_config *dest, struct proto_config *src)
struct
protocol
proto_device
=
{
.
name
=
"Direct"
,
.
template
=
"direct%d"
,
.
class
=
PROTOCOL_DIRECT
,
.
preference
=
DEF_PREF_DIRECT
,
.
channel_mask
=
NB_IP
|
NB_IP6_SADR
,
.
proto_size
=
sizeof
(
struct
rt_dev_proto
),
...
...
proto/babel/babel.c
View file @
ee7e2ffd
...
...
@@ -2312,7 +2312,7 @@ babel_reconfigure(struct proto *P, struct proto_config *CF)
struct
protocol
proto_babel
=
{
.
name
=
"Babel"
,
.
template
=
"babel%d"
,
.
attr_class
=
EAP
_BABEL
,
.
class
=
PROTOCOL
_BABEL
,
.
preference
=
DEF_PREF_BABEL
,
.
channel_mask
=
NB_IP
|
NB_IP6_SADR
,
.
proto_size
=
sizeof
(
struct
babel_proto
),
...
...
proto/babel/babel.h
View file @
ee7e2ffd
...
...
@@ -25,8 +25,8 @@
#include "lib/string.h"
#include "lib/timer.h"
#define EA_BABEL_METRIC EA_CODE(
EAP
_BABEL, 0)
#define EA_BABEL_ROUTER_ID EA_CODE(
EAP
_BABEL, 1)
#define EA_BABEL_METRIC EA_CODE(
PROTOCOL
_BABEL, 0)
#define EA_BABEL_ROUTER_ID EA_CODE(
PROTOCOL
_BABEL, 1)
#define BABEL_MAGIC 42
#define BABEL_VERSION 2
...
...
proto/bfd/bfd.c
View file @
ee7e2ffd
...
...
@@ -1116,6 +1116,7 @@ bfd_show_sessions(struct proto *P)
struct
protocol
proto_bfd
=
{
.
name
=
"BFD"
,
.
template
=
"bfd%d"
,
.
class
=
PROTOCOL_BFD
,
.
proto_size
=
sizeof
(
struct
bfd_proto
),
.
config_size
=
sizeof
(
struct
bfd_config
),
.
init
=
bfd_init
,
...
...
proto/bgp/attrs.c
View file @
ee7e2ffd
...
...
@@ -92,7 +92,7 @@ bgp_set_attr(ea_list **attrs, struct linpool *pool, uint code, uint flags, uintp
a
->
next
=
*
attrs
;
*
attrs
=
a
;
e
->
id
=
EA_CODE
(
EAP
_BGP
,
code
);
e
->
id
=
EA_CODE
(
PROTOCOL
_BGP
,
code
);
e
->
type
=
bgp_attr_table
[
code
].
type
;
e
->
flags
=
flags
;
...
...
@@ -702,7 +702,7 @@ static inline void
bgp_decode_unknown
(
struct
bgp_parse_state
*
s
,
uint
code
,
uint
flags
,
byte
*
data
,
uint
len
,
ea_list
**
to
)
{
/* Cannot use bgp_set_attr_data() as it works on known attributes only */
ea_set_attr_data
(
to
,
s
->
pool
,
EA_CODE
(
EAP
_BGP
,
code
),
flags
,
EAF_TYPE_OPAQUE
,
data
,
len
);
ea_set_attr_data
(
to
,
s
->
pool
,
EA_CODE
(
PROTOCOL
_BGP
,
code
),
flags
,
EAF_TYPE_OPAQUE
,
data
,
len
);
}
...
...
@@ -857,7 +857,7 @@ bgp_attr_known(uint code)
static
inline
void
bgp_export_attr
(
struct
bgp_export_state
*
s
,
eattr
*
a
,
ea_list
*
to
)
{
if
(
EA_PROTO
(
a
->
id
)
!=
EAP
_BGP
)
if
(
EA_PROTO
(
a
->
id
)
!=
PROTOCOL
_BGP
)
return
;
uint
code
=
EA_ID
(
a
->
id
);
...
...
@@ -937,7 +937,7 @@ bgp_export_attrs(struct bgp_export_state *s, ea_list *attrs)
static
inline
int
bgp_encode_attr
(
struct
bgp_write_state
*
s
,
eattr
*
a
,
byte
*
buf
,
uint
size
)
{
ASSERT
(
EA_PROTO
(
a
->
id
)
==
EAP
_BGP
);
ASSERT
(
EA_PROTO
(
a
->
id
)
==
PROTOCOL
_BGP
);
uint
code
=
EA_ID
(
a
->
id
);
...
...
@@ -1405,7 +1405,7 @@ bgp_import_control(struct proto *P, rte **new, ea_list **attrs UNUSED, struct li
/* Handle well-known communities, RFC 1997 */
struct
eattr
*
c
;
if
(
p
->
cf
->
interpret_communities
&&
(
c
=
ea_find
(
e
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_COMMUNITY
))))
(
c
=
ea_find
(
e
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_COMMUNITY
))))
{
struct
adata
*
d
=
c
->
u
.
ptr
;
...
...
@@ -1570,7 +1570,7 @@ bgp_rt_notify(struct proto *P, struct channel *C, net *n, rte *new, rte *old, ea
static
inline
u32
bgp_get_neighbor
(
rte
*
r
)
{
eattr
*
e
=
ea_find
(
r
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_AS_PATH
));
eattr
*
e
=
ea_find
(
r
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_AS_PATH
));
u32
as
;
if
(
e
&&
as_path_get_first_regular
(
e
->
u
.
ptr
,
&
as
))
...
...
@@ -1612,8 +1612,8 @@ bgp_rte_better(rte *new, rte *old)
return
0
;
/* Start with local preferences */
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_LOCAL_PREF
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_LOCAL_PREF
));
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_LOCAL_PREF
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_LOCAL_PREF
));
n
=
x
?
x
->
u
.
data
:
new_bgp
->
cf
->
default_local_pref
;
o
=
y
?
y
->
u
.
data
:
old_bgp
->
cf
->
default_local_pref
;
if
(
n
>
o
)
...
...
@@ -1624,8 +1624,8 @@ bgp_rte_better(rte *new, rte *old)
/* RFC 4271 9.1.2.2. a) Use AS path lengths */
if
(
new_bgp
->
cf
->
compare_path_lengths
||
old_bgp
->
cf
->
compare_path_lengths
)
{
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_AS_PATH
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_AS_PATH
));
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_AS_PATH
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_AS_PATH
));
n
=
x
?
as_path_getlen
(
x
->
u
.
ptr
)
:
AS_PATH_MAXLEN
;
o
=
y
?
as_path_getlen
(
y
->
u
.
ptr
)
:
AS_PATH_MAXLEN
;
if
(
n
<
o
)
...
...
@@ -1635,8 +1635,8 @@ bgp_rte_better(rte *new, rte *old)
}
/* RFC 4271 9.1.2.2. b) Use origins */
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_ORIGIN
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_ORIGIN
));
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_ORIGIN
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_ORIGIN
));
n
=
x
?
x
->
u
.
data
:
ORIGIN_INCOMPLETE
;
o
=
y
?
y
->
u
.
data
:
ORIGIN_INCOMPLETE
;
if
(
n
<
o
)
...
...
@@ -1658,8 +1658,8 @@ bgp_rte_better(rte *new, rte *old)
if
(
new_bgp
->
cf
->
med_metric
||
old_bgp
->
cf
->
med_metric
||
(
bgp_get_neighbor
(
new
)
==
bgp_get_neighbor
(
old
)))
{
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_MULTI_EXIT_DISC
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_MULTI_EXIT_DISC
));
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_MULTI_EXIT_DISC
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_MULTI_EXIT_DISC
));
n
=
x
?
x
->
u
.
data
:
new_bgp
->
cf
->
default_med
;
o
=
y
?
y
->
u
.
data
:
old_bgp
->
cf
->
default_med
;
if
(
n
<
o
)
...
...
@@ -1684,8 +1684,8 @@ bgp_rte_better(rte *new, rte *old)
/* RFC 4271 9.1.2.2. f) Compare BGP identifiers */
/* RFC 4456 9. a) Use ORIGINATOR_ID instead of local neighbor ID */
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_ORIGINATOR_ID
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_ORIGINATOR_ID
));
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_ORIGINATOR_ID
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_ORIGINATOR_ID
));
n
=
x
?
x
->
u
.
data
:
new_bgp
->
remote_id
;
o
=
y
?
y
->
u
.
data
:
old_bgp
->
remote_id
;
...
...
@@ -1702,8 +1702,8 @@ bgp_rte_better(rte *new, rte *old)
return
0
;
/* RFC 4456 9. b) Compare cluster list lengths */
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_CLUSTER_LIST
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_CLUSTER_LIST
));
x
=
ea_find
(
new
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_CLUSTER_LIST
));
y
=
ea_find
(
old
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_CLUSTER_LIST
));
n
=
x
?
int_set_get_size
(
x
->
u
.
ptr
)
:
0
;
o
=
y
?
int_set_get_size
(
y
->
u
.
ptr
)
:
0
;
if
(
n
<
o
)
...
...
@@ -1733,8 +1733,8 @@ bgp_rte_mergable(rte *pri, rte *sec)
return
0
;
/* Start with local preferences */
x
=
ea_find
(
pri
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_LOCAL_PREF
));
y
=
ea_find
(
sec
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_LOCAL_PREF
));
x
=
ea_find
(
pri
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_LOCAL_PREF
));
y
=
ea_find
(
sec
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_LOCAL_PREF
));
p
=
x
?
x
->
u
.
data
:
pri_bgp
->
cf
->
default_local_pref
;
s
=
y
?
y
->
u
.
data
:
sec_bgp
->
cf
->
default_local_pref
;
if
(
p
!=
s
)
...
...
@@ -1743,8 +1743,8 @@ bgp_rte_mergable(rte *pri, rte *sec)
/* RFC 4271 9.1.2.2. a) Use AS path lengths */
if
(
pri_bgp
->
cf
->
compare_path_lengths
||
sec_bgp
->
cf
->
compare_path_lengths
)
{
x
=
ea_find
(
pri
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_AS_PATH
));
y
=
ea_find
(
sec
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_AS_PATH
));
x
=
ea_find
(
pri
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_AS_PATH
));
y
=
ea_find
(
sec
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_AS_PATH
));
p
=
x
?
as_path_getlen
(
x
->
u
.
ptr
)
:
AS_PATH_MAXLEN
;
s
=
y
?
as_path_getlen
(
y
->
u
.
ptr
)
:
AS_PATH_MAXLEN
;
...
...
@@ -1756,8 +1756,8 @@ bgp_rte_mergable(rte *pri, rte *sec)
}
/* RFC 4271 9.1.2.2. b) Use origins */
x
=
ea_find
(
pri
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_ORIGIN
));
y
=
ea_find
(
sec
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_ORIGIN
));
x
=
ea_find
(
pri
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_ORIGIN
));
y
=
ea_find
(
sec
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_ORIGIN
));
p
=
x
?
x
->
u
.
data
:
ORIGIN_INCOMPLETE
;
s
=
y
?
y
->
u
.
data
:
ORIGIN_INCOMPLETE
;
if
(
p
!=
s
)
...
...
@@ -1767,8 +1767,8 @@ bgp_rte_mergable(rte *pri, rte *sec)
if
(
pri_bgp
->
cf
->
med_metric
||
sec_bgp
->
cf
->
med_metric
||
(
bgp_get_neighbor
(
pri
)
==
bgp_get_neighbor
(
sec
)))
{
x
=
ea_find
(
pri
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_MULTI_EXIT_DISC
));
y
=
ea_find
(
sec
->
attrs
->
eattrs
,
EA_CODE
(
EAP
_BGP
,
BA_MULTI_EXIT_DISC
));
x
=
ea_find
(
pri
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_MULTI_EXIT_DISC
));
y
=
ea_find
(
sec
->
attrs
->
eattrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_MULTI_EXIT_DISC
));
p
=
x
?
x
->
u
.
data
:
pri_bgp
->
cf
->
default_med
;
s
=
y
?
y
->
u
.
data
:
sec_bgp
->
cf
->
default_med
;
if
(
p
!=
s
)
...
...
@@ -2009,8 +2009,8 @@ bgp_get_attr(eattr *a, byte *buf, int buflen)
void
bgp_get_route_info
(
rte
*
e
,
byte
*
buf
,
ea_list
*
attrs
)
{
eattr
*
p
=
ea_find
(
attrs
,
EA_CODE
(
EAP
_BGP
,
BA_AS_PATH
));
eattr
*
o
=
ea_find
(
attrs
,
EA_CODE
(
EAP
_BGP
,
BA_ORIGIN
));
eattr
*
p
=
ea_find
(
attrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_AS_PATH
));
eattr
*
o
=
ea_find
(
attrs
,
EA_CODE
(
PROTOCOL
_BGP
,
BA_ORIGIN
));
u32
origas
;
buf
+=
bsprintf
(
buf
,
" (%d"
,
e
->
pref
);
...
...
proto/bgp/bgp.c
View file @
ee7e2ffd
...
...
@@ -2148,7 +2148,7 @@ struct channel_class channel_bgp = {
struct
protocol
proto_bgp
=
{
.
name
=
"BGP"
,
.
template
=
"bgp%d"
,
.
attr_class
=
EAP
_BGP
,
.
class
=
PROTOCOL
_BGP
,
.
preference
=
DEF_PREF_BGP
,
.
channel_mask
=
NB_IP
|
NB_VPN
|
NB_FLOW
,
.
proto_size
=
sizeof
(
struct
bgp_proto
),
...
...
proto/bgp/bgp.h
View file @
ee7e2ffd
...
...
@@ -462,7 +462,7 @@ struct rte_source *bgp_get_source(struct bgp_proto *p, u32 path_id);
static
inline
eattr
*
bgp_find_attr
(
ea_list
*
attrs
,
uint
code
)
{
return
ea_find
(
attrs
,
EA_CODE
(
EAP
_BGP
,
code
));
return
ea_find
(
attrs
,
EA_CODE
(
PROTOCOL
_BGP
,
code
));
}
eattr
*
...
...
proto/bgp/config.Y
View file @
ee7e2ffd
...
...
@@ -253,29 +253,29 @@ bgp_proto_channel: bgp_channel_start bgp_channel_opt_list bgp_channel_end;
CF_ADDTO(dynamic_attr, BGP_ORIGIN
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_ENUM_BGP_ORIGIN, EA_CODE(
EAP
_BGP, BA_ORIGIN)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_ENUM_BGP_ORIGIN, EA_CODE(
PROTOCOL
_BGP, BA_ORIGIN)); })
CF_ADDTO(dynamic_attr, BGP_PATH
{ $$ = f_new_dynamic_attr(EAF_TYPE_AS_PATH, T_PATH, EA_CODE(
EAP
_BGP, BA_AS_PATH)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_AS_PATH, T_PATH, EA_CODE(
PROTOCOL
_BGP, BA_AS_PATH)); })
CF_ADDTO(dynamic_attr, BGP_NEXT_HOP
{ $$ = f_new_dynamic_attr(EAF_TYPE_IP_ADDRESS, T_IP, EA_CODE(
EAP
_BGP, BA_NEXT_HOP)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_IP_ADDRESS, T_IP, EA_CODE(
PROTOCOL
_BGP, BA_NEXT_HOP)); })
CF_ADDTO(dynamic_attr, BGP_MED
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(
EAP
_BGP, BA_MULTI_EXIT_DISC)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(
PROTOCOL
_BGP, BA_MULTI_EXIT_DISC)); })
CF_ADDTO(dynamic_attr, BGP_LOCAL_PREF
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(
EAP
_BGP, BA_LOCAL_PREF)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(
PROTOCOL
_BGP, BA_LOCAL_PREF)); })
CF_ADDTO(dynamic_attr, BGP_ATOMIC_AGGR
{ $$ = f_new_dynamic_attr(EAF_TYPE_OPAQUE, T_ENUM_EMPTY, EA_CODE(
EAP
_BGP, BA_ATOMIC_AGGR)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_OPAQUE, T_ENUM_EMPTY, EA_CODE(
PROTOCOL
_BGP, BA_ATOMIC_AGGR)); })
CF_ADDTO(dynamic_attr, BGP_AGGREGATOR
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(
EAP
_BGP, BA_AGGREGATOR)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(
PROTOCOL
_BGP, BA_AGGREGATOR)); })
CF_ADDTO(dynamic_attr, BGP_COMMUNITY
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT_SET, T_CLIST, EA_CODE(
EAP
_BGP, BA_COMMUNITY)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT_SET, T_CLIST, EA_CODE(
PROTOCOL
_BGP, BA_COMMUNITY)); })
CF_ADDTO(dynamic_attr, BGP_ORIGINATOR_ID
{ $$ = f_new_dynamic_attr(EAF_TYPE_ROUTER_ID, T_QUAD, EA_CODE(
EAP
_BGP, BA_ORIGINATOR_ID)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_ROUTER_ID, T_QUAD, EA_CODE(
PROTOCOL
_BGP, BA_ORIGINATOR_ID)); })
CF_ADDTO(dynamic_attr, BGP_CLUSTER_LIST
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT_SET, T_CLIST, EA_CODE(
EAP
_BGP, BA_CLUSTER_LIST)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT_SET, T_CLIST, EA_CODE(
PROTOCOL
_BGP, BA_CLUSTER_LIST)); })
CF_ADDTO(dynamic_attr, BGP_EXT_COMMUNITY
{ $$ = f_new_dynamic_attr(EAF_TYPE_EC_SET, T_ECLIST, EA_CODE(
EAP
_BGP, BA_EXT_COMMUNITY)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_EC_SET, T_ECLIST, EA_CODE(
PROTOCOL
_BGP, BA_EXT_COMMUNITY)); })
CF_ADDTO(dynamic_attr, BGP_LARGE_COMMUNITY
{ $$ = f_new_dynamic_attr(EAF_TYPE_LC_SET, T_LCLIST, EA_CODE(
EAP
_BGP, BA_LARGE_COMMUNITY)); })
{ $$ = f_new_dynamic_attr(EAF_TYPE_LC_SET, T_LCLIST, EA_CODE(
PROTOCOL
_BGP, BA_LARGE_COMMUNITY)); })
...
...
proto/ospf/ospf.c
View file @
ee7e2ffd
...
...
@@ -1463,7 +1463,7 @@ ospf_sh_lsadb(struct lsadb_show_data *ld)
struct
protocol
proto_ospf
=
{
.
name
=
"OSPF"
,
.
template
=
"ospf%d"
,
.
attr_class
=
EAP
_OSPF
,
.
class
=
PROTOCOL
_OSPF
,
.
preference
=
DEF_PREF_OSPF
,
.
channel_mask
=
NB_IP
,
.
proto_size
=
sizeof
(
struct
ospf_proto
),
...
...
proto/ospf/ospf.h
View file @
ee7e2ffd
...
...
@@ -863,10 +863,10 @@ struct lsadb_show_data {
};
#define EA_OSPF_METRIC1 EA_CODE(
EAP
_OSPF, 0)
#define EA_OSPF_METRIC2 EA_CODE(
EAP
_OSPF, 1)
#define EA_OSPF_TAG EA_CODE(
EAP
_OSPF, 2)
#define EA_OSPF_ROUTER_ID EA_CODE(
EAP
_OSPF, 3)
#define EA_OSPF_METRIC1 EA_CODE(
PROTOCOL
_OSPF, 0)
#define EA_OSPF_METRIC2 EA_CODE(
PROTOCOL
_OSPF, 1)
#define EA_OSPF_TAG EA_CODE(
PROTOCOL
_OSPF, 2)
#define EA_OSPF_ROUTER_ID EA_CODE(
PROTOCOL
_OSPF, 3)
/* ospf.c */
...
...
proto/pipe/pipe.c
View file @
ee7e2ffd
...
...
@@ -275,6 +275,7 @@ pipe_show_proto_info(struct proto *P)
struct
protocol
proto_pipe
=
{
.
name
=
"Pipe"
,
.
template
=
"pipe%d"
,
.
class
=
PROTOCOL_PIPE
,
.
proto_size
=
sizeof
(
struct
pipe_proto
),
.
config_size
=
sizeof
(
struct
pipe_config
),
.
postconfig
=
pipe_postconfig
,
...
...
proto/radv/radv.c
View file @
ee7e2ffd
...
...
@@ -762,7 +762,7 @@ radv_get_attr(eattr *a, byte *buf, int buflen UNUSED)
struct
protocol
proto_radv
=
{
.
name
=
"RAdv"
,
.
template
=
"radv%d"
,
.
attr_class
=
EAP
_RADV
,
.
class
=
PROTOCOL
_RADV
,
.
channel_mask
=
NB_IP6
,
.
proto_size
=
sizeof
(
struct
radv_proto
),
.
config_size
=
sizeof
(
struct
radv_config
),
...
...
proto/radv/radv.h
View file @
ee7e2ffd
...
...
@@ -192,8 +192,8 @@ struct radv_iface
#define RA_PREF_MASK 0x18
/* Attributes */
#define EA_RA_PREFERENCE EA_CODE(
EAP
_RADV, 0)
#define EA_RA_LIFETIME EA_CODE(
EAP
_RADV, 1)
#define EA_RA_PREFERENCE EA_CODE(
PROTOCOL
_RADV, 0)
#define EA_RA_LIFETIME EA_CODE(
PROTOCOL
_RADV, 1)
#ifdef LOCAL_DEBUG
#define RADV_FORCE_DEBUG 1
...
...
proto/rip/rip.c
View file @
ee7e2ffd
...
...
@@ -1274,7 +1274,7 @@ rip_dump(struct proto *P)
struct
protocol
proto_rip
=
{
.
name
=
"RIP"
,
.
template
=
"rip%d"
,
.
attr_class
=
EAP
_RIP
,
.
class
=
PROTOCOL
_RIP
,
.
preference
=
DEF_PREF_RIP
,
.
channel_mask
=
NB_IP
,
.
proto_size
=
sizeof
(
struct
rip_proto
),
...
...
proto/rip/rip.h
View file @
ee7e2ffd
...
...
@@ -182,8 +182,8 @@ struct rip_rte
#define RIP_ENTRY_VALID 1
/* Valid outgoing route */
#define RIP_ENTRY_STALE 2
/* Stale outgoing route, waiting for GC */
#define EA_RIP_METRIC EA_CODE(
EAP
_RIP, 0)
#define EA_RIP_TAG EA_CODE(
EAP
_RIP, 1)
#define EA_RIP_METRIC EA_CODE(
PROTOCOL
_RIP, 0)
#define EA_RIP_TAG EA_CODE(
PROTOCOL
_RIP, 1)
static
inline
int
rip_is_v2
(
struct
rip_proto
*
p
)
{
return
p
->
rip2
;
}
...
...
proto/rpki/rpki.c
View file @
ee7e2ffd
...
...
@@ -913,6 +913,7 @@ rpki_copy_config(struct proto_config *dest UNUSED, struct proto_config *src UNUS
struct
protocol
proto_rpki
=
{
.
name
=
"RPKI"
,
.
template
=
"rpki%d"
,
.
class
=
PROTOCOL_RPKI
,
.
preference
=
DEF_PREF_RPKI
,
.
proto_size
=
sizeof
(
struct
rpki_proto
),
.
config_size
=
sizeof
(
struct
rpki_config
),
...
...
proto/static/static.c
View file @
ee7e2ffd
...
...
@@ -656,6 +656,7 @@ static_show(struct proto *P)
struct
protocol
proto_static
=
{
.
name
=
"Static"
,
.
template
=
"static%d"
,
.
class
=
PROTOCOL_STATIC
,
.
preference
=
DEF_PREF_STATIC
,
.
channel_mask
=
NB_ANY
,
.
proto_size
=
sizeof
(
struct
static_proto
),
...
...
sysdep/linux/krt-sys.h
View file @
ee7e2ffd
...
...
@@ -34,9 +34,9 @@ static inline struct ifa * kif_get_primary_ip(struct iface *i UNUSED) { return N
#define KRT_ALLOW_MERGE_PATHS 1
#define EA_KRT_PREFSRC EA_CODE(
EAP_KRT
, 0x10)
#define EA_KRT_REALM EA_CODE(
EAP_KRT
, 0x11)
#define EA_KRT_SCOPE EA_CODE(
EAP_KRT
, 0x12)
#define EA_KRT_PREFSRC EA_CODE(
PROTOCOL_KERNEL
, 0x10)
#define EA_KRT_REALM EA_CODE(
PROTOCOL_KERNEL
, 0x11)
#define EA_KRT_SCOPE EA_CODE(
PROTOCOL_KERNEL
, 0x12)
#define KRT_METRICS_MAX 0x10
/* RTAX_QUICKACK+1 */
...
...
@@ -48,22 +48,22 @@ static inline struct ifa * kif_get_primary_ip(struct iface *i UNUSED) { return N
* Following attributes are parts of RTA_METRICS kernel route attribute, their
* ids must be consistent with their RTAX_* constants (+ KRT_METRICS_OFFSET)
*/
#define EA_KRT_METRICS EA_CODE(
EAP_KRT
, 0x20)
/* Dummy one */
#define EA_KRT_LOCK EA_CODE(
EAP_KRT
, 0x21)
#define EA_KRT_MTU EA_CODE(
EAP_KRT
, 0x22)
#define EA_KRT_WINDOW EA_CODE(
EAP_KRT
, 0x23)
#define EA_KRT_RTT EA_CODE(
EAP_KRT
, 0x24)
#define EA_KRT_RTTVAR EA_CODE(
EAP_KRT
, 0x25)
#define EA_KRT_SSTRESH EA_CODE(
EAP_KRT
, 0x26)
#define EA_KRT_CWND EA_CODE(
EAP_KRT
, 0x27)
#define EA_KRT_ADVMSS EA_CODE(
EAP_KRT
, 0x28)
#define EA_KRT_REORDERING EA_CODE(
EAP_KRT
, 0x29)
#define EA_KRT_HOPLIMIT EA_CODE(
EAP_KRT
, 0x2a)
#define EA_KRT_INITCWND EA_CODE(
EAP_KRT
, 0x2b)
#define EA_KRT_FEATURES EA_CODE(
EAP_KRT
, 0x2c)
#define EA_KRT_RTO_MIN EA_CODE(
EAP_KRT
, 0x2d)
#define EA_KRT_INITRWND EA_CODE(
EAP_KRT
, 0x2e)
#define EA_KRT_QUICKACK EA_CODE(
EAP_KRT
, 0x2f)
#define EA_KRT_METRICS EA_CODE(
PROTOCOL_KERNEL
, 0x20)
/* Dummy one */
#define EA_KRT_LOCK EA_CODE(
PROTOCOL_KERNEL
, 0x21)
#define EA_KRT_MTU EA_CODE(
PROTOCOL_KERNEL
, 0x22)
#define EA_KRT_WINDOW EA_CODE(
PROTOCOL_KERNEL
, 0x23)
#define EA_KRT_RTT EA_CODE(
PROTOCOL_KERNEL
, 0x24)
#define EA_KRT_RTTVAR EA_CODE(
PROTOCOL_KERNEL
, 0x25)
#define EA_KRT_SSTRESH EA_CODE(
PROTOCOL_KERNEL
, 0x26)
#define EA_KRT_CWND EA_CODE(
PROTOCOL_KERNEL
, 0x27)
#define EA_KRT_ADVMSS EA_CODE(
PROTOCOL_KERNEL
, 0x28)
#define EA_KRT_REORDERING EA_CODE(
PROTOCOL_KERNEL
, 0x29)
#define EA_KRT_HOPLIMIT EA_CODE(
PROTOCOL_KERNEL
, 0x2a)
#define EA_KRT_INITCWND EA_CODE(
PROTOCOL_KERNEL
, 0x2b)
#define EA_KRT_FEATURES EA_CODE(
PROTOCOL_KERNEL
, 0x2c)
#define EA_KRT_RTO_MIN EA_CODE(
PROTOCOL_KERNEL
, 0x2d)
#define EA_KRT_INITRWND EA_CODE(
PROTOCOL_KERNEL
, 0x2e)
#define EA_KRT_QUICKACK EA_CODE(
PROTOCOL_KERNEL
, 0x2f)
/* Bits of EA_KRT_LOCK, also based on RTAX_* constants */
#define EA_KRT_LOCK_MTU EA_KRT_LOCK | EA_BIT(0x2)
...
...
sysdep/linux/netlink.c
View file @
ee7e2ffd
...
...
@@ -1751,7 +1751,7 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h)
for
(
t
=
1
;
t
<
KRT_METRICS_MAX
;
t
++
)
if
(
metrics
[
0
]
&
(
1
<<
t
))
{
ea
->
attrs
[
n
].
id
=
EA_CODE
(
EAP_KRT
,
KRT_METRICS_OFFSET
+
t
);
ea
->
attrs
[
n
].
id
=
EA_CODE
(
PROTOCOL_KERNEL
,
KRT_METRICS_OFFSET
+
t
);
ea
->
attrs
[
n
].
flags
=
0
;
ea
->
attrs
[
n
].
type
=
EAF_TYPE_INT
;
/* FIXME: Some are EAF_TYPE_BITFIELD */
ea
->
attrs
[
n
].
u
.
data
=
metrics
[
t
];
...
...
sysdep/unix/krt.c
View file @
ee7e2ffd
...
...
@@ -232,6 +232,7 @@ kif_copy_config(struct proto_config *dest, struct proto_config *src)
struct
protocol
proto_unix_iface
=
{
.
name
=
"Device"
,
.
template
=
"device%d"
,
.
class
=
PROTOCOL_DEVICE
,
.
proto_size
=
sizeof
(
struct
kif_proto
),
.
config_size
=
sizeof
(
struct
kif_config
),
.
preconfig
=
kif_preconfig
,
...
...
@@ -1235,7 +1236,7 @@ krt_get_attr(eattr *a, byte *buf, int buflen)
struct
protocol
proto_unix_kernel
=
{
.
name
=
"Kernel"
,
.
template
=
"kernel%d"
,
.
attr_class
=
EAP_KRT
,
.
class
=
PROTOCOL_KERNEL
,
.
preference
=
DEF_PREF_INHERITED
,
.
channel_mask
=
NB_IP
|
MAYBE_IP6_SADR
|
MAYBE_MPLS
,
.
proto_size
=
sizeof
(
struct
krt_proto
),
...
...
sysdep/unix/krt.h
View file @
ee7e2ffd
...
...
@@ -30,8 +30,8 @@ struct kif_proto;
#define KRT_DEFAULT_ECMP_LIMIT 16
#define EA_KRT_SOURCE EA_CODE(
EAP_KRT
, 0)
#define EA_KRT_METRIC EA_CODE(
EAP_KRT
, 1)
#define EA_KRT_SOURCE EA_CODE(
PROTOCOL_KERNEL
, 0)
#define EA_KRT_METRIC EA_CODE(
PROTOCOL_KERNEL
, 1)
/* Whenever we recognize our own routes, we allow learing of foreign routes */
...
...
test/bt-utils.c
View file @
ee7e2ffd
...
...
@@ -75,8 +75,8 @@ bt_bird_init(void)
void
bt_bird_cleanup
(
void
)
{
for
(
int
i
=
0
;
i
<
EAP
_MAX
;
i
++
)
attr_
class_to_protocol
[
i
]
=
NULL
;
for
(
int
i
=
0
;
i
<
PROTOCOL_
_MAX
;
i
++
)
class_to_protocol
[
i
]
=
NULL
;
config
=
new_config
=
NULL
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment