Skip to content

Commit e50520b

Browse files
feature: add reuseport for binding local port for udp cosocket.
1 parent c5b3410 commit e50520b

5 files changed

Lines changed: 34 additions & 16 deletions

File tree

src/ngx_stream_lua_socket_tcp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -999,7 +999,7 @@ ngx_stream_lua_socket_tcp_bind(lua_State *L)
999999
luaL_checktype(L, 1, LUA_TTABLE);
10001000

10011001
text = (u_char *) luaL_checklstring(L, 2, &len);
1002-
local = ngx_stream_lua_parse_addr(L, text, len);
1002+
local = ngx_stream_lua_parse_addr(L, text, len, 0);
10031003
if (local == NULL) {
10041004
lua_pushnil(L);
10051005
lua_pushfstring(L, "bad address");

src/ngx_stream_lua_socket_udp.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,11 +262,12 @@ ngx_stream_lua_socket_udp_bind(lua_State *L)
262262
u_char *text;
263263
size_t len;
264264
ngx_addr_t *local;
265+
ngx_int_t port = 0;
265266

266267
ngx_stream_lua_request_t *r;
267268

268269
n = lua_gettop(L);
269-
if (n != 2) {
270+
if (n != 2 && n != 3) {
270271
return luaL_error(L, "expecting 2 arguments, but got %d",
271272
lua_gettop(L));
272273
}
@@ -286,7 +287,13 @@ ngx_stream_lua_socket_udp_bind(lua_State *L)
286287
luaL_checktype(L, 1, LUA_TTABLE);
287288

288289
text = (u_char *) luaL_checklstring(L, 2, &len);
289-
local = ngx_stream_lua_parse_addr(L, text, len);
290+
if (n == 3) {
291+
port = luaL_checkinteger(L, 3);
292+
if (port <= 0 || port > 65535)
293+
return luaL_error(L, "bad port number: %d", port);
294+
}
295+
296+
local = ngx_stream_lua_parse_addr(L, text, len, port);
290297
if (local == NULL) {
291298
lua_pushnil(L);
292299
lua_pushfstring(L, "bad address");
@@ -499,6 +506,7 @@ ngx_stream_lua_socket_udp_setpeername(lua_State *L)
499506
u->resolved->socklen = url.addrs[0].socklen;
500507
u->resolved->naddrs = 1;
501508
u->resolved->host = url.addrs[0].name;
509+
u->resolved->port = ngx_inet_get_port(url.addrs[0].sockaddr);
502510

503511
} else {
504512
u->resolved->host = host;
@@ -1640,7 +1648,7 @@ ngx_stream_lua_udp_connect_set_transparent(ngx_stream_lua_udp_connection_t *uc,
16401648

16411649
#endif /* SO_BINDANY */
16421650

1643-
return NGX_OK;
1651+
return NGX_OK;
16441652
}
16451653
#endif
16461654

@@ -1742,7 +1750,7 @@ ngx_stream_lua_udp_connect(ngx_stream_lua_socket_udp_upstream_t *u)
17421750
#endif
17431751

17441752
#if (NGX_HAVE_IP_BIND_ADDRESS_NO_PORT || NGX_LINUX)
1745-
port = u->resolved->port;
1753+
port = ngx_inet_get_port(local->sockaddr);
17461754
#endif
17471755

17481756
#if (NGX_HAVE_IP_BIND_ADDRESS_NO_PORT)

src/ngx_stream_lua_socket_udp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ typedef struct {
4444
struct sockaddr *sockaddr;
4545
socklen_t socklen;
4646
#if (NGX_HAVE_TRANSPARENT_PROXY)
47-
unsigned transparent:1;
47+
unsigned transparent:1;
4848
#endif
4949
ngx_str_t server;
5050
ngx_log_t log;

src/ngx_stream_lua_util.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3701,7 +3701,8 @@ ngx_stream_lua_set_sa_restart(ngx_log_t *log)
37013701

37023702

37033703
ngx_addr_t *
3704-
ngx_stream_lua_parse_addr(lua_State *L, u_char *text, size_t len)
3704+
ngx_stream_lua_parse_addr(lua_State *L, u_char *text, size_t len,
3705+
in_port_t port)
37053706
{
37063707
ngx_addr_t *addr;
37073708
size_t socklen;
@@ -3718,19 +3719,26 @@ ngx_stream_lua_parse_addr(lua_State *L, u_char *text, size_t len)
37183719
ngx_memzero(&inaddr6, (sizeof(struct in6_addr)));
37193720
#endif
37203721

3721-
inaddr = ngx_inet_addr(text, len);
3722-
if (inaddr != INADDR_NONE) {
3723-
family = AF_INET;
3722+
if (len == 7 && memcmp(text, "0.0.0.0", 7) == 0) {
3723+
inaddr = INADDR_NONE;
37243724
socklen = sizeof(struct sockaddr_in);
3725+
family = AF_INET;
3726+
3727+
} else {
3728+
inaddr = ngx_inet_addr(text, len);
3729+
if (inaddr != INADDR_NONE) {
3730+
family = AF_INET;
3731+
socklen = sizeof(struct sockaddr_in);
37253732
#if (NGX_HAVE_INET6)
37263733

3727-
} else if (ngx_inet6_addr(text, len, inaddr6.s6_addr) == NGX_OK) {
3728-
family = AF_INET6;
3729-
socklen = sizeof(struct sockaddr_in6);
3734+
} else if (ngx_inet6_addr(text, len, inaddr6.s6_addr) == NGX_OK) {
3735+
family = AF_INET6;
3736+
socklen = sizeof(struct sockaddr_in6);
37303737
#endif
37313738

3732-
} else {
3733-
return NULL;
3739+
} else {
3740+
return NULL;
3741+
}
37343742
}
37353743

37363744
addr = lua_newuserdata(L, sizeof(ngx_addr_t) + socklen + len);
@@ -3756,6 +3764,7 @@ ngx_stream_lua_parse_addr(lua_State *L, u_char *text, size_t len)
37563764
break;
37573765
}
37583766

3767+
ngx_inet_set_port(addr->sockaddr, port);
37593768
addr->name.data = (u_char *) addr->sockaddr + socklen;
37603769
addr->name.len = len;
37613770
ngx_memcpy(addr->name.data, text, len);

src/ngx_stream_lua_util.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@ ngx_int_t ngx_stream_lua_open_and_stat_file(u_char *name,
198198
ngx_chain_t *ngx_stream_lua_chain_get_free_buf(ngx_log_t *log, ngx_pool_t *p,
199199
ngx_chain_t **free, size_t len);
200200

201-
ngx_addr_t *ngx_stream_lua_parse_addr(lua_State *L, u_char *text, size_t len);
201+
ngx_addr_t *ngx_stream_lua_parse_addr(lua_State *L, u_char *text, size_t len,
202+
in_port_t port);
202203

203204

204205
static ngx_inline void

0 commit comments

Comments
 (0)