Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __INET_ETHER_MAC_BASE_H
00020 #define __INET_ETHER_MAC_BASE_H
00021
00022 #include <omnetpp.h>
00023 #include "INETDefs.h"
00024 #include "Ethernet.h"
00025 #include "EtherFrame_m.h"
00026 #include "InterfaceEntry.h"
00027 #include "TxNotifDetails.h"
00028 #include "NotificationBoard.h"
00029
00030
00031
00032
00033
00034 #define ENDIFG 100
00035 #define ENDRECEPTION 101
00036 #define ENDBACKOFF 102
00037 #define ENDTRANSMISSION 103
00038 #define ENDJAMMING 104
00039 #define ENDPAUSE 105
00040 #define ENDAUTOCONFIG 106
00041
00042
00043 #define TX_IDLE_STATE 1
00044 #define WAIT_IFG_STATE 2
00045 #define TRANSMITTING_STATE 3
00046 #define JAMMING_STATE 4
00047 #define BACKOFF_STATE 5
00048 #define PAUSE_STATE 6
00049
00050
00051 #define RX_IDLE_STATE 1
00052 #define RECEIVING_STATE 2
00053 #define RX_COLLISION_STATE 3
00054
00055 class IPassiveQueue;
00056
00060 class INET_API EtherMACBase : public cSimpleModule, public INotifiable
00061 {
00062 protected:
00063 bool connected;
00064 bool disabled;
00065 bool promiscuous;
00066 MACAddress address;
00067 int txQueueLimit;
00068
00069
00070 bool duplexMode;
00071 bool carrierExtension;
00072 bool frameBursting;
00073
00074
00075 double txrate;
00076 simtime_t bitTime;
00077 simtime_t slotTime;
00078 simtime_t interFrameGap;
00079 simtime_t jamDuration;
00080 simtime_t shortestFrameDuration;
00081
00082
00083 int transmitState;
00084 int receiveState;
00085 int pauseUnitsRequested;
00086
00087 cQueue txQueue;
00088 IPassiveQueue *queueModule;
00089
00090 cGate *physOutGate;
00091
00092
00093 InterfaceEntry *interfaceEntry;
00094 NotificationBoard *nb;
00095 TxNotifDetails notifDetails;
00096 bool hasSubscribers;
00097
00098
00099 cMessage *endTxMsg, *endIFGMsg, *endPauseMsg;
00100
00101
00102 int framesSentInBurst;
00103 int bytesSentInBurst;
00104 unsigned long numFramesSent;
00105 unsigned long numFramesReceivedOK;
00106 unsigned long numBytesSent;
00107 unsigned long numBytesReceivedOK;
00108 unsigned long numFramesFromHL;
00109 unsigned long numDroppedIfaceDown;
00110 unsigned long numDroppedBitError;
00111 unsigned long numDroppedNotForUs;
00112 unsigned long numFramesPassedToHL;
00113 unsigned long numPauseFramesRcvd;
00114 unsigned long numPauseFramesSent;
00115 cOutVector numFramesSentVector;
00116 cOutVector numFramesReceivedOKVector;
00117 cOutVector numBytesSentVector;
00118 cOutVector numBytesReceivedOKVector;
00119 cOutVector numDroppedIfaceDownVector;
00120 cOutVector numDroppedBitErrorVector;
00121 cOutVector numDroppedNotForUsVector;
00122 cOutVector numFramesPassedToHLVector;
00123 cOutVector numPauseFramesRcvdVector;
00124 cOutVector numPauseFramesSentVector;
00125
00126 public:
00127 EtherMACBase();
00128 virtual ~EtherMACBase();
00129
00130 virtual long getQueueLength() {return txQueue.length();}
00131 virtual MACAddress getMACAddress() {return address;}
00132
00133 protected:
00134
00135 virtual void initialize();
00136 virtual void initializeTxrate() = 0;
00137 virtual void initializeFlags();
00138 virtual void initializeMACAddress();
00139 virtual void initializeQueueModule();
00140 virtual void initializeNotificationBoard();
00141 virtual void initializeStatistics();
00142 virtual void registerInterface(double txrate);
00143
00144
00145 virtual bool checkDestinationAddress(EtherFrame *frame);
00146 virtual void calculateParameters();
00147 virtual void printParameters();
00148
00149
00150 virtual void finish();
00151
00152
00153 virtual void processFrameFromUpperLayer(EtherFrame *msg);
00154 virtual void processMsgFromNetwork(cPacket *msg);
00155 virtual void processMessageWhenNotConnected(cMessage *msg);
00156 virtual void processMessageWhenDisabled(cMessage *msg);
00157 virtual void handleEndIFGPeriod();
00158 virtual void handleEndTxPeriod();
00159 virtual void handleEndPausePeriod();
00160 virtual void scheduleEndIFGPeriod();
00161 virtual void scheduleEndTxPeriod(cPacket *);
00162 virtual void scheduleEndPausePeriod(int pauseUnits);
00163
00164
00165 virtual bool checkAndScheduleEndPausePeriod();
00166 virtual void fireChangeNotification(int type, cPacket *msg);
00167 virtual void beginSendFrames();
00168 virtual void frameReceptionComplete(EtherFrame *frame);
00169 virtual void processReceivedDataFrame(EtherFrame *frame);
00170 virtual void processPauseCommand(int pauseUnits);
00171
00172
00173 virtual void updateDisplayString();
00174 virtual void updateConnectionColor(int txState);
00175
00176
00177 virtual void updateHasSubcribers() = 0;
00178 virtual void receiveChangeNotification(int category, const cPolymorphic *details);
00179
00180 };
00181
00182 #endif