zebra: handle policy routing fragment handling

incoming iptable entries with fragment parameter is handled.
An iptable context is created for each fragment value received from BGP.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
Philippe Guibert 2018-06-20 14:06:31 +02:00
parent 6f5617d877
commit 5ac5b7cc7e
3 changed files with 22 additions and 0 deletions

View File

@ -2943,6 +2943,7 @@ static inline void zread_iptable(ZAPI_HANDLER_ARGS)
STREAM_GETW(s, zpi.tcp_flags);
STREAM_GETW(s, zpi.tcp_mask_flags);
STREAM_GETC(s, zpi.dscp_value);
STREAM_GETC(s, zpi.fragment);
STREAM_GETL(s, zpi.nb_interface);
zebra_pbr_iptable_update_interfacelist(s, &zpi);

View File

@ -93,6 +93,14 @@ static const struct message tcp_value_str[] = {
{0}
};
static const struct message fragment_value_str[] = {
{1, "dont-fragment"},
{2, "is-fragment"},
{4, "first-fragment"},
{8, "last-fragment"},
{0}
};
/* static function declarations */
DEFINE_HOOK(zebra_pbr_ipset_entry_wrap_script_get_stat, (struct zebra_ns *zns,
struct zebra_pbr_ipset_entry *ipset,
@ -376,6 +384,7 @@ uint32_t zebra_pbr_iptable_hash_key(void *arg)
key = jhash_1word(iptable->tcp_flags, key);
key = jhash_1word(iptable->tcp_mask_flags, key);
key = jhash_1word(iptable->dscp_value, key);
key = jhash_1word(iptable->fragment, key);
return jhash_3words(iptable->filter_bm, iptable->type,
iptable->unique, key);
}
@ -410,6 +419,8 @@ int zebra_pbr_iptable_hash_equal(const void *arg1, const void *arg2)
return 0;
if (r1->dscp_value != r2->dscp_value)
return 0;
if (r1->fragment != r2->fragment)
return 0;
return 1;
}
@ -1089,6 +1100,15 @@ static int zebra_pbr_show_iptable_walkcb(struct hash_backet *backet, void *arg)
iptable->filter_bm & MATCH_DSCP_INVERSE_SET ?
"not" : "", iptable->dscp_value);
}
if (iptable->fragment) {
char val_str[10];
sprintf(val_str, "%d", iptable->fragment);
vty_out(vty, "\t fragment%s %s\n",
iptable->filter_bm & MATCH_FRAGMENT_INVERSE_SET ?
" not" : "", lookup_msg(fragment_value_str,
iptable->fragment, val_str));
}
ret = hook_call(zebra_pbr_iptable_wrap_script_get_stat,
zns, iptable, &pkts, &bytes);
if (ret && pkts > 0)

View File

@ -138,6 +138,7 @@ struct zebra_pbr_iptable {
uint16_t tcp_flags;
uint16_t tcp_mask_flags;
uint8_t dscp_value;
uint8_t fragment;
uint32_t nb_interface;