@@ -353,10 +353,20 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc)
353
353
354
354
#if (NGX_HAVE_TRANSPARENT_PROXY )
355
355
356
+ #if (NGX_HAVE_FSTACK )
357
+ extern int is_fstack_fd (int sockfd );
358
+ #ifndef IP_BINDANY
359
+ #define IP_BINDANY 24
360
+ #endif
361
+ #endif
362
+
356
363
static ngx_int_t
357
364
ngx_event_connect_set_transparent (ngx_peer_connection_t * pc , ngx_socket_t s )
358
365
{
359
366
int value ;
367
+ #if defined(NGX_HAVE_FSTACK )
368
+ int optname ;
369
+ #endif
360
370
361
371
value = 1 ;
362
372
@@ -376,23 +386,31 @@ ngx_event_connect_set_transparent(ngx_peer_connection_t *pc, ngx_socket_t s)
376
386
377
387
case AF_INET :
378
388
379
- #if defined(IP_TRANSPARENT )
389
+ #if defined(NGX_HAVE_FSTACK )
390
+ /****
391
+ FreeBSD define IP_BINDANY in freebsd/netinet/in.h
392
+ Fstack should only support IP_BINDANY.
393
+ ****/
394
+ if (is_fstack_fd (s )){
395
+ optname = IP_BINDANY ;
396
+ } else {
397
+ optname = IP_TRANSPARENT ;
398
+ }
380
399
381
- if (setsockopt (s , IPPROTO_IP , IP_TRANSPARENT ,
400
+ if (setsockopt (s , IPPROTO_IP , optname ,
382
401
(const void * ) & value , sizeof (int )) == -1 )
383
402
{
384
403
ngx_log_error (NGX_LOG_ALERT , pc -> log , ngx_socket_errno ,
385
- "setsockopt(IP_TRANSPARENT) failed" );
404
+ "setsockopt(IP_BINDANY/ IP_TRANSPARENT) failed" );
386
405
return NGX_ERROR ;
387
406
}
388
407
389
- #elif defined(IP_BINDANY )
390
-
391
- if (setsockopt (s , IPPROTO_IP , IP_BINDANY ,
408
+ #elif defined(IP_TRANSPARENT )
409
+ if (setsockopt (s , IPPROTO_IP , IP_TRANSPARENT ,
392
410
(const void * ) & value , sizeof (int )) == -1 )
393
411
{
394
412
ngx_log_error (NGX_LOG_ALERT , pc -> log , ngx_socket_errno ,
395
- "setsockopt(IP_BINDANY ) failed" );
413
+ "setsockopt(IP_TRANSPARENT ) failed" );
396
414
return NGX_ERROR ;
397
415
}
398
416
0 commit comments