diff --git a/src/lte/model/lte-tft.cc b/src/lte/model/lte-tft.cc index 1bad2f08a..a683409c4 100644 --- a/src/lte/model/lte-tft.cc +++ b/src/lte/model/lte-tft.cc @@ -30,6 +30,24 @@ namespace ns3 { NS_LOG_COMPONENT_DEFINE ("LteTft"); +std::ostream& operator<< (std::ostream& os, LteTft::Direction& d) +{ + switch (d) + { + case LteTft::DOWNLINK: + os << "DOWNLINK"; + break; + case LteTft::UPLINK: + os << "UPLINK"; + break; + default: + os << "BIDIRECTIONAL"; + break; + } + return os; +} + + std::ostream& operator<< (std::ostream& os, LteTft::PacketFilter& f) { os << " direction: " << f.direction diff --git a/src/lte/model/lte-tft.h b/src/lte/model/lte-tft.h index 528982210..937798d9b 100644 --- a/src/lte/model/lte-tft.h +++ b/src/lte/model/lte-tft.h @@ -32,6 +32,11 @@ namespace ns3 { +/** + * This class implements the EPS bearer Traffic Flow Template (TFT), + * which is the set of all packet filters associated with an EPS bearer. + * + */ class LteTft : public SimpleRefCount { @@ -54,6 +59,8 @@ public: * the following features are NOT supported: * - IPv6 filtering (including flow labels) * - IPSec filtering + * - filter precedence field is not evaluated, hence it is recommended to setup + * the TFTs within a PDP context such that TFTs are mutually exclusive */ struct PacketFilter { @@ -144,6 +151,7 @@ private: }; +std::ostream& operator<< (std::ostream& os, LteTft::Direction& d); } // namespace ns3 diff --git a/src/lte/test/lte-test-tft-classifier.cc b/src/lte/test/lte-test-tft-classifier.cc index cbcd440c1..c1b08ddc8 100644 --- a/src/lte/test/lte-test-tft-classifier.cc +++ b/src/lte/test/lte-test-tft-classifier.cc @@ -76,20 +76,9 @@ LteTftClassifierTestCase::LteTftClassifierTestCase (Ptr c, m_tftId (tftId) { std::ostringstream oss; - oss << c; - switch (d) - { - case LteTft::DOWNLINK: - oss << " DL, "; - break; - case LteTft::UPLINK: - oss << " UL, "; - break; - default: - oss << " BD, "; - break; - } - oss << ", sa = " << sa + oss << c + << " d = " << d + << ", sa = " << sa << ", da = " << da << ", sp = " << sp << ", dp = " << dp @@ -132,10 +121,6 @@ LteTftClassifierTestCase::DoRun (void) - -/** - * Test the calculation of carrier frequency based on EARFCN - */ class LteTftClassifierTestSuite : public TestSuite { public: @@ -151,6 +136,7 @@ LteTftClassifierTestSuite::LteTftClassifierTestSuite () Ptr c1 = Create (); + Ptr tft1_1 = Create (); LteTft::PacketFilter pf1_1_1; @@ -160,11 +146,59 @@ LteTftClassifierTestSuite::LteTftClassifierTestSuite () pf1_1_1.localMask.Set (0xFF000000); tft1_1->Add (pf1_1_1); + LteTft::PacketFilter pf1_1_2; + pf1_1_2.remoteAddress.Set ("3.3.3.0"); + pf1_1_2.localAddress.Set ("4.4.4.0"); + pf1_1_2.remoteMask.Set (0xFFFFFF00); + pf1_1_2.localMask.Set (0xFFFFFF00); + tft1_1->Add (pf1_1_2); + c1->Add (tft1_1); - AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("2.2.3.4"), Ipv4Address ("1.12.0.132"), 4, 1234, 0, 1)); - AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("6.2.3.4"), Ipv4Address ("1.12.0.132"), 4, 1234, 0, 0)); - + + + Ptr tft1_2 = Create (); + + LteTft::PacketFilter pf1_2_1; + pf1_2_1.remotePortStart = 1024; + pf1_2_1.remotePortEnd = 1035; + tft1_2->Add (pf1_2_1); + + LteTft::PacketFilter pf1_2_2; + pf1_2_2.localPortStart = 3456; + pf1_2_2.localPortEnd = 3489; + tft1_2->Add (pf1_2_2); + + c1->Add (tft1_2); + + + + // ------------------------------------classifier---direction--------------src address---------------dst address---src port--dst port--ToS--TFT id + + // test IP addresses + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("2.2.3.4"), Ipv4Address ("1.1.1.1"), 4, 1234, 0, 1)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("2.2.3.4"), Ipv4Address ("1.0.0.0"), 2, 123, 5, 1)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("6.2.3.4"), Ipv4Address ("1.1.1.1"), 4, 1234, 0, 0)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::DOWNLINK, Ipv4Address ("3.3.3.4"), Ipv4Address ("4.4.4.1"), 4, 1234, 0, 1)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::DOWNLINK, Ipv4Address ("3.3.4.4"), Ipv4Address ("4.4.4.1"), 4, 1234, 0, 0)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("3.3.3.4"), Ipv4Address ("4.4.2.1"), 4, 1234, 0, 0)); + + // test remote port + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 4, 1024, 0, 2)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 4, 1025, 0, 2)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 4, 1035, 0, 2)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 4, 1234, 0, 0)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::DOWNLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 4, 1024, 0, 0)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::DOWNLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 4, 1025, 0, 0)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::DOWNLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 4, 1035, 0, 0)); + + // test local port + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 4, 3456, 0, 0)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 4, 3457, 0, 0)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 4, 3489, 0, 0)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::UPLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 3456, 6, 0, 2)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::DOWNLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 3461, 3461, 0, 2)); + AddTestCase (new LteTftClassifierTestCase (c1, LteTft::DOWNLINK, Ipv4Address ("9.1.1.1"), Ipv4Address ("8.1.1.1"), 9, 3489, 0, 2)); }