From d792d9c01e60656cbfe1b0f1fd6a9b125f5dab0c Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Sat, 21 Oct 2017 10:53:20 -0700 Subject: BIER - see draft-ietf-bier-mpls-encapsulation-10 - midpoint, head and tail functions - supported payload protocols; IPv4 and IPv6 only. Change-Id: I59d7363bb6fdfdce8e4016a68a9c8f5a5e5791cb Signed-off-by: Neale Ranns --- src/vnet/bier/bier_types.c | 190 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 src/vnet/bier/bier_types.c (limited to 'src/vnet/bier/bier_types.c') diff --git a/src/vnet/bier/bier_types.c b/src/vnet/bier/bier_types.c new file mode 100644 index 00000000000..0d27524aeb1 --- /dev/null +++ b/src/vnet/bier/bier_types.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2016 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +/* + * enum to string conversions + */ +const static char* const bier_hdr_len_id_names[] = BIER_HDR_LEN_IDS; +const static char* const bier_hdr_proto_names[] = BIER_HDR_PROTO_ID_NAMES; + +const static u16 bier_hdr_len_num_buckets[] = { + [BIER_HDR_LEN_INVALID] = 0, + [BIER_HDR_LEN_64] = 8, + [BIER_HDR_LEN_128] = 16, + [BIER_HDR_LEN_256] = 32, + [BIER_HDR_LEN_512] = 64, + [BIER_HDR_LEN_1024] = 128, + [BIER_HDR_LEN_2048] = 256, + [BIER_HDR_LEN_4096] = 512, +}; + +const static u16 bier_hdr_len_num_bits[] = { + [BIER_HDR_LEN_INVALID] = 0, + [BIER_HDR_LEN_64] = 64, + [BIER_HDR_LEN_128] = 128, + [BIER_HDR_LEN_256] = 256, + [BIER_HDR_LEN_512] = 512, + [BIER_HDR_LEN_1024] = 1024, + [BIER_HDR_LEN_2048] = 2048, + [BIER_HDR_LEN_4096] = 4096, +}; + +const static u16 bier_hdr_len_prefix_len[] = { + [BIER_HDR_LEN_INVALID] = 0, + [BIER_HDR_LEN_64] = 7, + [BIER_HDR_LEN_128] = 8, + [BIER_HDR_LEN_256] = 9, + [BIER_HDR_LEN_512] = 10, + [BIER_HDR_LEN_1024] = 11, + [BIER_HDR_LEN_2048] = 12, + [BIER_HDR_LEN_4096] = 13, +}; + +uint32_t +bier_hdr_len_id_to_num_buckets (bier_hdr_len_id_t id) +{ + return (bier_hdr_len_num_buckets[id]); +} + +uint32_t +bier_hdr_len_id_to_num_bytes (bier_hdr_len_id_t id) +{ + return (bier_hdr_len_id_to_num_buckets(id)); +} + +uint32_t +bier_hdr_len_id_to_max_bucket (bier_hdr_len_id_t id) +{ + return (bier_hdr_len_id_to_num_buckets(id) - 1); +} + +uint32_t +bier_hdr_len_id_to_num_bits (bier_hdr_len_id_t id) +{ + return (bier_hdr_len_num_bits[id]); +} + +uint32_t +bier_hdr_len_id_to_max_bit (bier_hdr_len_id_t id) +{ + return (bier_hdr_len_id_to_num_bits(id)); +} + +uint32_t +bier_hdr_len_id_to_prefix_len (bier_hdr_len_id_t id) +{ + return (bier_hdr_len_prefix_len[id]); +} + +u8 * +format_bier_hdr_len_id (u8 *s, va_list *ap) +{ + bier_hdr_len_id_t hli = va_arg(*ap, int); // int promotion of bier_hdr_len_id_t + + return (format(s, "%s", bier_hdr_len_id_names[hli])); +} + +u8 * +format_bier_hdr_proto (u8 *s, va_list *ap) +{ + bier_hdr_proto_id_t pi = va_arg(*ap, int); + + return (format(s, "%s", bier_hdr_proto_names[pi])); +} + +int +bier_table_id_cmp (const bier_table_id_t *btid1, + const bier_table_id_t *btid2) +{ + int res; + + res = (btid1->bti_set - btid2->bti_set); + + if (0 == res) + { + res = (btid1->bti_sub_domain - btid2->bti_sub_domain); + } + if (0 == res) + { + res = (btid1->bti_ecmp - btid2->bti_ecmp); + } + if (0 == res) + { + res = (btid1->bti_hdr_len - btid2->bti_hdr_len); + } + if (0 == res) + { + res = (btid1->bti_type - btid2->bti_type); + } + return (res); +} + +dpo_proto_t +bier_hdr_proto_to_dpo (bier_hdr_proto_id_t bproto) +{ + switch (bproto) + { + case BIER_HDR_PROTO_INVALID: + case BIER_HDR_PROTO_CTRL: + case BIER_HDR_PROTO_OAM: + ASSERT(0); + break; + case BIER_HDR_PROTO_MPLS_DOWN_STREAM: + case BIER_HDR_PROTO_MPLS_UP_STREAM: + return (DPO_PROTO_MPLS); + case BIER_HDR_PROTO_ETHERNET: + case BIER_HDR_PROTO_VXLAN: + return (DPO_PROTO_ETHERNET); + case BIER_HDR_PROTO_IPV4: + return (DPO_PROTO_IP4); + case BIER_HDR_PROTO_IPV6: + return (DPO_PROTO_IP4); + } + + return (DPO_PROTO_NUM); +} + +u8 * +format_bier_table_id (u8 *s, va_list *ap) +{ + bier_table_id_t *btid = va_arg(*ap, bier_table_id_t *); + + return (format(s, "sub-domain:%d set:%d ecmp:%d bsl:%U", + btid->bti_sub_domain, + btid->bti_set, + btid->bti_ecmp, + format_bier_hdr_len_id, btid->bti_hdr_len)); +} + +u8 * +format_bier_hdr (u8 *s, va_list *ap) +{ + bier_hdr_t *bh = va_arg(*ap, bier_hdr_t *); + bier_hdr_t copy = *bh; + + bier_hdr_ntoh(©); + + return (format(s, "nibble:%d version:%d hdr-len:%U entropy:%d proto:%U src:%d", + bier_hdr_get_1st_nibble(©), + bier_hdr_get_version(©), + format_bier_hdr_len_id, bier_hdr_get_len_id(©), + bier_hdr_get_entropy(©), + format_bier_hdr_proto, bier_hdr_get_proto_id(©), + bier_hdr_get_src_id(©))); +} -- cgit 1.2.3-korg