00001 /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */ 00002 /* 00003 * Copyright (c) 1997 Regents of the University of California. 00004 * All rights reserved. 00005 * 00006 * Redistribution and use in source and binary forms, with or without 00007 * modification, are permitted provided that the following conditions 00008 * are met: 00009 * 1. Redistributions of source code must retain the above copyright 00010 * notice, this list of conditions and the following disclaimer. 00011 * 2. Redistributions in binary form must reproduce the above copyright 00012 * notice, this list of conditions and the following disclaimer in the 00013 * documentation and/or other materials provided with the distribution. 00014 * 3. All advertising materials mentioning features or use of this software 00015 * must display the following acknowledgement: 00016 * This product includes software developed by the Daedalus Research 00017 * Group at the University of California Berkeley. 00018 * 4. Neither the name of the University nor of the Laboratory may be used 00019 * to endorse or promote products derived from this software without 00020 * specific prior written permission. 00021 * 00022 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 00023 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00024 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00025 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 00026 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00027 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00028 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00029 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00030 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00031 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00032 * SUCH DAMAGE. 00033 * 00034 * Contributed by Giao Nguyen, http://daedalus.cs.berkeley.edu/~gnguyen 00035 * 00036 * @(#) $Header: /cvsroot/nsnam/ns-2/mac/mac-csma.h,v 1.16 1998/08/12 23:41:07 gnguyen Exp $ (UCB) 00037 */ 00038 00039 #ifndef ns_mac_csma_h 00040 #define ns_mac_csma_h 00041 00042 #include "mac.h" 00043 00044 /* 00045 // Carrier Sense Multiple Access MAC 00046 */ 00047 00048 class MacCsma; 00049 00050 class MacHandlerEoc : public Handler { 00051 public: 00052 MacHandlerEoc(MacCsma* m) : mac_(m) {} 00053 void handle(Event* e); 00054 protected: 00055 MacCsma* mac_; 00056 }; 00057 00058 00059 class MacCsma : public Mac { 00060 public: 00061 MacCsma(); 00062 virtual void send(Packet* p); 00063 virtual void resume(Packet* p = 0); 00064 virtual void endofContention(Packet* p); 00065 00066 protected: 00067 virtual void backoff(Handler* h, Packet* p, double delay=0); 00068 double txstart_; // when the transmission starts 00069 double ifs_; // interframe spacing 00070 double slotTime_; // duration of contention slot in seconds 00071 int cw_; // current contention window 00072 int cwmin_; // minimum contention window for 1st backoff 00073 int cwmax_; // maximum contention window (backoff range) 00074 int rtx_; // number of retransmission attempt 00075 int rtxLimit_; // maximum number of retransmission attempt 00076 int csense_; // carrier sense or not 00077 Event eEoc_; // event at the end-of-contention 00078 MacHandlerEoc hEoc_; // handle end-of-contention 00079 }; 00080 00081 00082 class MacCsmaCd : public MacCsma { 00083 public: 00084 void endofContention(Packet*); 00085 }; 00086 00087 00088 class MacCsmaCa : public MacCsma { 00089 public: 00090 virtual void send(Packet*); 00091 }; 00092 00093 #endif