Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
labs
BIRD Internet Routing Daemon
Commits
ffa398b8
Commit
ffa398b8
authored
Jul 19, 2015
by
Ondřej Zajíček
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
BFD: Fixes crash after socket error
Thanks to Thomas King for the bugreport.
parent
a8ad8fd6
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
22 additions
and
14 deletions
+22
-14
proto/bfd/bfd.c
proto/bfd/bfd.c
+16
-12
proto/bfd/packets.c
proto/bfd/packets.c
+6
-2
No files found.
proto/bfd/bfd.c
View file @
ffa398b8
...
...
@@ -43,7 +43,7 @@
* the needs of BFD sessions. When a new session is created, it requests a
* proper BFD interface by function bfd_get_iface(), which either finds an
* existing one in &iface_list (from &bfd_proto) or allocates a new one. When a
* session is removed, an associated iface is dicharged by bfd_free_iface().
* session is removed, an associated iface is di
s
charged by bfd_free_iface().
*
* BFD requests are the external API for the other protocols. When a protocol
* wants a BFD session, it calls bfd_request_session(), which creates a
...
...
@@ -62,7 +62,7 @@
* configuration (like static routes in the static protocol). BFD neighbors are
* handled by BFD protocol like it is a BFD client -- when a BFD neighbor is
* ready, the protocol just creates a BFD request like any other protocol.
*
*
* The protocol uses a new generic event loop (structure &birdloop) from |io.c|,
* which supports sockets, timers and events like the main loop. Timers
* (structure &timer2) are new microsecond based timers, while sockets and
...
...
@@ -129,11 +129,11 @@ static inline void bfd_notify_kick(struct bfd_proto *p);
* BFD sessions
*/
static
void
static
void
bfd_session_update_state
(
struct
bfd_session
*
s
,
uint
state
,
uint
diag
)
{
struct
bfd_proto
*
p
=
s
->
ifa
->
bfd
;
uint
old_state
=
s
->
loc_state
;
uint
old_state
=
s
->
loc_state
;
int
notify
;
if
(
state
==
old_state
)
...
...
@@ -201,8 +201,8 @@ bfd_session_control_tx_timer(struct bfd_session *s, int reset)
if
(
s
->
passive
&&
(
s
->
rem_id
==
0
))
goto
stop
;
if
(
s
->
rem_demand_mode
&&
!
s
->
poll_active
&&
if
(
s
->
rem_demand_mode
&&
!
s
->
poll_active
&&
(
s
->
loc_state
==
BFD_STATE_UP
)
&&
(
s
->
rem_state
==
BFD_STATE_UP
))
goto
stop
;
...
...
@@ -303,7 +303,7 @@ bfd_session_process_ctl(struct bfd_session *s, u8 flags, u32 old_tx_int, u32 old
bfd_send_ctl
(
s
->
ifa
->
bfd
,
s
,
1
);
}
static
void
static
void
bfd_session_timeout
(
struct
bfd_session
*
s
)
{
struct
bfd_proto
*
p
=
s
->
ifa
->
bfd
;
...
...
@@ -353,7 +353,7 @@ bfd_session_set_min_rx(struct bfd_session *s, u32 val)
if
(
val
==
s
->
req_min_rx_new
)
return
;
s
->
req_min_rx_new
=
val
;
s
->
req_min_rx_new
=
val
;
/* Postpone timer update if req_min_rx_int decreases and the session is up */
if
((
s
->
loc_state
!=
BFD_STATE_UP
)
||
(
val
>
s
->
req_min_rx_int
))
...
...
@@ -575,9 +575,13 @@ bfd_free_iface(struct bfd_iface *ifa)
if
(
!
ifa
||
--
ifa
->
uc
)
return
;
if
(
ifa
->
sk
)
{
sk_stop
(
ifa
->
sk
);
rfree
(
ifa
->
sk
);
}
rem_node
(
&
ifa
->
n
);
sk_stop
(
ifa
->
sk
);
rfree
(
ifa
->
sk
);
mb_free
(
ifa
);
}
...
...
@@ -873,7 +877,7 @@ bfd_notify_hook(sock *sk, int len)
diag
=
s
->
loc_diag
;
bfd_unlock_sessions
(
p
);
/* FIXME: convert to btime and move to bfd_session_update_state() */
/* FIXME: convert to btime and move to bfd_session_update_state() */
s
->
last_state_change
=
now
;
s
->
notify_running
=
1
;
...
...
@@ -1092,7 +1096,7 @@ bfd_show_sessions(struct proto *P)
/* FIXME: this is thread-unsafe, but perhaps harmless */
state
=
s
->
loc_state
;
diag
=
s
->
loc_diag
;
ifname
=
(
s
->
ifa
&&
s
->
ifa
->
sk
->
iface
)
?
s
->
ifa
->
sk
->
iface
->
name
:
"---"
;
ifname
=
(
s
->
ifa
&&
s
->
ifa
->
iface
)
?
s
->
ifa
->
iface
->
name
:
"---"
;
tx_int
=
s
->
last_tx
?
(
MAX
(
s
->
des_min_tx_int
,
s
->
rem_min_rx_int
)
TO_MS
)
:
0
;
timeout
=
(
MAX
(
s
->
req_min_rx_int
,
s
->
rem_min_tx_int
)
TO_MS
)
*
s
->
rem_detect_mult
;
...
...
proto/bfd/packets.c
View file @
ffa398b8
...
...
@@ -63,9 +63,13 @@ void
bfd_send_ctl
(
struct
bfd_proto
*
p
,
struct
bfd_session
*
s
,
int
final
)
{
sock
*
sk
=
s
->
ifa
->
sk
;
struct
bfd_ctl_packet
*
pkt
=
(
struct
bfd_ctl_packet
*
)
sk
->
tbuf
;
struct
bfd_ctl_packet
*
pkt
;
char
fb
[
8
];
if
(
!
sk
)
return
;
pkt
=
(
struct
bfd_ctl_packet
*
)
sk
->
tbuf
;
pkt
->
vdiag
=
bfd_pack_vdiag
(
1
,
s
->
loc_diag
);
pkt
->
flags
=
bfd_pack_flags
(
s
->
loc_state
,
0
);
pkt
->
detect_mult
=
s
->
detect_mult
;
...
...
@@ -139,7 +143,7 @@ bfd_rx_hook(sock *sk, int len)
u8
ps
=
bfd_pkt_get_state
(
pkt
);
if
(
ps
>
BFD_STATE_DOWN
)
DROP
(
"invalid init state"
,
ps
);
s
=
bfd_find_session_by_addr
(
p
,
sk
->
faddr
);
/* FIXME: better session matching and message */
...
...
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