]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: handling EVPN Route Type 5 NLRI message
authorPhilippe Guibert <philippe.guibert@6wind.com>
Mon, 5 Sep 2016 09:07:25 +0000 (11:07 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 14 Feb 2017 12:58:57 +0000 (13:58 +0100)
This patch introduces code to receive a NLRI message with route type
5, as defined in draft-ietf-bess-evpn-prefix-advertisement-02. It
It increases the number of parameters to extract from the NLRI and
to store into bgp extra information structure. Those parameters are
the ESI (ethernet segment identifier), the gateway IP Address (which
acts like nexthop attribute but is contained inside the NLRI itself)
and the ethernet tag identifier ( that acts for the VXLan Identifier)
This patch updates bgp_update() and bgp_withdraw() api, and then does the
necessary adapations for rfapi.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
13 files changed:
bgpd/Makefile.am
bgpd/bgp_attr_evpn.c
bgpd/bgp_attr_evpn.h
bgpd/bgp_encap.c
bgpd/bgp_evpn.c [new file with mode: 0644]
bgpd/bgp_evpn.h [new file with mode: 0644]
bgpd/bgp_mplsvpn.c
bgpd/bgp_packet.c
bgpd/bgp_packet.h
bgpd/bgp_route.c
bgpd/bgp_route.h
bgpd/bgpd.c
bgpd/rfapi/vnc_export_bgp.c

index 4fda7adaab146d916da6cb38dbf1219057024d17..4ce2cd03b53b164d170ceaa58cae80394f928764 100644 (file)
@@ -79,7 +79,8 @@ libbgp_a_SOURCES = \
        bgp_mplsvpn.c bgp_nexthop.c \
        bgp_damp.c bgp_table.c bgp_advertise.c bgp_vty.c bgp_mpath.c \
         bgp_nht.c bgp_updgrp.c bgp_updgrp_packet.c bgp_updgrp_adv.c bgp_bfd.c \
-       bgp_encap.c bgp_encap_tlv.c $(BGP_VNC_RFAPI_SRC) bgp_attr_evpn.c
+       bgp_encap.c bgp_encap_tlv.c $(BGP_VNC_RFAPI_SRC) bgp_attr_evpn.c \
+       bgp_evpn.c
 
 noinst_HEADERS = \
        bgp_memory.h \
@@ -90,7 +91,7 @@ noinst_HEADERS = \
        bgp_mplsvpn.h bgp_nexthop.h bgp_damp.h bgp_table.h \
        bgp_advertise.h bgp_snmp.h bgp_vty.h bgp_mpath.h bgp_nht.h \
         bgp_updgrp.h bgp_bfd.h bgp_encap.h bgp_encap_tlv.h bgp_encap_types.h \
-       $(BGP_VNC_RFAPI_HD) bgp_attr_evpn.h
+       $(BGP_VNC_RFAPI_HD) bgp_attr_evpn.h bgp_evpn.h
 
 bgpd_SOURCES = bgp_main.c
 bgpd_LDADD = libbgp.a  $(BGP_VNC_RFP_LIB) ../lib/libfrr.la @LIBCAP@ @LIBM@
index 8715062bae1a3ed81163b6d2c3a7eea249c29901..76c0e51198c854842dfe9980065337e262870600 100644 (file)
@@ -21,6 +21,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include <zebra.h>
 
 #include "command.h"
+#include "filter.h"
 #include "prefix.h"
 #include "log.h"
 #include "memory.h"
index 14846ebc1faa71df1594d6a49767dbfa9c4365ab..1e8ad3801cabe611941fe83d8f8eaf115ad0a49c 100644 (file)
@@ -46,6 +46,12 @@ union gw_addr {
   struct in6_addr ipv6;
 };
 
+struct bgp_route_evpn
+{
+  struct eth_segment_id eth_s_id;
+  union gw_addr gw_ip;
+};
+
 extern int str2esi (const char *str, struct eth_segment_id *id);
 extern int str2mac (const char *str, char *mac);
 extern char *esi2str (struct eth_segment_id *id);
index 4ec45108b4e4a85be0c102ce97f106a7e92320dd..72a30220ff51d5f3c06ab98d5f286c1877083cdc 100644 (file)
@@ -188,10 +188,10 @@ bgp_nlri_parse_encap(
 
       if (attr) {
        bgp_update (peer, &p, 0, attr, afi, SAFI_ENCAP,
-                   ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL, 0);
+                   ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL, 0, NULL);
       } else {
        bgp_withdraw (peer, &p, 0, attr, afi, SAFI_ENCAP,
-                     ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL);
+                     ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL, NULL);
       }
     }
 
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
new file mode 100644 (file)
index 0000000..fd785b9
--- /dev/null
@@ -0,0 +1,189 @@
+/* Ethernet-VPN Packet and vty Processing File
+   Copyright (C) 2016 6WIND
+
+This file is part of Free Range Routing.
+
+Free Range Routing is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+Free Range Routing is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Free Range Routing; see the file COPYING.  If not, write to the Free
+Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
+
+
+#include <zebra.h>
+
+#include "command.h"
+#include "filter.h"
+#include "prefix.h"
+#include "log.h"
+#include "memory.h"
+#include "stream.h"
+
+#include "bgpd/bgp_attr_evpn.h"
+#include "bgpd/bgpd.h"
+#include "bgpd/bgp_table.h"
+#include "bgpd/bgp_route.h"
+#include "bgpd/bgp_attr.h"
+#include "bgpd/bgp_mplsvpn.h"
+#include "bgpd/bgp_evpn.h"
+
+int
+bgp_nlri_parse_evpn (struct peer *peer, struct attr *attr,
+                     struct bgp_nlri *packet, int withdraw)
+{
+  u_char *pnt;
+  u_char *lim;
+  struct prefix p;
+  struct prefix_rd prd;
+  struct evpn_addr *p_evpn_p;
+  struct bgp_route_evpn evpn;
+  uint8_t route_type, route_length;
+  u_char *pnt_label;
+  u_int32_t addpath_id = 0;
+
+  /* Check peer status. */
+  if (peer->status != Established)
+    return 0;
+  
+  /* Make prefix_rd */
+  prd.family = AF_UNSPEC;
+  prd.prefixlen = 64;
+
+#if !defined(HAVE_EVPN)
+  return -1;
+#endif /* HAVE_EVPN */
+
+  p_evpn_p = &p.u.prefix_evpn;
+  pnt = packet->nlri;
+  lim = pnt + packet->length;
+  while (pnt < lim)
+    {
+      /* clear evpn structure */
+      memset (&evpn, 0, sizeof (evpn));
+
+      /* Clear prefix structure. */
+      memset (&p, 0, sizeof (struct prefix));
+      memset(&evpn.gw_ip, 0, sizeof(union gw_addr));
+      memset(&evpn.eth_s_id, 0, sizeof(struct eth_segment_id));
+
+      /* Fetch Route Type */ 
+      route_type = *pnt++;
+      route_length = *pnt++;
+      /* simply ignore. goto next route type if any */
+      if(route_type != EVPN_IP_PREFIX)
+       {
+         if (pnt + route_length > lim)
+           {
+             zlog_err ("not enough bytes for New Route Type left in NLRI?");
+             return -1;
+           }
+         pnt += route_length;
+         continue;
+       }
+
+      /* Fetch RD */
+      if (pnt + 8 > lim)
+        {
+          zlog_err ("not enough bytes for RD left in NLRI?");
+          return -1;
+        }
+
+      /* Copy routing distinguisher to rd. */
+      memcpy (&prd.val, pnt, 8);
+      pnt += 8;
+
+      /* Fetch ESI */
+      if (pnt + 10 > lim)
+        {
+          zlog_err ("not enough bytes for ESI left in NLRI?");
+          return -1;
+        }
+      memcpy(&evpn.eth_s_id.val, pnt, 10);
+      pnt += 10;
+
+      /* Fetch Ethernet Tag */
+      if (pnt + 4 > lim)
+        {
+          zlog_err ("not enough bytes for Eth Tag left in NLRI?");
+          return -1;
+        }
+
+      if (route_type == EVPN_IP_PREFIX)
+        {
+          p_evpn_p->route_type = route_type;
+          memcpy (&(p_evpn_p->eth_tag), pnt, 4);
+          p_evpn_p->eth_tag = ntohl(p_evpn_p->eth_tag);
+          pnt += 4;
+
+           /* Fetch IP prefix length. */
+          p_evpn_p->ip_prefix_length = *pnt++;
+
+          if (p_evpn_p->ip_prefix_length > 128)
+            {
+              zlog_err ("invalid prefixlen %d in EVPN NLRI?", p.prefixlen);
+              return -1;
+            }
+          /* determine IPv4 or IPv6 prefix */
+          if(route_length - 4 - 10 - 8 - 3 /* label to be read */ >= 32)
+            {
+              p_evpn_p->flags = IP_PREFIX_V6;
+              memcpy (&(p_evpn_p->ip.v4_addr), pnt, 16);
+              pnt += 16;
+              memcpy(&evpn.gw_ip.ipv6, pnt, 16);
+              pnt += 16;
+            }
+          else
+            {
+              p_evpn_p->flags = IP_PREFIX_V4;
+              memcpy (&(p_evpn_p->ip.v4_addr), pnt, 4);
+              pnt += 4;
+              memcpy(&evpn.gw_ip.ipv4, pnt, 4);
+              pnt += 4;
+            }
+          p.family = AFI_L2VPN;
+          if (p_evpn_p->flags == IP_PREFIX_V4)
+            p.prefixlen = (u_char)PREFIX_LEN_ROUTE_TYPE_5_IPV4;
+          else
+            p.prefixlen = PREFIX_LEN_ROUTE_TYPE_5_IPV6;
+          p.family = AF_ETHERNET;
+        }
+
+      /* Fetch Label */
+      if (pnt + 3 > lim)
+        {
+          zlog_err ("not enough bytes for Label left in NLRI?");
+          return -1;
+        }
+      pnt_label = pnt;
+      
+      pnt += 3;
+
+      if (!withdraw)
+        {
+          bgp_update (peer, &p, addpath_id, attr, AFI_L2VPN, SAFI_EVPN,
+                      ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
+                      pnt_label, 0, &evpn);
+        }
+      else
+        {
+          bgp_withdraw (peer, &p, addpath_id, attr, AFI_L2VPN, SAFI_EVPN,
+                        ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
+                        &prd, pnt_label, &evpn);
+        }
+    }
+
+  /* Packet length consistency check. */
+  if (pnt != lim)
+    return -1;
+
+  return 0;
+}
diff --git a/bgpd/bgp_evpn.h b/bgpd/bgp_evpn.h
new file mode 100644 (file)
index 0000000..a493962
--- /dev/null
@@ -0,0 +1,36 @@
+/* E-VPN header for packet handling
+   Copyright (C) 2016 6WIND
+
+This file is part of Free Range Routing.
+
+Free Range Routing is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+Free Range Routing is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Free Range Routing; see the file COPYING.  If not, write to the Free
+Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
+
+#ifndef _QUAGGA_BGP_EVPN_H
+#define _QUAGGA_BGP_EVPN_H
+
+extern int bgp_nlri_parse_evpn (struct peer *peer, struct attr *attr,
+                                struct bgp_nlri *packet, int withdraw);
+
+/* EVPN route types as per RFC7432 and
+ * as per draft-ietf-bess-evpn-prefix-advertisement-02
+ */
+#define EVPN_ETHERNET_AUTO_DISCOVERY 1
+#define EVPN_MACIP_ADVERTISEMENT 2
+#define EVPN_INCLUSIVE_MULTICAST_ETHERNET_TAG 3
+#define EVPN_ETHERNET_SEGMENT 4
+#define EVPN_IP_PREFIX 5
+
+#endif /* _QUAGGA_BGP_EVPN_H */
index cfdb9f3ce62d020c6ddb97678004cd9a1bc11cb0..3e11e522fae983c0cc6acb80d60fdd87ef13a930 100644 (file)
@@ -288,12 +288,12 @@ bgp_nlri_parse_vpn (struct peer *peer, struct attr *attr,
       if (attr)
         {
           bgp_update (peer, &p, addpath_id, attr, packet->afi, SAFI_MPLS_VPN,
-                      ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt, 0);
+                      ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt, 0, NULL);
         }
       else
         {
           bgp_withdraw (peer, &p, addpath_id, attr, packet->afi, SAFI_MPLS_VPN,
-                        ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt);
+                        ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt, NULL);
         }
     }
   /* Packet length consistency check. */
index c7453509faa2caa8e901967982d349133bb3f42b..9a8722a749db1bd462626a59d3543c1869c42e6d 100644 (file)
@@ -49,6 +49,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include "bgpd/bgp_lcommunity.h"
 #include "bgpd/bgp_network.h"
 #include "bgpd/bgp_mplsvpn.h"
+#include "bgpd/bgp_evpn.h"
 #include "bgpd/bgp_encap.h"
 #include "bgpd/bgp_advertise.h"
 #include "bgpd/bgp_vty.h"
@@ -1327,19 +1328,24 @@ bgp_update_explicit_eors (struct peer *peer)
   bgp_check_update_delay(peer->bgp);
 }
 
-/* Frontend for NLRI parsing, to fan-out to AFI/SAFI specific parsers */
+/* Frontend for NLRI parsing, to fan-out to AFI/SAFI specific parsers 
+ * mp_withdraw, if set, is used to nullify attr structure on most of the calling safi function
+ * and for evpn, passed as parameter
+ */
 int
-bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet)
+bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet, int mp_withdraw)
 {
   switch (packet->safi)
     {
       case SAFI_UNICAST:
       case SAFI_MULTICAST:
-        return bgp_nlri_parse_ip (peer, attr, packet);
+        return bgp_nlri_parse_ip (peer, mp_withdraw?NULL:attr, packet);
       case SAFI_MPLS_VPN:
-        return bgp_nlri_parse_vpn (peer, attr, packet);
+        return bgp_nlri_parse_vpn (peer, mp_withdraw?NULL:attr, packet);
       case SAFI_ENCAP:
-        return bgp_nlri_parse_encap (peer, attr, packet);
+        return bgp_nlri_parse_encap (peer, mp_withdraw?NULL:attr, packet);
+      case SAFI_EVPN:
+        return bgp_nlri_parse_evpn (peer, attr, packet, mp_withdraw);
     }
   return -1;
 }
@@ -1531,11 +1537,11 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
         {
           case NLRI_UPDATE:
           case NLRI_MP_UPDATE:
-            nlri_ret = bgp_nlri_parse (peer, NLRI_ATTR_ARG, &nlris[i]);
+            nlri_ret = bgp_nlri_parse (peer, NLRI_ATTR_ARG, &nlris[i], 0);
             break;
           case NLRI_WITHDRAW:
           case NLRI_MP_WITHDRAW:
-            nlri_ret = bgp_nlri_parse (peer, NULL, &nlris[i]);
+            nlri_ret = bgp_nlri_parse (peer, &attr, &nlris[i], 1);
             break;
           default:
             nlri_ret = -1;
index 78855c342580f6d94d475b3eb80537aac2a829a7..ea5c7a8998077203a7a78b1e3b32f675b343f0af 100644 (file)
@@ -55,7 +55,7 @@ extern void bgp_default_withdraw_send (struct peer *, afi_t, safi_t);
 
 extern int bgp_capability_receive (struct peer *, bgp_size_t);
 
-extern int bgp_nlri_parse (struct peer *, struct attr *, struct bgp_nlri *);
+extern int bgp_nlri_parse (struct peer *, struct attr *, struct bgp_nlri *, int mp_withdraw);
 
 extern void bgp_update_restarted_peers (struct peer *);
 extern void bgp_update_implicit_eors (struct peer *);
index 84c0ee1021cb3752f4208cf03d634967f185a302..2391964dad3d50a88d97b7ec9fcd56e3dcadfbe7 100644 (file)
@@ -2341,7 +2341,7 @@ int
 bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id,
             struct attr *attr, afi_t afi, safi_t safi, int type,
             int sub_type, struct prefix_rd *prd, u_char *tag,
-            int soft_reconfig)
+            int soft_reconfig, struct bgp_route_evpn* evpn)
 {
   int ret;
   int aspath_loop_count = 0;
@@ -2851,7 +2851,7 @@ bgp_update (struct peer *peer, struct prefix *p, u_int32_t addpath_id,
 int
 bgp_withdraw (struct peer *peer, struct prefix *p, u_int32_t addpath_id,
               struct attr *attr, afi_t afi, safi_t safi, int type, int sub_type,
-             struct prefix_rd *prd, u_char *tag)
+             struct prefix_rd *prd, u_char *tag, struct bgp_route_evpn *evpn)
 {
   struct bgp *bgp;
   char buf[SU_ADDRSTRLEN];
@@ -3049,7 +3049,7 @@ bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
 
            ret = bgp_update (peer, &rn->p, ain->addpath_rx_id, ain->attr,
                               afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                             prd, tag, 1);
+                             prd, tag, 1, NULL);
 
            if (ret < 0)
              {
@@ -3615,10 +3615,10 @@ bgp_nlri_parse_ip (struct peer *peer, struct attr *attr,
       /* Normal process. */
       if (attr)
        ret = bgp_update (peer, &p, addpath_id, attr, afi, safi,
-                         ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
+                         ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0, NULL);
       else
        ret = bgp_withdraw (peer, &p, addpath_id, attr, afi, safi,
-                           ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
+                           ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, NULL);
 
       /* Address family configuration mismatch or maximum-prefix count
          overflow. */
index 2103338b7d6d5ee41c0fdc7f4c83c1bed8038cf8..4a24b0f376c437e02183c2925bbc574466cf5794 100644 (file)
@@ -25,6 +25,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include "bgp_table.h"
 
 struct bgp_nexthop_cache;
+struct bgp_route_evpn;
 
 enum bgp_show_type
 {
@@ -319,10 +320,11 @@ extern int bgp_static_unset_safi (safi_t safi, struct vty *, const char *,
 
 /* this is primarily for MPLS-VPN */
 extern int bgp_update (struct peer *, struct prefix *, u_int32_t, struct attr *,
-                      afi_t, safi_t, int, int, struct prefix_rd *, 
-                      u_char *, int);
+                      afi_t, safi_t, int, int, struct prefix_rd *,
+                      u_char *, int, struct bgp_route_evpn *);
 extern int bgp_withdraw (struct peer *, struct prefix *, u_int32_t, struct attr *,
-                        afi_t, safi_t, int, int, struct prefix_rd *, u_char *);
+                        afi_t, safi_t, int, int, struct prefix_rd *, u_char *, 
+                         struct bgp_route_evpn *);
 
 /* for bgp_nexthop and bgp_damp */
 extern void bgp_process (struct bgp *, struct bgp_node *, afi_t, safi_t);
index 1cad7c5a152c0d0ff9ef33d5c1c1d0e4be2e8900..5e4340023773c48725f469eb0401c873d6a82cd1 100644 (file)
@@ -66,6 +66,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
 #include "bgpd/rfapi/rfapi_backend.h"
 #endif
+#include "bgpd/bgp_evpn.h"
 #include "bgpd/bgp_advertise.h"
 #include "bgpd/bgp_network.h"
 #include "bgpd/bgp_vty.h"
index f20e9ed67455e6bde500c63aea792d45c73f8dfe..9b2dc2582394c17fd099c93b7a628d576aebc643 100644 (file)
@@ -340,7 +340,7 @@ vnc_direct_bgp_add_route_ce (
               iattr,      /* bgp_update copies this attr */
               afi, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT, BGP_ROUTE_REDISTRIBUTE, NULL,  /* RD not used for unicast */
               NULL,             /* tag not used for unicast */
-              0);
+              0, NULL);         /* EVPN not used */
   bgp_attr_unintern (&iattr);
 }
 
@@ -425,7 +425,7 @@ vnc_direct_bgp_del_route_ce (
                 0,                /* addpath_id */
                 NULL, /* attr, ignored */
                 afi, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT, BGP_ROUTE_REDISTRIBUTE, NULL,        /* RD not used for unicast */
-                NULL);          /* tag not used for unicast */
+                NULL, NULL);          /* tag not used for unicast */
 
 }
 
@@ -534,7 +534,7 @@ vnc_direct_bgp_vpn_disable_ce (struct bgp *bgp, afi_t afi)
                             0,                /* addpath_id */
                             NULL,       /* ignored */
                             AFI_IP, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT, BGP_ROUTE_REDISTRIBUTE, NULL, /* RD not used for unicast */
-                            NULL);      /* tag not used for unicast */
+                            NULL, NULL);      /* tag not used for unicast */
             }
         }
     }
@@ -911,7 +911,7 @@ vnc_direct_bgp_add_prefix (
                       iattr,    /* bgp_update copies it */
                       afi, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT, BGP_ROUTE_REDISTRIBUTE, NULL,  /* RD not used for unicast */
                       NULL,     /* tag not used for unicast */
-                      0);
+                      0, NULL); /* EVPN not used */
 
           bgp_attr_unintern (&iattr);
         }
@@ -1011,7 +1011,7 @@ vnc_direct_bgp_del_prefix (
                         0,                /* addpath_id */
                         NULL,   /* attr, ignored */
                         afi, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT, BGP_ROUTE_REDISTRIBUTE, NULL,        /* RD not used for unicast */
-                        NULL);  /* tag not used for unicast */
+                        NULL, NULL);  /* tag not used for unicast */
         }
     }
 }
@@ -1150,7 +1150,7 @@ vnc_direct_bgp_add_nve (struct bgp *bgp, struct rfapi_descriptor *rfd)
                               iattr,    /* bgp_update copies it */
                               afi, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT, BGP_ROUTE_REDISTRIBUTE, NULL,  /* RD not used for unicast */
                               NULL,     /* tag not used for unicast */
-                              0);
+                              0, NULL); /* EVPN not used */
 
                   bgp_attr_unintern (&iattr);
 
@@ -1250,7 +1250,7 @@ vnc_direct_bgp_del_nve (struct bgp *bgp, struct rfapi_descriptor *rfd)
                                 0,                      /* addpath_id */
                                 NULL,   /* attr, ignored */
                                 afi, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT, BGP_ROUTE_REDISTRIBUTE, NULL,        /* RD not used for unicast */
-                                NULL);  /* tag not used for unicast */
+                                NULL, NULL);  /* tag not used for unicast */
 
                 }
             }
@@ -1377,7 +1377,7 @@ vnc_direct_bgp_add_group_afi (
                           iattr,        /* bgp_update copies it */
                           afi, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT, BGP_ROUTE_REDISTRIBUTE, NULL,      /* RD not used for unicast */
                           NULL, /* tag not used for unicast */
-                          0);
+                          0, NULL); /* EVPN not used */
 
               bgp_attr_unintern (&iattr);
             }
@@ -1462,7 +1462,7 @@ vnc_direct_bgp_del_group_afi (
                             0,                  /* addpath_id */
                             NULL,       /* attr, ignored */
                             afi, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT, BGP_ROUTE_REDISTRIBUTE, NULL,    /* RD not used for unicast */
-                            NULL);      /* tag not used for unicast */
+                            NULL, NULL);      /* tag not used for unicast */
 
             }
         }
@@ -1540,7 +1540,7 @@ vnc_direct_bgp_unexport_table (
                                 0,                      /* addpath_id */
                                 NULL,   /* attr, ignored */
                                 afi, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT, BGP_ROUTE_REDISTRIBUTE, NULL,        /* RD not used for unicast */
-                                NULL);  /* tag not used for unicast */
+                                NULL, NULL);  /* tag not used for unicast, EVPN neither */
 
                 }
             }
@@ -1777,8 +1777,8 @@ vnc_direct_bgp_rh_add_route (
               0,                /* addpath_id */
               iattr,            /* bgp_update copies this attr */
               afi, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT_RH, BGP_ROUTE_REDISTRIBUTE, NULL,       /* RD not used for unicast */
-              NULL,             /* tag not used for unicast */
-              0);
+              NULL,             /* tag not used for unicast, EVPN neither */
+              0, NULL);         /* EVPN not used */
   bgp_attr_unintern (&iattr);
 
 }
@@ -1801,7 +1801,7 @@ vncExportWithdrawTimer (struct thread *t)
     eti->type,
     eti->subtype,
     NULL,                              /* RD not used for unicast */
-    NULL);                             /* tag not used for unicast */
+    NULL, NULL);                       /* tag not used for unicast, EVPN neither */
 
   /*
    * Free the eti
@@ -2019,8 +2019,8 @@ vnc_direct_bgp_rh_vpn_enable (struct bgp *bgp, afi_t afi)
                               0,                /* addpath_id */
                               iattr,    /* bgp_update copies it */
                               AFI_IP, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT_RH, BGP_ROUTE_REDISTRIBUTE, NULL,    /* RD not used for unicast */
-                              NULL,     /* tag not used for unicast */
-                              0);
+                              NULL,     /* tag not used for unicast, EVPN neither */
+                              0, NULL); /* EVPN not used */
                   bgp_attr_unintern (&iattr);
                 }
             }
@@ -2085,7 +2085,7 @@ vnc_direct_bgp_rh_vpn_disable (struct bgp *bgp, afi_t afi)
                             0,                  /* addpath_id */
                             NULL,       /* ignored */
                             AFI_IP, SAFI_UNICAST, ZEBRA_ROUTE_VNC_DIRECT_RH, BGP_ROUTE_REDISTRIBUTE, NULL,      /* RD not used for unicast */
-                            NULL);      /* tag not used for unicast */
+                            NULL, NULL);      /* tag not used for unicast, EVPN neither */
             }
         }
     }