X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/7d862d168f6e9784fb60998b6ffd7e3aabf2a6ca..658f6aea7b968c7db3a1c2be58c62efb091c3984:/bgp.c?ds=inline diff --git a/bgp.c b/bgp.c index 04ff767..36894be 100644 --- a/bgp.c +++ b/bgp.c @@ -10,8 +10,6 @@ * nor RFC2385 (which requires a kernel patch on 2.4 kernels). */ -char const *cvs_id_bgp = "$Id: bgp.c,v 1.12 2005/09/02 23:39:36 bodea Exp $"; - #include #include #include @@ -22,6 +20,7 @@ char const *cvs_id_bgp = "$Id: bgp.c,v 1.12 2005/09/02 23:39:36 bodea Exp $"; #include #include #include +#include #include "l2tpns.h" #include "bgp.h" @@ -29,7 +28,6 @@ char const *cvs_id_bgp = "$Id: bgp.c,v 1.12 2005/09/02 23:39:36 bodea Exp $"; static void bgp_clear(struct bgp_peer *peer); static void bgp_set_retry(struct bgp_peer *peer); -static void bgp_cidr(in_addr_t ip, in_addr_t mask, struct bgp_ip_prefix *pfx); static struct bgp_route_list *bgp_insert_route(struct bgp_route_list *head, struct bgp_route_list *new); static struct bgp_route6_list *bgp_insert_route6(struct bgp_route6_list *head, @@ -394,26 +392,6 @@ static void bgp_set_retry(struct bgp_peer *peer) bgp_halt(peer); /* give up */ } -/* convert ip/mask to CIDR notation */ -static void bgp_cidr(in_addr_t ip, in_addr_t mask, struct bgp_ip_prefix *pfx) -{ - int i; - uint32_t b; - - /* convert to prefix notation */ - pfx->len = 32; - pfx->prefix = ip; - - if (!mask) /* bogus */ - mask = 0xffffffff; - - for (i = 0; i < 32 && ((b = ntohl(1 << i)), !(mask & b)); i++) - { - pfx->len--; - pfx->prefix &= ~b; - } -} - /* insert route into list; sorted */ static struct bgp_route_list *bgp_insert_route(struct bgp_route_list *head, struct bgp_route_list *new) @@ -475,13 +453,14 @@ static struct bgp_route6_list *bgp_insert_route6(struct bgp_route6_list *head, * that if that route is later deleted we don't have to be concerned * about adding back the more specific one). */ -int bgp_add_route(in_addr_t ip, in_addr_t mask) +int bgp_add_route(in_addr_t ip, int prefixlen) { struct bgp_route_list *r = bgp_routes; struct bgp_route_list add; int i; - bgp_cidr(ip, mask, &add.dest); + add.dest.prefix = ip; + add.dest.len = prefixlen; add.next = 0; /* check for duplicate */ @@ -574,14 +553,15 @@ int bgp_add_route6(struct in6_addr ip, int prefixlen) } /* remove route from list for peers */ -int bgp_del_route(in_addr_t ip, in_addr_t mask) +int bgp_del_route(in_addr_t ip, int prefixlen) { struct bgp_route_list *r = bgp_routes; struct bgp_route_list *e = 0; struct bgp_route_list del; int i; - bgp_cidr(ip, mask, &del.dest); + del.dest.prefix = ip; + del.dest.len = prefixlen; del.next = 0; /* find entry in routes list and remove */ @@ -833,6 +813,7 @@ int bgp_process(uint32_t events[]) return 1; } +/* process bgp timers only */ void bgp_process_peers_timers() { int i; @@ -841,7 +822,14 @@ void bgp_process_peers_timers() return; for (i = 0; i < BGP_NUM_PEERS; i++) - bgp_process_timers(&bgp_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)