/src/vnet/bier/bier_types.c

https://gitlab.com/x1046882802/flexiroutervpp · C · 233 lines · 184 code · 32 blank · 17 comment · 9 complexity · 46dd101ceca0325069bf4ad9d0cce4ea MD5 · raw file

  1. /*
  2. * Copyright (c) 2016 Cisco and/or its affiliates.
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at:
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. #include <vppinfra/types.h>
  16. #include <vnet/bier/bier_types.h>
  17. #include <vnet/bier/bier_hdr_inlines.h>
  18. /*
  19. * enum to string conversions
  20. */
  21. const static char* const bier_hdr_len_id_names[] = BIER_HDR_LEN_IDS;
  22. const static char* const bier_hdr_proto_names[] = BIER_HDR_PROTO_ID_NAMES;
  23. const static u16 bier_hdr_len_num_buckets[] = {
  24. [BIER_HDR_LEN_INVALID] = 0,
  25. [BIER_HDR_LEN_64] = 8,
  26. [BIER_HDR_LEN_128] = 16,
  27. [BIER_HDR_LEN_256] = 32,
  28. [BIER_HDR_LEN_512] = 64,
  29. [BIER_HDR_LEN_1024] = 128,
  30. [BIER_HDR_LEN_2048] = 256,
  31. [BIER_HDR_LEN_4096] = 512,
  32. };
  33. const static u16 bier_hdr_len_num_bits[] = {
  34. [BIER_HDR_LEN_INVALID] = 0,
  35. [BIER_HDR_LEN_64] = 64,
  36. [BIER_HDR_LEN_128] = 128,
  37. [BIER_HDR_LEN_256] = 256,
  38. [BIER_HDR_LEN_512] = 512,
  39. [BIER_HDR_LEN_1024] = 1024,
  40. [BIER_HDR_LEN_2048] = 2048,
  41. [BIER_HDR_LEN_4096] = 4096,
  42. };
  43. const static u16 bier_hdr_len_prefix_len[] = {
  44. [BIER_HDR_LEN_INVALID] = 0,
  45. [BIER_HDR_LEN_64] = 7,
  46. [BIER_HDR_LEN_128] = 8,
  47. [BIER_HDR_LEN_256] = 9,
  48. [BIER_HDR_LEN_512] = 10,
  49. [BIER_HDR_LEN_1024] = 11,
  50. [BIER_HDR_LEN_2048] = 12,
  51. [BIER_HDR_LEN_4096] = 13,
  52. };
  53. u32
  54. bier_hdr_len_id_to_num_buckets (bier_hdr_len_id_t id)
  55. {
  56. return (bier_hdr_len_num_buckets[id]);
  57. }
  58. u32
  59. bier_hdr_len_id_to_num_bytes (bier_hdr_len_id_t id)
  60. {
  61. return (bier_hdr_len_id_to_num_buckets(id));
  62. }
  63. u32
  64. bier_hdr_len_id_to_max_bucket (bier_hdr_len_id_t id)
  65. {
  66. return (bier_hdr_len_id_to_num_buckets(id) - 1);
  67. }
  68. u32
  69. bier_hdr_len_id_to_num_bits (bier_hdr_len_id_t id)
  70. {
  71. return (bier_hdr_len_num_bits[id]);
  72. }
  73. u32
  74. bier_hdr_len_id_to_max_bit (bier_hdr_len_id_t id)
  75. {
  76. return (bier_hdr_len_id_to_num_bits(id));
  77. }
  78. u32
  79. bier_hdr_len_id_to_prefix_len (bier_hdr_len_id_t id)
  80. {
  81. return (bier_hdr_len_prefix_len[id]);
  82. }
  83. u8 *
  84. format_bier_hdr_len_id (u8 *s, va_list *ap)
  85. {
  86. bier_hdr_len_id_t hli = va_arg(*ap, int); // int promotion of bier_hdr_len_id_t
  87. return (format(s, "%s", bier_hdr_len_id_names[hli]));
  88. }
  89. u8 *
  90. format_bier_hdr_proto (u8 *s, va_list *ap)
  91. {
  92. bier_hdr_proto_id_t pi = va_arg(*ap, int);
  93. return (format(s, "%s", bier_hdr_proto_names[pi]));
  94. }
  95. int
  96. bier_table_id_cmp (const bier_table_id_t *btid1,
  97. const bier_table_id_t *btid2)
  98. {
  99. int res;
  100. res = (btid1->bti_set - btid2->bti_set);
  101. if (0 == res)
  102. {
  103. res = (btid1->bti_sub_domain - btid2->bti_sub_domain);
  104. }
  105. if (0 == res)
  106. {
  107. res = (btid1->bti_ecmp - btid2->bti_ecmp);
  108. }
  109. if (0 == res)
  110. {
  111. res = (btid1->bti_hdr_len - btid2->bti_hdr_len);
  112. }
  113. if (0 == res)
  114. {
  115. res = (btid1->bti_type - btid2->bti_type);
  116. }
  117. return (res);
  118. }
  119. dpo_proto_t
  120. bier_hdr_proto_to_dpo (bier_hdr_proto_id_t bproto)
  121. {
  122. switch (bproto)
  123. {
  124. case BIER_HDR_PROTO_INVALID:
  125. case BIER_HDR_PROTO_CTRL:
  126. case BIER_HDR_PROTO_OAM:
  127. ASSERT(0);
  128. break;
  129. case BIER_HDR_PROTO_MPLS_DOWN_STREAM:
  130. case BIER_HDR_PROTO_MPLS_UP_STREAM:
  131. return (DPO_PROTO_MPLS);
  132. case BIER_HDR_PROTO_ETHERNET:
  133. case BIER_HDR_PROTO_VXLAN:
  134. return (DPO_PROTO_ETHERNET);
  135. case BIER_HDR_PROTO_IPV4:
  136. return (DPO_PROTO_IP4);
  137. case BIER_HDR_PROTO_IPV6:
  138. return (DPO_PROTO_IP4);
  139. }
  140. return (DPO_PROTO_NUM);
  141. }
  142. bier_bift_id_t
  143. bier_bift_id_encode (bier_table_set_id_t set,
  144. bier_table_sub_domain_id_t sd,
  145. bier_hdr_len_id_t bsl)
  146. {
  147. bier_bift_id_t id;
  148. id = bsl;
  149. id = id << 8;
  150. id |= sd;
  151. id = id << 8;
  152. id |= set;
  153. return (id);
  154. }
  155. void
  156. bier_bift_id_decode (bier_bift_id_t id,
  157. bier_table_set_id_t *set,
  158. bier_table_sub_domain_id_t *sd,
  159. bier_hdr_len_id_t *bsl)
  160. {
  161. *set = id & 0xff;
  162. id = id >> 8;
  163. *sd = id & 0xff;
  164. id = id >> 8;
  165. *bsl = id;
  166. }
  167. u8 *
  168. format_bier_table_id (u8 *s, va_list *ap)
  169. {
  170. bier_table_id_t *btid = va_arg(*ap, bier_table_id_t *);
  171. return (format(s, "sub-domain:%d set:%d ecmp:%d bsl:%U",
  172. btid->bti_sub_domain,
  173. btid->bti_set,
  174. btid->bti_ecmp,
  175. format_bier_hdr_len_id, btid->bti_hdr_len));
  176. }
  177. u8 *
  178. format_bier_hdr (u8 *s, va_list *ap)
  179. {
  180. bier_hdr_t *bh = va_arg(*ap, bier_hdr_t *);
  181. bier_hdr_t copy = *bh;
  182. bier_hdr_ntoh(&copy);
  183. return (format(s, "nibble:%d version:%d hdr-len:%U entropy:%d proto:%U src:%d",
  184. bier_hdr_get_1st_nibble(&copy),
  185. bier_hdr_get_version(&copy),
  186. format_bier_hdr_len_id, bier_hdr_get_len_id(&copy),
  187. bier_hdr_get_entropy(&copy),
  188. format_bier_hdr_proto, bier_hdr_get_proto_id(&copy),
  189. bier_hdr_get_src_id(&copy)));
  190. }
  191. u8*
  192. format_bier_bift_id(u8 *s, va_list *ap)
  193. {
  194. bier_bift_id_t id = va_arg(*ap, bier_bift_id_t);
  195. bier_table_sub_domain_id_t sd;
  196. bier_table_set_id_t set;
  197. bier_hdr_len_id_t bsl;
  198. bier_bift_id_decode(id, &set, &sd, &bsl);
  199. return (format(s, "0x%x -> set:%d sd:%d hdr-len:%U",
  200. id, set, sd, format_bier_hdr_len_id, bsl));
  201. }