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 #include "config.h"
00032
00033 #include "dtnaodv.h"
00034 #include "AODVApp.h"
00035 #include "AODVForwardingPolicy.h"
00036 #include "dtn/Bundle.h"
00037 #include "dtn/Node.h"
00038 #include "dtn/Exception.h"
00039
00040 #include <iostream>
00041
00042 static unsigned char initstring[] = {'a','o','d','v','a','p','p'};
00043 DTN::ByteString AODVApp::m_appID(initstring);
00044
00045 AODVApp::AODVApp( AODVForwardingPolicy* pol ) :
00046 Application(),
00047 m_policy( pol )
00048 {
00049 if ( 0 != pol )
00050 {
00051 dtnaodv_appMap[ &(pol->state()) ] = this;
00052 }
00053 }
00054
00055 AODVApp::~AODVApp()
00056 {
00057 }
00058
00059 void
00060 AODVApp::send( const aodv_msghdr_t* headers, const aodv_chunk_t* message )
00061 {
00062 if ( 0 == m_owner ) return;
00063 if ( 0 == m_policy ) return;
00064 if ( 0 == headers ) return;
00065 if ( 0 == message ) return;
00066
00067 struct timeval tv = DTN::dtn_time();
00068 struct timeval e;
00069 e.tv_sec = tv.tv_sec;
00070 e.tv_usec = tv.tv_usec + 1000*m_policy->traversalTime();
00071 e.tv_sec += ( e.tv_usec / 1000000 );
00072 e.tv_usec = ( e.tv_usec % 1000000 );
00073
00074 DTN::ByteString dest( headers->addr.data, headers->addr.length );
00075 const aodv_chunk_t* c = message;
00076 DTN::ByteString data;
00077 while ( 0 != c )
00078 {
00079 data.append( c->data, c->length );
00080 c = c->next;
00081 }
00082 DTN::Bundle::BundleType bt = DTN::Bundle::kData | DTN::Bundle::kNoACK;
00083 if ( dtnaodv_bcast_addr == dest )
00084 {
00085 bt |= DTN::Bundle::kBcast;
00086 }
00087 DTN::Bundle* b = new DTN::Bundle( m_owner->nextSeq(),
00088 m_owner->addr(),
00089 dest,
00090 data,
00091 tv,
00092 e,
00093 bt,
00094 m_appID );
00095 m_owner->forward(b);
00096 }
00097
00098 void
00099 AODVApp::notify()
00100 {
00101 if ( 0 == m_owner ) return;
00102 if ( 0 == m_policy ) return;
00103 m_policy->notify();
00104 }
00105
00106 void
00107 AODVApp::process( const DTN::Bundle& b )
00108 {
00109 if ( 0 == m_owner ) return;
00110 if ( 0 == m_policy ) return;
00111 m_policy->handleMessage(b);
00112 }