diff options
author | Francis Dupont <fdupont@isc.org> | 2024-06-02 17:00:55 +0200 |
---|---|---|
committer | Francis Dupont <fdupont@isc.org> | 2024-06-14 22:44:34 +0200 |
commit | 58cc9eb76c08598301610ff4c0340efa5b681601 (patch) | |
tree | 2360434c50680599c4a0f7e74e2cb62fda69f391 /src/bin | |
parent | [#3366] Fixed failures in CfgIface UTs (diff) | |
download | kea-58cc9eb76c08598301610ff4c0340efa5b681601.tar.xz kea-58cc9eb76c08598301610ff4c0340efa5b681601.zip |
[#2755] Code done, doc to update
Diffstat (limited to 'src/bin')
-rw-r--r-- | src/bin/dhcp4/dhcp4_srv.cc | 12 | ||||
-rw-r--r-- | src/bin/dhcp4/tests/dhcp4_srv_unittest.cc | 116 | ||||
-rw-r--r-- | src/bin/dhcp4/tests/dhcp4_test_utils.cc | 26 | ||||
-rw-r--r-- | src/bin/dhcp4/tests/inform_unittest.cc | 8 | ||||
-rw-r--r-- | src/bin/dhcp6/tests/dhcp6_srv_unittest.cc | 7 |
5 files changed, 51 insertions, 118 deletions
diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index dbbc728327..664a0ecdbc 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -4392,16 +4392,8 @@ Dhcpv4Srv::recoverStashedAgentOption(const Pkt4Ptr& query) { } vector<uint8_t> rai_data; str::decodeFormattedHexString(rai_hex, rai_data); - static OptionDefinitionPtr rai_def; - if (!rai_def) { - rai_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_AGENT_OPTIONS); - } - if (!rai_def) { - // Should not happen. - return; - } - OptionCustomPtr rai(new OptionCustom(*rai_def, Option::V4, rai_data)); + static const OptionDefinition& rai_def = LibDHCP::DHO_DHCP_AGENT_OPTIONS_DEF(); + OptionCustomPtr rai(new OptionCustom(rai_def, Option::V4, rai_data)); // unpackOptions is a bit too flexible so check if it got something... if (!rai || rai->getOptions().empty()) { return; diff --git a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc index b97776e72e..a044fadabb 100644 --- a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc +++ b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc @@ -304,10 +304,8 @@ TEST_F(Dhcpv4SrvTest, adjustIfaceDataRelayPort) { req->setRemotePort(1234); // Add a RAI relay-port sub-option (the only difference with the previous test). - OptionDefinitionPtr rai_def = - LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, DHO_DHCP_AGENT_OPTIONS); - ASSERT_TRUE(rai_def); - OptionCustomPtr rai(new OptionCustom(*rai_def, Option::V4)); + const OptionDefinition& rai_def = LibDHCP::DHO_DHCP_AGENT_OPTIONS_DEF(); + OptionCustomPtr rai(new OptionCustom(rai_def, Option::V4)); ASSERT_TRUE(rai); req->addOption(rai); OptionPtr relay_port(new Option(Option::V4, RAI_OPTION_RELAY_PORT)); @@ -880,10 +878,8 @@ TEST_F(Dhcpv4SrvTest, initResponse) { // client-id echo is optional // rai echo is done in relayAgentInfoEcho // Do subnet selection option - OptionDefinitionPtr sbnsel_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_SUBNET_SELECTION); - ASSERT_TRUE(sbnsel_def); - OptionCustomPtr sbnsel(new OptionCustom(*sbnsel_def, Option::V4)); + const OptionDefinition& sbnsel_def = LibDHCP::DHO_SUBNET_SELECTION_DEF(); + OptionCustomPtr sbnsel(new OptionCustom(sbnsel_def, Option::V4)); ASSERT_TRUE(sbnsel); sbnsel->writeAddress(IOAddress("192.0.2.3")); query->addOption(sbnsel); @@ -1081,11 +1077,9 @@ TEST_F(Dhcpv4SrvTest, sanityCheckDiscover) { ASSERT_NO_THROW(srv.processDiscover(pkt)); // Now let's add a server-id. This should throw. - OptionDefinitionPtr server_id_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_SERVER_IDENTIFIER); - ASSERT_TRUE(server_id_def); + const OptionDefinition& server_id_def = LibDHCP::DHO_DHCP_SERVER_IDENTIFIER_DEF(); - OptionCustomPtr server_id(new OptionCustom(*server_id_def, Option::V4)); + OptionCustomPtr server_id(new OptionCustom(server_id_def, Option::V4)); server_id->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(server_id); EXPECT_THROW_MSG(srv.processDiscover(pkt), RFCViolation, @@ -1113,10 +1107,8 @@ TEST_F(Dhcpv4SrvTest, sanityCheckRequest) { EXPECT_NO_THROW(srv.processRequest(pkt)); // Now let's add a requested address. This should not throw. - OptionDefinitionPtr req_addr_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_REQUESTED_ADDRESS); - ASSERT_TRUE(req_addr_def); - OptionCustomPtr req_addr(new OptionCustom(*req_addr_def, Option::V4)); + const OptionDefinition& req_addr_def = LibDHCP::DHO_DHCP_REQUESTED_ADDRESS_DEF(); + OptionCustomPtr req_addr(new OptionCustom(req_addr_def, Option::V4)); req_addr->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(req_addr); ASSERT_NO_THROW(srv.processRequest(pkt)); @@ -1128,11 +1120,9 @@ TEST_F(Dhcpv4SrvTest, sanityCheckRequest) { ASSERT_NO_THROW(srv.processRequest(pkt)); // Now let's add a server-id. This should not throw. - OptionDefinitionPtr server_id_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_SERVER_IDENTIFIER); - ASSERT_TRUE(server_id_def); + const OptionDefinition& server_id_def = LibDHCP::DHO_DHCP_SERVER_IDENTIFIER_DEF(); - OptionCustomPtr server_id(new OptionCustom(*server_id_def, Option::V4)); + OptionCustomPtr server_id(new OptionCustom(server_id_def, Option::V4)); server_id->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(server_id); EXPECT_NO_THROW(srv.processRequest(pkt)); @@ -1160,10 +1150,8 @@ TEST_F(Dhcpv4SrvTest, sanityCheckDecline) { " sent from [hwtype=1 00:fe:fe:fe:fe:fe], cid=[no info], tid=0x4d2"); // Now let's add a requested address. This should not throw. - OptionDefinitionPtr req_addr_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_REQUESTED_ADDRESS); - ASSERT_TRUE(req_addr_def); - OptionCustomPtr req_addr(new OptionCustom(*req_addr_def, Option::V4)); + const OptionDefinition& req_addr_def = LibDHCP::DHO_DHCP_REQUESTED_ADDRESS_DEF(); + OptionCustomPtr req_addr(new OptionCustom(req_addr_def, Option::V4)); req_addr->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(req_addr); ASSERT_NO_THROW(srv.processDecline(pkt)); @@ -1175,11 +1163,9 @@ TEST_F(Dhcpv4SrvTest, sanityCheckDecline) { ASSERT_NO_THROW(srv.processDecline(pkt)); // Now let's add a server-id. This should not throw. - OptionDefinitionPtr server_id_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_SERVER_IDENTIFIER); - ASSERT_TRUE(server_id_def); + const OptionDefinition& server_id_def = LibDHCP::DHO_DHCP_SERVER_IDENTIFIER_DEF(); - OptionCustomPtr server_id(new OptionCustom(*server_id_def, Option::V4)); + OptionCustomPtr server_id(new OptionCustom(server_id_def, Option::V4)); server_id->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(server_id); EXPECT_NO_THROW(srv.processDecline(pkt)); @@ -1209,11 +1195,9 @@ TEST_F(Dhcpv4SrvTest, sanityCheckRelease) { ASSERT_NO_THROW(srv.processRelease(pkt)); // Now let's add a server-id. This should not throw. - OptionDefinitionPtr server_id_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_SERVER_IDENTIFIER); - ASSERT_TRUE(server_id_def); + const OptionDefinition& server_id_def = LibDHCP::DHO_DHCP_SERVER_IDENTIFIER_DEF(); - OptionCustomPtr server_id(new OptionCustom(*server_id_def, Option::V4)); + OptionCustomPtr server_id(new OptionCustom(server_id_def, Option::V4)); server_id->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(server_id); EXPECT_NO_THROW(srv.processRelease(pkt)); @@ -1239,10 +1223,8 @@ TEST_F(Dhcpv4SrvTest, sanityCheckInform) { ASSERT_NO_THROW(srv.processInform(pkt)); // Now let's add a requested address. This should not throw. - OptionDefinitionPtr req_addr_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_REQUESTED_ADDRESS); - ASSERT_TRUE(req_addr_def); - OptionCustomPtr req_addr(new OptionCustom(*req_addr_def, Option::V4)); + const OptionDefinition& req_addr_def = LibDHCP::DHO_DHCP_REQUESTED_ADDRESS_DEF(); + OptionCustomPtr req_addr(new OptionCustom(req_addr_def, Option::V4)); req_addr->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(req_addr); ASSERT_NO_THROW(srv.processInform(pkt)); @@ -1254,11 +1236,9 @@ TEST_F(Dhcpv4SrvTest, sanityCheckInform) { ASSERT_NO_THROW(srv.processInform(pkt)); // Now let's add a server-id. This should not throw. - OptionDefinitionPtr server_id_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_SERVER_IDENTIFIER); - ASSERT_TRUE(server_id_def); + const OptionDefinition& server_id_def = LibDHCP::DHO_DHCP_SERVER_IDENTIFIER_DEF(); - OptionCustomPtr server_id(new OptionCustom(*server_id_def, Option::V4)); + OptionCustomPtr server_id(new OptionCustom(server_id_def, Option::V4)); server_id->writeAddress(IOAddress("192.0.2.3")); pkt->addOption(server_id); EXPECT_NO_THROW(srv.processInform(pkt)); @@ -2643,13 +2623,11 @@ TEST_F(Dhcpv4SrvTest, acceptServerId) { // Remove the server identifier. ASSERT_NO_THROW(pkt->delOption(DHO_DHCP_SERVER_IDENTIFIER)); - OptionDefinitionPtr rai_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_AGENT_OPTIONS); - + const OptionDefinition& rai_def = LibDHCP::DHO_DHCP_AGENT_OPTIONS_DEF(); OptionBuffer override_server_id_buf(IOAddress("10.0.0.128").toBytes()); // Create RAI option. - OptionCustomPtr rai(new OptionCustom(*rai_def, Option::V4)); + OptionCustomPtr rai(new OptionCustom(rai_def, Option::V4)); OptionPtr rai_override_server_id(new Option(Option::V4, RAI_OPTION_SERVER_ID_OVERRIDE, override_server_id_buf)); @@ -4487,10 +4465,8 @@ TEST_F(Dhcpv4SrvTest, relayLinkSelect) { dis->addOption(clientid); // Let's create a Relay Agent Information option - OptionDefinitionPtr rai_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_AGENT_OPTIONS); - ASSERT_TRUE(rai_def); - OptionCustomPtr rai(new OptionCustom(*rai_def, Option::V4)); + const OptionDefinition& rai_def = LibDHCP::DHO_DHCP_AGENT_OPTIONS_DEF(); + OptionCustomPtr rai(new OptionCustom(rai_def, Option::V4)); ASSERT_TRUE(rai); IOAddress addr("192.0.3.2"); OptionPtr ols(new Option(Option::V4, @@ -4518,10 +4494,8 @@ TEST_F(Dhcpv4SrvTest, relayLinkSelect) { EXPECT_FALSE(drop); // Subnet select option has a lower precedence - OptionDefinitionPtr sbnsel_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_SUBNET_SELECTION); - ASSERT_TRUE(sbnsel_def); - OptionCustomPtr sbnsel(new OptionCustom(*sbnsel_def, Option::V4)); + const OptionDefinition& sbnsel_def = LibDHCP::DHO_SUBNET_SELECTION_DEF(); + OptionCustomPtr sbnsel(new OptionCustom(sbnsel_def, Option::V4)); ASSERT_TRUE(sbnsel); sbnsel->writeAddress(IOAddress("192.0.2.3")); dis->addOption(sbnsel); @@ -4622,10 +4596,8 @@ TEST_F(Dhcpv4SrvTest, relayIgnoreLinkSelect) { dis->addOption(clientid); // Let's create a Relay Agent Information option - OptionDefinitionPtr rai_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_AGENT_OPTIONS); - ASSERT_TRUE(rai_def); - OptionCustomPtr rai(new OptionCustom(*rai_def, Option::V4)); + const OptionDefinition& rai_def = LibDHCP::DHO_DHCP_AGENT_OPTIONS_DEF(); + OptionCustomPtr rai(new OptionCustom(rai_def, Option::V4)); ASSERT_TRUE(rai); IOAddress addr("192.0.3.2"); OptionPtr ols(new Option(Option::V4, @@ -4655,10 +4627,8 @@ TEST_F(Dhcpv4SrvTest, relayIgnoreLinkSelect) { // Subnet select option has a lower precedence, but will succeed // because RAI link selection suboptions are being ignored - OptionDefinitionPtr sbnsel_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_SUBNET_SELECTION); - ASSERT_TRUE(sbnsel_def); - OptionCustomPtr sbnsel(new OptionCustom(*sbnsel_def, Option::V4)); + const OptionDefinition& sbnsel_def = LibDHCP::DHO_SUBNET_SELECTION_DEF(); + OptionCustomPtr sbnsel(new OptionCustom(sbnsel_def, Option::V4)); ASSERT_TRUE(sbnsel); sbnsel->writeAddress(IOAddress("192.0.2.3")); dis->addOption(sbnsel); @@ -4758,10 +4728,8 @@ TEST_F(Dhcpv4SrvTest, subnetSelect) { dis->addOption(clientid); // Let's create a Subnet Selection option - OptionDefinitionPtr sbnsel_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_SUBNET_SELECTION); - ASSERT_TRUE(sbnsel_def); - OptionCustomPtr sbnsel(new OptionCustom(*sbnsel_def, Option::V4)); + const OptionDefinition& sbnsel_def = LibDHCP::DHO_SUBNET_SELECTION_DEF(); + OptionCustomPtr sbnsel(new OptionCustom(sbnsel_def, Option::V4)); ASSERT_TRUE(sbnsel); sbnsel->writeAddress(IOAddress("192.0.3.2")); @@ -5258,10 +5226,8 @@ public: query_->setHWAddr(hwaddr_); query_->setCiaddr(addr_); - if (!rai_def_) { - isc_throw(Unexpected, "RAI definition can't be found"); - } - rai_.reset(new OptionCustom(*rai_def_, Option::V4)); + rai_.reset(new OptionCustom(LibDHCP::DHO_DHCP_AGENT_OPTIONS_DEF(), + Option::V4)); rai_sub_.reset(new Option(Option::V4, RAI_OPTION_LINK_SELECTION, addr_.toBytes())); rai_->addOption(rai_sub_); @@ -5290,9 +5256,6 @@ public: LeaseMgrFactory::destroy(); } - /// @brief RAI definition. - static OptionDefinitionPtr rai_def_; - /// @brief Client address. IOAddress addr_; @@ -5324,15 +5287,6 @@ public: ElementPtr sub_options_; }; -OptionDefinitionPtr -StashAgentOptionTest::rai_def_ = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_AGENT_OPTIONS); - -// Verify that RAI has a definition and can be built. -TEST(StashAgentOptionTestTest, checkRAI) { - ASSERT_TRUE(StashAgentOptionTest::rai_def_); -} - // Verify the basic positive case. TEST_F(StashAgentOptionTest, basic) { CfgMgr::instance().commit(); @@ -5398,7 +5352,7 @@ TEST_F(StashAgentOptionTest, oldExtendedInfo) { // Verify that empty RAI is supported. TEST_F(StashAgentOptionTest, emptyRelayAgentInfo) { // Add an empty RAI. - OptionPtr empty_rai(new OptionCustom(*StashAgentOptionTest::rai_def_, + OptionPtr empty_rai(new OptionCustom(LibDHCP::DHO_DHCP_AGENT_OPTIONS_DEF(), Option::V4)); query_->addOption(empty_rai); diff --git a/src/bin/dhcp4/tests/dhcp4_test_utils.cc b/src/bin/dhcp4/tests/dhcp4_test_utils.cc index 94dfe6f48f..8f303b9d3d 100644 --- a/src/bin/dhcp4/tests/dhcp4_test_utils.cc +++ b/src/bin/dhcp4/tests/dhcp4_test_utils.cc @@ -407,17 +407,15 @@ Dhcpv4SrvTest::generateHWAddr(size_t size /*= 6*/) { OptionCustomPtr Dhcpv4SrvTest::makeServerIdOption(const IOAddress& address) { - OptionDefinitionPtr option_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_SERVER_IDENTIFIER); - OptionCustomPtr server_id(new OptionCustom(*option_def, Option::V4)); + const OptionDefinition& option_def = LibDHCP::DHO_DHCP_SERVER_IDENTIFIER_DEF(); + OptionCustomPtr server_id(new OptionCustom(option_def, Option::V4)); server_id->writeAddress(address); return (server_id); } OptionPtr Dhcpv4SrvTest::makeFqdnListOption() { - OptionDefinitionPtr def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DOMAIN_SEARCH); + const OptionDefinition& def = LibDHCP::DHO_DOMAIN_SEARCH_DEF(); // Prepare buffer holding an array of FQDNs. const uint8_t fqdn[] = { @@ -430,8 +428,8 @@ Dhcpv4SrvTest::makeFqdnListOption() { // Initialize a vector with the FQDN data. std::vector<uint8_t> fqdn_buf(fqdn, fqdn + sizeof(fqdn)); - OptionPtr option = def->optionFactory(Option::V4, DHO_DOMAIN_SEARCH, - fqdn_buf.begin(), fqdn_buf.end()); + OptionPtr option = def.optionFactory(Option::V4, DHO_DOMAIN_SEARCH, + fqdn_buf.begin(), fqdn_buf.end()); return (option); } @@ -784,18 +782,12 @@ Dhcpv4SrvTest::buildCfgOptionTest(IOAddress expected_server_id, Pkt4Ptr& query, IOAddress requested, IOAddress server_id) { - OptionDefinitionPtr req_addr_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_REQUESTED_ADDRESS); - ASSERT_TRUE(req_addr_def); - - OptionDefinitionPtr sbnsel_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_SUBNET_SELECTION); - ASSERT_TRUE(sbnsel_def); - - OptionCustomPtr req_addr(new OptionCustom(*req_addr_def, Option::V4)); + const OptionDefinition& req_addr_def = LibDHCP::DHO_DHCP_REQUESTED_ADDRESS_DEF(); + OptionCustomPtr req_addr(new OptionCustom(req_addr_def, Option::V4)); req_addr->writeAddress(requested); - OptionCustomPtr sbnsel(new OptionCustom(*sbnsel_def, Option::V4)); + const OptionDefinition& sbnsel_def = LibDHCP::DHO_SUBNET_SELECTION_DEF(); + OptionCustomPtr sbnsel(new OptionCustom(sbnsel_def, Option::V4)); sbnsel->writeAddress(requested); query->addOption(req_addr); diff --git a/src/bin/dhcp4/tests/inform_unittest.cc b/src/bin/dhcp4/tests/inform_unittest.cc index a91e45d70c..88e80a33e1 100644 --- a/src/bin/dhcp4/tests/inform_unittest.cc +++ b/src/bin/dhcp4/tests/inform_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2023 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2014-2024 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -503,11 +503,9 @@ TEST_F(InformTest, messageFieldsLongOptions) { // Client requests big option. client.requestOption(240); // Client also sends multiple options with the same code. - OptionDefinitionPtr rai_def = LibDHCP::getOptionDef(DHCP4_OPTION_SPACE, - DHO_DHCP_AGENT_OPTIONS); - ASSERT_TRUE(rai_def); + const OptionDefinition& rai_def = LibDHCP::DHO_DHCP_AGENT_OPTIONS_DEF(); // Create RAI options which should be fused by the server. - OptionCustomPtr rai(new OptionCustom(*rai_def, Option::V4)); + OptionCustomPtr rai(new OptionCustom(rai_def, Option::V4)); for (uint8_t i = 0; i < 4; ++i) { // Create a buffer holding some binary data. This data will be // used as reference when we read back the data from a created diff --git a/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc b/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc index 1f790c4dea..ca73c0e4f0 100644 --- a/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc +++ b/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc @@ -3288,11 +3288,8 @@ TEST_F(Dhcpv6SrvTest, relayOverride) { /// @param payload specified payload (0 = fill payload with repeating option code) /// @return RSOO with nested options OptionPtr createRSOO(const std::vector<uint16_t>& codes, uint8_t payload = 0) { - OptionDefinitionPtr def = LibDHCP::getOptionDef(DHCP6_OPTION_SPACE, D6O_RSOO); - if (!def) { - isc_throw(BadValue, "Can't find RSOO definition"); - } - OptionPtr rsoo_container(new OptionCustom(*def, Option::V6)); + const OptionDefinition& def = LibDHCP::D6O_RSOO_DEF(); + OptionPtr rsoo_container(new OptionCustom(def, Option::V6)); for (size_t i = 0; i < codes.size(); ++i) { OptionBuffer buf(10, payload ? payload : codes[i]); // let's make the option 10 bytes long |