On Tue, Jan 5, 2016 at 5:56 AM, Lou Berger <lber...@labn.net> wrote: > Vivek, > > On 1/5/2016 7:55 AM, Vivek Venkatraman wrote: > > I think it'd be really good if the new functions introduced for VPN > > static routes (which take SAFI as the parameter) subsume the non-VPN > > (i.e., IP unicast) static routes too, so we don't have duplicate code. > > > > The genesis of these changes were the *existing* commands: > bgp_mplsvpn.c:DEFUN (vpnv4_network, > bgp_mplsvpn.c:DEFUN (no_vpnv4_network, > bgp_routemap.c:DEFUN (set_vpnv4_nexthop, > bgp_routemap.c:DEFUN (no_set_vpnv4_nexthop, > bgp_routemap.c:ALIAS (no_set_vpnv4_nexthop, > bgp_vty.c:DEFUN (address_family_vpnv4, > bgp_vty.c:ALIAS (address_family_vpnv4, > > Understood. But I did see a comment in this patch itself about the potential to combine these (i.e., a single bgp_static_set() or bgp_static_update() handles all the different AFI/SAFI) and I was stating my preference for this. Of course, this could be incorporated as a subsequent patch.
> > bgp_static_update_safi() is handling change to attribute (of an > > existing VPN route) but its calling function bgp_static_set_safi() > > right, which replaces the old bgp_static_set_vpnv4 function > > doesn't seem to be; compare with bgp_static_set(). > > > > Can you elaborate on what you mean. Our code was a modification of > bgp_static_set_vpnv4 rather than trying to modify / extend bgp_static_set. > I'll get back on this tomorrow as I'm on a different system right now. But basically, I was saying that while the call chain for IPv4/IPv6 networks (bgp_static_set() and bgp_static_update()) handles changes to attributes, the similar chain for VPNv4 doesn't appear to be. > > > Overall, I'm unsure about the use cases for injecting (or removing) > > VPN static routes (networks) directly. The common thing on a PE would > > be to inject networks into appropriate VRFs and these would then get > > exported by BGP. The original quagga code says these functions are for > > "test purposes". Possibly, there are scenarios where a controller > > would directly inject VPN routes into BGP? > > Not sure, but we were aiming to generalize/fix what was there. I think > it's at least useful for testing and perhaps other uses that may come up > in actual operation. We also weren't comfortable suggesting removing > existing function without a good reason. > Sure. This question was just to know if this interface has other well-known uses. > > Thanks again, > Lou > > > > > On Thu, Dec 24, 2015 at 10:10 AM, Lou Berger <lber...@labn.net > > <mailto:lber...@labn.net>> wrote: > > > > This is part of the core VPN and Encap SAFI changes. > > > > This changes the existing _vpnv4 functions for MPLS-VPN into > > SAFI-agnostic functions, renaming them from *_vpnv4 to *_safi. > > > > Also adds route-map support while at it. > > > > Signed-off-by: Lou Berger <lber...@labn.net <mailto:lber...@labn.net > >> > > Reviewed-by: David Lamparter <equi...@opensourcerouting.org > > <mailto:equi...@opensourcerouting.org>> > > --- > > bgpd/bgp_mplsvpn.c | 20 ++++- > > bgpd/bgp_route.c | 212 > > ++++++++++++++++++++++++++++++++++++++++------------- > > bgpd/bgp_route.h | 6 +- > > 3 files changed, 184 insertions(+), 54 deletions(-) > > > > diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c > > index a72d5ed..18627ad 100644 > > --- a/bgpd/bgp_mplsvpn.c > > +++ b/bgpd/bgp_mplsvpn.c > > @@ -294,7 +294,22 @@ DEFUN (vpnv4_network, > > "BGP tag\n" > > "tag value\n") > > { > > - return bgp_static_set_vpnv4 (vty, argv[0], argv[1], argv[2]); > > + return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[0], > > argv[1], argv[2], NULL); > > +} > > + > > +DEFUN (vpnv4_network_route_map, > > + vpnv4_network_route_map_cmd, > > + "network A.B.C.D/M rd ASN:nn_or_IP-address:nn tag WORD > > route-map WORD", > > + "Specify a network to announce via BGP\n" > > + "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n > > <http://35.0.0.0/8%5Cn>" > > + "Specify Route Distinguisher\n" > > + "VPN Route Distinguisher\n" > > + "BGP tag\n" > > + "tag value\n" > > + "route map\n" > > + "route map name\n") > > +{ > > + return bgp_static_set_safi (SAFI_MPLS_VPN, vty, argv[0], > > argv[1], argv[2], argv[3]); > > } > > > > /* For testing purpose, static route of MPLS-VPN. */ > > @@ -309,7 +324,7 @@ DEFUN (no_vpnv4_network, > > "BGP tag\n" > > "tag value\n") > > { > > - return bgp_static_unset_vpnv4 (vty, argv[0], argv[1], argv[2]); > > + return bgp_static_unset_safi (SAFI_MPLS_VPN, vty, argv[0], > > argv[1], argv[2]); > > } > > > > static int > > @@ -722,6 +737,7 @@ void > > bgp_mplsvpn_init (void) > > { > > install_element (BGP_VPNV4_NODE, &vpnv4_network_cmd); > > + install_element (BGP_VPNV4_NODE, &vpnv4_network_route_map_cmd); > > install_element (BGP_VPNV4_NODE, &no_vpnv4_network_cmd); > > > > > > diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c > > index 316fa5a..9866e37 100644 > > --- a/bgpd/bgp_route.c > > +++ b/bgpd/bgp_route.c > > @@ -3614,39 +3614,6 @@ bgp_static_update (struct bgp *bgp, struct > > prefix *p, > > } > > } > > > > -static void > > -bgp_static_update_vpnv4 (struct bgp *bgp, struct prefix *p, afi_t > > afi, > > - safi_t safi, struct prefix_rd *prd, > > u_char *tag) > > -{ > > - struct bgp_node *rn; > > - struct bgp_info *new; > > - > > - rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd); > > - > > - /* Make new BGP info. */ > > - new = bgp_info_new (); > > - new->type = ZEBRA_ROUTE_BGP; > > - new->sub_type = BGP_ROUTE_STATIC; > > - new->peer = bgp->peer_self; > > - new->attr = bgp_attr_default_intern (BGP_ORIGIN_IGP); > > - SET_FLAG (new->flags, BGP_INFO_VALID); > > - new->uptime = bgp_clock (); > > - new->extra = bgp_info_extra_new(); > > - memcpy (new->extra->tag, tag, 3); > > - > > - /* Aggregate address increment. */ > > - bgp_aggregate_increment (bgp, p, new, afi, safi); > > - > > - /* Register new BGP information. */ > > - bgp_info_add (rn, new); > > - > > - /* route_node_get lock */ > > - bgp_unlock_node (rn); > > - > > - /* Process change. */ > > - bgp_process (bgp, rn, afi, safi); > > -} > > - > > void > > bgp_static_withdraw (struct bgp *bgp, struct prefix *p, afi_t afi, > > safi_t safi) > > @@ -3695,9 +3662,12 @@ bgp_check_local_routes_rsclient (struct > > peer *rsclient, afi_t afi, safi_t safi) > > } > > } > > > > +/* > > + * Used for SAFI_MPLS_VPN and SAFI_ENCAP > > + */ > > static void > > -bgp_static_withdraw_vpnv4 (struct bgp *bgp, struct prefix *p, > > afi_t afi, > > - safi_t safi, struct prefix_rd *prd, > > u_char *tag) > > +bgp_static_withdraw_safi (struct bgp *bgp, struct prefix *p, > > afi_t afi, > > + safi_t safi, struct prefix_rd *prd, > > u_char *tag) > > { > > struct bgp_node *rn; > > struct bgp_info *ri; > > @@ -3723,6 +3693,131 @@ bgp_static_withdraw_vpnv4 (struct bgp > > *bgp, struct prefix *p, afi_t afi, > > bgp_unlock_node (rn); > > } > > > > +static void > > +bgp_static_update_safi (struct bgp *bgp, struct prefix *p, > > + struct bgp_static *bgp_static, afi_t afi, > > safi_t safi) > > +{ > > + struct bgp_node *rn; > > + struct bgp_info *new; > > + struct attr *attr_new; > > + struct attr attr = { 0 }; > > + struct bgp_info *ri; > > + > > + assert (bgp_static); > > + > > + rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, > > &bgp_static->prd); > > + > > + bgp_attr_default_set (&attr, BGP_ORIGIN_IGP); > > + > > + attr.nexthop = bgp_static->igpnexthop; > > + attr.med = bgp_static->igpmetric; > > + attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC); > > + > > + /* Apply route-map. */ > > + if (bgp_static->rmap.name <http://rmap.name>) > > + { > > + struct attr attr_tmp = attr; > > + struct bgp_info info; > > + int ret; > > + > > + info.peer = bgp->peer_self; > > + info.attr = &attr_tmp; > > + > > + SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_NETWORK); > > + > > + ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, > > &info); > > + > > + bgp->peer_self->rmap_type = 0; > > + > > + if (ret == RMAP_DENYMATCH) > > + { > > + /* Free uninterned attribute. */ > > + bgp_attr_flush (&attr_tmp); > > + > > + /* Unintern original. */ > > + aspath_unintern (&attr.aspath); > > + bgp_attr_extra_free (&attr); > > + bgp_static_withdraw_safi (bgp, p, afi, safi, > > &bgp_static->prd, > > + bgp_static->tag); > > + return; > > + } > > + > > + attr_new = bgp_attr_intern (&attr_tmp); > > + } > > + else > > + { > > + attr_new = bgp_attr_intern (&attr); > > + } > > + > > + for (ri = rn->info; ri; ri = ri->next) > > + if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP > > + && ri->sub_type == BGP_ROUTE_STATIC) > > + break; > > + > > + if (ri) > > + { > > + if (attrhash_cmp (ri->attr, attr_new) && > > + !CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)) > > + { > > + bgp_unlock_node (rn); > > + bgp_attr_unintern (&attr_new); > > + aspath_unintern (&attr.aspath); > > + bgp_attr_extra_free (&attr); > > + return; > > + } > > + else > > + { > > + /* The attribute is changed. */ > > + bgp_info_set_flag (rn, ri, BGP_INFO_ATTR_CHANGED); > > + > > + /* Rewrite BGP route information. */ > > + if (CHECK_FLAG(ri->flags, BGP_INFO_REMOVED)) > > + bgp_info_restore(rn, ri); > > + else > > + bgp_aggregate_decrement (bgp, p, ri, afi, safi); > > + bgp_attr_unintern (&ri->attr); > > + ri->attr = attr_new; > > + ri->uptime = bgp_clock (); > > + > > + /* Process change. */ > > + bgp_aggregate_increment (bgp, p, ri, afi, safi); > > + bgp_process (bgp, rn, afi, safi); > > + bgp_unlock_node (rn); > > + aspath_unintern (&attr.aspath); > > + bgp_attr_extra_free (&attr); > > + return; > > + } > > + } > > + > > + > > + /* Make new BGP info. */ > > + new = bgp_info_new (); > > + new->type = ZEBRA_ROUTE_BGP; > > + new->sub_type = BGP_ROUTE_STATIC; > > + new->peer = bgp->peer_self; > > + new->attr = attr_new; > > + SET_FLAG (new->flags, BGP_INFO_VALID); > > + new->uptime = bgp_clock (); > > + new->extra = bgp_info_extra_new(); > > + memcpy (new->extra->tag, bgp_static->tag, 3); > > + > > + /* Aggregate address increment. */ > > + bgp_aggregate_increment (bgp, p, new, afi, safi); > > + > > + /* Register new BGP information. */ > > + bgp_info_add (rn, new); > > + > > + /* route_node_get lock */ > > + bgp_unlock_node (rn); > > + > > + /* Process change. */ > > + bgp_process (bgp, rn, afi, safi); > > + > > + /* Unintern original. */ > > + aspath_unintern (&attr.aspath); > > + bgp_attr_extra_free (&attr); > > +} > > + > > /* Configure static BGP network. When user don't run zebra, static > > route should be installed as valid. */ > > static int > > @@ -3893,8 +3988,8 @@ bgp_static_delete (struct bgp *bgp) > > for (rm = bgp_table_top (table); rm; rm = > > bgp_route_next (rm)) > > { > > bgp_static = rn->info; > > - bgp_static_withdraw_vpnv4 (bgp, &rm->p, > > - AFI_IP, SAFI_MPLS_VPN, > > + bgp_static_withdraw_safi (bgp, &rm->p, > > + AFI_IP, safi, > > (struct prefix_rd > > *)&rn->p, > > bgp_static->tag); > > bgp_static_free (bgp_static); > > @@ -3913,9 +4008,15 @@ bgp_static_delete (struct bgp *bgp) > > } > > } > > > > +/* > > + * gpz 110624 > > + * Currently this is used to set static routes for VPN and ENCAP. > > + * I think it can probably be factored with bgp_static_set. > > + */ > > int > > -bgp_static_set_vpnv4 (struct vty *vty, const char *ip_str, const > > char *rd_str, > > - const char *tag_str) > > +bgp_static_set_safi (safi_t safi, struct vty *vty, const char > > *ip_str, > > + const char *rd_str, const char *tag_str, > > + const char *rmap_str) > > { > > int ret; > > struct prefix p; > > @@ -3951,10 +4052,10 @@ bgp_static_set_vpnv4 (struct vty *vty, > > const char *ip_str, const char *rd_str, > > return CMD_WARNING; > > } > > > > - prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN], > > + prn = bgp_node_get (bgp->route[AFI_IP][safi], > > (struct prefix *)&prd); > > if (prn->info == NULL) > > - prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN); > > + prn->info = bgp_table_init (AFI_IP, safi); > > else > > bgp_unlock_node (prn); > > table = prn->info; > > @@ -3970,11 +4071,24 @@ bgp_static_set_vpnv4 (struct vty *vty, > > const char *ip_str, const char *rd_str, > > { > > /* New configuration. */ > > bgp_static = bgp_static_new (); > > - bgp_static->valid = 1; > > - memcpy (bgp_static->tag, tag, 3); > > + bgp_static->backdoor = 0; > > + bgp_static->valid = 0; > > + bgp_static->igpmetric = 0; > > + bgp_static->igpnexthop.s_addr = 0; > > + memcpy(bgp_static->tag, tag, 3); > > + bgp_static->prd = prd; > > + > > + if (rmap_str) > > + { > > + if (bgp_static->rmap.name <http://rmap.name>) > > + free (bgp_static->rmap.name <http://rmap.name>); > > + bgp_static->rmap.name <http://rmap.name> = strdup > > (rmap_str); > > + bgp_static->rmap.map = route_map_lookup_by_name (rmap_str); > > + } > > rn->info = bgp_static; > > > > - bgp_static_update_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, > > &prd, tag); > > + bgp_static->valid = 1; > > + bgp_static_update_safi (bgp, &p, bgp_static, AFI_IP, safi); > > } > > > > return CMD_SUCCESS; > > @@ -3982,8 +4096,8 @@ bgp_static_set_vpnv4 (struct vty *vty, const > > char *ip_str, const char *rd_str, > > > > /* Configure static BGP network. */ > > int > > -bgp_static_unset_vpnv4 (struct vty *vty, const char *ip_str, > > - const char *rd_str, const char *tag_str) > > +bgp_static_unset_safi(safi_t safi, struct vty *vty, const char > > *ip_str, > > + const char *rd_str, const char *tag_str) > > { > > int ret; > > struct bgp *bgp; > > @@ -4020,10 +4134,10 @@ bgp_static_unset_vpnv4 (struct vty *vty, > > const char *ip_str, > > return CMD_WARNING; > > } > > > > - prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN], > > + prn = bgp_node_get (bgp->route[AFI_IP][safi], > > (struct prefix *)&prd); > > if (prn->info == NULL) > > - prn->info = bgp_table_init (AFI_IP, SAFI_MPLS_VPN); > > + prn->info = bgp_table_init (AFI_IP, safi); > > else > > bgp_unlock_node (prn); > > table = prn->info; > > @@ -4032,7 +4146,7 @@ bgp_static_unset_vpnv4 (struct vty *vty, > > const char *ip_str, > > > > if (rn) > > { > > - bgp_static_withdraw_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, > > &prd, tag); > > + bgp_static_withdraw_safi (bgp, &p, AFI_IP, safi, &prd, tag); > > > > bgp_static = rn->info; > > bgp_static_free (bgp_static); > > diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h > > index 3d2eea5..3e7f6f5 100644 > > --- a/bgpd/bgp_route.h > > +++ b/bgpd/bgp_route.h > > @@ -209,10 +209,10 @@ extern void bgp_static_update (struct bgp *, > > struct prefix *, struct bgp_static > > afi_t, safi_t); > > extern void bgp_static_withdraw (struct bgp *, struct prefix *, > > afi_t, safi_t); > > > > -extern int bgp_static_set_vpnv4 (struct vty *vty, const char *, > > - const char *, const char *); > > +extern int bgp_static_set_safi (safi_t safi, struct vty *vty, > > const char *, > > + const char *, const char *, const char *); > > > > -extern int bgp_static_unset_vpnv4 (struct vty *, const char *, > > +extern int bgp_static_unset_safi (safi_t safi, struct vty *, > > const char *, > > const char *, const char *); > > > > /* this is primarily for MPLS-VPN */ > > -- > > 2.1.3 > > > > > > _______________________________________________ > > Quagga-dev mailing list > > Quagga-dev@lists.quagga.net <mailto:Quagga-dev@lists.quagga.net> > > https://lists.quagga.net/mailman/listinfo/quagga-dev > > > > > > >
_______________________________________________ Quagga-dev mailing list Quagga-dev@lists.quagga.net https://lists.quagga.net/mailman/listinfo/quagga-dev