mirror of
https://git.proxmox.com/git/mirror_frr
synced 2026-01-03 23:00:44 +00:00
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:
parent
6f5617d877
commit
5ac5b7cc7e
@ -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);
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user