From: Philippe Guibert Date: Wed, 20 Jun 2018 12:06:31 +0000 (+0200) Subject: zebra: handle policy routing fragment handling X-Git-Tag: frr-6.1-dev~217^2~4 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=5ac5b7cc7e6ac1ba25e7cd07dd0949e2b62725ae;p=matthieu%2Ffrr.git 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 --- diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index dfbbb8e61f..32165ae789 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -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); diff --git a/zebra/zebra_pbr.c b/zebra/zebra_pbr.c index f9f7882f6c..74ef25b031 100644 --- a/zebra/zebra_pbr.c +++ b/zebra/zebra_pbr.c @@ -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) diff --git a/zebra/zebra_pbr.h b/zebra/zebra_pbr.h index 58c71f4d97..fd83502ae1 100644 --- a/zebra/zebra_pbr.h +++ b/zebra/zebra_pbr.h @@ -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;