00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 #ifndef ns_omni_mcast_h
00056 #define ns_omni_mcast_h
00057
00058 #include <assert.h>
00059 #include <math.h>
00060 #include <stdio.h>
00061 #include <signal.h>
00062 #include <float.h>
00063 #include <stdlib.h>
00064
00065 #include <tcl.h>
00066
00067 #include "diff_header.h"
00068 #include "agent.h"
00069 #include "tclcl.h"
00070 #include "ip.h"
00071 #include "config.h"
00072 #include "packet.h"
00073 #include "trace.h"
00074 #include "random.h"
00075 #include "classifier.h"
00076 #include "node.h"
00077 #include "iflist.h"
00078 #include "hash_table.h"
00079 #include "arp.h"
00080 #include "mac.h"
00081 #include "ll.h"
00082 #include "dsr/path.h"
00083
00084
00085 #define THIS_NODE here_.addr_
00086 #define MAC_RETRY_ 0 // 0 or 1
00087
00088 #define JITTER 0.11 // (sec) to jitter broadcast
00089 #define ARP_BUFFER_CHECK 0.03 // (sec) between buffer checks
00090 #define ARP_MAX_ATTEMPT 3 // (times)
00091 #define ARP_BUF_SIZE 64 // (slots)
00092
00093 #define SEND_BUFFER_CHECK 0.03 // (sec) between buffer checks
00094 #define SEND_TIMEOUT 30.0 // (sec) a packet can live in sendbuf
00095 #define SEND_BUF_SIZE 64 // (slots)
00096
00097
00098 #define SEND_MESSAGE(x,y,z) send_to_dmux(prepare_message(x,y,z), 0)
00099
00100
00101 class OmniMcastAgent;
00102
00103
00104 class OmniMcastArpBufEntry {
00105 public:
00106 Time t;
00107 int attempt;
00108 Packet *p;
00109
00110 OmniMcastArpBufEntry() { t=0; attempt=0; p=NULL; }
00111 };
00112
00113
00114 class OmniMcastArpBufferTimer : public TimerHandler {
00115 public:
00116 OmniMcastArpBufferTimer(OmniMcastAgent *a) : TimerHandler() { a_ = a; }
00117 void expire(Event *e);
00118 protected:
00119 OmniMcastAgent *a_;
00120 };
00121
00122
00123 class OmniMcastSendBufferEntry {
00124 public:
00125 Time t;
00126 Packet *p;
00127
00128 OmniMcastSendBufferEntry() { t=0; p=NULL; }
00129 };
00130
00131
00132 class OmniMcastSendBufTimer : public TimerHandler {
00133 public:
00134 OmniMcastSendBufTimer(OmniMcastAgent *a) : TimerHandler() { a_ = a; }
00135 void expire(Event *e);
00136 protected:
00137 OmniMcastAgent *a_;
00138 };
00139
00140
00141
00142
00143
00144 class OmniMcast_Entry {
00145 public:
00146 Agent_List *source;
00147 Agent_List *sink;
00148
00149 OmniMcast_Entry() {
00150 source = NULL;
00151 sink = NULL;
00152 }
00153
00154 void reset();
00155 void clear_agentlist(Agent_List *);
00156 };
00157
00158
00159
00160
00161 class OmniMcastAgent : public Agent {
00162 public:
00163 OmniMcastAgent();
00164 int command(int argc, const char*const* argv);
00165 void recv(Packet*, Handler*);
00166
00167 OmniMcast_Entry routing_table[MAX_DATA_TYPE];
00168
00169
00170 protected:
00171
00172
00173 int pk_count;
00174
00175 Pkt_Hash_Table PktTable;
00176 Node *node;
00177
00178 Trace *tracetarget;
00179 NsObject *ll;
00180 NsObject *port_dmux;
00181 ARPTable *arp_table;
00182
00183 OmniMcastArpBufferTimer arp_buf_timer;
00184 OmniMcastArpBufEntry arp_buf[ARP_BUF_SIZE];
00185 OmniMcastSendBufTimer send_buf_timer;
00186 OmniMcastSendBufferEntry send_buf[SEND_BUF_SIZE];
00187
00188
00189
00190 inline void send_to_dmux(Packet *pkt, Handler *h) {
00191 port_dmux->recv(pkt, h);
00192 }
00193
00194 void clear_arp_buf();
00195 void clear_send_buf();
00196 void reset();
00197
00198 void ConsiderNew(Packet *);
00199 void Start();
00200 void Terminate();
00201
00202 Packet *create_packet();
00203 Packet *prepare_message(unsigned int dtype, ns_addr_t to_addr, int msg_type);
00204
00205 void DataForSink(Packet *);
00206 void GodForwardData(Packet *);
00207 void StopSource();
00208
00209 void MACprepare(Packet *pkt, nsaddr_t next_hop, unsigned int type,
00210 bool lk_dtct);
00211 void MACsend(Packet *pkt, Time delay=0);
00212 void xmitFailed(Packet *pkt);
00213
00214 void StickPacketInArpBuffer(Packet *pkt);
00215 void ArpBufferCheck();
00216 void SendBufferCheck();
00217 void StickPacketInSendBuffer(Packet *p);
00218
00219 void trace(char *fmt,...);
00220
00221 friend void OmniMcastXmitFailedCallback(Packet *pkt, void *data);
00222
00223 friend class OmniMcastArpBufferTimer;
00224 friend class OmniMcastSendBufTimer;
00225
00226 };
00227
00228
00229
00230 #endif
00231
00232