Merge pull request #3415 from pguibert6WIND/flowspec_support_nh_tracking

Flowspec support nh tracking
This commit is contained in:
Donald Sharp 2019-01-09 15:41:16 -05:00 committed by GitHub
commit e6cc3dc98b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 42 additions and 1 deletions

View File

@ -23,6 +23,7 @@
#include "prefix.h" #include "prefix.h"
#include "lib_errors.h" #include "lib_errors.h"
#include "bgp_route.h"
#include "bgp_table.h" #include "bgp_table.h"
#include "bgp_flowspec_util.h" #include "bgp_flowspec_util.h"
#include "bgp_flowspec_private.h" #include "bgp_flowspec_private.h"
@ -581,3 +582,27 @@ int bgp_flowspec_match_rules_fill(uint8_t *nlri_content, int len,
} }
return error; return error;
} }
/* return 1 if FS entry invalid or no NH IP */
int bgp_flowspec_get_first_nh(struct bgp *bgp, struct bgp_path_info *pi,
struct prefix *p)
{
struct bgp_pbr_entry_main api;
int i;
struct bgp_node *rn = pi->net;
struct bgp_pbr_entry_action *api_action;
memset(&api, 0, sizeof(struct bgp_pbr_entry_main));
if (bgp_pbr_build_and_validate_entry(&rn->p, pi, &api) < 0)
return 1;
for (i = 0; i < api.action_num; i++) {
api_action = &api.actions[i];
if (api_action->action != ACTION_REDIRECT_IP)
continue;
p->family = AF_INET;
p->prefixlen = IPV4_MAX_BITLEN;
p->u.prefix4 = api_action->u.zr.redirect_ip_v4;
return 0;
}
return 1;
}

View File

@ -54,4 +54,8 @@ extern bool bgp_flowspec_contains_prefix(struct prefix *pfs,
struct prefix *input, struct prefix *input,
int prefix_check); int prefix_check);
extern int bgp_flowspec_get_first_nh(struct bgp *bgp,
struct bgp_path_info *pi,
struct prefix *nh);
#endif /* _FRR_BGP_FLOWSPEC_UTIL_H */ #endif /* _FRR_BGP_FLOWSPEC_UTIL_H */

View File

@ -42,6 +42,7 @@
#include "bgpd/bgp_nht.h" #include "bgpd/bgp_nht.h"
#include "bgpd/bgp_fsm.h" #include "bgpd/bgp_fsm.h"
#include "bgpd/bgp_zebra.h" #include "bgpd/bgp_zebra.h"
#include "bgpd/bgp_flowspec_util.h"
extern struct zclient *zclient; extern struct zclient *zclient;
@ -533,7 +534,15 @@ static int make_prefix(int afi, struct bgp_path_info *pi, struct prefix *p)
&& (pi->sub_type == BGP_ROUTE_STATIC)) && (pi->sub_type == BGP_ROUTE_STATIC))
? 1 ? 1
: 0; : 0;
struct bgp_node *net = pi->net;
struct prefix *p_orig = &net->p;
if (p_orig->family == AF_FLOWSPEC) {
if (!pi->peer)
return -1;
return bgp_flowspec_get_first_nh(pi->peer->bgp,
pi, p);
}
memset(p, 0, sizeof(struct prefix)); memset(p, 0, sizeof(struct prefix));
switch (afi) { switch (afi) {
case AFI_IP: case AFI_IP:

View File

@ -626,7 +626,7 @@ static int bgp_pbr_validate_policy_route(struct bgp_pbr_entry_main *api)
} }
/* return -1 if build or validation failed */ /* return -1 if build or validation failed */
static int bgp_pbr_build_and_validate_entry(struct prefix *p, int bgp_pbr_build_and_validate_entry(struct prefix *p,
struct bgp_path_info *path, struct bgp_path_info *path,
struct bgp_pbr_entry_main *api) struct bgp_pbr_entry_main *api)
{ {

View File

@ -290,4 +290,7 @@ extern void bgp_pbr_reset(struct bgp *bgp, afi_t afi);
extern struct bgp_pbr_interface *bgp_pbr_interface_lookup(const char *name, extern struct bgp_pbr_interface *bgp_pbr_interface_lookup(const char *name,
struct bgp_pbr_interface_head *head); struct bgp_pbr_interface_head *head);
extern int bgp_pbr_build_and_validate_entry(struct prefix *p,
struct bgp_path_info *path,
struct bgp_pbr_entry_main *api);
#endif /* __BGP_PBR_H__ */ #endif /* __BGP_PBR_H__ */