Browse Source

drop large UDP packets

pull/365/head
Max Lv 9 years ago
parent
commit
a9f8b2bdfa
2 changed files with 21 additions and 13 deletions
  1. 30
      src/udprelay.c
  2. 4
      src/udprelay.h

30
src/udprelay.c

@ -635,18 +635,20 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents)
if (buf_len == -1) { if (buf_len == -1) {
// error on recv // error on recv
// simply drop that packet // simply drop that packet
if (verbose) {
ERROR("[udp] server_recvfrom");
}
ERROR("[udp] remote_recvfrom");
goto CLEAN_UP;
}
// Drop large packets > default MTU
if (buf_len > MTU) {
LOGE("[udp] drop large packets, size: %ld", buf_len);
goto CLEAN_UP; goto CLEAN_UP;
} }
#ifdef UDPRELAY_LOCAL #ifdef UDPRELAY_LOCAL
buf = ss_decrypt_all(BUF_SIZE, buf, &buf_len, server_ctx->method); buf = ss_decrypt_all(BUF_SIZE, buf, &buf_len, server_ctx->method);
if (buf == NULL) { if (buf == NULL) {
if (verbose) {
ERROR("[udp] server_ss_decrypt_all");
}
ERROR("[udp] server_ss_decrypt_all");
goto CLEAN_UP; goto CLEAN_UP;
} }
@ -797,6 +799,8 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
LOGE("[udp] unable to get dest addr"); LOGE("[udp] unable to get dest addr");
goto CLEAN_UP; goto CLEAN_UP;
} }
src_addr_len = msg.msg_namelen;
#else #else
ssize_t buf_len = ssize_t buf_len =
recvfrom(server_ctx->fd, buf, BUF_SIZE, 0, (struct sockaddr *)&src_addr, recvfrom(server_ctx->fd, buf, BUF_SIZE, 0, (struct sockaddr *)&src_addr,
@ -805,9 +809,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
if (buf_len == -1) { if (buf_len == -1) {
// error on recv // error on recv
// simply drop that packet // simply drop that packet
if (verbose) {
ERROR("[udp] server_recvfrom");
}
ERROR("[udp] server_recvfrom");
goto CLEAN_UP; goto CLEAN_UP;
} }
#endif #endif
@ -819,9 +821,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
#ifdef UDPRELAY_REMOTE #ifdef UDPRELAY_REMOTE
buf = ss_decrypt_all(BUF_SIZE, buf, &buf_len, server_ctx->method); buf = ss_decrypt_all(BUF_SIZE, buf, &buf_len, server_ctx->method);
if (buf == NULL) { if (buf == NULL) {
if (verbose) {
ERROR("[udp] server_ss_decrypt_all");
}
ERROR("[udp] server_ss_decrypt_all");
goto CLEAN_UP; goto CLEAN_UP;
} }
#endif #endif
@ -833,6 +833,12 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
#endif #endif
#endif #endif
// Drop large packets > default MTU
if (buf_len > MTU) {
LOGE("[udp] drop large packets, size: %ld", buf_len);
goto CLEAN_UP;
}
/* /*
* *
* SOCKS5 UDP Request * SOCKS5 UDP Request

4
src/udprelay.h

@ -37,7 +37,9 @@
#include "common.h" #include "common.h"
#define MAX_UDP_PACKET_SIZE (64 * 1024)
#define MAX_UDP_PACKET_SIZE (2 * 1024) // large enough for a typical MTU 1500
#define MTU 1421 // 1492 - 1 - 28 - 2 - 40 = 1421, the default MTU for UDP relay
struct server_ctx { struct server_ctx {
ev_io io; ev_io io;

Loading…
Cancel
Save