|
8 | 8 |
|
9 | 9 | #include <common/tracing.h>
|
10 | 10 |
|
11 |
| -uint32_t huffman_codes[256] = { |
12 |
| - 0x1ff8, 0x7fffd8, 0xfffffe2, 0xfffffe3, 0xfffffe4, 0xfffffe5, 0xfffffe6, 0xfffffe7, |
13 |
| - 0xfffffe8, 0xffffea, 0x3ffffffc, 0xfffffe9, 0xfffffea, 0x3ffffffd, 0xfffffeb, 0xfffffec, |
14 |
| - 0xfffffed, 0xfffffee, 0xfffffef, 0xffffff0, 0xffffff1, 0xffffff2, 0x3ffffffe, 0xffffff3, |
15 |
| - 0xffffff4, 0xffffff5, 0xffffff6, 0xffffff7, 0xffffff8, 0xffffff9, 0xffffffa, 0xffffffb, |
16 |
| - 0x14, 0x3f8, 0x3f9, 0xffa, 0x1ff9, 0x15, 0xf8, 0x7fa, |
17 |
| - 0x3fa, 0x3fb, 0xf9, 0x7fb, 0xfa, 0x16, 0x17, 0x18, |
18 |
| - 0x0, 0x1, 0x2, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, |
19 |
| - 0x1e, 0x1f, 0x5c, 0xfb, 0x7ffc, 0x20, 0xffb, 0x3fc, |
20 |
| - 0x1ffa, 0x21, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, |
21 |
| - 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, |
22 |
| - 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, |
23 |
| - 0xfc, 0x73, 0xfd, 0x1ffb, 0x7fff0, 0x1ffc, 0x3ffc, 0x22, |
24 |
| - 0x7ffd, 0x3, 0x23, 0x4, 0x24, 0x5, 0x25, 0x26, |
25 |
| - 0x27, 0x6, 0x74, 0x75, 0x28, 0x29, 0x2a, 0x7, |
26 |
| - 0x2b, 0x76, 0x2c, 0x8, 0x9, 0x2d, 0x77, 0x78, |
27 |
| - 0x79, 0x7a, 0x7b, 0x7ffe, 0x7fc, 0x3ffd, 0x1ffd, 0xffffffc, |
28 |
| - 0xfffe6, 0x3fffd2, 0xfffe7, 0xfffe8, 0x3fffd3, 0x3fffd4, 0x3fffd5, 0x7fffd9, |
29 |
| - 0x3fffd6, 0x7fffda, 0x7fffdb, 0x7fffdc, 0x7fffdd, 0x7fffde, 0xffffeb, 0x7fffdf, |
30 |
| - 0xffffec, 0xffffed, 0x3fffd7, 0x7fffe0, 0xffffee, 0x7fffe1, 0x7fffe2, 0x7fffe3, |
31 |
| - 0x7fffe4, 0x1fffdc, 0x3fffd8, 0x7fffe5, 0x3fffd9, 0x7fffe6, 0x7fffe7, 0xffffef, |
32 |
| - 0x3fffda, 0x1fffdd, 0xfffe9, 0x3fffdb, 0x3fffdc, 0x7fffe8, 0x7fffe9, 0x1fffde, |
33 |
| - 0x7fffea, 0x3fffdd, 0x3fffde, 0xfffff0, 0x1fffdf, 0x3fffdf, 0x7fffeb, 0x7fffec, |
34 |
| - 0x1fffe0, 0x1fffe1, 0x3fffe0, 0x1fffe2, 0x7fffed, 0x3fffe1, 0x7fffee, 0x7fffef, |
35 |
| - 0xfffea, 0x3fffe2, 0x3fffe3, 0x3fffe4, 0x7ffff0, 0x3fffe5, 0x3fffe6, 0x7ffff1, |
36 |
| - 0x3ffffe0, 0x3ffffe1, 0xfffeb, 0x7fff1, 0x3fffe7, 0x7ffff2, 0x3fffe8, 0x1ffffec, |
37 |
| - 0x3ffffe2, 0x3ffffe3, 0x3ffffe4, 0x7ffffde, 0x7ffffdf, 0x3ffffe5, 0xfffff1, 0x1ffffed, |
38 |
| - 0x7fff2, 0x1fffe3, 0x3ffffe6, 0x7ffffe0, 0x7ffffe1, 0x3ffffe7, 0x7ffffe2, 0xfffff2, |
39 |
| - 0x1fffe4, 0x1fffe5, 0x3ffffe8, 0x3ffffe9, 0xffffffd, 0x7ffffe3, 0x7ffffe4, 0x7ffffe5, |
40 |
| - 0xfffec, 0xfffff3, 0xfffed, 0x1fffe6, 0x3fffe9, 0x1fffe7, 0x1fffe8, 0x7ffff3, |
41 |
| - 0x3fffea, 0x3fffeb, 0x1ffffee, 0x1ffffef, 0xfffff4, 0xfffff5, 0x3ffffea, 0x7ffff4, |
42 |
| - 0x3ffffeb, 0x7ffffe6, 0x3ffffec, 0x3ffffed, 0x7ffffe7, 0x7ffffe8, 0x7ffffe9, 0x7ffffea, |
43 |
| - 0x7ffffeb, 0xffffffe, 0x7ffffec, 0x7ffffed, 0x7ffffee, 0x7ffffef, 0x7fffff0, 0x3ffffee, |
44 |
| -}; |
45 |
| - |
46 |
| -uint8_t huffman_code_len[256] = { |
47 |
| - 13, 23, 28, 28, 28, 28, 28, 28, 28, 24, 30, 28, 28, 30, 28, 28, 28, 28, 28, 28, 28, 28, 30, 28, |
48 |
| - 28, 28, 28, 28, 28, 28, 28, 28, 6, 10, 10, 12, 13, 6, 8, 11, 10, 10, 8, 11, 8, 6, 6, 6, |
49 |
| - 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 8, 15, 6, 12, 10, 13, 6, 7, 7, 7, 7, 7, 7, |
50 |
| - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 13, 19, 13, 14, 6, |
51 |
| - 15, 5, 6, 5, 6, 5, 6, 6, 6, 5, 7, 7, 6, 6, 6, 5, 6, 7, 6, 5, 5, 6, 7, 7, |
52 |
| - 7, 7, 7, 15, 11, 14, 13, 28, 20, 22, 20, 20, 22, 22, 22, 23, 22, 23, 23, 23, 23, 23, 24, 23, |
53 |
| - 24, 24, 22, 23, 24, 23, 23, 23, 23, 21, 22, 23, 22, 23, 23, 24, 22, 21, 20, 22, 22, 23, 23, 21, |
54 |
| - 23, 22, 22, 24, 21, 22, 23, 23, 21, 21, 22, 21, 23, 22, 23, 23, 20, 22, 22, 22, 23, 22, 22, 23, |
55 |
| - 26, 26, 20, 19, 22, 23, 22, 25, 26, 26, 26, 27, 27, 26, 24, 25, 19, 21, 26, 27, 27, 26, 27, 24, |
56 |
| - 21, 21, 26, 26, 28, 27, 27, 27, 20, 24, 20, 21, 22, 21, 21, 23, 22, 22, 25, 25, 24, 24, 26, 23, |
57 |
| - 26, 27, 26, 26, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 27, 26, |
58 |
| -}; |
59 |
| - |
60 |
| -#define EOS_CODE (0x3fffffff) |
61 |
| -#define EOS_N_BITS (30) |
62 |
| -#define EOS_PAD_BYTE (EOS_CODE >> (EOS_N_BITS - 8)) |
63 |
| - |
64 | 11 | #define TP_ENCODED_LEN 8
|
65 | 12 |
|
66 | 13 | static unsigned char tp_encoded[TP_ENCODED_LEN] = {
|
67 | 14 | 0x4d, 0x83, 0x21, 0x6b, 0x1d, 0x85, 0xa9, 0x3f}; // hpack encoded "traceparent"
|
68 |
| - |
69 |
| -struct hpack_ctx { |
70 |
| - uint8_t dst[TP_MAX_VAL_LENGTH]; |
71 |
| - int32 dst_len; |
72 |
| - uint8_t src[TP_MAX_VAL_LENGTH]; |
73 |
| - uint64_t m_bytes; |
74 |
| - uint32_t m_count; |
75 |
| - int32 len; |
76 |
| -}; |
77 |
| - |
78 |
| -static int encode_iter(u32 index, struct hpack_ctx *d) { |
79 |
| - int len = d->len; |
80 |
| - |
81 |
| - if (len >= (TP_MAX_VAL_LENGTH - 4)) { |
82 |
| - d->len = -1; |
83 |
| - return 1; |
84 |
| - } |
85 |
| - |
86 |
| - if (index >= TP_MAX_VAL_LENGTH) { |
87 |
| - return 1; |
88 |
| - } |
89 |
| - |
90 |
| - uint8_t b = d->src[index]; |
91 |
| - |
92 |
| - d->m_count += (uint32_t)(huffman_code_len[b]); |
93 |
| - d->m_bytes <<= huffman_code_len[b] % 64; |
94 |
| - d->m_bytes |= huffman_codes[b]; |
95 |
| - if (d->m_count >= 32) { |
96 |
| - d->m_count %= 32; |
97 |
| - uint32_t y = (uint32_t)(d->m_bytes >> d->m_count); |
98 |
| - d->dst[len] = (uint8_t)(y >> 24); |
99 |
| - d->dst[len + 1] = (uint8_t)(y >> 16); |
100 |
| - d->dst[len + 2] = (uint8_t)(y >> 8); |
101 |
| - d->dst[len + 3] = (uint8_t)(y); |
102 |
| - d->len += 4; |
103 |
| - } |
104 |
| - |
105 |
| - return 0; |
106 |
| -} |
107 |
| - |
108 |
| -static __always_inline int32_t hpack_encode_tp(struct hpack_ctx *d) { |
109 |
| - uint32_t nr_loops = TP_MAX_VAL_LENGTH; |
110 |
| - |
111 |
| - bpf_loop(nr_loops, encode_iter, d, 0); |
112 |
| - |
113 |
| - int len = d->len; |
114 |
| - |
115 |
| - if (len < 0) { |
116 |
| - return -1; |
117 |
| - } |
118 |
| - |
119 |
| - if (len > (TP_MAX_VAL_LENGTH - 4)) { |
120 |
| - return -1; |
121 |
| - } |
122 |
| - |
123 |
| - uint32_t over = d->m_count % 8; |
124 |
| - |
125 |
| - if (over > 0 && over < 8) { |
126 |
| - uint32_t pad = (8 - over) & 0x0ff; |
127 |
| - d->m_bytes = (d->m_bytes << pad) | (EOS_PAD_BYTE >> over); |
128 |
| - d->m_count += pad; // 8 now divides into n exactly |
129 |
| - } |
130 |
| - |
131 |
| - uint32_t rem = (d->m_count / 8); |
132 |
| - |
133 |
| - // n in (0, 8, 16, 24, 32) |
134 |
| - switch (rem) { |
135 |
| - case 0: |
136 |
| - return d->len; |
137 |
| - case 1: |
138 |
| - d->dst[len] = (uint8_t)(d->m_bytes); |
139 |
| - d->len += 1; |
140 |
| - return d->len; |
141 |
| - case 2: { |
142 |
| - uint16_t y = (uint16_t)(d->m_bytes); |
143 |
| - d->dst[len] = (uint8_t)(y >> 8); |
144 |
| - d->dst[len + 1] = (uint8_t)(y); |
145 |
| - |
146 |
| - d->len += 2; |
147 |
| - |
148 |
| - return d->len; |
149 |
| - } |
150 |
| - case 3: { |
151 |
| - uint16_t y = (uint16_t)(d->m_bytes >> 8); |
152 |
| - d->dst[len] = (uint8_t)(y >> 8); |
153 |
| - d->dst[len + 1] = (uint8_t)(y); |
154 |
| - d->dst[len + 2] = (uint8_t)(d->m_bytes); |
155 |
| - d->len += 3; |
156 |
| - return d->len; |
157 |
| - } |
158 |
| - default: |
159 |
| - break; |
160 |
| - } |
161 |
| - // case 4: |
162 |
| - uint32_t y = (uint32_t)(d->m_bytes); |
163 |
| - d->dst[len] = (uint8_t)(y >> 24); |
164 |
| - d->dst[len + 1] = (uint8_t)(y >> 16); |
165 |
| - d->dst[len + 2] = (uint8_t)(y >> 8); |
166 |
| - d->dst[len + 3] = (uint8_t)(y); |
167 |
| - |
168 |
| - d->len += 4; |
169 |
| - |
170 |
| - return d->len; |
171 |
| -} |
0 commit comments