]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #3893 from mjstapp/dplane_pw_nexthops
authorDonald Sharp <sharpd@cumulusnetworks.com>
Tue, 12 Mar 2019 16:44:42 +0000 (12:44 -0400)
committerGitHub <noreply@github.com>
Tue, 12 Mar 2019 16:44:42 +0000 (12:44 -0400)
zebra: include nexthop info when installing pseudowires

1  2 
zebra/rt_netlink.c

diff --combined zebra/rt_netlink.c
index 2a297409fe47b7aba56c2d2923fe28222f8c63dd,2ba1f890716d5e9d6c7e4259c06fb0e0f39a7a1e..c56e2f316d411a8b0e32771369bd899f5fc5f102
@@@ -927,7 -927,7 +927,7 @@@ static void _netlink_route_nl_add_gatew
                                               uint8_t gw_family,
                                               struct nlmsghdr *nlmsg,
                                               size_t req_size, int bytelen,
-                                              struct nexthop *nexthop)
+                                              const struct nexthop *nexthop)
  {
        if (route_family == AF_MPLS) {
                struct gw_family_t gw_fam;
@@@ -954,7 -954,7 +954,7 @@@ static void _netlink_route_rta_add_gate
                                                struct rtattr *rta,
                                                struct rtnexthop *rtnh,
                                                size_t req_size, int bytelen,
-                                               struct nexthop *nexthop)
+                                               const struct nexthop *nexthop)
  {
        if (route_family == AF_MPLS) {
                struct gw_family_t gw_fam;
   * @param req_size: The size allocated for the message.
   */
  static void _netlink_route_build_singlepath(const char *routedesc, int bytelen,
-                                           struct nexthop *nexthop,
+                                           const struct nexthop *nexthop,
                                            struct nlmsghdr *nlmsg,
                                            struct rtmsg *rtmsg,
                                            size_t req_size, int cmd)
        label_buf[0] = '\0';
  
        assert(nexthop);
-       for (struct nexthop *nh = nexthop; nh; nh = nh->rparent) {
+       for (const struct nexthop *nh = nexthop; nh; nh = nh->rparent) {
                char label_buf1[20];
  
                nh_label = nh->nh_label;
   *             the prefsrc should be stored.
   */
  static void _netlink_route_build_multipath(const char *routedesc, int bytelen,
-                                          struct nexthop *nexthop,
+                                          const struct nexthop *nexthop,
                                           struct rtattr *rta,
                                           struct rtnexthop *rtnh,
                                           struct rtmsg *rtmsg,
-                                          union g_addr **src)
+                                          const union g_addr **src)
  {
        struct mpls_label_stack *nh_label;
        mpls_lse_t out_lse[MPLS_MAX_LABELS];
        label_buf[0] = '\0';
  
        assert(nexthop);
-       for (struct nexthop *nh = nexthop; nh; nh = nh->rparent) {
+       for (const struct nexthop *nh = nexthop; nh; nh = nh->rparent) {
                char label_buf1[20];
  
                nh_label = nh->nh_label;
  }
  
  static inline void _netlink_mpls_build_singlepath(const char *routedesc,
-                                                 zebra_nhlfe_t *nhlfe,
+                                                 const zebra_nhlfe_t *nhlfe,
                                                  struct nlmsghdr *nlmsg,
                                                  struct rtmsg *rtmsg,
                                                  size_t req_size, int cmd)
  
  
  static inline void
- _netlink_mpls_build_multipath(const char *routedesc, zebra_nhlfe_t *nhlfe,
+ _netlink_mpls_build_multipath(const char *routedesc, const zebra_nhlfe_t *nhlfe,
                              struct rtattr *rta, struct rtnexthop *rtnh,
-                             struct rtmsg *rtmsg, union g_addr **src)
+                             struct rtmsg *rtmsg, const union g_addr **src)
  {
        int bytelen;
        uint8_t family;
@@@ -1655,7 -1655,7 +1655,7 @@@ static int netlink_route_multipath(int 
                char buf[NL_PKT_BUF_SIZE];
                struct rtattr *rta = (void *)buf;
                struct rtnexthop *rtnh;
-               union g_addr *src1 = NULL;
+               const union g_addr *src1 = NULL;
  
                rta->rta_type = RTA_MULTIPATH;
                rta->rta_len = RTA_LENGTH(0);
@@@ -1965,38 -1965,23 +1965,38 @@@ static int netlink_macfdb_change(struc
        /* The interface should exist. */
        ifp = if_lookup_by_index_per_ns(zebra_ns_lookup(ns_id),
                                        ndm->ndm_ifindex);
 -      if (!ifp || !ifp->info)
 +      if (!ifp || !ifp->info) {
 +              if (IS_ZEBRA_DEBUG_KERNEL)
 +                      zlog_debug("\t%s without associated interface: %u",
 +                                 __PRETTY_FUNCTION__, ndm->ndm_ifindex);
                return 0;
 +      }
  
        /* The interface should be something we're interested in. */
 -      if (!IS_ZEBRA_IF_BRIDGE_SLAVE(ifp))
 +      if (!IS_ZEBRA_IF_BRIDGE_SLAVE(ifp)) {
 +              if (IS_ZEBRA_DEBUG_KERNEL)
 +                      zlog_debug("\t%s Not interested in %s, not a slave",
 +                                 __PRETTY_FUNCTION__, ifp->name);
                return 0;
 +      }
  
        /* Drop "permanent" entries. */
 -      if (ndm->ndm_state & NUD_PERMANENT)
 +      if (ndm->ndm_state & NUD_PERMANENT) {
 +              if (IS_ZEBRA_DEBUG_KERNEL)
 +                      zlog_debug("\t%s Entry is PERMANENT, dropping",
 +                                 __PRETTY_FUNCTION__);
                return 0;
 +      }
  
        zif = (struct zebra_if *)ifp->info;
        if ((br_if = zif->brslave_info.br_if) == NULL) {
 -              zlog_debug("%s family %s IF %s(%u) brIF %u - no bridge master",
 -                         nl_msg_type_to_str(h->nlmsg_type),
 -                         nl_family_to_str(ndm->ndm_family), ifp->name,
 -                         ndm->ndm_ifindex, zif->brslave_info.bridge_ifindex);
 +              if (IS_ZEBRA_DEBUG_KERNEL)
 +                      zlog_debug(
 +                              "%s family %s IF %s(%u) brIF %u - no bridge master",
 +                              nl_msg_type_to_str(h->nlmsg_type),
 +                              nl_family_to_str(ndm->ndm_family), ifp->name,
 +                              ndm->ndm_ifindex,
 +                              zif->brslave_info.bridge_ifindex);
                return 0;
        }
  
        netlink_parse_rtattr(tb, NDA_MAX, NDA_RTA(ndm), len);
  
        if (!tb[NDA_LLADDR]) {
 -              zlog_debug("%s family %s IF %s(%u) brIF %u - no LLADDR",
 -                         nl_msg_type_to_str(h->nlmsg_type),
 -                         nl_family_to_str(ndm->ndm_family), ifp->name,
 -                         ndm->ndm_ifindex, zif->brslave_info.bridge_ifindex);
 +              if (IS_ZEBRA_DEBUG_KERNEL)
 +                      zlog_debug("%s family %s IF %s(%u) brIF %u - no LLADDR",
 +                                 nl_msg_type_to_str(h->nlmsg_type),
 +                                 nl_family_to_str(ndm->ndm_family), ifp->name,
 +                                 ndm->ndm_ifindex,
 +                                 zif->brslave_info.bridge_ifindex);
                return 0;
        }
  
        if (RTA_PAYLOAD(tb[NDA_LLADDR]) != ETH_ALEN) {
 -              zlog_debug(
 -                      "%s family %s IF %s(%u) brIF %u - LLADDR is not MAC, len %lu",
 -                      nl_msg_type_to_str(h->nlmsg_type),
 -                      nl_family_to_str(ndm->ndm_family), ifp->name,
 -                      ndm->ndm_ifindex, zif->brslave_info.bridge_ifindex,
 -                      (unsigned long)RTA_PAYLOAD(tb[NDA_LLADDR]));
 +              if (IS_ZEBRA_DEBUG_KERNEL)
 +                      zlog_debug(
 +                              "%s family %s IF %s(%u) brIF %u - LLADDR is not MAC, len %lu",
 +                              nl_msg_type_to_str(h->nlmsg_type),
 +                              nl_family_to_str(ndm->ndm_family), ifp->name,
 +                              ndm->ndm_ifindex,
 +                              zif->brslave_info.bridge_ifindex,
 +                              (unsigned long)RTA_PAYLOAD(tb[NDA_LLADDR]));
                return 0;
        }
  
                           prefix_mac2str(&mac, buf, sizeof(buf)),
                           dst_present ? dst_buf : "");
  
 -      if (filter_vlan && vid != filter_vlan)
 +      if (filter_vlan && vid != filter_vlan) {
 +              if (IS_ZEBRA_DEBUG_KERNEL)
 +                      zlog_debug("\tFiltered due to filter vlan: %d",
 +                                 filter_vlan);
                return 0;
 +      }
  
        /* If add or update, do accordingly if learnt on a "local" interface; if
         * the notification is over VxLAN, this has to be related to
         * so perform an implicit delete of any local entry (if it exists).
         */
        if (h->nlmsg_type == RTM_NEWNEIGH) {
 -              /* Drop "permanent" entries. */
 -              if (ndm->ndm_state & NUD_PERMANENT)
 -                      return 0;
 -
                if (IS_ZEBRA_IF_VXLAN(ifp))
                        return zebra_vxlan_check_del_local_mac(ifp, br_if, &mac,
                                                               vid);
         * Ignore the notification from VxLan driver as it is also generated
         * when mac moves from remote to local.
         */
 -      if (dst_present)
 +      if (dst_present) {
 +              if (IS_ZEBRA_DEBUG_KERNEL)
 +                      zlog_debug("\tNo Destination Present");
                return 0;
 +      }
  
        if (IS_ZEBRA_IF_VXLAN(ifp))
                return zebra_vxlan_check_readd_remote_mac(ifp, br_if, &mac,
@@@ -2401,9 -2379,6 +2401,9 @@@ static int netlink_ipneigh_change(struc
        /* if kernel deletes our rfc5549 neighbor entry, re-install it */
        if (h->nlmsg_type == RTM_DELNEIGH && (ndm->ndm_state & NUD_PERMANENT)) {
                netlink_handle_5549(ndm, zif, ifp, &ip);
 +              if (IS_ZEBRA_DEBUG_KERNEL)
 +                      zlog_debug(
 +                              "\tNeighbor Entry Received is a 5549 entry, finished");
                return 0;
        }
  
                        return 0;
        } else if (IS_ZEBRA_IF_BRIDGE(ifp))
                link_if = ifp;
 -      else
 +      else {
 +              if (IS_ZEBRA_DEBUG_KERNEL)
 +                      zlog_debug(
 +                              "\tNeighbor Entry received is not on a VLAN or a BRIDGE, ignoring");
                return 0;
 +      }
  
        memset(&mac, 0, sizeof(struct ethaddr));
        if (h->nlmsg_type == RTM_NEWNEIGH) {
                if (tb[NDA_LLADDR]) {
                        if (RTA_PAYLOAD(tb[NDA_LLADDR]) != ETH_ALEN) {
 -                              zlog_debug(
 -                                      "%s family %s IF %s(%u) - LLADDR is not MAC, len %lu",
 -                                      nl_msg_type_to_str(h->nlmsg_type),
 -                                      nl_family_to_str(ndm->ndm_family),
 -                                      ifp->name, ndm->ndm_ifindex,
 -                                      (unsigned long)RTA_PAYLOAD(
 -                                              tb[NDA_LLADDR]));
 +                              if (IS_ZEBRA_DEBUG_KERNEL)
 +                                      zlog_debug(
 +                                              "%s family %s IF %s(%u) - LLADDR is not MAC, len %lu",
 +                                              nl_msg_type_to_str(
 +                                                      h->nlmsg_type),
 +                                              nl_family_to_str(
 +                                                      ndm->ndm_family),
 +                                              ifp->name, ndm->ndm_ifindex,
 +                                              (unsigned long)RTA_PAYLOAD(
 +                                                      tb[NDA_LLADDR]));
                                return 0;
                        }
  
@@@ -2776,7 -2744,7 +2776,7 @@@ int kernel_upd_neigh(struct interface *
  int netlink_mpls_multipath(int cmd, struct zebra_dplane_ctx *ctx)
  {
        mpls_lse_t lse;
-       zebra_nhlfe_t *nhlfe;
+       const zebra_nhlfe_t *nhlfe;
        struct nexthop *nexthop = NULL;
        unsigned int nexthop_num;
        const char *routedesc;
                char buf[NL_PKT_BUF_SIZE];
                struct rtattr *rta = (void *)buf;
                struct rtnexthop *rtnh;
-               union g_addr *src1 = NULL;
+               const union g_addr *src1 = NULL;
  
                rta->rta_type = RTA_MULTIPATH;
                rta->rta_len = RTA_LENGTH(0);