vnstat: avoid adding the same interface over and over when running uci-defaults again...
[packages.git] / net / quagga / patches / 009-bgpd-fix-vpn4-soft-reconfiguration.patch
1 --- a/bgpd/bgp_route.c
2 +++ b/bgpd/bgp_route.c
3 @@ -2616,7 +2616,7 @@ bgp_announce_route_all (struct peer *pee
4  \f
5  static void
6  bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi,
7 -        safi_t safi, struct bgp_table *table)
8 +        safi_t safi, struct bgp_table *table, struct prefix_rd *prd)
9  {
10    struct bgp_node *rn;
11    struct bgp_adj_in *ain;
12 @@ -2627,8 +2627,11 @@ bgp_soft_reconfig_table_rsclient (struct
13    for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
14      for (ain = rn->adj_in; ain; ain = ain->next)
15        {
16 +        struct bgp_info *ri = rn->info;
17 +
18          bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer,
19 -                &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
20 +                &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, prd,
21 +                (bgp_info_extra_get (ri))->tag);
22        }
23  }
24  
25 @@ -2639,18 +2642,25 @@ bgp_soft_reconfig_rsclient (struct peer
26    struct bgp_node *rn;
27    
28    if (safi != SAFI_MPLS_VPN)
29 -    bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL);
30 +    bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL, NULL);
31  
32    else
33      for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
34              rn = bgp_route_next (rn))
35        if ((table = rn->info) != NULL)
36 -        bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table);
37 +        {
38 +          struct prefix_rd prd;
39 +          prd.family = AF_UNSPEC;
40 +          prd.prefixlen = 64;
41 +          memcpy(&prd.val, rn->p.u.val, 8);
42 +
43 +          bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table, &prd);
44 +        }
45  }
46  \f
47  static void
48  bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
49 -                        struct bgp_table *table)
50 +                        struct bgp_table *table, struct prefix_rd *prd)
51  {
52    int ret;
53    struct bgp_node *rn;
54 @@ -2664,9 +2674,12 @@ bgp_soft_reconfig_table (struct peer *pe
55        {
56         if (ain->peer == peer)
57           {
58 +           struct bgp_info *ri = rn->info;
59 +
60             ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
61                               ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
62 -                             NULL, NULL, 1);
63 +                             prd, (bgp_info_extra_get (ri))->tag, 1);
64 +
65             if (ret < 0)
66               {
67                 bgp_unlock_node (rn);
68 @@ -2687,12 +2700,19 @@ bgp_soft_reconfig_in (struct peer *peer,
69      return;
70  
71    if (safi != SAFI_MPLS_VPN)
72 -    bgp_soft_reconfig_table (peer, afi, safi, NULL);
73 +    bgp_soft_reconfig_table (peer, afi, safi, NULL, NULL);
74    else
75      for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
76          rn = bgp_route_next (rn))
77        if ((table = rn->info) != NULL)
78 -       bgp_soft_reconfig_table (peer, afi, safi, table);
79 +        {
80 +          struct prefix_rd prd;
81 +          prd.family = AF_UNSPEC;
82 +          prd.prefixlen = 64;
83 +          memcpy(&prd.val, rn->p.u.val, 8);
84 +
85 +          bgp_soft_reconfig_table (peer, afi, safi, table, &prd);
86 +        }
87  }
88  \f
89