modules/up/src/Core/network/Mtrace.cc
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- mtraceTimerHandler
- Mtrace
- Mtrace
- send
- handleTimer
- receive
- Response
- Response
1 //
2 // $Id: Mtrace.cc,v 1.1.1.1 2000/03/10 16:32:19 engin Exp $
3 //
4 // Author(s): Ramesh Govindan
5
6 #ifdef HAVE_CONFIG_H
7 #include <config.h>
8 #endif
9
10 #include "util/Types.hh"
11 #include "util/Trail.hh"
12 #include "util/Handler.hh"
13 #include "util/Buffer.hh"
14 #include "sys/File.hh"
15 #include "sys/Pipe.hh"
16 #include "sys/Time.hh"
17 #include "sched/Timer.hh"
18 #include "sched/Dispatcher.hh"
19
20 #include "network/Mtrace.hh"
21 #include "network/Headers.hh"
22 #include "network/Network.hh"
23
24 // Constants
25 static const U8 MaxUnicastTtl = 255;
26 static const U8 MaxMulticastTtl = 192;
27
28 // Locals
29 static TraceCode traceMtrace("network");
30 static TimeShort maxWait(10, 0);
31 static int mtraceSequence = 0;
32
33 static void
34 mtraceTimerHandler(void* ptr,
/* [<][>][^][v][top][bottom][index][help] */
35 void*)
36 {
37 ((Mtrace*) ptr)->handleTimer();
38 }
39
40 Mtrace::Mtrace(const Address* s,
/* [<][>][^][v][top][bottom][index][help] */
41 const Address* g,
42 const Address* r,
43 const Address* R,
44 const Address* t,
45 int h,
46 const Handler& cb)
47 : ListNode()
48 {
49 done = cb;
50 source = *s;
51 group = *g;
52
53 multicastSocket = NULL;
54 if (r) {
55 replyTo = *r;
56 ASSERT(!IN_MULTICAST(replyTo.get()));
57 } else {
58 replyTo.set(MtraceMulticast);
59 }
60
61 if (R) {
62 receiver = *R;
63 } else {
64 receiver.set((network->interfaces.head())->address.get());
65 }
66 if (t) {
67 target = *t;
68 } else {
69 target.set(AllRoutersMulticast);
70 }
71
72 nhops = h;
73 timer = NULL;
74 network->pendingMtraces.append(this);
75 }
76
77 Mtrace::~Mtrace()
/* [<][>][^][v][top][bottom][index][help] */
78 {
79 if (timer) {
80 delete timer;
81 }
82 if (multicastSocket) {
83 delete multicastSocket;
84 }
85 responses.clear();
86 network->pendingMtraces.remove(this);
87 }
88
89 void
90 Mtrace::send()
/* [<][>][^][v][top][bottom][index][help] */
91 {
92 Handler th(mtraceTimerHandler, this);
93 Handler nh(NULL, NULL);
94 Buffer* buf;
95 IP* ip;
96 IGMP* igmp;
97 IGMPTrace* trace;
98 RawSocket* raw;
99 TimeLong at;
100 Address addr;
101
102 raw = new RawSocket(nh, nh, RawSocketIGMP);
103 buf = new Buffer(sizeof(IP) + sizeof(IGMP) + sizeof(IGMPTrace));
104
105 ip = (IP*) buf->contents;
106 ip->headerLength = sizeof(IP) >> 2;
107 ip->version = 4;
108 ip->typeOfService = 0;
109 ip->totalLength = sizeof(IP) + sizeof(IGMP) + sizeof(IGMPTrace);
110 ip->identifier = 0;
111 ip->fragmentOffset = 0;
112 ip->timeToLive = 0xff;
113 ip->protocol = IPPROTO_IGMP;
114 ip->source = (network->interfaces.head())->address.get();
115 ip->destination = target.get();
116 ip->hton();
117 ip->checksum = 0;
118 ip->checksum = htons(network->cksum((U16*) ip, sizeof(IP)));
119
120 igmp = (IGMP*) (ip + 1);
121 igmp->type = IGMPMtrace;
122 igmp->code = nhops;
123 igmp->group = group.get();
124 igmp->hton();
125
126 trace = (IGMPTrace*) (igmp + 1);
127 trace->source = source.get();
128 trace->destination = receiver.get();
129 trace->responseAddress = replyTo.get();
130 trace->timeToLive =
131 IN_MULTICAST(trace->destination) ?
132 MaxMulticastTtl : MaxUnicastTtl;
133 // identifier = ++mtraceSequence;
134 identifier = random() >> 8;
135 trace->queryId = identifier;
136 trace->hton();
137
138 igmp->checksum = 0;
139 igmp->checksum = network->cksum((U16*) igmp,
140 sizeof(IGMP) + sizeof(IGMPTrace));
141
142 addr.set(AllRoutersMulticast);
143 raw->sendTo(buf->contents, buf->size, addr, 0);
144
145 TRACE(traceMtrace, "mtrace sent to %s\n", group.name());
146
147 delete raw;
148 delete buf;
149
150 if (timer) {
151 delete timer;
152 }
153 at = dispatcher.systemClock;
154 at = at + maxWait;
155 timer = new Timer(th, at);
156
157 return;
158 }
159
160 void
161 Mtrace::handleTimer()
/* [<][>][^][v][top][bottom][index][help] */
162 {
163 TRACE(traceMtrace, "mtrace failed to %s\n", group.name());
164
165 timer = NULL;
166 done.callBack((void*) this);
167 return;
168 }
169
170 void
171 Mtrace::receive(const IGMPTrace *trace, int length)
/* [<][>][^][v][top][bottom][index][help] */
172 {
173 IGMPTraceResponse* resp;
174 // Save the response
175 resp = (IGMPTraceResponse*) (trace + 1);
176 for (int i = 0; i < (length / sizeof(IGMPTraceResponse)); i++) {
177 Mtrace::Response* response;
178
179 response = new Mtrace::Response(resp);
180 response->ntoh();
181 responses.append(response);
182 resp++;
183 }
184
185 done.callBack((void*) this);
186 return;
187 }
188
189 Mtrace::Response::Response(IGMPTraceResponse* r)
/* [<][>][^][v][top][bottom][index][help] */
190 : ListNode()
191 {
192 response = *r;
193 }
194
195 Mtrace::Response::~Response()
/* [<][>][^][v][top][bottom][index][help] */
196 {
197 // Empty
198 }
199
200 // Copyright (c) 1994 by the University of Southern California.
201 // All rights reserved.
202 //
203 // Permission to use, copy, modify, and distribute this software and
204 // its documentation in source and binary forms for lawful
205 // non-commercial purposes and without fee is hereby granted, provided
206 // that the above copyright notice appear in all copies and that both
207 // the copyright notice and this permission notice appear in supporting
208 // documentation, and that any documentation, advertising materials,
209 // and other materials related to such distribution and use acknowledge
210 // that the software was developed by the University of Southern
211 // California and/or Information Sciences Institute.
212 // The name of the University of Southern California may not
213 // be used to endorse or promote products derived from this software
214 // without specific prior written permission.
215 //
216 // THE UNIVERSITY OF SOUTHERN CALIFORNIA DOES NOT MAKE ANY REPRESENTATIONS
217 // ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE. THIS SOFTWARE IS
218 // PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
219 // INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
220 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND
221 // NON-INFRINGEMENT.
222 //
223 // IN NO EVENT SHALL USC, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
224 // SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, WHETHER IN CONTRACT,
225 // TORT, OR OTHER FORM OF ACTION, ARISING OUT OF OR IN CONNECTION WITH,
226 // THE USE OR PERFORMANCE OF THIS SOFTWARE.
227 //
228 // Questions concerning this software should be directed to
229 // scan@isi.edu.
230 //
231
232