src/lte/model/epc-tft.h
changeset 8463 cc818aa536a5
parent 8380 f615b30c26e1
child 10425 1867d8c25aa7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lte/model/epc-tft.h	Mon Dec 05 21:27:44 2011 +0100
@@ -0,0 +1,169 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Nicola Baldo  <nbaldo@cttc.es>
+ */
+
+
+#ifndef EPC_TFT_H
+#define EPC_TFT_H
+
+
+#include <ns3/simple-ref-count.h>
+#include <ns3/ipv4-address.h>
+
+#include <list>
+
+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 EpcTft : public SimpleRefCount<EpcTft>
+{
+
+public:
+
+
+  /** 
+   * creates a TFT matching any traffic
+   *
+   * \return a newly created TFT that will match any traffic
+   */
+  static Ptr<EpcTft> Default ();
+  
+  /**
+   * Indicates the direction of the traffic that is to be classified. 
+   */
+  enum Direction {DOWNLINK = 1,
+		  UPLINK = 2,
+		  BIDIRECTIONAL = 3};
+  
+  /**
+   * Implement the data structure representing a TrafficFlowTemplate
+   * Packet Filter.
+   * See 3GPP TS 24.008 version 8.7.0 Release 8, Table 10.5.162/3GPP TS
+   * 24.008: Traffic flow template information element  
+   * 
+   * With respect to the Packet Filter specification in the above doc,
+   * 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
+  {
+    PacketFilter ();
+
+    /** 
+     * 
+     * \param d the direction 
+     * \param ra the remote address 
+     * \param la the local address 
+     * \param rp the remote port 
+     * \param lp the local port 
+     * \param tos the type of service 
+     * 
+     * \return true if the parameters match with the PacketFilter,
+     * false otherwise.
+     */
+    bool Matches (Direction d,
+		  Ipv4Address ra, 
+		  Ipv4Address la, 
+		  uint16_t rp,
+		  uint16_t lp,
+		  uint8_t tos);
+
+ 
+
+    uint8_t precedence;  /**< used to specify the precedence for the
+			  * packet filter among all packet filters in
+			  * the TFT; higher values will be evaluated
+			  * last. 
+			  */ 
+
+    Direction direction; /**< whether the filter needs to be applied
+			    to uplink / downlink only, or in both cases*/
+
+    Ipv4Address remoteAddress;     /**< IPv4 address of the remote host  */
+    Ipv4Mask remoteMask; /**< IPv4 address mask of the remote host */
+    Ipv4Address localAddress;      /**< IPv4 address of the UE */
+    Ipv4Mask localMask;  /**< IPv4 address mask of the UE */
+  
+    uint16_t remotePortStart;  /**< start of the port number range of the remote host */
+    uint16_t remotePortEnd;    /**< end of the port number range of the remote host */
+    uint16_t localPortStart;   /**< start of the port number range of the UE */
+    uint16_t localPortEnd;     /**< end of the port number range of the UE */
+  
+    uint8_t typeOfService;     /**< type of service field */
+    uint8_t typeOfServiceMask; /**< type of service field mask */
+  };
+  
+  EpcTft ();
+  
+
+  /** 
+   * add a PacketFilter to the Traffic Flow Template
+   * 
+   * \param the PacketFilter to be added
+   * 
+   * \return the id( 0 <= id < 16) of the newly added filter, if the addition was successful. Will fail if you try to add more than 15 filters. This is to be compliant with TS 24.008.
+   */
+  uint8_t Add (PacketFilter f);
+
+
+    /** 
+     * 
+     * \param direction 
+     * \param remoteAddress 
+     * \param localAddress 
+     * \param remotePort 
+     * \param localPort 
+     * \param typeOfService 
+     * 
+     * \return true if any PacketFilter in the TFT matches with the
+     * parameters, false otherwise.
+     */
+    bool Matches (Direction direction,
+		  Ipv4Address remoteAddress, 
+		  Ipv4Address localAddress, 
+		  uint16_t remotePort,
+		  uint16_t localPort,
+		  uint8_t typeOfService);
+
+
+private:
+
+  std::list<PacketFilter> m_filters;
+  uint8_t m_numFilters;
+  
+};
+
+
+std::ostream& operator<< (std::ostream& os, EpcTft::Direction& d);
+
+
+} // namespace ns3
+  
+#endif /* EPC_TFT_H */ 
+
+