Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
labs
BIRD Internet Routing Daemon
Commits
7a7ac656
Commit
7a7ac656
authored
Apr 08, 2016
by
Jan Moskyto Matejka
Browse files
Merge branch 'master' into int-new-channels
parents
4bdf1881
06edbb67
Changes
26
Hide whitespace changes
Inline
Side-by-side
doc/bird.sgml
View file @
7a7ac656
...
...
@@ -318,8 +318,9 @@ protocol rip {
<p><descrip>
<tag>include "<m/filename/"</tag>
This statement causes inclusion of a new file. <m/Filename/ could also
be a wildcard. The maximal depth is 8. Note that this statement could be
used anywhere in the config file, not just as a top-level option.
be a wildcard, in that case matching files are included in alphabetic
order. The maximal depth is 8. Note that this statement could be used
anywhere in the config file, not just as a top-level option.
<tag><label id="dsc-log">log "<m/filename/"|syslog [name <m/name/]|stderr all|{ <m/list of classes/ }</tag>
Set logging of messages having the given class (either <cf/all/ or
...
...
@@ -1119,9 +1120,12 @@ foot).
<cf><m/P/.last</cf> returns the last ASN (the source ASN) in path <m/P/.
<cf><m/P/.last_nonaggregated</cf> returns the last ASN in the non-aggregated part of the path <m/P/.
Both <cf/first/ and <cf/last/ return zero if there is no appropriate
ASN, for example if the path contains an AS set element as the first (or
the last) part.
the last) part. If the path ends with an AS set, <cf/last_nonaggregated/
may be used to get last ASN before any AS set.
<cf><m/P/.len</cf> returns the length of path <m/P/.
...
...
@@ -1859,6 +1863,11 @@ using the following configuration parameters:
in neighbor's implementation of 4B AS extension. Even when disabled
(off), BIRD behaves internally as AS4-aware BGP router. Default: on.
<tag>enable extended messages <m/switch/</tag>
The BGP protocol uses maximum message length of 4096 bytes. This option
provides an extension to allow extended messages with length up
to 65535 bytes. Default: off.
<tag>capabilities <m/switch/</tag>
Use capability advertisement to advertise optional capabilities. This is
standard behavior for newer BGP implementations, but there might be some
...
...
@@ -2054,7 +2063,7 @@ protocol bgp {
multihop; # ... which is connected indirectly
export filter { # We use non-trivial export rules
if source = RTS_STATIC then { # Export only static routes
# Assign our community
# Assign our community
bgp_community.add((65000,64501));
# Artificially increase path length
# by advertising local AS number twice
...
...
@@ -2263,7 +2272,7 @@ these attributes:
<tag>ip <cf/krt_prefsrc/</tag> (Linux)
The preferred source address. Used in source address selection for
outgoing packets. Has to be one of the IP addresses of the router.
outgoing packets. Has to be one of the IP addresses of the router.
<tag>int <cf/krt_realm/</tag> (Linux)
The realm of the route. Can be used for traffic classification.
...
...
@@ -2608,8 +2617,8 @@ protocol ospf <name> {
updates. Default value is 5.
<tag>priority <M>num</M></tag>
On every multiple access network (e.g., the Ethernet) Designed Router
and Backup Designed router are elected. These routers have some special
On every multiple access network (e.g., the Ethernet) Design
at
ed Router
and Backup Design
at
ed router are elected. These routers have some special
functions in the flooding process. Higher priority increases preferences
in this election. Routers with priority 0 are not eligible. Default
value is 1.
...
...
filter/config.Y
View file @
7a7ac656
...
...
@@ -282,7 +282,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
LEN,
DEFINED,
ADD, DELETE, CONTAINS, RESET,
PREPEND, FIRST, LAST, MATCH,
PREPEND, FIRST, LAST,
LAST_NONAGGREGATED,
MATCH,
EMPTY,
FILTER, WHERE, EVAL)
...
...
@@ -743,6 +743,7 @@ term:
| term '.' MASK '(' term ')' { $$ = f_new_inst(); $$->code = P('i','M'); $$->a1.p = $1; $$->a2.p = $5; }
| term '.' FIRST { $$ = f_new_inst(); $$->code = P('a','f'); $$->a1.p = $1; }
| term '.' LAST { $$ = f_new_inst(); $$->code = P('a','l'); $$->a1.p = $1; }
| term '.' LAST_NONAGGREGATED { $$ = f_new_inst(); $$->code = P('a','L'); $$->a1.p = $1; }
/* Communities */
/* This causes one shift/reduce conflict
...
...
filter/filter.c
View file @
7a7ac656
...
...
@@ -1056,6 +1056,14 @@ interpret(struct f_inst *what)
res
.
type
=
T_INT
;
res
.
val
.
i
=
as
;
break
;
case
P
(
'a'
,
'L'
):
/* Get last ASN from non-aggregated part of AS PATH */
ONEARG
;
if
(
v1
.
type
!=
T_PATH
)
runtime
(
"AS path expected"
);
res
.
type
=
T_INT
;
res
.
val
.
i
=
as_path_get_last_nonaggregated
(
v1
.
val
.
ad
);
break
;
case
'r'
:
ONEARG
;
res
=
v1
;
...
...
lib/lists.c
View file @
7a7ac656
...
...
@@ -41,7 +41,7 @@ add_tail(list *l, node *n)
{
node
*
z
=
l
->
tail
;
n
->
next
=
(
node
*
)
&
l
->
null
;
n
->
next
=
&
l
->
tail_node
;
n
->
prev
=
z
;
z
->
next
=
n
;
l
->
tail
=
n
;
...
...
@@ -60,7 +60,7 @@ add_head(list *l, node *n)
node
*
z
=
l
->
head
;
n
->
next
=
z
;
n
->
prev
=
(
node
*
)
&
l
->
head
;
n
->
prev
=
&
l
->
head
_node
;
z
->
prev
=
n
;
l
->
head
=
n
;
}
...
...
@@ -88,7 +88,7 @@ insert_node(node *n, node *after)
* rem_node - remove a node from a list
* @n: node to be removed
*
* Removes a node @n from the list it's linked in.
* Removes a node @n from the list it's linked in.
Afterwards, node @n is cleared.
*/
LIST_INLINE
void
rem_node
(
node
*
n
)
...
...
@@ -96,23 +96,6 @@ rem_node(node *n)
node
*
z
=
n
->
prev
;
node
*
x
=
n
->
next
;
z
->
next
=
x
;
x
->
prev
=
z
;
}
/**
* rem2_node - remove a node from a list, with cleanup
* @n: node to be removed
*
* Removes a node @n from the list it's linked in and resets its pointers to NULL.
* Useful if you want to distinguish between linked and unlinked nodes.
*/
LIST_INLINE
void
rem2_node
(
node
*
n
)
{
node
*
z
=
n
->
prev
;
node
*
x
=
n
->
next
;
z
->
next
=
x
;
x
->
prev
=
z
;
n
->
next
=
NULL
;
...
...
@@ -150,9 +133,9 @@ replace_node(node *old, node *new)
LIST_INLINE
void
init_list
(
list
*
l
)
{
l
->
head
=
(
node
*
)
&
l
->
null
;
l
->
head
=
&
l
->
tail_node
;
l
->
null
=
NULL
;
l
->
tail
=
(
node
*
)
&
l
->
head
;
l
->
tail
=
&
l
->
head
_node
;
}
/**
...
...
@@ -172,6 +155,6 @@ add_tail_list(list *to, list *l)
p
->
next
=
q
;
q
->
prev
=
p
;
q
=
l
->
tail
;
q
->
next
=
(
node
*
)
&
to
->
null
;
q
->
next
=
&
to
->
tail_node
;
to
->
tail
=
q
;
}
lib/lists.h
View file @
7a7ac656
...
...
@@ -26,10 +26,23 @@ typedef struct node {
struct
node
*
next
,
*
prev
;
}
node
;
typedef
struct
list
{
/* In fact two overlayed nodes */
struct
node
*
head
,
*
null
,
*
tail
;
typedef
union
list
{
/* In fact two overlayed nodes */
struct
{
/* Head node */
struct
node
head_node
;
void
*
head_padding
;
};
struct
{
/* Tail node */
void
*
tail_padding
;
struct
node
tail_node
;
};
struct
{
/* Split to separate pointers */
struct
node
*
head
;
struct
node
*
null
;
struct
node
*
tail
;
};
}
list
;
#define NODE (node *)
#define HEAD(list) ((void *)((list).head))
#define TAIL(list) ((void *)((list).tail))
...
...
@@ -64,7 +77,6 @@ typedef struct list { /* In fact two overlayed nodes */
void
add_tail
(
list
*
,
node
*
);
void
add_head
(
list
*
,
node
*
);
void
rem_node
(
node
*
);
void
rem2_node
(
node
*
);
void
add_tail_list
(
list
*
,
list
*
);
void
init_list
(
list
*
);
void
insert_node
(
node
*
,
node
*
);
...
...
lib/resource.c
View file @
7a7ac656
...
...
@@ -163,6 +163,7 @@ rfree(void *res)
if
(
r
->
n
.
next
)
rem_node
(
&
r
->
n
);
r
->
class
->
free
(
r
);
r
->
class
=
NULL
;
xfree
(
r
);
}
...
...
@@ -383,16 +384,9 @@ mb_allocz(pool *p, unsigned size)
void
*
mb_realloc
(
void
*
m
,
unsigned
size
)
{
struct
mblock
*
ob
=
NULL
;
if
(
m
)
{
ob
=
SKIP_BACK
(
struct
mblock
,
data
,
m
);
if
(
ob
->
r
.
n
.
next
)
rem_node
(
&
ob
->
r
.
n
);
}
struct
mblock
*
b
=
SKIP_BACK
(
struct
mblock
,
data
,
m
);
struct
mblock
*
b
=
xrealloc
(
o
b
,
sizeof
(
struct
mblock
)
+
size
);
b
=
xrealloc
(
b
,
sizeof
(
struct
mblock
)
+
size
);
replace_node
(
&
b
->
r
.
n
,
&
b
->
r
.
n
);
b
->
size
=
size
;
return
b
->
data
;
...
...
lib/socket.h
View file @
7a7ac656
...
...
@@ -27,6 +27,7 @@ typedef struct birdsock {
struct
iface
*
iface
;
/* Interface; specify this for broad/multicast sockets */
byte
*
rbuf
,
*
rpos
;
/* NULL=allocate automatically */
uint
fast_rx
;
/* RX has higher priority in event loop */
uint
rbsize
;
int
(
*
rx_hook
)(
struct
birdsock
*
,
int
size
);
/* NULL=receiving turned off, returns 1 to clear rx buffer */
...
...
nest/a-path.c
View file @
7a7ac656
...
...
@@ -220,7 +220,7 @@ as_path_get_last(struct adata *path, u32 *orig_as)
p
+=
BS
*
len
;
}
break
;
default:
bug
(
"
as_path_get_first:
Invalid path segment"
);
default:
bug
(
"Invalid path segment"
);
}
}
...
...
@@ -229,6 +229,35 @@ as_path_get_last(struct adata *path, u32 *orig_as)
return
found
;
}
u32
as_path_get_last_nonaggregated
(
struct
adata
*
path
)
{
u8
*
p
=
path
->
data
;
u8
*
q
=
p
+
path
->
length
;
u32
res
=
0
;
int
len
;
while
(
p
<
q
)
{
switch
(
*
p
++
)
{
case
AS_PATH_SET
:
return
res
;
case
AS_PATH_SEQUENCE
:
if
(
len
=
*
p
++
)
res
=
get_as
(
p
+
BS
*
(
len
-
1
));
p
+=
BS
*
len
;
break
;
default:
bug
(
"Invalid path segment"
);
}
}
return
res
;
}
int
as_path_get_first
(
struct
adata
*
path
,
u32
*
last_as
)
{
...
...
nest/attrs.h
View file @
7a7ac656
...
...
@@ -35,6 +35,7 @@ int as_path_getlen(struct adata *path);
int
as_path_getlen_int
(
struct
adata
*
path
,
int
bs
);
int
as_path_get_first
(
struct
adata
*
path
,
u32
*
orig_as
);
int
as_path_get_last
(
struct
adata
*
path
,
u32
*
last_as
);
u32
as_path_get_last_nonaggregated
(
struct
adata
*
path
);
int
as_path_contains
(
struct
adata
*
path
,
u32
as
,
int
min
);
int
as_path_match_set
(
struct
adata
*
path
,
struct
f_tree
*
set
);
struct
adata
*
as_path_filter
(
struct
linpool
*
pool
,
struct
adata
*
path
,
struct
f_tree
*
set
,
u32
key
,
int
pos
);
...
...
nest/config.Y
View file @
7a7ac656
...
...
@@ -112,7 +112,7 @@ idval:
else if (($1->class == (SYM_CONSTANT | T_IP)) && ipa_is_ip4(SYM_VAL($1).ip))
$$ = ipa_to_u32(SYM_VAL($1).ip);
else
cf_error("Number o
f
IPv4 address constant expected");
cf_error("Number o
r
IPv4 address constant expected");
}
;
...
...
nest/proto.c
View file @
7a7ac656
...
...
@@ -264,6 +264,7 @@ channel_stop_export(struct channel *c)
rt_feed_channel_abort
(
c
);
c
->
export_state
=
ES_DOWN
;
c
->
stats
.
exp_routes
=
0
;
}
static
void
...
...
@@ -299,7 +300,7 @@ channel_do_flush(struct channel *c)
static
void
channel_do_down
(
struct
channel
*
c
)
{
rem
2
_node
(
&
c
->
table_node
);
rem_node
(
&
c
->
table_node
);
rt_unlock_table
(
c
->
table
);
c
->
proto
->
active_channels
--
;
...
...
nest/route.h
View file @
7a7ac656
...
...
@@ -232,8 +232,8 @@ typedef struct rte {
struct
{
/* Routes generated by krt sync (both temporary and inherited ones) */
s8
src
;
/* Alleged route source (see krt.h) */
u8
proto
;
/* Kernel source protocol ID */
u8
type
;
/* Kernel route type */
u8
seen
;
/* Seen during last scan */
u8
best
;
/* Best route in network, propagated to core */
u32
metric
;
/* Kernel metric */
}
krt
;
}
u
;
...
...
proto/bfd/bfd.c
View file @
7a7ac656
...
...
@@ -872,7 +872,7 @@ bfd_notify_hook(sock *sk, int len)
WALK_LIST_FIRST
(
s
,
tmp_list
)
{
bfd_lock_sessions
(
p
);
rem
2
_node
(
&
s
->
n
);
rem_node
(
&
s
->
n
);
state
=
s
->
loc_state
;
diag
=
s
->
loc_diag
;
bfd_unlock_sessions
(
p
);
...
...
proto/bfd/io.c
View file @
7a7ac656
...
...
@@ -576,7 +576,7 @@ sockets_close_fds(struct birdloop *loop)
loop
->
close_scheduled
=
0
;
}
int
sk_read
(
sock
*
s
);
int
sk_read
(
sock
*
s
,
int
revents
);
int
sk_write
(
sock
*
s
);
static
void
...
...
@@ -605,7 +605,7 @@ sockets_fire(struct birdloop *loop)
if
(
pfd
->
revents
&
POLLIN
)
while
(
e
&&
*
psk
&&
(
*
psk
)
->
rx_hook
)
e
=
sk_read
(
*
psk
);
e
=
sk_read
(
*
psk
,
0
);
e
=
1
;
if
(
pfd
->
revents
&
POLLOUT
)
...
...
proto/bgp/bgp.c
View file @
7a7ac656
...
...
@@ -374,6 +374,8 @@ bgp_conn_enter_established_state(struct bgp_conn *conn)
if
(
ipa_zero
(
p
->
source_addr
))
p
->
source_addr
=
conn
->
sk
->
saddr
;
conn
->
sk
->
fast_rx
=
0
;
p
->
conn
=
conn
;
p
->
last_error_class
=
0
;
p
->
last_error_code
=
0
;
...
...
@@ -666,6 +668,10 @@ bgp_keepalive_timeout(timer *t)
DBG
(
"BGP: Keepalive timer
\n
"
);
bgp_schedule_packet
(
conn
,
PKT_KEEPALIVE
);
/* Kick TX a bit faster */
if
(
ev_active
(
conn
->
tx_ev
))
ev_run
(
conn
->
tx_ev
);
}
static
void
...
...
@@ -696,6 +702,7 @@ bgp_setup_sk(struct bgp_conn *conn, sock *s)
{
s
->
data
=
conn
;
s
->
err_hook
=
bgp_sock_err
;
s
->
fast_rx
=
1
;
conn
->
sk
=
s
;
}
...
...
@@ -813,7 +820,13 @@ bgp_incoming_connection(sock *sk, int dummy UNUSED)
return
0
;
}
/* We are in proper state and there is no other incoming connection */
/*
* BIRD should keep multiple incoming connections in OpenSent state (for
* details RFC 4271 8.2.1 par 3), but it keeps just one. Duplicate incoming
* connections are rejected istead. The exception is the case where an
* incoming connection triggers a graceful restart.
*/
acc
=
(
p
->
p
.
proto_state
==
PS_START
||
p
->
p
.
proto_state
==
PS_UP
)
&&
(
p
->
start_state
>=
BSS_CONNECT
)
&&
(
!
p
->
incoming_conn
.
sk
);
...
...
@@ -823,6 +836,10 @@ bgp_incoming_connection(sock *sk, int dummy UNUSED)
bgp_handle_graceful_restart
(
p
);
bgp_conn_enter_idle_state
(
p
->
conn
);
acc
=
1
;
/* There might be separate incoming connection in OpenSent state */
if
(
p
->
incoming_conn
.
state
>
BS_ACTIVE
)
bgp_close_conn
(
&
p
->
incoming_conn
);
}
BGP_TRACE
(
D_EVENTS
,
"Incoming connection from %I%J (port %d) %s"
,
...
...
proto/bgp/packets.c
View file @
7a7ac656
...
...
@@ -163,6 +163,14 @@ bgp_put_cap_rr(struct bgp_proto *p UNUSED, byte *buf)
return
buf
;
}
static
byte
*
bgp_put_cap_ext_msg
(
struct
bgp_proto
*
p
UNUSED
,
byte
*
buf
)
{
*
buf
++
=
6
;
/* Capability 6: Support for extended messages */
*
buf
++
=
0
;
/* Capability data length */
return
buf
;
}
static
byte
*
bgp_put_cap_gr1
(
struct
bgp_proto
*
p
,
byte
*
buf
)
{
...
...
@@ -223,14 +231,6 @@ bgp_put_cap_err(struct bgp_proto *p UNUSED, byte *buf)
return
buf
;
}
static
byte
*
bgp_put_cap_ext_msg
(
struct
bgp_proto
*
p
UNUSED
,
byte
*
buf
)
{
*
buf
++
=
230
;
/* Capability TBD: Support for extended messages */
*
buf
++
=
0
;
/* Capability data length */
return
buf
;
}
static
byte
*
bgp_create_open
(
struct
bgp_conn
*
conn
,
byte
*
buf
)
...
...
@@ -827,6 +827,12 @@ bgp_parse_capabilities(struct bgp_conn *conn, byte *opt, int len)
conn
->
peer_refresh_support
=
1
;
break
;
case
6
:
/* Extended message length capability, draft */
if
(
cl
!=
0
)
goto
err
;
conn
->
peer_ext_messages_support
=
1
;
break
;
case
64
:
/* Graceful restart capability, RFC 4724 */
if
(
cl
%
4
!=
2
)
goto
err
;
...
...
@@ -867,12 +873,6 @@ bgp_parse_capabilities(struct bgp_conn *conn, byte *opt, int len)
conn
->
peer_enhanced_refresh_support
=
1
;
break
;
case
230
:
/* Extended message length capability, draft, cap number TBD */
if
(
cl
!=
0
)
goto
err
;
conn
->
peer_ext_messages_support
=
1
;
break
;
/* We can safely ignore all other capabilities */
}
len
-=
2
+
cl
;
...
...
proto/ospf/iface.c
View file @
7a7ac656
...
...
@@ -595,10 +595,10 @@ ospf_iface_new(struct ospf_area *oa, struct ifa *addr, struct ospf_iface_patt *i
if
(
ospf_is_v2
(
p
)
&&
(
ifa
->
type
==
OSPF_IT_NBMA
)
&&
(
addr
->
flags
&
IA_PEER
))
ifa
->
type
=
OSPF_IT_PTMP
;
if
((
ifa
->
type
==
OSPF_IT_BCAST
)
&&
!
(
iface
->
flags
&
if_multi_flag
))
if
((
ifa
->
type
==
OSPF_IT_BCAST
)
&&
!
(
iface
->
flags
&
if_multi_flag
)
&&
!
ifa
->
stub
)
ifa
->
type
=
OSPF_IT_NBMA
;
if
((
ifa
->
type
==
OSPF_IT_PTP
)
&&
!
(
iface
->
flags
&
if_multi_flag
))
if
((
ifa
->
type
==
OSPF_IT_PTP
)
&&
!
(
iface
->
flags
&
if_multi_flag
)
&&
!
ifa
->
stub
)
ifa
->
type
=
OSPF_IT_PTMP
;
if
(
ifa
->
type
!=
old_type
)
...
...
proto/ospf/neighbor.c
View file @
7a7ac656
...
...
@@ -108,6 +108,7 @@ ospf_neigh_down(struct ospf_neighbor *n)
{
struct
ospf_iface
*
ifa
=
n
->
ifa
;
struct
ospf_proto
*
p
=
ifa
->
oa
->
po
;
u32
rid
=
n
->
rid
;
if
((
ifa
->
type
==
OSPF_IT_NBMA
)
||
(
ifa
->
type
==
OSPF_IT_PTMP
))
{
...
...
@@ -121,7 +122,7 @@ ospf_neigh_down(struct ospf_neighbor *n)
rem_node
(
NODE
n
);
rfree
(
n
->
pool
);
OSPF_TRACE
(
D_EVENTS
,
"Neighbor %R on %s removed"
,
n
->
rid
,
ifa
->
ifname
);
OSPF_TRACE
(
D_EVENTS
,
"Neighbor %R on %s removed"
,
rid
,
ifa
->
ifname
);
}
/**
...
...
proto/ospf/topology.c
View file @
7a7ac656
...
...
@@ -278,7 +278,7 @@ ospf_originate_lsa(struct ospf_proto *p, struct ospf_new_lsa *lsa)
if
(
!
SNODE_VALID
(
en
))
s_add_tail
(
&
p
->
lsal
,
SNODE
en
);
if
(
en
->
lsa_body
==
NULL
)
if
(
!
en
->
nf
||
!
en
->
lsa_body
)
en
->
nf
=
lsa
->
nf
;
if
(
en
->
nf
!=
lsa
->
nf
)
...
...
proto/rip/config.Y
View file @
7a7ac656
...
...
@@ -137,7 +137,7 @@ rip_iface_item:
| TIMEOUT TIME expr { RIP_IFACE->timeout_time = $3; if ($3<=0) cf_error("Timeout time must be positive"); }
| GARBAGE TIME expr { RIP_IFACE->garbage_time = $3; if ($3<=0) cf_error("Garbage time must be positive"); }
| ECMP WEIGHT expr { RIP_IFACE->ecmp_weight = $3 - 1; if (($3<1) || ($3>256)) cf_error("ECMP weight must be in range 1-256"); }
| RX BUFFER expr { RIP_IFACE->rx_buffer = $3; if (($3<256) || ($3>65535)) cf_error("
T
X length must be in range 256-65535"); }
| RX BUFFER expr { RIP_IFACE->rx_buffer = $3; if (($3<256) || ($3>65535)) cf_error("
R
X length must be in range 256-65535"); }
| TX LENGTH expr { RIP_IFACE->tx_length = $3; if (($3<256) || ($3>65535)) cf_error("TX length must be in range 256-65535"); }
| TX tos { RIP_IFACE->tx_tos = $2; }
| TX PRIORITY expr { RIP_IFACE->tx_priority = $3; }
...
...
Prev
1
2
Next
Write
Preview
Supports
Markdown
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