diff options
| -rw-r--r-- | bgpd/Makefile.am | 5 | ||||
| -rw-r--r-- | bgpd/bgp_attr_evpn.c | 1 | ||||
| -rw-r--r-- | bgpd/bgp_attr_evpn.h | 6 | ||||
| -rw-r--r-- | bgpd/bgp_encap.c | 4 | ||||
| -rw-r--r-- | bgpd/bgp_evpn.c | 189 | ||||
| -rw-r--r-- | bgpd/bgp_evpn.h | 36 | ||||
| -rw-r--r-- | bgpd/bgp_mplsvpn.c | 4 | ||||
| -rw-r--r-- | bgpd/bgp_packet.c | 20 | ||||
| -rw-r--r-- | bgpd/bgp_packet.h | 2 | ||||
| -rw-r--r-- | bgpd/bgp_route.c | 10 | ||||
| -rw-r--r-- | bgpd/bgp_route.h | 8 | ||||
| -rw-r--r-- | bgpd/bgpd.c | 1 | ||||
| -rw-r--r-- | bgpd/rfapi/vnc_export_bgp.c | 32 |
13 files changed, 280 insertions, 38 deletions
diff --git a/bgpd/Makefile.am b/bgpd/Makefile.am index 4fda7adaab..4ce2cd03b5 100644 --- a/bgpd/Makefile.am +++ b/bgpd/Makefile.am @@ -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@ diff --git a/bgpd/bgp_attr_evpn.c b/bgpd/bgp_attr_evpn.c index 8715062bae..76c0e51198 100644 --- a/bgpd/bgp_attr_evpn.c +++ b/bgpd/bgp_attr_evpn.c @@ -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" diff --git a/bgpd/bgp_attr_evpn.h b/bgpd/bgp_attr_evpn.h index 14846ebc1f..1e8ad3801c 100644 --- a/bgpd/bgp_attr_evpn.h +++ b/bgpd/bgp_attr_evpn.h @@ -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); diff --git a/bgpd/bgp_encap.c b/bgpd/bgp_encap.c index 4ec45108b4..72a30220ff 100644 --- a/bgpd/bgp_encap.c +++ b/bgpd/bgp_encap.c @@ -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 index 0000000000..fd785b9a64 --- /dev/null +++ b/bgpd/bgp_evpn.c @@ -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 index 0000000000..a493962350 --- /dev/null +++ b/bgpd/bgp_evpn.h @@ -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 */ diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index cfdb9f3ce6..3e11e522fa 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -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. */ diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index c7453509fa..9a8722a749 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -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; diff --git a/bgpd/bgp_packet.h b/bgpd/bgp_packet.h index 78855c3425..ea5c7a8998 100644 --- a/bgpd/bgp_packet.h +++ b/bgpd/bgp_packet.h @@ -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 *); diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 84c0ee1021..2391964dad 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -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. */ diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h index 2103338b7d..4a24b0f376 100644 --- a/bgpd/bgp_route.h +++ b/bgpd/bgp_route.h @@ -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); diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 1cad7c5a15..5e43400237 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -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" diff --git a/bgpd/rfapi/vnc_export_bgp.c b/bgpd/rfapi/vnc_export_bgp.c index f20e9ed674..9b2dc25823 100644 --- a/bgpd/rfapi/vnc_export_bgp.c +++ b/bgpd/rfapi/vnc_export_bgp.c @@ -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 */ } } } |
