modernize backfire 10.03 so it can be operational again
[openwrt-10.03/.git] / package / quagga / not-patches / patches-old / nopes / 200-bgpd-implicit_updates_withdrawal_from_zebra.patch
1 From 64e0ac29ddc43bb5b1a2999a8ebedbdff115e3ca Mon Sep 17 00:00:00 2001
2 From: Paul Jakma <paul.jakma@hpe.com>
3 Date: Wed, 18 Nov 2015 16:00:54 +0000
4 Subject: [PATCH] bgpd: Implicit updates in BGP may require a withdrawal from
5  zebra RIB
6
7 *  J Yu <jackiesyu@hotmail.com> noted a problem with bgpd of routes not
8    having their nexthop updated correctly.
9
10    Martin Winter <mwinter@opensourcerouting.org> pinned this down to the
11    case where a BGP route is updated from one with a valid nexthop to an
12    invalid next-hop, using a test tool. Once the problem occurs, the incorrect
13    route may remain, even after further UPDATEs, so long as the nexthop in the
14    zebra RIB does not match the BGP route's nexthop.
15
16    Jacqueline Yu then pinned the issue down further to being due to bgpd
17    sending the DELETE for the route to zebra with the new nexthop after a
18    BGP UPDATE updates an existing route, but then is found to be invalid,
19    and zebra not finding the route as it requires a match on all attributes.
20
21 * bgp_zebra.c: (bgp_zebra_withdraw) When deleting a prefix, we want it gone.
22   Do not send additional matching attributes like the nexthop, which can
23   only cause incorrect non-matches.
24 Acked-by: Donald Sharp <sharpd@cumulusnetworks.com>
25 ---
26  bgpd/bgp_zebra.c | 46 +++++-----------------------------------------
27  1 file changed, 5 insertions(+), 41 deletions(-)
28
29 diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
30 index e534bee..186657b 100644
31 --- a/bgpd/bgp_zebra.c
32 +++ b/bgpd/bgp_zebra.c
33 @@ -863,18 +863,14 @@ bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info, safi_t safi)
34    if (p->family == AF_INET)
35      {
36        struct zapi_ipv4 api;
37 -      struct in_addr *nexthop;
38  
39        api.vrf_id = VRF_DEFAULT;
40        api.flags = flags;
41 -      nexthop = &info->attr->nexthop;
42  
43        api.type = ZEBRA_ROUTE_BGP;
44        api.message = 0;
45        api.safi = safi;
46 -      SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
47 -      api.nexthop_num = 1;
48 -      api.nexthop = &nexthop;
49 +      api.nexthop_num = 0;
50        api.ifindex_num = 0;
51        SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
52        api.metric = info->attr->med;
53 @@ -882,10 +878,9 @@ bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info, safi_t safi)
54        if (BGP_DEBUG(zebra, ZEBRA))
55         {
56           char buf[2][INET_ADDRSTRLEN];
57 -         zlog_debug("Zebra send: IPv4 route delete %s/%d nexthop %s metric %u",
58 +         zlog_debug("Zebra send: IPv4 route delete %s/%d metric %u",
59                      inet_ntop(AF_INET, &p->u.prefix4, buf[0], sizeof(buf[0])),
60                      p->prefixlen,
61 -                    inet_ntop(AF_INET, nexthop, buf[1], sizeof(buf[1])),
62                      api.metric);
63         }
64  
65 @@ -897,54 +892,23 @@ bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info, safi_t safi)
66    if (p->family == AF_INET6)
67      {
68        struct zapi_ipv6 api;
69 -      unsigned int ifindex;
70 -      struct in6_addr *nexthop;
71 -      
72 -      assert (info->attr->extra);
73        
74 -      ifindex = 0;
75 -      nexthop = NULL;
76 -
77 -      /* Only global address nexthop exists. */
78 -      if (info->attr->extra->mp_nexthop_len == 16)
79 -       nexthop = &info->attr->extra->mp_nexthop_global;
80 -
81 -      /* If both global and link-local address present. */
82 -      if (info->attr->extra->mp_nexthop_len == 32)
83 -       {
84 -         nexthop = &info->attr->extra->mp_nexthop_local;
85 -         if (info->peer->nexthop.ifp)
86 -           ifindex = info->peer->nexthop.ifp->ifindex;
87 -       }
88 -
89 -      if (nexthop == NULL)
90 -       return;
91 -
92 -      if (IN6_IS_ADDR_LINKLOCAL (nexthop) && ! ifindex)
93 -       if (info->peer->ifname)
94 -         ifindex = ifname2ifindex (info->peer->ifname);
95 -
96        api.vrf_id = VRF_DEFAULT;
97        api.flags = flags;
98        api.type = ZEBRA_ROUTE_BGP;
99        api.message = 0;
100        api.safi = safi;
101 -      SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
102 -      api.nexthop_num = 1;
103 -      api.nexthop = &nexthop;
104 -      SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX);
105 -      api.ifindex_num = 1;
106 -      api.ifindex = &ifindex;
107 +      api.nexthop_num = 0;
108 +      api.ifindex_num = 0;
109        SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
110        api.metric = info->attr->med;
111  
112        if (BGP_DEBUG(zebra, ZEBRA))
113         {
114           char buf[2][INET6_ADDRSTRLEN];
115 -         zlog_debug("Zebra send: IPv6 route delete %s/%d nexthop %s metric %u",
116 +         zlog_debug("Zebra send: IPv6 route delete %s/%d metric %u",
117                      inet_ntop(AF_INET6, &p->u.prefix6, buf[0], sizeof(buf[0])),
118                      p->prefixlen,
119 -                    inet_ntop(AF_INET6, nexthop, buf[1], sizeof(buf[1])),
120                      api.metric);
121         }
122  
123 -- 
124 2.7.0
125