src/uan/model/uan-mac-rc.h
changeset 6852 8f1a53d3f6ca
parent 6478 b401db8531f5
child 7353 09fccf6195ea
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/uan/model/uan-mac-rc.h	Fri Mar 04 01:26:54 2011 +0000
@@ -0,0 +1,217 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 University of Washington
+ *
+ * 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: Leonard Tracy <lentracy@gmail.com>
+ */
+
+#ifndef UANMACRC_H
+#define UANMACRC_H
+
+#include "uan-mac.h"
+#include "uan-address.h"
+
+#include "ns3/nstime.h"
+#include "ns3/trace-source-accessor.h"
+#include "ns3/traced-callback.h"
+#include "ns3/event-id.h"
+
+#include <list>
+#include <utility>
+#include <vector>
+
+
+namespace ns3 {
+
+class Address;
+class UanTxMode;
+class UanHeaderRcRts;
+class UanHeaderRcCts;
+class UanHeaderRcCtsGlobal;
+class UanPhy;
+
+
+/**
+ * \class Reservation
+ * \brief Stores reservation info for use in scheduling data channel by reservation channel MAC
+ */
+class Reservation
+{
+public:
+  /**
+   * \brief Create empty object with default values
+   */
+  Reservation ();
+  /**
+   * \brief Create Reservation object with given packet list, frame number and max packets
+   * \param list List of packets for assigned to reservation
+   * \param frameNo Frame number of reservation transmission
+   * \param maxPkts Maximum number of packets to assign to reservation from packet list (0 = no maximum)
+   */
+  Reservation (std::list<std::pair <Ptr<Packet>, UanAddress > > &list, uint8_t frameNo, uint32_t maxPkts = 0);
+  ~Reservation ();
+  /**
+   * \returns number of frames in reservation
+   */
+  uint32_t GetNoFrames () const;
+  /**
+   * \returns total byte length of reservation (sum of all packets with headers)
+   */
+  uint32_t GetLength () const;
+  /**
+   * \returns reference to list of packets in this reservation
+   */
+  const std::list<std::pair <Ptr<Packet>, UanAddress > > &GetPktList (void) const;
+  /**
+   * \returns Frame number of reservation
+   */
+  uint8_t GetFrameNo () const;
+  /**
+   * \returns Retry number of reservation
+   */
+  uint8_t GetRetryNo () const;
+  /**
+   * \returns Timestamp nth RTS send for this reservation
+   * \param n Timestamp for retry number n to return
+   */
+  Time GetTimestamp (uint8_t n) const;
+  /**
+   * \returns True if reservation packets have been transmitted
+   */
+  bool IsTransmitted () const;
+  /**
+   * \param fn Frame number to set reservation to
+   */
+  void SetFrameNo (uint8_t fn);
+  /**
+   * \param t Time of latest RTS send
+   */
+  void AddTimestamp (Time t);
+  /**
+   * \brief Increments retry count by 1
+   */
+  void IncrementRetry ();
+  /**
+   * \param t True if resevation has been transmitted
+   * \brief Sets reservation transmitted state
+   */
+  void SetTransmitted (bool t = true);
+private:
+  std::list<std::pair <Ptr<Packet>, UanAddress > > m_pktList;
+  uint32_t m_length;
+  uint8_t m_frameNo;
+  std::vector<Time> m_timestamp;
+  uint8_t m_retryNo;
+  bool m_transmitted;
+
+};
+
+
+/**
+ * \class UanMacRc
+ * \brief Non-gateway node MAC for reservation channel MAC protocol
+ *
+ * This MAC protocol assumes a network topology where all traffic
+ * is destined for a set of GW nodes which are connected via
+ * some out of band (RF?) means.  This particular implementation
+ * assumes that there is only a single gateway.
+ *
+ * For more information on class operation email
+ * lentracy@u.washington.edu
+ * (This work is, as of yet, unpublished)
+ */
+class UanMacRc : public UanMac
+{
+public:
+  enum {
+    TYPE_DATA, TYPE_GWPING, TYPE_RTS, TYPE_CTS, TYPE_ACK
+  };
+  UanMacRc ();
+  virtual ~UanMacRc ();
+
+  static TypeId GetTypeId (void);
+
+  // Inherited virtual functions
+  virtual Address GetAddress (void);
+  virtual void SetAddress (UanAddress addr);
+  virtual bool Enqueue (Ptr<Packet> pkt, const Address &dest, uint16_t protocolNumber);
+  virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, const UanAddress&> cb);
+  virtual void AttachPhy (Ptr<UanPhy> phy);
+  virtual Address GetBroadcast (void) const;
+  virtual void Clear (void);
+
+private:
+  enum State {
+    UNASSOCIATED, GWPSENT, IDLE, RTSSENT, DATATX
+  };
+
+  State m_state;
+  bool m_rtsBlocked;
+
+  EventId m_startAgain;
+  UanAddress m_address;
+  double m_retryRate;
+  UanAddress m_assocAddr;
+  Ptr<UanPhy> m_phy;
+  uint32_t m_numRates;
+  uint32_t m_currentRate;
+  uint32_t m_maxFrames;
+  uint32_t m_queueLimit;
+  uint8_t m_frameNo;
+  Time m_sifs;
+  Time m_learnedProp;
+
+  uint16_t m_numRetryRates;
+  double m_minRetryRate;
+  double m_retryStep;
+
+  uint32_t m_ctsSizeN;
+  uint32_t m_ctsSizeG;
+
+  bool m_cleared;
+
+  std::list<std::pair <Ptr<Packet>, UanAddress > > m_pktQueue;
+  std::list<Reservation> m_resList;
+
+  Callback<void, Ptr<Packet>, const UanAddress& > m_forwardUpCb;
+
+  TracedCallback<Ptr<const Packet>, UanTxMode > m_rxLogger;
+  TracedCallback<Ptr<const Packet>, uint16_t > m_enqueueLogger;
+  TracedCallback<Ptr<const Packet>, uint16_t > m_dequeueLogger;
+
+  EventId m_rtsEvent;
+  void ReceiveOkFromPhy (Ptr<Packet>, double sinr, UanTxMode mode);
+
+  void Associate (void);
+  void AssociateTimeout (void);
+  void SendRts (void);
+  void RtsTimeout (void);
+  UanHeaderRcRts CreateRtsHeader (const Reservation &res);
+  void ScheduleData (const UanHeaderRcCts &ctsh, const UanHeaderRcCtsGlobal &ctsg, uint32_t ctsBytes);
+  void ProcessAck (Ptr<Packet> ack);
+  void SendPacket (Ptr<Packet> pkt, uint32_t rate);
+  bool IsPhy1Ok (void);
+  void BlockRtsing (void);
+
+  static uint32_t m_cntrlSends;
+
+protected:
+  void DoDispose ();
+};
+
+}
+
+#endif // UANMACRC_H