]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #1990 from donaldsharp/bgp_v6_ifindex
authorRuss White <russ@riw.us>
Fri, 30 Mar 2018 13:25:52 +0000 (09:25 -0400)
committerGitHub <noreply@github.com>
Fri, 30 Mar 2018 13:25:52 +0000 (09:25 -0400)
bgpd: Only supply ifindex for a v6 nexthop if LL

1  2 
bgpd/bgp_zebra.c

diff --combined bgpd/bgp_zebra.c
index 269dcc7cb67b00d5c7384173584518d0e517f59e,bd2711f1dea4a23719996490114b555d102e7d35..e07701d42d1e640152766ab292eadfd46bd31aa6
@@@ -970,64 -970,6 +970,64 @@@ static int bgp_table_map_apply(struct r
        return 0;
  }
  
 +static struct thread *bgp_tm_thread_connect;
 +static bool bgp_tm_status_connected;
 +
 +static int bgp_zebra_tm_connect(struct thread *t)
 +{
 +      struct zclient *zclient;
 +      int delay = 10, ret = 0;
 +
 +      zclient = THREAD_ARG(t);
 +      if (bgp_tm_status_connected && zclient->sock > 0)
 +              delay = 60;
 +      else {
 +              bgp_tm_status_connected = false;
 +              ret = tm_table_manager_connect(zclient);
 +      }
 +      if (ret < 0) {
 +              zlog_warn("Error connecting to table manager!");
 +              bgp_tm_status_connected = false;
 +      } else {
 +              if (!bgp_tm_status_connected)
 +                      zlog_debug("Connecting to table manager. Success");
 +              bgp_tm_status_connected = true;
 +      }
 +      thread_add_timer(bm->master, bgp_zebra_tm_connect, zclient, delay,
 +                       &bgp_tm_thread_connect);
 +      return 0;
 +}
 +
 +void bgp_zebra_init_tm_connect(void)
 +{
 +      int delay = 1;
 +
 +      /* if already set, do nothing
 +       */
 +      if (bgp_tm_thread_connect != NULL)
 +              return;
 +      bgp_tm_status_connected = false;
 +      thread_add_timer(bm->master, bgp_zebra_tm_connect, zclient, delay,
 +                       &bgp_tm_thread_connect);
 +}
 +
 +int bgp_zebra_get_table_range(uint32_t chunk_size,
 +                            uint32_t *start, uint32_t *end)
 +{
 +      int ret;
 +
 +      if (!bgp_tm_status_connected)
 +              return -1;
 +      ret = tm_get_table_chunk(zclient, chunk_size, start, end);
 +      if (ret < 0) {
 +              zlog_err("BGP: Error getting table chunk %u", chunk_size);
 +              return -1;
 +      }
 +      zlog_info("BGP: Table Manager returns range from chunk %u is [%u %u]",
 +               chunk_size, *start, *end);
 +      return 0;
 +}
 +
  void bgp_zebra_announce(struct bgp_node *rn, struct prefix *p,
                        struct bgp_info *info, struct bgp *bgp, afi_t afi,
                        safi_t safi)
                                        ifindex = mpinfo->peer->nexthop.ifp
                                                          ->ifindex;
                        }
-                       if (ifindex == 0)
-                               continue;
+                       if (IN6_IS_ADDR_LINKLOCAL(nexthop)) {
+                               if (ifindex == 0)
+                                       continue;
+                       } else
+                               ifindex = 0;
  
                        api_nh->gate.ipv6 = *nexthop;
                        api_nh->ifindex = ifindex;
-                       api_nh->type = NEXTHOP_TYPE_IPV6_IFINDEX;
+                       api_nh->type = ifindex ? NEXTHOP_TYPE_IPV6_IFINDEX
+                                              : NEXTHOP_TYPE_IPV6;
                }
  
                if (mpinfo->extra