@@ -995,3 +995,158 @@ TEST(pick_address, ipv4_ipv6_enabled2)
995995 ASSERT_EQ (-1 , r);
996996 }
997997}
998+
999+ // Test for IPv4 address
1000+ TEST (is_addr_in_subnet, ipv4)
1001+ {
1002+ std::string public_network = " 10.1.1.0/24" ;
1003+ entity_addr_t addr;
1004+ addr.parse (" 10.1.1.2" , nullptr );
1005+
1006+ boost::intrusive_ptr<CephContext> cct (new CephContext (CEPH_ENTITY_TYPE_OSD), false );
1007+ cct->_conf ._clear_safe_to_start_threads ();
1008+ cct->_conf .set_val (" ms_bind_ipv4" , " true" );
1009+ cct->_conf .set_val (" ms_bind_ipv6" , " false" );
1010+
1011+ bool r = is_addr_in_subnet (cct.get (), public_network, addr);
1012+ ASSERT_EQ (true , r);
1013+ }
1014+
1015+ // Test for IPv6 address
1016+ TEST (is_addr_in_subnet, ipv6)
1017+ {
1018+ std::string public_network = " 2001:db8::/64" ;
1019+ entity_addr_t addr;
1020+ addr.parse (" 2001:db8::1" , nullptr );
1021+
1022+ boost::intrusive_ptr<CephContext> cct (new CephContext (CEPH_ENTITY_TYPE_OSD), false );
1023+ cct->_conf ._clear_safe_to_start_threads ();
1024+ cct->_conf .set_val (" ms_bind_ipv6" , " true" );
1025+ cct->_conf .set_val (" ms_bind_ipv4" , " false" );
1026+
1027+ bool r = is_addr_in_subnet (cct.get (), public_network, addr);
1028+ ASSERT_EQ (true , r);
1029+ }
1030+
1031+ // Test for invalid address
1032+ TEST (is_addr_in_subnet, invalid_address)
1033+ {
1034+ std::string public_network = " 10.1.1.0/24" ;
1035+ entity_addr_t addr;
1036+ addr.parse (" 192.168.1.1" , nullptr );
1037+
1038+ boost::intrusive_ptr<CephContext> cct (new CephContext (CEPH_ENTITY_TYPE_OSD), false );
1039+ cct->_conf ._clear_safe_to_start_threads ();
1040+ cct->_conf .set_val (" ms_bind_ipv4" , " true" );
1041+ cct->_conf .set_val (" ms_bind_ipv6" , " false" );
1042+
1043+ bool r = is_addr_in_subnet (cct.get (), public_network, addr);
1044+ ASSERT_EQ (false , r);
1045+ }
1046+
1047+ // Test for malformed address
1048+ TEST (is_addr_in_subnet, malformed_address)
1049+ {
1050+ std::string public_network = " 10.1.1.0/24" ;
1051+ entity_addr_t addr;
1052+ addr.parse (" invalid_address" , nullptr );
1053+
1054+ boost::intrusive_ptr<CephContext> cct (new CephContext (CEPH_ENTITY_TYPE_OSD), false );
1055+ cct->_conf ._clear_safe_to_start_threads ();
1056+ cct->_conf .set_val (" ms_bind_ipv4" , " true" );
1057+ cct->_conf .set_val (" ms_bind_ipv6" , " false" );
1058+
1059+ // Test with a malformed address
1060+ bool r = is_addr_in_subnet (cct.get (), public_network, addr);
1061+ ASSERT_EQ (false , r);
1062+ }
1063+
1064+ TEST (is_addr_in_subnet, boundary_ipv4)
1065+ {
1066+ std::string public_network = " 10.1.1.0/24" ;
1067+ entity_addr_t addr_low;
1068+ addr_low.parse (" 10.1.1.0" , nullptr );
1069+ entity_addr_t addr_high;
1070+ addr_high.parse (" 10.1.1.255" , nullptr );
1071+ entity_addr_t addr_out;
1072+ addr_out.parse (" 10.1.2.0" , nullptr );
1073+
1074+ boost::intrusive_ptr<CephContext> cct (new CephContext (CEPH_ENTITY_TYPE_OSD), false );
1075+ cct->_conf ._clear_safe_to_start_threads ();
1076+ cct->_conf .set_val (" ms_bind_ipv4" , " true" );
1077+ cct->_conf .set_val (" ms_bind_ipv6" , " false" );
1078+
1079+ ASSERT_TRUE (is_addr_in_subnet (cct.get (), public_network, addr_low));
1080+ ASSERT_TRUE (is_addr_in_subnet (cct.get (), public_network, addr_high));
1081+ ASSERT_FALSE (is_addr_in_subnet (cct.get (), public_network, addr_out));
1082+ }
1083+
1084+ TEST (is_addr_in_subnet, boundary_ipv6)
1085+ {
1086+ std::string public_network = " 2001:db8::/64" ;
1087+ entity_addr_t addr_low;
1088+ addr_low.parse (" 2001:db8::" , nullptr );
1089+ entity_addr_t addr_high;
1090+ addr_high.parse (" 2001:db8:0:0:ffff:ffff:ffff:ffff" , nullptr );
1091+ entity_addr_t addr_out;
1092+ addr_out.parse (" 2001:db9::" , nullptr );
1093+
1094+ boost::intrusive_ptr<CephContext> cct (new CephContext (CEPH_ENTITY_TYPE_OSD), false );
1095+ cct->_conf ._clear_safe_to_start_threads ();
1096+ cct->_conf .set_val (" ms_bind_ipv6" , " true" );
1097+ cct->_conf .set_val (" ms_bind_ipv4" , " false" );
1098+
1099+ ASSERT_TRUE (is_addr_in_subnet (cct.get (), public_network, addr_low));
1100+ ASSERT_TRUE (is_addr_in_subnet (cct.get (), public_network, addr_high));
1101+ ASSERT_FALSE (is_addr_in_subnet (cct.get (), public_network, addr_out));
1102+ }
1103+
1104+ TEST (is_addr_in_subnet, overlapping_subnets)
1105+ {
1106+ std::string public_network_1 = " 10.1.1.0/24" ;
1107+ std::string public_network_2 = " 10.1.2.0/24" ;
1108+ entity_addr_t addr;
1109+ addr.parse (" 10.1.1.5" , nullptr );
1110+
1111+ boost::intrusive_ptr<CephContext> cct (new CephContext (CEPH_ENTITY_TYPE_OSD), false );
1112+ cct->_conf ._clear_safe_to_start_threads ();
1113+ cct->_conf .set_val (" ms_bind_ipv4" , " true" );
1114+ cct->_conf .set_val (" ms_bind_ipv6" , " false" );
1115+
1116+ ASSERT_TRUE (is_addr_in_subnet (cct.get (), public_network_1, addr));
1117+ ASSERT_FALSE (is_addr_in_subnet (cct.get (), public_network_2, addr));
1118+ }
1119+
1120+ TEST (is_addr_in_subnet, mismatched_family)
1121+ {
1122+ std::string public_network_1 = " 2001:db8::/64" ;
1123+ entity_addr_t addr_1;
1124+ addr_1.parse (" 10.1.1.5" , nullptr );
1125+
1126+ std::string public_network_2 = " 10.1.1.0/24" ;
1127+ entity_addr_t addr_2;
1128+ addr_2.parse (" 2001:db8::1" , nullptr );
1129+
1130+ boost::intrusive_ptr<CephContext> cct (new CephContext (CEPH_ENTITY_TYPE_OSD), false );
1131+ cct->_conf ._clear_safe_to_start_threads ();
1132+ cct->_conf .set_val (" ms_bind_ipv4" , " true" );
1133+ cct->_conf .set_val (" ms_bind_ipv6" , " true" );
1134+
1135+ ASSERT_FALSE (is_addr_in_subnet (cct.get (), public_network_1, addr_1));
1136+ ASSERT_FALSE (is_addr_in_subnet (cct.get (), public_network_2, addr_2));
1137+ }
1138+
1139+ TEST (is_addr_in_subnet, invalid_subnets)
1140+ {
1141+ std::string public_network_1 = " 10.1.1.0/33" ;
1142+ std::string public_network_2 = " 25.0.0.99/10" ;
1143+ entity_addr_t addr;
1144+ addr.parse (" 10.1.1.2" , nullptr );
1145+
1146+ boost::intrusive_ptr<CephContext> cct (new CephContext (CEPH_ENTITY_TYPE_OSD), false );
1147+ cct->_conf ._clear_safe_to_start_threads ();
1148+
1149+ ASSERT_FALSE (is_addr_in_subnet (cct.get (), public_network_1, addr)); // Invalid prefix
1150+ ASSERT_FALSE (is_addr_in_subnet (cct.get (), public_network_2, addr)); // Invalid subnet string
1151+ }
1152+
0 commit comments