X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/1c898f7017d2f3bfc07dfdadd077d70ccf6066c1..49f8ea66ee9a729eeaadf8d8bc4dcbeb3ca10835:/bgp.c diff --git a/bgp.c b/bgp.c index 600c950..80a445e 100644 --- a/bgp.c +++ b/bgp.c @@ -35,6 +35,7 @@ static struct bgp_route_list *bgp_insert_route(struct bgp_route_list *head, static struct bgp_route6_list *bgp_insert_route6(struct bgp_route6_list *head, struct bgp_route6_list *new); +static void bgp_process_timers(struct bgp_peer *peer); static void bgp_free_routes(struct bgp_route_list *routes); static void bgp_free_routes6(struct bgp_route6_list *routes); static char const *bgp_msg_type_str(uint8_t type); @@ -826,35 +827,59 @@ int bgp_process(uint32_t events[]) } /* process timers */ - if (peer->state == Established) - { - if (time_now > peer->expire_time) - { - LOG(1, 0, 0, "No message from BGP peer %s in %ds\n", - peer->name, peer->hold); + bgp_process_timers(peer); + } - bgp_send_notification(peer, BGP_ERR_HOLD_TIMER_EXP, 0); - continue; - } + return 1; +} - if (time_now > peer->keepalive_time && !peer->outbuf->packet.header.len) - bgp_send_keepalive(peer); - } - else if (peer->state == Idle) - { - if (time_now > peer->retry_time) - bgp_connect(peer); - } - else if (time_now > peer->state_time + BGP_STATE_TIME) +/* process bgp timers only */ +void bgp_process_peers_timers() +{ + int i; + + if (!bgp_configured) + return; + + for (i = 0; i < BGP_NUM_PEERS; i++) + { + struct bgp_peer *peer = &bgp_peers[i]; + + if (peer->state == Disabled) + continue; + + bgp_process_timers(peer); + } +} + +static void bgp_process_timers(struct bgp_peer *peer) +{ + if (peer->state == Established) + { + if (time_now > peer->expire_time) { - LOG(1, 0, 0, "%s timer expired for BGP peer %s\n", - bgp_state_str(peer->state), peer->name); + LOG(1, 0, 0, "No message from BGP peer %s in %ds\n", + peer->name, peer->hold); - bgp_restart(peer); + bgp_send_notification(peer, BGP_ERR_HOLD_TIMER_EXP, 0); + return; } + + if (time_now > peer->keepalive_time && !peer->outbuf->packet.header.len) + bgp_send_keepalive(peer); + } + else if (peer->state == Idle) + { + if (time_now > peer->retry_time) + bgp_connect(peer); } + else if (time_now > peer->state_time + BGP_STATE_TIME) + { + LOG(1, 0, 0, "%s timer expired for BGP peer %s\n", + bgp_state_str(peer->state), peer->name); - return 1; + bgp_restart(peer); + } } static void bgp_free_routes(struct bgp_route_list *routes) @@ -1383,7 +1408,11 @@ static int bgp_send_open(struct bgp_peer *peer) data.version = BGP_VERSION; data.as = htons(our_as); data.hold_time = htons(peer->hold); - data.identifier = my_address; + /* use the source IP we use as identifier, if available */ + if (peer->source_addr != INADDR_ANY) + data.identifier = peer->source_addr; + else + data.identifier = my_address; /* if we know peer doesn't support MP (mp_handling == DoesntHandleIPv6Routes) then don't add this parameter */