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 #include "ip.h"
00038 #include "trace.h"
00039 #include "mac.h"
00040
00041
00042
00043 class TraceIp : public Trace {
00044 public:
00045 TraceIp(int type) : Trace(type) {
00046 bind("mask_", &mask_);
00047 bind("shift_", &shift_);
00048 }
00049 void recv(Packet*, Handler*);
00050 protected:
00051 int mask_;
00052 int shift_;
00053 };
00054
00055 class TraceIpMac : public TraceIp {
00056 public:
00057 TraceIpMac(int type) : TraceIp(type) {}
00058 void recv(Packet*, Handler*);
00059 };
00060
00061
00062 class TraceIpClass : public TclClass {
00063 public:
00064 TraceIpClass() : TclClass("TraceIp") { }
00065 TclObject* create(int args, const char*const* argv) {
00066 if (args >= 5)
00067 return (new TraceIp(*argv[4]));
00068 else
00069 return NULL;
00070 }
00071 } traceip_class;
00072
00073 class TraceIpMacClass : public TclClass {
00074 public:
00075 TraceIpMacClass() : TclClass("TraceIp/Mac") { }
00076 TclObject* create(int args, const char*const* argv) {
00077 if (args >= 5)
00078 return (new TraceIpMac(*argv[4]));
00079 else
00080 return NULL;
00081 }
00082 } trace_ip_mac_class;
00083
00084
00085 void TraceIp::recv(Packet* p, Handler* h)
00086 {
00087
00088 hdr_ip *iph = hdr_ip::access(p);
00089 int src = (src_ >= 0) ? src_ : (iph->saddr() >> shift_) & mask_;
00090 int dst = (iph->daddr() >> shift_) & mask_;
00091 format(type_, src, dst , p);
00092 pt_->dump();
00093 target_ ? send(p, h) : Packet::free(p);
00094 }
00095
00096
00097 void TraceIpMac::recv(Packet* p, Handler* h)
00098 {
00099
00100
00101
00102 hdr_ip *iph = HDR_IP(p);
00103
00104 int src = (src_ >= 0) ? src_ : (iph->saddr() >> shift_) & mask_;
00105 int dst = (iph->daddr() >> shift_) & mask_;
00106
00107 hdr_mac* mh = HDR_MAC(p);
00108
00109 if (mh->ftype() == MF_ACK || mh->ftype() == MF_CTS)
00110 format(type_, dst, src , p);
00111 else
00112 format(type_, src, dst , p);
00113 pt_->dump();
00114 target_ ? send(p, h) : Packet::free(p);
00115 }