+*/
+
+ // tproxy implement test
+ #ifndef IP_TRANSPARENT
+ #define IP_TRANSPARENT 19
+ #endif
+ boost::asio::ip::tcp::endpoint dummy_v4_1(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT);
+ boost::asio::ip::tcp::endpoint dummy_v4_2(boost::asio::ip::address::from_string(DUMMY_SERVER_IP), DUMMY_SERVER_PORT + 1);
+ boost::asio::ip::tcp::endpoint dummy_v6_1(boost::asio::ip::address::from_string(DUMMY_SERVER_IPV6), DUMMY_SERVER_PORT);
+ boost::asio::ip::tcp::endpoint dummy_v6_2(boost::asio::ip::address::from_string(DUMMY_SERVER_IPV6), DUMMY_SERVER_PORT + 1);
+ l7vs::tcp_data set_data;
+
+ // server fwdmode is not FWD_TPROXY (FWD_MASQ)
+ l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
+ ::setsockopt_sock = 0;
+ vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_MASQ;
+ set_data.set_endpoint(dummy_v4_1);
+ test_obj.set_up_thread_data_dest_side(set_data);
+ if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
+ test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
+ }
+ test_obj.test_call();
+ // will be no error and not called setsockopt
+ BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
+ BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
+
+ // server fwdmode is not FWD_TPROXY (FWD_NONE) (never happen)
+ l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
+ ::setsockopt_sock = 0;
+ vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_NONE;
+ set_data.set_endpoint(dummy_v4_1);
+ test_obj.set_up_thread_data_dest_side(set_data);
+ if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
+ test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
+ }
+ test_obj.test_call();
+ // will be no error and not called setsockopt
+ BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
+ BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
+
+ // server fwdmode is FWD_TPROXY and client(IPv6), server(IPv4)
+ l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
+ ::setsockopt_sock = 0;
+ vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
+ set_data.set_endpoint(dummy_v4_1);
+ test_obj.set_up_thread_data_dest_side(set_data);
+ test_obj.set_client_endpoint(dummy_v6_1);
+ if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
+ test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
+ }
+ test_obj.test_call();
+ // will be no error and not called setsockopt
+ BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
+ BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
+
+ // server fwdmode is FWD_TPROXY and client(IPv4), server(IPv6)
+ l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
+ ::setsockopt_sock = 0;
+ vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
+ set_data.set_endpoint(dummy_v6_1);
+ test_obj.set_up_thread_data_dest_side(set_data);
+ test_obj.set_client_endpoint(dummy_v4_1);
+ if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
+ test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
+ }
+ test_obj.test_call();
+ // will be no error and not called setsockopt
+ BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
+ BOOST_CHECK_EQUAL(::setsockopt_sock, 0);
+
+ // server fwdmode is FWD_TPROXY and client(IPv4), server(IPv4), setsockopt error
+ l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
+ ::setsockopt_sock = 0;
+ vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
+ set_data.set_endpoint(dummy_v4_1);
+ test_obj.set_up_thread_data_dest_side(set_data);
+ test_obj.set_client_endpoint(dummy_v4_2);
+ setsockopt_ret = -1;
+ setsockopt_level = -1;
+ setsockopt_optname = 0;
+ setsockopt_optval = NULL;
+ setsockopt_optlen = 0;
+ if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
+ test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
+ }
+ test_obj.test_call();
+ // called setsockopt and will be session error
+ BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION, l7vs::Logger::putLogError_category);
+ BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IP);
+ BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
+ BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
+ BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
+
+ // server fwdmode is FWD_TPROXY and client(IPv6), server(IPv6), setsockopt error
+ l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
+ ::setsockopt_sock = 0;
+ vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
+ set_data.set_endpoint(dummy_v6_1);
+ test_obj.set_up_thread_data_dest_side(set_data);
+ test_obj.set_client_endpoint(dummy_v6_2);
+ setsockopt_ret = -1;
+ setsockopt_level = -1;
+ setsockopt_optname = 0;
+ setsockopt_optval = NULL;
+ setsockopt_optlen = 0;
+ if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
+ test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
+ }
+ test_obj.test_call();
+ // called setsockopt and will be session error
+ BOOST_CHECK_EQUAL(l7vs::LOG_CAT_L7VSD_SESSION, l7vs::Logger::putLogError_category);
+ BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IPV6);
+ BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
+ BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
+ BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
+
+ // server fwdmode is FWD_TPROXY and client(IPv4), server(IPv4)
+ l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
+ ::setsockopt_sock = 0;
+ vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
+ set_data.set_endpoint(dummy_v4_1);
+ test_obj.set_up_thread_data_dest_side(set_data);
+ test_obj.set_client_endpoint(dummy_v4_2);
+ setsockopt_ret = 0;
+ setsockopt_level = -1;
+ setsockopt_optname = 0;
+ setsockopt_optval = NULL;
+ setsockopt_optlen = 0;
+ if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
+ test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
+ }
+ test_obj.test_call();
+ // called setsockopt and will be session error
+ BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
+ BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IP);
+ BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
+ BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
+ BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
+
+ // server fwdmode is FWD_TPROXY and client(IPv6), server(IPv6)
+ l7vs::Logger::putLogError_category = l7vs::LOG_CAT_NONE;
+ ::setsockopt_sock = 0;
+ vs.my_element.sorry_fwdmode = l7vs::virtualservice_element::FWD_TPROXY;
+ set_data.set_endpoint(dummy_v6_1);
+ test_obj.set_up_thread_data_dest_side(set_data);
+ test_obj.set_client_endpoint(dummy_v6_2);
+ setsockopt_ret = 0;
+ setsockopt_level = -1;
+ setsockopt_optname = 0;
+ setsockopt_optval = NULL;
+ setsockopt_optlen = 0;
+ if (test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().is_open()) {
+ test_obj.get_sorryserver_socket().second->get_socket().lowest_layer().close();
+ }
+ test_obj.test_call();
+ // called setsockopt and will be session error
+ BOOST_CHECK_EQUAL(l7vs::LOG_CAT_NONE, l7vs::Logger::putLogError_category);
+ BOOST_CHECK_EQUAL(::setsockopt_level, SOL_IPV6);
+ BOOST_CHECK_EQUAL(::setsockopt_optname, IP_TRANSPARENT);
+ BOOST_CHECK_EQUAL(*((int*)::setsockopt_optval), 1);
+ BOOST_CHECK_EQUAL(::setsockopt_optlen, sizeof(int));
+