modules/up/src/Core/network/Prefix.cc
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- Prefix
- Prefix
- Prefix
- Prefix
- Prefix
- mask
- numHosts
- name
- randomHost
- buddy
- neighbor
- match
1 //
2 // $Id: Prefix.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 extern "C" {
11 #include <string.h>
12 #if NEED_MEMORY_H
13 #include <memory.h>
14 #endif // NEED_MEMORY_H
15
16 #include <sys/types.h>
17 #include <sys/socket.h>
18 #include <netinet/in.h>
19 #include <arpa/inet.h>
20 }
21
22 #include "gnu/ACG.h"
23 #include "gnu/RndInt.h"
24 #include "util/Types.hh"
25 #include "util/Trail.hh"
26 #include "util/Handler.hh"
27 #include "util/Buffer.hh"
28 #include "sys/Address.hh"
29 #include "network/Prefix.hh"
30 #include "sched/Dispatcher.hh"
31
32 // Constants
33 static const int maxSignedInt = 0x7fffffff;
34
35 // File locals
36 ACG *acg = NULL;
37 RandomInteger *rndInt = NULL;
38
39 Prefix::Prefix()
/* [<][>][^][v][top][bottom][index][help] */
40 {
41 address = 0;
42 maskLength = 0;
43 (void) memset(nameString, 0, MaxPrefixNameLength);
44 }
45
46 Prefix::Prefix(Address& a)
/* [<][>][^][v][top][bottom][index][help] */
47 {
48 address = a.get();
49 maskLength = 32;
50 (void) memset(nameString, 0, MaxPrefixNameLength);
51 }
52
53 Prefix::Prefix(Address& a,
/* [<][>][^][v][top][bottom][index][help] */
54 int l)
55 {
56 U32 baddr;
57
58 ASSERT((l >= 0) && (l <= 30)); // Note upper bound on length
59
60 address = a.get();
61 maskLength = l;
62 (void) memset(nameString, 0, MaxPrefixNameLength);
63
64 address &= mask();
65 return;
66 }
67
68 Prefix::Prefix(Prefix& p)
/* [<][>][^][v][top][bottom][index][help] */
69 {
70 address = p.address;
71 maskLength = p.maskLength;
72 return;
73 }
74
75 Prefix::~Prefix()
/* [<][>][^][v][top][bottom][index][help] */
76 {
77 // Empty
78 }
79
80 void
81 Prefix::operator--(int j)
82 {
83 ASSERT(j < sizeof(address) * 8); // NBBY?
84 maskLength -= 1;
85 address &= mask();
86 return;
87 }
88
89 Boolean
90 Prefix::operator==(Prefix& pfx)
91 {
92 return ((maskLength == pfx.maskLength) &&
93 (address == pfx.address));
94 }
95
96 U32
97 Prefix::mask()
/* [<][>][^][v][top][bottom][index][help] */
98 {
99 return ~((0x1 << (32 - maskLength)) - 1);
100 }
101
102 unsigned int
103 Prefix::numHosts()
/* [<][>][^][v][top][bottom][index][help] */
104 {
105 return ((0x1 << (32 - maskLength)) - 1);
106 }
107
108 char*
109 Prefix::name()
/* [<][>][^][v][top][bottom][index][help] */
110 {
111 struct in_addr in;
112
113 if (!nameString[0]) {
114 in.s_addr = htonl(address);
115 sprintf(nameString, "%s/%d", ::inet_ntoa(in), maskLength);
116 }
117 return nameString;
118 }
119
120 void
121 Prefix::randomHost(Address& addr)
/* [<][>][^][v][top][bottom][index][help] */
122 {
123 unsigned int hostNum;
124
125 if (acg == NULL) {
126 dispatcher.systemClock.sync();
127 acg = new ACG(dispatcher.systemClock.seconds());
128 rndInt = new RandomInteger(0, maxSignedInt, acg);
129 }
130
131 while (!(hostNum = rndInt->asLong(numHosts()))) {
132 // Empty
133 }
134 addr.set(address + hostNum);
135 return;
136 }
137
138 void
139 Prefix::buddy()
/* [<][>][^][v][top][bottom][index][help] */
140 {
141 U32 base;
142
143 base = (address >> (32 - maskLength));
144 if (base & 0x1) {
145 base -= 1;
146 } else {
147 base += 1;
148 }
149 address = (base << (32 - maskLength));
150 return;
151 }
152
153 void
154 Prefix::neighbor()
/* [<][>][^][v][top][bottom][index][help] */
155 {
156 U32 base;
157
158 base = (address >> (32 - maskLength));
159 if (base & 0x1) {
160 base += 1;
161 } else {
162 base -= 1;
163 }
164 address = (base << (32 - maskLength)); // XXX: wrap around?
165 return;
166 }
167
168 Boolean
169 Prefix::match(Address& a)
/* [<][>][^][v][top][bottom][index][help] */
170 {
171 return ((a.get() & mask()) == address);
172 }
173
174 // Copyright (c) 1994 by the University of Southern California.
175 // All rights reserved.
176 //
177 // Permission to use, copy, modify, and distribute this software and
178 // its documentation in source and binary forms for lawful
179 // non-commercial purposes and without fee is hereby granted, provided
180 // that the above copyright notice appear in all copies and that both
181 // the copyright notice and this permission notice appear in supporting
182 // documentation, and that any documentation, advertising materials,
183 // and other materials related to such distribution and use acknowledge
184 // that the software was developed by the University of Southern
185 // California and/or Information Sciences Institute.
186 // The name of the University of Southern California may not
187 // be used to endorse or promote products derived from this software
188 // without specific prior written permission.
189 //
190 // THE UNIVERSITY OF SOUTHERN CALIFORNIA DOES NOT MAKE ANY REPRESENTATIONS
191 // ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE. THIS SOFTWARE IS
192 // PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
193 // INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
194 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND
195 // NON-INFRINGEMENT.
196 //
197 // IN NO EVENT SHALL USC, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
198 // SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, WHETHER IN CONTRACT,
199 // TORT, OR OTHER FORM OF ACTION, ARISING OUT OF OR IN CONNECTION WITH,
200 // THE USE OR PERFORMANCE OF THIS SOFTWARE.
201 //
202 // Questions concerning this software should be directed to
203 // scan@isi.edu.
204 //
205
206