Skip to content

Commit d6fed38

Browse files
Merge pull request #1618 from donaldsharp/zebra_startup_ordering
zebra route-leaking for static routes
2 parents 5c65809 + 6140853 commit d6fed38

29 files changed

+652
-168
lines changed

Diff for: babeld/kernel.c

+1
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ zebra_route(int add, int family, const unsigned char *pref, unsigned short plen,
166166
api.type = ZEBRA_ROUTE_BABEL;
167167
api.safi = SAFI_UNICAST;
168168
api.vrf_id = VRF_DEFAULT;
169+
api.nh_vrf_id = VRF_DEFAULT;
169170
api.prefix = quagga_prefix;
170171

171172
if(metric >= KERNEL_INFINITY) {

Diff for: bgpd/bgp_zebra.c

+2
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,7 @@ void bgp_zebra_announce(struct bgp_node *rn, struct prefix *p,
10011001
memset(&api, 0, sizeof(api));
10021002
memcpy(&api.rmac, &(info->attr->rmac), sizeof(struct ethaddr));
10031003
api.vrf_id = bgp->vrf_id;
1004+
api.nh_vrf_id = bgp->vrf_id;
10041005
api.type = ZEBRA_ROUTE_BGP;
10051006
api.safi = safi;
10061007
api.prefix = *p;
@@ -1253,6 +1254,7 @@ void bgp_zebra_withdraw(struct prefix *p, struct bgp_info *info, safi_t safi)
12531254
memset(&api, 0, sizeof(api));
12541255
memcpy(&api.rmac, &(info->attr->rmac), sizeof(struct ethaddr));
12551256
api.vrf_id = peer->bgp->vrf_id;
1257+
api.nh_vrf_id = peer->bgp->vrf_id;
12561258
api.type = ZEBRA_ROUTE_BGP;
12571259
api.safi = safi;
12581260
api.prefix = *p;

Diff for: bgpd/rfapi/vnc_zebra.c

+1
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@ static void vnc_zebra_route_msg(struct prefix *p, unsigned int nhp_count,
396396

397397
memset(&api, 0, sizeof(api));
398398
api.vrf_id = VRF_DEFAULT;
399+
api.nh_vrf_id = VRF_DEFAULT;
399400
api.type = ZEBRA_ROUTE_VNC;
400401
api.safi = SAFI_UNICAST;
401402
api.prefix = *p;

Diff for: eigrpd/eigrp_zebra.c

+2
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ void eigrp_zebra_route_add(struct prefix *p, struct list *successors)
366366

367367
memset(&api, 0, sizeof(api));
368368
api.vrf_id = VRF_DEFAULT;
369+
api.nh_vrf_id = VRF_DEFAULT;
369370
api.type = ZEBRA_ROUTE_EIGRP;
370371
api.safi = SAFI_UNICAST;
371372
memcpy(&api.prefix, p, sizeof(*p));
@@ -407,6 +408,7 @@ void eigrp_zebra_route_delete(struct prefix *p)
407408

408409
memset(&api, 0, sizeof(api));
409410
api.vrf_id = VRF_DEFAULT;
411+
api.nh_vrf_id = VRF_DEFAULT;
410412
api.type = ZEBRA_ROUTE_EIGRP;
411413
api.safi = SAFI_UNICAST;
412414
memcpy(&api.prefix, p, sizeof(*p));

Diff for: isisd/isis_zebra.c

+2
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ static void isis_zebra_route_add_route(struct prefix *prefix,
261261

262262
memset(&api, 0, sizeof(api));
263263
api.vrf_id = VRF_DEFAULT;
264+
api.nh_vrf_id = VRF_DEFAULT;
264265
api.type = ZEBRA_ROUTE_ISIS;
265266
api.safi = SAFI_UNICAST;
266267
api.prefix = *prefix;
@@ -329,6 +330,7 @@ static void isis_zebra_route_del_route(struct prefix *prefix,
329330

330331
memset(&api, 0, sizeof(api));
331332
api.vrf_id = VRF_DEFAULT;
333+
api.nh_vrf_id = VRF_DEFAULT;
332334
api.type = ZEBRA_ROUTE_ISIS;
333335
api.safi = SAFI_UNICAST;
334336
api.prefix = *prefix;

Diff for: lib/if.c

+12
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,18 @@ struct interface *if_lookup_by_index(ifindex_t ifindex, vrf_id_t vrf_id)
219219
struct vrf *vrf;
220220
struct interface if_tmp;
221221

222+
if (vrf_id == VRF_UNKNOWN) {
223+
struct interface *ifp;
224+
225+
RB_FOREACH(vrf, vrf_id_head, &vrfs_by_id) {
226+
ifp = if_lookup_by_index(ifindex, vrf->vrf_id);
227+
if (ifp)
228+
return ifp;
229+
}
230+
231+
return NULL;
232+
}
233+
222234
vrf = vrf_lookup_by_id(vrf_id);
223235
if (!vrf)
224236
return NULL;

Diff for: lib/if.h

+7
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,13 @@ struct nbr_connected {
452452
/* Prototypes. */
453453
extern int if_cmp_name_func(char *, char *);
454454

455+
/*
456+
* Passing in VRF_UNKNOWN is a valid thing to do, unless we
457+
* are creating a new interface.
458+
*
459+
* This is useful for vrf route-leaking. So more than anything
460+
* else think before you use VRF_UNKNOWN
461+
*/
455462
extern void if_update_to_new_vrf(struct interface *, vrf_id_t vrf_id);
456463
extern struct interface *if_create(const char *name, vrf_id_t vrf_id);
457464
extern struct interface *if_lookup_by_index(ifindex_t, vrf_id_t vrf_id);

Diff for: lib/zclient.c

+5
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,8 @@ int zapi_route_encode(u_char cmd, struct stream *s, struct zapi_route *api)
942942
}
943943

944944
stream_putw(s, api->nexthop_num);
945+
if (api->nexthop_num)
946+
stream_putw(s, api->nh_vrf_id);
945947

946948
for (i = 0; i < api->nexthop_num; i++) {
947949
api_nh = &api->nexthops[i];
@@ -1091,6 +1093,9 @@ int zapi_route_decode(struct stream *s, struct zapi_route *api)
10911093
return -1;
10921094
}
10931095

1096+
if (api->nexthop_num)
1097+
STREAM_GETW(s, api->nh_vrf_id);
1098+
10941099
for (i = 0; i < api->nexthop_num; i++) {
10951100
api_nh = &api->nexthops[i];
10961101

Diff for: lib/zclient.h

+6
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ struct zapi_route {
281281
u_int32_t mtu;
282282

283283
vrf_id_t vrf_id;
284+
vrf_id_t nh_vrf_id;
284285

285286
struct ethaddr rmac;
286287
};
@@ -420,6 +421,11 @@ extern struct interface *zebra_interface_vrf_update_read(struct stream *s,
420421
vrf_id_t *new_vrf_id);
421422
extern void zebra_interface_if_set_value(struct stream *, struct interface *);
422423
extern void zebra_router_id_update_read(struct stream *s, struct prefix *rid);
424+
425+
#if CONFDATE > 20180823
426+
CPP_NOTICE("zapi_ipv4_route, zapi_ipv6_route, zapi_ipv4_route_ipv6_nexthop as well as the zapi_ipv4 and zapi_ipv6 data structures should be removed now");
427+
#endif
428+
423429
extern int zapi_ipv4_route(u_char, struct zclient *, struct prefix_ipv4 *,
424430
struct zapi_ipv4 *) __attribute__((deprecated));
425431

Diff for: nhrpd/nhrp_route.c

+2
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ void nhrp_route_announce(int add, enum nhrp_cache_type type, const struct prefix
9595
memset(&api, 0, sizeof(api));
9696
api.type = ZEBRA_ROUTE_NHRP;
9797
api.safi = SAFI_UNICAST;
98+
api.vrf_id = VRF_DEFAULT;
99+
api.nh_vrf_id = VRF_DEFAULT;
98100
api.prefix = *p;
99101

100102
switch (type) {

Diff for: ospf6d/ospf6_zebra.c

+3
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ static void ospf6_zebra_route_update(int type, struct ospf6_route *request)
337337

338338
memset(&api, 0, sizeof(api));
339339
api.vrf_id = VRF_DEFAULT;
340+
api.nh_vrf_id = VRF_DEFAULT;
340341
api.type = ZEBRA_ROUTE_OSPF6;
341342
api.safi = SAFI_UNICAST;
342343
api.prefix = *dest;
@@ -387,6 +388,7 @@ void ospf6_zebra_add_discard(struct ospf6_route *request)
387388
if (!CHECK_FLAG(request->flag, OSPF6_ROUTE_BLACKHOLE_ADDED)) {
388389
memset(&api, 0, sizeof(api));
389390
api.vrf_id = VRF_DEFAULT;
391+
api.nh_vrf_id = VRF_DEFAULT;
390392
api.type = ZEBRA_ROUTE_OSPF6;
391393
api.safi = SAFI_UNICAST;
392394
api.prefix = *dest;
@@ -420,6 +422,7 @@ void ospf6_zebra_delete_discard(struct ospf6_route *request)
420422
if (CHECK_FLAG(request->flag, OSPF6_ROUTE_BLACKHOLE_ADDED)) {
421423
memset(&api, 0, sizeof(api));
422424
api.vrf_id = VRF_DEFAULT;
425+
api.nh_vrf_id = VRF_DEFAULT;
423426
api.type = ZEBRA_ROUTE_OSPF6;
424427
api.safi = SAFI_UNICAST;
425428
api.prefix = *dest;

Diff for: ospfd/ospf_zebra.c

+4
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ void ospf_zebra_add(struct ospf *ospf, struct prefix_ipv4 *p,
389389

390390
memset(&api, 0, sizeof(api));
391391
api.vrf_id = ospf->vrf_id;
392+
api.nh_vrf_id = ospf->vrf_id;
392393
api.type = ZEBRA_ROUTE_OSPF;
393394
api.instance = ospf->instance;
394395
api.safi = SAFI_UNICAST;
@@ -466,6 +467,7 @@ void ospf_zebra_delete(struct ospf *ospf, struct prefix_ipv4 *p,
466467

467468
memset(&api, 0, sizeof(api));
468469
api.vrf_id = ospf->vrf_id;
470+
api.nh_vrf_id = ospf->vrf_id;
469471
api.type = ZEBRA_ROUTE_OSPF;
470472
api.instance = ospf->instance;
471473
api.safi = SAFI_UNICAST;
@@ -487,6 +489,7 @@ void ospf_zebra_add_discard(struct ospf *ospf, struct prefix_ipv4 *p)
487489

488490
memset(&api, 0, sizeof(api));
489491
api.vrf_id = ospf->vrf_id;
492+
api.nh_vrf_id = ospf->vrf_id;
490493
api.type = ZEBRA_ROUTE_OSPF;
491494
api.instance = ospf->instance;
492495
api.safi = SAFI_UNICAST;
@@ -506,6 +509,7 @@ void ospf_zebra_delete_discard(struct ospf *ospf, struct prefix_ipv4 *p)
506509

507510
memset(&api, 0, sizeof(api));
508511
api.vrf_id = ospf->vrf_id;
512+
api.nh_vrf_id = ospf->vrf_id;
509513
api.type = ZEBRA_ROUTE_OSPF;
510514
api.instance = ospf->instance;
511515
api.safi = SAFI_UNICAST;

Diff for: ripd/rip_zebra.c

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ static void rip_zebra_ipv4_send(struct route_node *rp, u_char cmd)
4848

4949
memset(&api, 0, sizeof(api));
5050
api.vrf_id = VRF_DEFAULT;
51+
api.nh_vrf_id = VRF_DEFAULT;
5152
api.type = ZEBRA_ROUTE_RIP;
5253
api.safi = SAFI_UNICAST;
5354

Diff for: ripngd/ripng_zebra.c

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ static void ripng_zebra_ipv6_send(struct route_node *rp, u_char cmd)
4848

4949
memset(&api, 0, sizeof(api));
5050
api.vrf_id = VRF_DEFAULT;
51+
api.nh_vrf_id = VRF_DEFAULT;
5152
api.type = ZEBRA_ROUTE_RIPNG;
5253
api.safi = SAFI_UNICAST;
5354
api.prefix = rp->p;

Diff for: sharpd/sharp_zebra.c

+2
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ void route_add(struct prefix *p, struct nexthop *nh)
159159

160160
memset(&api, 0, sizeof(api));
161161
api.vrf_id = VRF_DEFAULT;
162+
api.nh_vrf_id = VRF_DEFAULT;
162163
api.type = ZEBRA_ROUTE_SHARP;
163164
api.safi = SAFI_UNICAST;
164165
memcpy(&api.prefix, p, sizeof(*p));
@@ -180,6 +181,7 @@ void route_delete(struct prefix *p)
180181

181182
memset(&api, 0, sizeof(api));
182183
api.vrf_id = VRF_DEFAULT;
184+
api.nh_vrf_id = VRF_DEFAULT;
183185
api.type = ZEBRA_ROUTE_SHARP;
184186
api.safi = SAFI_UNICAST;
185187
memcpy(&api.prefix, p, sizeof(*p));

Diff for: zebra/connected.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,12 @@ void connected_up(struct interface *ifp, struct connected *ifc)
238238
break;
239239
}
240240

241-
rib_add(afi, SAFI_UNICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT, 0, 0,
241+
rib_add(afi, SAFI_UNICAST, ifp->vrf_id, ifp->vrf_id,
242+
ZEBRA_ROUTE_CONNECT, 0, 0,
242243
&p, NULL, &nh, RT_TABLE_MAIN, ifp->metric, 0, 0, 0);
243244

244-
rib_add(afi, SAFI_MULTICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT, 0, 0,
245+
rib_add(afi, SAFI_MULTICAST, ifp->vrf_id, ifp->vrf_id,
246+
ZEBRA_ROUTE_CONNECT, 0, 0,
245247
&p, NULL, &nh, RT_TABLE_MAIN, ifp->metric, 0, 0, 0);
246248

247249
if (IS_ZEBRA_DEBUG_RIB_DETAILED) {

Diff for: zebra/kernel_socket.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,7 @@ void rtm_read(struct rt_msghdr *rtm)
10481048

10491049
if (rtm->rtm_type == RTM_GET || rtm->rtm_type == RTM_ADD
10501050
|| rtm->rtm_type == RTM_CHANGE)
1051-
rib_add(AFI_IP, SAFI_UNICAST, VRF_DEFAULT,
1051+
rib_add(AFI_IP, SAFI_UNICAST, VRF_DEFAULT, VRF_DEFAULT,
10521052
ZEBRA_ROUTE_KERNEL, 0, zebra_flags, &p, NULL,
10531053
&nh, 0, 0, 0, 0, 0);
10541054
else
@@ -1096,7 +1096,7 @@ void rtm_read(struct rt_msghdr *rtm)
10961096

10971097
if (rtm->rtm_type == RTM_GET || rtm->rtm_type == RTM_ADD
10981098
|| rtm->rtm_type == RTM_CHANGE)
1099-
rib_add(AFI_IP6, SAFI_UNICAST, VRF_DEFAULT,
1099+
rib_add(AFI_IP6, SAFI_UNICAST, VRF_DEFAULT, VRF_DEFAULT,
11001100
ZEBRA_ROUTE_KERNEL, 0, zebra_flags, &p, NULL,
11011101
&nh, 0, 0, 0, 0, 0);
11021102
else

Diff for: zebra/main.c

+7-10
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,13 @@ int main(int argc, char **argv)
300300
zebra_if_init();
301301
zebra_debug_init();
302302
router_id_cmd_init();
303+
304+
/*
305+
* Initialize NS( and implicitly the VRF module), and make kernel
306+
* routing socket. */
307+
zebra_ns_init();
308+
309+
zebra_vty_init();
303310
access_list_init();
304311
prefix_list_init();
305312
#if defined(HAVE_RTADV)
@@ -317,16 +324,6 @@ int main(int argc, char **argv)
317324
/* For debug purpose. */
318325
/* SET_FLAG (zebra_debug_event, ZEBRA_DEBUG_EVENT); */
319326

320-
/* Initialize NS( and implicitly the VRF module), and make kernel
321-
* routing socket. */
322-
zebra_ns_init();
323-
324-
/*
325-
* Initialize show/config command after the vrf initialization is
326-
* complete
327-
*/
328-
zebra_vty_init();
329-
330327
#if defined(HANDLE_ZAPI_FUZZING)
331328
if (fuzzing) {
332329
zserv_read_file(fuzzing);

Diff for: zebra/rib.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ struct route_entry {
5959

6060
/* VRF identifier. */
6161
vrf_id_t vrf_id;
62+
vrf_id_t nh_vrf_id;
6263

6364
/* Which routing table */
6465
uint32_t table;
@@ -293,8 +294,8 @@ extern void rib_uninstall_kernel(struct route_node *rn, struct route_entry *re);
293294
/* NOTE:
294295
* All rib_add function will not just add prefix into RIB, but
295296
* also implicitly withdraw equal prefix of same type. */
296-
extern int rib_add(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
297-
u_short instance, int flags, struct prefix *p,
297+
extern int rib_add(afi_t afi, safi_t safi, vrf_id_t vrf_id, vrf_id_t nh_vrf_id,
298+
int type, u_short instance, int flags, struct prefix *p,
298299
struct prefix_ipv6 *src_p, const struct nexthop *nh,
299300
u_int32_t table_id, u_int32_t metric, u_int32_t mtu,
300301
uint8_t distance, route_tag_t tag);
@@ -439,6 +440,8 @@ DECLARE_HOOK(rib_update, (struct route_node * rn, const char *reason),
439440

440441

441442
extern void zebra_vty_init(void);
443+
extern int static_config(struct vty *vty, struct zebra_vrf *zvrf,
444+
afi_t afi, safi_t safi, const char *cmd);
442445
extern pid_t pid;
443446

444447
#endif /*_ZEBRA_RIB_H */

0 commit comments

Comments
 (0)