Skip to content

Commit f06c8d8

Browse files
committed
Simplify websockets unmasking a bit more
1 parent 344c141 commit f06c8d8

File tree

1 file changed

+26
-30
lines changed

1 file changed

+26
-30
lines changed

src/lib/lwan-websocket.c

+26-30
Original file line numberDiff line numberDiff line change
@@ -150,44 +150,40 @@ static size_t get_frame_length(struct lwan_request *request, uint16_t header)
150150

151151
static void unmask(char *msg, size_t msg_len, char mask[static 4])
152152
{
153-
const uint32_t mask32 = string_as_uint32(mask);
154-
char *msg_end = msg + msg_len;
155-
156-
if (sizeof(void *) == 8) {
157-
const uint64_t mask64 = (uint64_t)mask32 << 32 | mask32;
153+
const int32_t mask32 = (int32_t)string_as_uint32(mask);
154+
const char *msg_end = msg + msg_len;
158155

159156
#if defined(__AVX2__)
160-
const size_t len256 = msg_len / 32;
161-
if (len256) {
162-
const __m256i mask256 =
163-
_mm256_setr_epi64x((int64_t)mask64, (int64_t)mask64,
164-
(int64_t)mask64, (int64_t)mask64);
165-
for (size_t i = 0; i < len256; i++) {
166-
__m256i v = _mm256_loadu_si256((__m256i *)msg);
167-
_mm256_storeu_si256((__m256i *)msg,
168-
_mm256_xor_si256(v, mask256));
169-
msg += 32;
170-
}
171-
172-
msg_len = (size_t)(msg_end - msg);
157+
const size_t len256 = msg_len / 32;
158+
if (len256) {
159+
const __m256i mask256 = _mm256_setr_epi32(
160+
mask32, mask32, mask32, mask32, mask32, mask32, mask32, mask32);
161+
for (size_t i = 0; i < len256; i++) {
162+
__m256i v = _mm256_loadu_si256((__m256i *)msg);
163+
_mm256_storeu_si256((__m256i *)msg, _mm256_xor_si256(v, mask256));
164+
msg += 32;
173165
}
166+
167+
msg_len = (size_t)(msg_end - msg);
168+
}
174169
#endif
175170

176171
#if defined(__SSE2__)
177-
const size_t len128 = msg_len / 16;
178-
if (len128) {
179-
const __m128i mask128 =
180-
_mm_setr_epi64((__m64)mask64, (__m64)mask64);
181-
for (size_t i = 0; i < len128; i++) {
182-
__m128i v = _mm_loadu_si128((__m128i *)msg);
183-
_mm_storeu_si128((__m128i *)msg, _mm_xor_si128(v, mask128));
184-
msg += 16;
185-
}
186-
187-
msg_len = (size_t)(msg_end - msg);
172+
const size_t len128 = msg_len / 16;
173+
if (len128) {
174+
const __m128i mask128 = _mm_setr_epi32(mask32, mask32, mask32, mask32);
175+
for (size_t i = 0; i < len128; i++) {
176+
__m128i v = _mm_loadu_si128((__m128i *)msg);
177+
_mm_storeu_si128((__m128i *)msg, _mm_xor_si128(v, mask128));
178+
msg += 16;
188179
}
180+
181+
msg_len = (size_t)(msg_end - msg);
182+
}
189183
#endif
190184

185+
if (sizeof(void *) == 8) {
186+
const uint64_t mask64 = (uint64_t)mask32 << 32 | (uint64_t)mask32;
191187
const size_t len64 = msg_len / 8;
192188
for (size_t i = 0; i < len64; i++) {
193189
uint64_t v = string_as_uint64(msg);
@@ -199,7 +195,7 @@ static void unmask(char *msg, size_t msg_len, char mask[static 4])
199195
const size_t len32 = (size_t)((msg_end - msg) / 4);
200196
for (size_t i = 0; i < len32; i++) {
201197
uint32_t v = string_as_uint32(msg);
202-
v ^= mask32;
198+
v ^= (uint32_t)mask32;
203199
msg = mempcpy(msg, &v, sizeof(v));
204200
}
205201

0 commit comments

Comments
 (0)