]> git.proxmox.com Git - mirror_frr.git/blobdiff - ldpd/neighbor.c
Merge pull request #3405 from LabNConsulting/working/master/fix-vrf
[mirror_frr.git] / ldpd / neighbor.c
index 9a92a00d32327a811ae39888ee26ccac8b602e93..78a6131ca404f6e2f15a00c9cca73ee01988cbec 100644 (file)
 #include "lde.h"
 #include "log.h"
 
-static __inline int     nbr_id_compare(struct nbr *, struct nbr *);
-static __inline int     nbr_addr_compare(struct nbr *, struct nbr *);
-static __inline int     nbr_pid_compare(struct nbr *, struct nbr *);
+static __inline int     nbr_id_compare(const struct nbr *, const struct nbr *);
+static __inline int     nbr_addr_compare(const struct nbr *,
+                           const struct nbr *);
+static __inline int     nbr_pid_compare(const struct nbr *,
+                           const struct nbr *);
 static void             nbr_update_peerid(struct nbr *);
 static int              nbr_ktimer(struct thread *);
 static void             nbr_start_ktimer(struct nbr *);
@@ -39,8 +41,8 @@ static void            nbr_start_itimeout(struct nbr *);
 static int              nbr_idtimer(struct thread *);
 static int              nbr_act_session_operational(struct nbr *);
 static void             nbr_send_labelmappings(struct nbr *);
-static __inline int     nbr_params_compare(struct nbr_params *,
-                           struct nbr_params *);
+static __inline int     nbr_params_compare(const struct nbr_params *,
+                           const struct nbr_params *);
 
 RB_GENERATE(nbr_id_head, nbr, id_tree, nbr_id_compare)
 RB_GENERATE(nbr_addr_head, nbr, addr_tree, nbr_addr_compare)
@@ -101,13 +103,13 @@ struct nbr_addr_head nbrs_by_addr = RB_INITIALIZER(&nbrs_by_addr);
 struct nbr_pid_head nbrs_by_pid = RB_INITIALIZER(&nbrs_by_pid);
 
 static __inline int
-nbr_id_compare(struct nbr *a, struct nbr *b)
+nbr_id_compare(const struct nbr *a, const struct nbr *b)
 {
        return (ntohl(a->id.s_addr) - ntohl(b->id.s_addr));
 }
 
 static __inline int
-nbr_addr_compare(struct nbr *a, struct nbr *b)
+nbr_addr_compare(const struct nbr *a, const struct nbr *b)
 {
        if (a->af < b->af)
                return (-1);
@@ -118,7 +120,7 @@ nbr_addr_compare(struct nbr *a, struct nbr *b)
 }
 
 static __inline int
-nbr_pid_compare(struct nbr *a, struct nbr *b)
+nbr_pid_compare(const struct nbr *a, const struct nbr *b)
 {
        return (a->peerid - b->peerid);
 }
@@ -229,7 +231,7 @@ nbr_new(struct in_addr id, int af, int ds_tlv, union ldpd_addr *addr,
        if ((nbr = calloc(1, sizeof(*nbr))) == NULL)
                fatal(__func__);
 
-       RB_INIT(&nbr->adj_tree);
+       RB_INIT(nbr_adj_head, &nbr->adj_tree);
        nbr->state = NBR_STA_PRESENT;
        nbr->peerid = 0;
        nbr->af = af;
@@ -287,6 +289,8 @@ nbr_new(struct in_addr id, int af, int ds_tlv, union ldpd_addr *addr,
 void
 nbr_del(struct nbr *nbr)
 {
+       struct adj              *adj;
+
        log_debug("%s: lsr-id %s", __func__, inet_ntoa(nbr->id));
 
        nbr_fsm(nbr, NBR_EVT_CLOSE_SESSION);
@@ -312,6 +316,13 @@ nbr_del(struct nbr *nbr)
        mapping_list_clr(&nbr->release_list);
        mapping_list_clr(&nbr->abortreq_list);
 
+       while (!RB_EMPTY(nbr_adj_head, &nbr->adj_tree)) {
+               adj = RB_ROOT(nbr_adj_head, &nbr->adj_tree);
+
+               adj->nbr = NULL;
+               RB_REMOVE(nbr_adj_head, &nbr->adj_tree, adj);
+       }
+
        if (nbr->peerid)
                RB_REMOVE(nbr_pid_head, &nbrs_by_pid, nbr);
        RB_REMOVE(nbr_id_head, &nbrs_by_id, nbr);
@@ -408,7 +419,8 @@ nbr_start_ktimer(struct nbr *nbr)
        /* send three keepalives per period */
        secs = nbr->keepalive / KEEPALIVE_PER_PERIOD;
        THREAD_TIMER_OFF(nbr->keepalive_timer);
-       nbr->keepalive_timer = thread_add_timer(master, nbr_ktimer, nbr, secs);
+       nbr->keepalive_timer = NULL;
+       thread_add_timer(master, nbr_ktimer, nbr, secs, &nbr->keepalive_timer);
 }
 
 void
@@ -437,8 +449,9 @@ static void
 nbr_start_ktimeout(struct nbr *nbr)
 {
        THREAD_TIMER_OFF(nbr->keepalive_timeout);
-       nbr->keepalive_timeout = thread_add_timer(master, nbr_ktimeout, nbr,
-           nbr->keepalive);
+       nbr->keepalive_timeout = NULL;
+       thread_add_timer(master, nbr_ktimeout, nbr, nbr->keepalive,
+                        &nbr->keepalive_timeout);
 }
 
 void
@@ -468,7 +481,8 @@ nbr_start_itimeout(struct nbr *nbr)
 
        secs = INIT_FSM_TIMEOUT;
        THREAD_TIMER_OFF(nbr->init_timeout);
-       nbr->init_timeout = thread_add_timer(master, nbr_itimeout, nbr, secs);
+       nbr->init_timeout = NULL;
+       thread_add_timer(master, nbr_itimeout, nbr, secs, &nbr->init_timeout);
 }
 
 void
@@ -516,7 +530,9 @@ nbr_start_idtimer(struct nbr *nbr)
        }
 
        THREAD_TIMER_OFF(nbr->initdelay_timer);
-       nbr->initdelay_timer = thread_add_timer(master, nbr_idtimer, nbr, secs);
+       nbr->initdelay_timer = NULL;
+       thread_add_timer(master, nbr_idtimer, nbr, secs,
+                        &nbr->initdelay_timer);
 }
 
 void
@@ -568,8 +584,8 @@ nbr_connect_cb(struct thread *thread)
 int
 nbr_establish_connection(struct nbr *nbr)
 {
-       struct sockaddr_storage  local_sa;
-       struct sockaddr_storage  remote_sa;
+       union sockunion          local_su;
+       union sockunion          remote_su;
        struct adj              *adj;
        struct nbr_params       *nbrp;
 #ifdef __OpenBSD__
@@ -603,16 +619,14 @@ nbr_establish_connection(struct nbr *nbr)
 #endif
        }
 
-       memcpy(&local_sa, addr2sa(nbr->af, &nbr->laddr, 0), sizeof(local_sa));
-       memcpy(&remote_sa, addr2sa(nbr->af, &nbr->raddr, LDP_PORT),
-           sizeof(local_sa));
+       addr2sa(nbr->af, &nbr->laddr, 0, &local_su);
+       addr2sa(nbr->af, &nbr->raddr, LDP_PORT, &remote_su);
        if (nbr->af == AF_INET6 && nbr->raddr_scope)
-               addscope((struct sockaddr_in6 *)&remote_sa, nbr->raddr_scope);
+               addscope(&remote_su.sin6, nbr->raddr_scope);
 
-       if (bind(nbr->fd, (struct sockaddr *)&local_sa,
-           sockaddr_len((struct sockaddr *)&local_sa)) == -1) {
+       if (bind(nbr->fd, &local_su.sa, sockaddr_len(&local_su.sa)) == -1) {
                log_warn("%s: error while binding socket to %s", __func__,
-                   log_sockaddr((struct sockaddr *)&local_sa));
+                        log_sockaddr(&local_su.sa));
                close(nbr->fd);
                return (-1);
        }
@@ -630,15 +644,15 @@ nbr_establish_connection(struct nbr *nbr)
                send_hello(adj->source.type, adj->source.link.ia,
                    adj->source.target);
 
-       if (connect(nbr->fd, (struct sockaddr *)&remote_sa,
-           sockaddr_len((struct sockaddr *)&remote_sa)) == -1) {
+       if (connect(nbr->fd, &remote_su.sa, sockaddr_len(&remote_su.sa))
+           == -1) {
                if (errno == EINPROGRESS) {
-                       THREAD_WRITE_ON(master, nbr->ev_connect, nbr_connect_cb,
-                           nbr, nbr->fd);
+                       thread_add_write(master, nbr_connect_cb, nbr, nbr->fd,
+                                        &nbr->ev_connect);
                        return (0);
                }
                log_warn("%s: error while connecting to %s", __func__,
-                   log_sockaddr((struct sockaddr *)&remote_sa));
+                        log_sockaddr(&remote_su.sa));
                close(nbr->fd);
                return (-1);
        }
@@ -759,7 +773,7 @@ nbr_send_labelmappings(struct nbr *nbr)
 }
 
 static __inline int
-nbr_params_compare(struct nbr_params *a, struct nbr_params *b)
+nbr_params_compare(const struct nbr_params *a, const struct nbr_params *b)
 {
        return (ntohl(a->lsr_id.s_addr) - ntohl(b->lsr_id.s_addr));
 }