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"
@@ -35,8 +42,6 @@ ngx_stream_lua_get_global_state(ngx_conf_t *cf)
3542}
3643
3744
38-
39-
4045static ngx_int_t ngx_stream_lua_shared_memory_init (ngx_shm_zone_t * shm_zone ,
4146 void * data );
4247
@@ -218,4 +223,84 @@ ngx_stream_lua_shared_memory_init(ngx_shm_zone_t *shm_zone, void *data)
218223 return NGX_OK ;
219224}
220225
226+
227+ #if (NGX_LINUX )
228+ int
229+ ngx_stream_lua_ffi_req_dst_addr (ngx_stream_lua_request_t * r , char * buf ,
230+ int * buf_size , u_char * errbuf , size_t * errbuf_size )
231+ {
232+ int fd ;
233+ int opt_name ;
234+ int family ;
235+ socklen_t addr_sz ;
236+ socklen_t len = sizeof (family );
237+
238+ struct sockaddr_storage addr ;
239+
240+ addr_sz = sizeof (addr );
241+ /* Check if connection exists */
242+ if (r -> session -> connection == NULL ) {
243+ * errbuf_size = ngx_snprintf (errbuf , * errbuf_size , "no connection" )
244+ - errbuf ;
245+ return NGX_ERROR ;
246+ }
247+
248+ fd = r -> session -> connection -> fd ;
249+
250+ /* Validate file descriptor */
251+ if (fd < 0 ) {
252+ * errbuf_size = ngx_snprintf (errbuf , * errbuf_size , "invalid fd" )
253+ - errbuf ;
254+ return NGX_ERROR ;
255+ }
256+
257+ /* Get socket family using getsockopt */
258+ if (getsockopt (fd , SOL_SOCKET , SO_DOMAIN , & family , & len ) != 0 ) {
259+ * errbuf_size = ngx_snprintf (errbuf , * errbuf_size ,
260+ "failed to get socket family" ) - errbuf ;
261+ return NGX_ERROR ;
262+ }
263+
264+ memset (& addr , 0 , addr_sz );
265+
266+ /* Get original destination address based on socket family */
267+ if (family == AF_INET ) {
268+ /* IPv4 */
269+ opt_name = SO_ORIGINAL_DST ;
270+ if (getsockopt (fd , SOL_IP , opt_name , & addr , & addr_sz ) != 0 ) {
271+ * errbuf_size
272+ = ngx_snprintf (errbuf , * errbuf_size ,
273+ "failed to get IPv4 origin addr" ) - errbuf ;
274+ return NGX_ERROR ;
275+ }
276+
277+ #if (NGX_HAVE_INET6 )
278+
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+
290+ } else {
291+ /* Unsupported address family */
292+ * errbuf_size
293+ = ngx_snprintf (errbuf , * errbuf_size ,
294+ "unsupported address family: %d" , family ) - errbuf ;
295+ return NGX_ERROR ;
296+ }
297+
298+ /* Convert socket address to string representation */
299+ * buf_size = ngx_sock_ntop ((struct sockaddr * )& addr , addr_sz ,
300+ (u_char * ) buf , * buf_size , 1 );
301+
302+ return NGX_OK ;
303+ }
304+ #endif
305+
221306/* vi:set ft=c ts=4 sw=4 et fdm=marker: */
0 commit comments