Skip to content

Commit 3096b45

Browse files
feature: add ngx_stream_lua_ffi_req_dst_addr().
1 parent 9c205ed commit 3096b45

File tree

4 files changed

+135
-30
lines changed

4 files changed

+135
-30
lines changed

src/ngx_stream_lua_api.c

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@
1717
#endif
1818
#include "ddebug.h"
1919

20+
#if (NGX_LINUX)
21+
#include <linux/netfilter_ipv4.h>
22+
#if (NGX_HAVE_INET6)
23+
#include <linux/netfilter_ipv6.h>
24+
#include <linux/netfilter_ipv6/ip6_tables.h>
25+
#endif
26+
#endif
2027

2128
#include "ngx_stream_lua_common.h"
2229
#include "api/ngx_stream_lua_api.h"
@@ -218,4 +225,81 @@ ngx_stream_lua_shared_memory_init(ngx_shm_zone_t *shm_zone, void *data)
218225
return NGX_OK;
219226
}
220227

228+
229+
#if (NGX_LINUX)
230+
int
231+
ngx_stream_lua_ffi_req_dst_addr(ngx_stream_lua_request_t *r, char *buf,
232+
int *buf_size, u_char *errbuf, size_t *errbuf_size)
233+
{
234+
int fd;
235+
int opt_name;
236+
int family;
237+
socklen_t addr_sz;
238+
socklen_t len = sizeof(family);
239+
240+
struct sockaddr_storage addr;
241+
242+
addr_sz = sizeof(addr);
243+
/* Check if connection exists */
244+
if (r->session->connection == NULL) {
245+
*errbuf_size = ngx_snprintf(errbuf, *errbuf_size, "no connection")
246+
- errbuf;
247+
return NGX_ERROR;
248+
}
249+
250+
fd = r->session->connection->fd;
251+
252+
/* Validate file descriptor */
253+
if (fd < 0) {
254+
*errbuf_size = ngx_snprintf(errbuf, *errbuf_size, "invalid fd")
255+
- errbuf;
256+
return NGX_ERROR;
257+
}
258+
259+
/* Get socket family using getsockopt */
260+
if (getsockopt(fd, SOL_SOCKET, SO_DOMAIN, &family, &len) != 0) {
261+
*errbuf_size = ngx_snprintf(errbuf, *errbuf_size,
262+
"failed to get socket family") - errbuf;
263+
return NGX_ERROR;
264+
}
265+
266+
memset(&addr, 0, addr_sz);
267+
268+
/* Get original destination address based on socket family */
269+
if (family == AF_INET) {
270+
/* IPv4 */
271+
opt_name = SO_ORIGINAL_DST;
272+
if (getsockopt(fd, SOL_IP, opt_name, &addr, &addr_sz) != 0) {
273+
*errbuf_size
274+
= ngx_snprintf(errbuf, *errbuf_size,
275+
"failed to get IPv4 origin addr") - errbuf;
276+
return NGX_ERROR;
277+
}
278+
#if (NGX_HAVE_INET6)
279+
} else if (family == AF_INET6) {
280+
/* IPv6 */
281+
opt_name = IP6T_SO_ORIGINAL_DST;
282+
if (getsockopt(fd, SOL_IPV6, opt_name, &addr, &addr_sz) != 0) {
283+
*errbuf_size
284+
= ngx_snprintf(errbuf, *errbuf_size,
285+
"failed to get IPv6 origin addr") - errbuf;
286+
return NGX_ERROR;
287+
}
288+
#endif
289+
} else {
290+
/* Unsupported address family */
291+
*errbuf_size
292+
= ngx_snprintf(errbuf, *errbuf_size,
293+
"unsupported address family: %d", family) - errbuf;
294+
return NGX_ERROR;
295+
}
296+
297+
/* Convert socket address to string representation */
298+
*buf_size = ngx_sock_ntop((struct sockaddr *)&addr, addr_sz,
299+
(u_char *) buf, *buf_size, 1);
300+
301+
return NGX_OK;
302+
}
303+
#endif
304+
221305
/* vi:set ft=c ts=4 sw=4 et fdm=marker: */

t/062-count.t

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ ngx: 54
4848
ngx.say("n = ", n)
4949
}
5050
--- stream_response
51-
n = 2
51+
n = 3
5252
--- no_error_log
5353
[error]
5454

t/cert/test2.crt

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
-----BEGIN CERTIFICATE-----
2-
MIIChzCCAfACCQDjCkJpJUtZmjANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMC
3-
VVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28x
4-
EjAQBgNVBAoMCU9wZW5SZXN0eTESMBAGA1UEAwwJdGVzdDIuY29tMSIwIAYJKoZI
5-
hvcNAQkBFhNvcGVucmVzdHlAZ21haWwuY29tMCAXDTE0MDkxMzAwMTgxMFoYDzIx
6-
MTQwODIwMDAxODEwWjCBhjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3Ju
7-
aWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoMCU9wZW5SZXN0eTES
8-
MBAGA1UEAwwJdGVzdDIuY29tMSIwIAYJKoZIhvcNAQkBFhNvcGVucmVzdHlAZ21h
9-
aWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDy+OVI2u5NBOeB2Cyz
10-
Gnwy9b7Ao4CSi05XtUxh2IoVdzYZz6c4PFb9C1ad52LDdRStiQT5A7+RKLj6Kr7f
11-
JrKFziJxMy4g4Kdn9G659vE7CWu/UAVjRUtc+mTBAEfjdbumizmHLG7DmnNhGl3R
12-
NGiVNLsUInSMGfUlJRzZJXhI4QIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAEMmRvyN
13-
N7uE24Tc6TR19JadNHK8g3YGktRoXWiqd/y0HY4NRPgvnK/nX7CY/wXa1j+uDO8K
14-
e6/Ldm5RZrjtvfHJmTSAu8zkqTJz8bqRDH7kzL5Ni2Ky2x8r9dtB0ImpOiSlwvZN
15-
snMvbrxEdwBiqlC9prV2f9aG+ACo1KnPL0j6
2+
MIID7zCCAtegAwIBAgIUS1f/CoGJaRaJvBgrXEXeTSm7kM4wDQYJKoZIhvcNAQEL
3+
BQAwgYYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH
4+
DA1TYW4gRnJhbmNpc2NvMRIwEAYDVQQKDAlPcGVuUmVzdHkxEjAQBgNVBAMMCXRl
5+
c3QyLmNvbTEiMCAGCSqGSIb3DQEJARYTb3BlbnJlc3R5QGdtYWlsLmNvbTAeFw0y
6+
NDAzMjQxMDI1NDhaFw0zNDAzMjIxMDI1NDhaMIGGMQswCQYDVQQGEwJVUzETMBEG
7+
A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzESMBAGA1UE
8+
CgwJT3BlblJlc3R5MRIwEAYDVQQDDAl0ZXN0Mi5jb20xIjAgBgkqhkiG9w0BCQEW
9+
E29wZW5yZXN0eUBnbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
10+
AoIBAQChXBMRP5X9Y0l5NogyIZatou1YDT2BDE9tza6dYKUdraJlGo1T4DZf7LoD
11+
mKFvIpVqLedppZ9z9SrlrsZ8Be6OUbw3kxSyUPDvpauI4XXBR2ZuAHIzTy/Uare1
12+
1iZSjbT0KATiWviMWCWWblyBU5QPMFJJOmcjRDAZocfIUs4CzglRaDorl5qUFJHr
13+
mROaIsag/10nnClTwaGwj1pHmFitKRHTIrYICYd5wGgstte9mDFz15s9a3f/Dwhc
14+
/7neEHYaryRVhR627aDGVHHpcMRWr+FC8QmZTTkiFmO80eeaiyGGTS0AEW51EPI9
15+
Nr142PEaQETpjQaQnfNhZGnwTZHTAgMBAAGjUzBRMB0GA1UdDgQWBBQb73HlJHF7
16+
B4a1PWRkb3aovk7EtDAfBgNVHSMEGDAWgBQb73HlJHF7B4a1PWRkb3aovk7EtDAP
17+
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCQJcLh7+NzAukTG4hV
18+
nVd572U4sCnlXwTN4lnRIkSGbQxOWwbuI7p05iAT9HJrFLm+rV0EOzxyl/fYkPgR
19+
DKYfj7sGPp4Lo0NyQ3xhoVypqDDmv7Wm9CLy2mVTJ07khW5tV8GHg9mFwgb/XBTQ
20+
c+RnNalIapqdlkQbxms5HLzKzTVRuDt+wvqcAsiKFwKDAL9DFrp36TP1t023w+vd
21+
Vb6Ms+l+xFFcxMCxFEOkSPc7szwSce9Q+Hk2C6JdCU30gJPyEBUMl6vD+0l0IFG0
22+
ZEw1BhBp4d92xHiYgdnDEH1RdLPI0q1r7LJL+5ic+VFWycgbC0KRHCarduYgvMYy
23+
GbRG
1624
-----END CERTIFICATE-----

t/cert/test2.key

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,28 @@
1-
-----BEGIN RSA PRIVATE KEY-----
2-
MIICXAIBAAKBgQDy+OVI2u5NBOeB2CyzGnwy9b7Ao4CSi05XtUxh2IoVdzYZz6c4
3-
PFb9C1ad52LDdRStiQT5A7+RKLj6Kr7fJrKFziJxMy4g4Kdn9G659vE7CWu/UAVj
4-
RUtc+mTBAEfjdbumizmHLG7DmnNhGl3RNGiVNLsUInSMGfUlJRzZJXhI4QIDAQAB
5-
AoGAEqBB83PVENJvbOTFiHVfUAjGtr3R/Wnwd4jOcjHHZB3fZ9sjVoxJntxfp3s1
6-
dwZir2rxlqVS6i3VAFiGiVTOGo2Vvzhw2J7f58twCECmnLb2f863AkGEYe4dAndD
7-
GHGD0WI0CBMD1sT18YCj561o0Wol5deWH0gM9pr2N3HkeIECQQD6hUKFlFhrpaHP
8-
WNJsl6BxgE6pB5kxLcMcpIQ7P+kHUvtyvCJl5QZJqPrpPGjRsAI5Ph92rpsp/zDp
9-
/IZNWGVjAkEA+Ele31Rt+XbV32MrLKZgBDBk+Pzss5LTn9fZ5v1k/7hrMk2VVWvk
10-
AD6n5QiGe/g59woANpPb1T9l956SBf0d6wJABTXOS17pc9uvANP1FGMW6CVl/Wf2
11-
DKrJ+weE5IKQwyE7r4gwIvRfbBrClSU3fNzvPueG2f4JphbzmnoxBNzIxwJAYivY
12-
mGNwzHehXx99/byXMHDWK+EN0n8WsBgP75Z3rekEcbJdfpYXY8Via1vwmOnwOW65
13-
4NqbzHix37PSNw37GwJBALxaGNpREO2Tk+oWOvsD2QyviMVae3mXAJHc6nLVdKDM
14-
q0YvDT6VdeNYYFTkAuzJacsVXOpn6AnUMFj0OBedMhc=
15-
-----END RSA PRIVATE KEY-----
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQChXBMRP5X9Y0l5
3+
NogyIZatou1YDT2BDE9tza6dYKUdraJlGo1T4DZf7LoDmKFvIpVqLedppZ9z9Srl
4+
rsZ8Be6OUbw3kxSyUPDvpauI4XXBR2ZuAHIzTy/Uare11iZSjbT0KATiWviMWCWW
5+
blyBU5QPMFJJOmcjRDAZocfIUs4CzglRaDorl5qUFJHrmROaIsag/10nnClTwaGw
6+
j1pHmFitKRHTIrYICYd5wGgstte9mDFz15s9a3f/Dwhc/7neEHYaryRVhR627aDG
7+
VHHpcMRWr+FC8QmZTTkiFmO80eeaiyGGTS0AEW51EPI9Nr142PEaQETpjQaQnfNh
8+
ZGnwTZHTAgMBAAECggEAAhemuvqx8A25YQQsgvM9jXXckbTmPxtQ7QcVmb6BlZ9v
9+
834DJtB0VA0b97pNyZpPXrJGsG+F4E6QZlcRsCpcMWXs72Q4Xfw/tj6AjsSsWWZw
10+
H8K2Dbqb+lYB7i6J463TvWDGzhqeOM+seRq9l1hlRfHQogN1spbf8CJ8Fo8VqHf3
11+
OyId5db0nRUFYV9ciPvJSnk8xi+0aJ2LWVAkCaXQkntbI3529x8KPQm9bGUjdMgo
12+
A+HXAKZTZL7GtGZoSU4jjyymGLM4hPtzXBExbkX7s7HOP1AeWGom4reOC6XNScQq
13+
ysfs0wVzJAVSl0vFbQfUT6GZ2ZsaTdkT+JgXrYwp5QKBgQDIzY1O/Hj2koVgfKmS
14+
2+1JVehX8+yjgz3rSNVUauISLoMaYN4hipsKb7Vi6aDFl+Db296Qql7kIzzd/nFk
15+
UwdBjShUi/xbewGcrYEXbdcXSIxt9ius76eJ9INfa4EmLrZoiX/3Am1u+CcdtcKm
16+
jkqy1o9zoIPbD6lc242zGFK2nQKBgQDNtukEZop/PngCX0yDGWLxisrvFYSrHxnW
17+
x9/Fw0B56qmyG2FpFg5WDlErenHXh+KSlQ3pV1sWK/+3pVzgGP2ZK+nv3ThEQJmg
18+
IbI32dABmUG9+HckxgOuAzfqGW6Y4m5I8YpODjn26V6GeS+xQj0bolr4lZ00QSEG
19+
R5BxxLLHLwKBgQDAzYzWwFgs+HaUNF5lokFt3syeVplqTsOPPHmI+q9iocJD+6qN
20+
Lha7qJLTDFvQHYpL0AsdgFhoWOVCieK6X3ZiHHUS6O4/sBXWKEoBAvg5ZPFhS7KX
21+
8+w768iQQBrbXJLMQOnbdDs7B44XWsQxRAK5QIawkPjJx3norO6bfck9iQKBgA05
22+
Ze9ffCXD6UkVwUBoQGEQsA0AkB/EBxA0lyEKdTmhKTmG4xMzVMaZcwRdgbX+SUVt
23+
CZDnibZ6K50tpzPMx3iyRv6hdP2GPZn6sI9AlEuWA5DnyRj3FcN49344FlEDtV1B
24+
EcgEyBskU2xHnBZEENOW80wpqgpy6WGS9ikqIOgHAoGAeAUetHWIdZZ+Qt6SS1s2
25+
R17YAiZe88QFAo3uK/dyApLgY7wvbM0n7Cor/3tbpzpzAujUb/qNqTdTXsZIeRfq
26+
bI767g4/pNl7+jhDUKmDI001YdfHvcRSwjzyjshuSinJY9rydXLUIEWtkTG3f9v8
27+
d+yLXD2Dz9gF6l2Msj+C3To=
28+
-----END PRIVATE KEY-----

0 commit comments

Comments
 (0)