00001
00002
00003
00004
00005 #include <agent.h>
00006 #include <random.h>
00007 #include <trace.h>
00008
00009 #include <ll.h>
00010 #include <priqueue.h>
00011 #include <tora/tora_packet.h>
00012 #include <tora/tora.h>
00013
00014 #define CURRENT_TIME Scheduler::instance().clock()
00015
00016 static const int verbose = 0;
00017
00018
00019
00020
00021 void
00022 toraAgent::log_route_loop(nsaddr_t prev, nsaddr_t next)
00023 {
00024 if(! logtarget || ! verbose ) return;
00025
00026 sprintf(logtarget->pt_->buffer(),
00027 "T %.9f _%d_ routing loop (%d --> %d --> %d)",
00028 CURRENT_TIME, ipaddr(), prev, ipaddr(), next);
00029 logtarget->pt_->dump();
00030 }
00031
00032 void
00033 toraAgent::log_link_layer_feedback(Packet *p)
00034 {
00035 static int link_layer_feedback = 0;
00036 struct hdr_cmn *ch = HDR_CMN(p);
00037
00038 if(! logtarget || ! verbose) return;
00039
00040 sprintf(logtarget->pt_->buffer(),
00041 "T %.9f _%d_ LL unable to deliver packet %d to %d (%d) (reason = %d, ifqlen = %d)",
00042 CURRENT_TIME,
00043 ipaddr(),
00044 ch->uid_,
00045 ch->next_hop_,
00046 ++link_layer_feedback,
00047 ch->xmit_reason_,
00048 ifqueue->length());
00049
00050 logtarget->pt_->dump();
00051 }
00052
00053
00054 void
00055 toraAgent::log_link_layer_recycle(Packet *p)
00056 {
00057 struct hdr_cmn *ch = HDR_CMN(p);
00058 struct hdr_ip *ih = HDR_IP(p);
00059
00060 if(! logtarget || ! verbose) return;
00061
00062 sprintf(logtarget->pt_->buffer(),
00063 "T %.9f _%d_ recycling packet %d (src = %d, dst = %d, prev = %d, next = %d)",
00064 CURRENT_TIME,
00065 ipaddr(),
00066 ch->uid_,
00067
00068 ih->saddr(),ih->daddr(),
00069 ch->prev_hop_, ch->next_hop_);
00070 logtarget->pt_->dump();
00071 }
00072
00073 void
00074 toraAgent::log_lnk_del(nsaddr_t dst)
00075 {
00076 static int link_del = 0;
00077
00078 if(! logtarget || ! verbose) return;
00079
00080
00081
00082
00083
00084 sprintf(logtarget->pt_->buffer(),
00085 "T %.9f _%d_ deleting LL hop to %d (delete %d is %s)",
00086 CURRENT_TIME,
00087 ipaddr(),
00088 dst,
00089 ++link_del,
00090 God::instance()->hops(ipaddr(), dst) != 1 ? "VALID" : "INVALID");
00091 logtarget->pt_->dump();
00092 }
00093
00094 void
00095 toraAgent::log_lnk_kept(nsaddr_t dst)
00096 {
00097 static int link_kept = 0;
00098
00099 if(! logtarget || ! verbose) return;
00100
00101
00102
00103
00104
00105
00106 sprintf(logtarget->pt_->buffer(),
00107 "T %.9f _%d_ keeping LL hop to %d (keep %d is %s)",
00108 CURRENT_TIME,
00109 ipaddr(),
00110 dst,
00111 ++link_kept,
00112 God::instance()->hops(ipaddr(), dst) == 1 ? "VALID" : "INVALID");
00113 logtarget->pt_->dump();
00114 }
00115
00116 void
00117 toraAgent::log_nb_del(nsaddr_t dst, nsaddr_t id)
00118 {
00119 if(! logtarget || ! verbose) return;
00120
00121 sprintf(logtarget->pt_->buffer(),
00122 "T %.9f _%d_ destination %d removing neighbor %d",
00123 CURRENT_TIME,
00124 ipaddr(),
00125 dst, id);
00126 logtarget->pt_->dump();
00127 }
00128
00129 void
00130 toraAgent::log_recv_qry(Packet *p)
00131 {
00132 struct hdr_ip *ih = HDR_IP(p);
00133 struct hdr_tora_qry *qh = HDR_TORA_QRY(p);
00134
00135 if(! logtarget || ! verbose) return;
00136
00137 sprintf(logtarget->pt_->buffer(),
00138 "T %.9f %d received `QRY` from %d --- %d",
00139 CURRENT_TIME, ipaddr(), ih->saddr(), qh->tq_dst);
00140 logtarget->pt_->dump();
00141 }
00142
00143 void
00144 toraAgent::log_recv_upd(Packet *p)
00145 {
00146 struct hdr_ip *ih = HDR_IP(p);
00147 struct hdr_tora_upd *uh = HDR_TORA_UPD(p);
00148
00149 if(! logtarget || ! verbose) return;
00150
00151 sprintf(logtarget->pt_->buffer(),
00152 "T %.9f _%d_ received `UPD` from %d --- %d (%f %d %d %d %d)",
00153 CURRENT_TIME,
00154 ipaddr(),
00155
00156 ih->saddr(), uh->tu_dst,
00157 uh->tu_tau, uh->tu_oid, uh->tu_r, uh->tu_delta, uh->tu_id);
00158 logtarget->pt_->dump();
00159 }
00160
00161 void
00162 toraAgent::log_recv_clr(Packet *p)
00163 {
00164 struct hdr_ip *ih = HDR_IP(p);
00165 struct hdr_tora_clr *ch = HDR_TORA_CLR(p);
00166
00167 if(! logtarget || ! verbose) return;
00168
00169 sprintf(logtarget->pt_->buffer(),
00170 "T %.9f _%d_ received `CLR` from %d --- %d (%f %d)",
00171 CURRENT_TIME,
00172 ipaddr(),
00173
00174 ih->saddr(),
00175 ch->tc_dst, ch->tc_tau, ch->tc_oid);
00176 logtarget->pt_->dump();
00177 }
00178
00179
00180 void
00181 toraAgent::log_route_table()
00182 {
00183 TORADest *td;
00184 TORANeighbor *tn;
00185
00186 if (!logtarget || ! verbose) return;
00187
00188 for(td = dstlist.lh_first; td; td = td->link.le_next) {
00189 tn = td->nb_find_next_hop();
00190
00191 sprintf(logtarget->pt_->buffer(),
00192 "T %.9f _%d_ %2d (%9f %2d %2d %2d %2d) ---> %2d (%9f %2d %2d %2d %2d) %d %.9f --- (%2d a, %2d d, %2d u) %d %9f",
00193 CURRENT_TIME,
00194 ipaddr(),
00195 td->index,
00196 td->height.tau, td->height.oid, td->height.r,
00197 td->height.delta, td->height.id,
00198 tn ? tn->index : -1,
00199 tn ? tn->height.tau : -1.0,
00200 tn ? tn->height.oid : -1,
00201 tn ? tn->height.r : -1,
00202 tn ? tn->height.delta : -1,
00203 tn ? tn->height.id: -1,
00204 tn ? tn->lnk_stat : -1,
00205 tn ? tn->time_act : -1.0,
00206 td->num_active, td->num_down, td->num_up,
00207 td->rt_req, td->time_upd);
00208
00209 logtarget->pt_->dump();
00210 }
00211
00212 sprintf(logtarget->pt_->buffer(),
00213 "T --------------------------------------------------");
00214 logtarget->pt_->dump();
00215 }
00216
00219
00220 void
00221 toraAgent::logToraDest(TORADest *td)
00222 {
00223 if(! verbose) return;
00224
00225 assert(td);
00226
00227 sprintf(logtarget->pt_->buffer(),
00228 "T %.9f _%d_ TD %2d (%9f %2d %2d %2d %2d) --- (%2d a, %2d d, %2d u) %d %9f",
00229 CURRENT_TIME,
00230 ipaddr(),
00231 td->index,
00232 td->height.tau, td->height.oid, td->height.r,
00233 td->height.delta, td->height.id,
00234 td->num_active, td->num_down, td->num_up,
00235 td->rt_req, td->time_upd);
00236 logtarget->pt_->dump();
00237 }
00238
00239
00240 void
00241 toraAgent::logToraNeighbor(TORANeighbor *tn)
00242 {
00243 if(! verbose) return;
00244
00245 assert(tn);
00246
00247 sprintf(logtarget->pt_->buffer(),
00248 "T %.9f _%d_ TN %2d (%.9f %2d %2d %2d %2d) %d %.9f",
00249 CURRENT_TIME,
00250 ipaddr(),
00251 tn->index,
00252 tn->height.tau,
00253 tn->height.oid,
00254 tn->height.r,
00255 tn->height.delta,
00256 tn->height.id,
00257 tn->lnk_stat,
00258 tn->time_act);
00259 logtarget->pt_->dump();
00260 }
00261
00262 void
00263 toraAgent::logNextHopChange(TORADest *td)
00264 {
00265 if(! verbose) return;
00266
00267 TORANeighbor *n;
00268
00269 assert(td);
00270
00271 logToraDest(td);
00272
00273 for(n = td->nblist.lh_first; n; n = n->link.le_next)
00274 logToraNeighbor(n);
00275
00276 n = td->nb_find_next_hop();
00277 if(n) {
00278 sprintf(logtarget->pt_->buffer(), "T %.9f _%d_ nexthop for %d is %d",
00279 CURRENT_TIME, ipaddr(), td->index, n->index);
00280 logtarget->pt_->dump();
00281 }
00282
00283 sprintf(logtarget->pt_->buffer(),
00284 "T %.9f _%d_ --------------------------------------------------",
00285 CURRENT_TIME,
00286 ipaddr());
00287 logtarget->pt_->dump();
00288 }
00289
00290 void
00291 toraAgent::logNbDeletedLastDN(TORADest *td)
00292 {
00293 if(! verbose) return;
00294
00295 sprintf(logtarget->pt_->buffer(), "T %.9f _%d_ lost last downstream link for destination %d",
00296 CURRENT_TIME,
00297 ipaddr(),
00298 td->index);
00299 logtarget->pt_->dump();
00300
00301 logNextHopChange(td);
00302 }
00303