/* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
/*
* Copyright (c) 1997 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the Daedalus Research
* Group at the University of California Berkeley.
* 4. Neither the name of the University nor of the Laboratory may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/mac/mac-multihop.h,v 1.7 1998/06/27 01:24:07 gnguyen Exp $ (UCB)
*/
#ifndef ns_mac_multihop_h
#define ns_mac_multihop_h
#include "packet.h"
#include "mac.h"
#include "random.h"
#include "ip.h"
#define MAC_POLLSIZE 40 /* completely arbitrary */
#define MAC_POLLACKSIZE 40 /* completely arbitrary */
/* States of MultihopMac protocol */
#define MAC_IDLE 0x01
#define MAC_POLLING 0x02
#define MAC_RCV 0x04
#define MAC_SND 0x08
#define MAC_TICK 16000 /* 1 tick = 1ms; 16 sub-ticks in a tick */
class MultihopMac;
/*
* PollEvent class to generate poll events in the multihop
* network prior to sending and receiving packets.
*/
class PollEvent : public Event {
public:
PollEvent(MultihopMac* m, MultihopMac* pm) :
backoffTime_(0), mac_(m), peerMac_(pm) { }
int backoffTime_; /* valid only for NackPoll */
inline MultihopMac *peerMac() { return peerMac_; }
protected:
MultihopMac *mac_; /* pointer to my mac */
MultihopMac *peerMac_; /* pointer to my peer's mac */
};
/*
* Handle poll events.
*/
class PollHandler : public Handler {
public:
PollHandler(MultihopMac* m) { mac_ = m; }
void handle(Event *);
protected:
MultihopMac* mac_;
};
/*
* Handle pollack events.
*/
class PollAckHandler : public Handler {
public:
PollAckHandler(MultihopMac* m) { mac_ = m; }
void handle(Event *);
protected:
MultihopMac* mac_;
};
/*
* Handle pollnack events.
*/
class PollNackHandler : public Handler {
public:
PollNackHandler(MultihopMac* m) { mac_ = m; }
void handle(Event *);
protected:
MultihopMac* mac_;
};
/*
* Handle poll timeout events.
*/
class PollTimeoutHandler : public Handler {
public:
PollTimeoutHandler(MultihopMac* m) { mac_ = m; }
void handle(Event *);
protected:
MultihopMac* mac_;
};
class BackoffHandler : public Handler {
public:
BackoffHandler(MultihopMac *m) { mac_ = m; }
void handle(Event *);
protected:
MultihopMac* mac_;
};
/*
class MultihopMacHandler : public Handler {
public:
MultihopMacHandler(MultihopMac* m) { mac_ = m; }
void handle(Event *e);
protected:
MultihopMac* mac_;
};
*/
class MultihopMac : public Mac {
public:
MultihopMac();
void send(Packet*); /* send data packet (assume POLLed) link */
void recv(Packet *, Handler *); /* call from higher layer (LL) */
void poll(Packet *); /* poll peer mac */
int checkInterfaces(int); /* probe state of this and other MACs */
void schedulePoll(MultihopMac *); /* schedule poll for later */
inline int mode() { return mode_; }
inline int mode(int m) { return mode_ = m; }
inline MultihopMac *peer() { return peer_; }
inline MultihopMac *peer(MultihopMac *p) { return peer_ = p; }
inline double tx_rx() { return tx_rx_; } /* access tx_rx time */
inline double rx_tx() { return rx_tx_; } /* access rx_tx time */
inline double rx_rx() { return rx_rx_; } /* access rx_rx time */
inline double backoffBase() { return backoffBase_; }
inline double backoffTime() { return backoffTime_; }
inline double backoffTime(double bt) { return backoffTime_ = bt; }
inline PollEvent *pendingPE() { return pendingPollEvent_; }
inline PollEvent *pendingPE(PollEvent *pe) { return pendingPollEvent_ = pe; }
inline Packet *pkt() { return pkt_; }
inline PollHandler* ph() { return &ph_; } /* access poll handler */
inline PollAckHandler* pah() { return &pah_; }
inline PollNackHandler* pnh() { return &pnh_; }
inline PollTimeoutHandler* pth() { return &pth_; }
inline BackoffHandler* bh() { return &bh_; }
// inline MultihopMacHandler* mh() { return &mh_; }
inline double pollTxtime(int s) { return (double) s*8.0/bandwidth(); }
protected:
int mode_; /* IDLE/SND/RCV */
MultihopMac *peer_; /* peer mac */
double tx_rx_; /* Turnaround times: transmit-->recv */
double rx_tx_; /* recv-->transmit */
double rx_rx_; /* recv-->recv */
double backoffTime_;
double backoffBase_;
PollEvent *pendingPollEvent_; /* pending in scheduler */
Packet *pkt_; /* packet stored for poll retries */
PollHandler ph_; /* handler for POLL events */
PollAckHandler pah_; /* handler for POLL_ACK events */
PollNackHandler pnh_; /* handler for POLL_NACK events */
PollTimeoutHandler pth_;/* handler for POLL_TIMEOUT events */
BackoffHandler bh_; /* handler for exponential backoffs */
// MultihopMacHandler mh_; /* handle receives of data */
};
#endif
syntax highlighted by Code2HTML, v. 0.9.1