50 } |
50 } |
51 |
51 |
52 ErrorModel::ErrorModel () : |
52 ErrorModel::ErrorModel () : |
53 m_enable (true) |
53 m_enable (true) |
54 { |
54 { |
55 NS_LOG_FUNCTION; |
55 NS_LOG_FUNCTION_NOARGS (); |
56 } |
56 } |
57 |
57 |
58 ErrorModel::~ErrorModel () |
58 ErrorModel::~ErrorModel () |
59 { |
59 { |
60 NS_LOG_FUNCTION; |
60 NS_LOG_FUNCTION_NOARGS (); |
61 } |
61 } |
62 |
62 |
63 bool |
63 bool |
64 ErrorModel::IsCorrupt (Ptr<Packet> p) |
64 ErrorModel::IsCorrupt (Ptr<Packet> p) |
65 { |
65 { |
66 NS_LOG_FUNCTION; |
66 NS_LOG_FUNCTION_NOARGS (); |
67 bool result; |
67 bool result; |
68 // Insert any pre-conditions here |
68 // Insert any pre-conditions here |
69 result = DoCorrupt (p); |
69 result = DoCorrupt (p); |
70 // Insert any post-conditions here |
70 // Insert any post-conditions here |
71 return result; |
71 return result; |
72 } |
72 } |
73 |
73 |
74 void |
74 void |
75 ErrorModel::Reset (void) |
75 ErrorModel::Reset (void) |
76 { |
76 { |
77 NS_LOG_FUNCTION; |
77 NS_LOG_FUNCTION_NOARGS (); |
78 DoReset (); |
78 DoReset (); |
79 } |
79 } |
80 |
80 |
81 void |
81 void |
82 ErrorModel::Enable (void) |
82 ErrorModel::Enable (void) |
83 { |
83 { |
84 NS_LOG_FUNCTION; |
84 NS_LOG_FUNCTION_NOARGS (); |
85 m_enable = true; |
85 m_enable = true; |
86 } |
86 } |
87 |
87 |
88 void |
88 void |
89 ErrorModel::Disable (void) |
89 ErrorModel::Disable (void) |
90 { |
90 { |
91 NS_LOG_FUNCTION; |
91 NS_LOG_FUNCTION_NOARGS (); |
92 m_enable = false; |
92 m_enable = false; |
93 } |
93 } |
94 |
94 |
95 bool |
95 bool |
96 ErrorModel::IsEnabled (void) const |
96 ErrorModel::IsEnabled (void) const |
97 { |
97 { |
98 NS_LOG_FUNCTION; |
98 NS_LOG_FUNCTION_NOARGS (); |
99 return m_enable; |
99 return m_enable; |
100 } |
100 } |
101 |
101 |
102 // |
102 // |
103 // RateErrorModel |
103 // RateErrorModel |
129 } |
129 } |
130 |
130 |
131 |
131 |
132 RateErrorModel::RateErrorModel () |
132 RateErrorModel::RateErrorModel () |
133 { |
133 { |
134 NS_LOG_FUNCTION; |
134 NS_LOG_FUNCTION_NOARGS (); |
135 } |
135 } |
136 |
136 |
137 RateErrorModel::~RateErrorModel () |
137 RateErrorModel::~RateErrorModel () |
138 { |
138 { |
139 NS_LOG_FUNCTION; |
139 NS_LOG_FUNCTION_NOARGS (); |
140 } |
140 } |
141 |
141 |
142 enum ErrorUnit |
142 enum ErrorUnit |
143 RateErrorModel::GetUnit (void) const |
143 RateErrorModel::GetUnit (void) const |
144 { |
144 { |
145 NS_LOG_FUNCTION; |
145 NS_LOG_FUNCTION_NOARGS (); |
146 return m_unit; |
146 return m_unit; |
147 } |
147 } |
148 |
148 |
149 void |
149 void |
150 RateErrorModel::SetUnit (enum ErrorUnit error_unit) |
150 RateErrorModel::SetUnit (enum ErrorUnit error_unit) |
151 { |
151 { |
152 NS_LOG_FUNCTION; |
152 NS_LOG_FUNCTION_NOARGS (); |
153 m_unit = error_unit; |
153 m_unit = error_unit; |
154 } |
154 } |
155 |
155 |
156 double |
156 double |
157 RateErrorModel::GetRate (void) const |
157 RateErrorModel::GetRate (void) const |
158 { |
158 { |
159 NS_LOG_FUNCTION; |
159 NS_LOG_FUNCTION_NOARGS (); |
160 return m_rate; |
160 return m_rate; |
161 } |
161 } |
162 |
162 |
163 void |
163 void |
164 RateErrorModel::SetRate (double rate) |
164 RateErrorModel::SetRate (double rate) |
165 { |
165 { |
166 NS_LOG_FUNCTION; |
166 NS_LOG_FUNCTION_NOARGS (); |
167 m_rate = rate; |
167 m_rate = rate; |
168 } |
168 } |
169 |
169 |
170 void |
170 void |
171 RateErrorModel::SetRandomVariable (const RandomVariable &ranvar) |
171 RateErrorModel::SetRandomVariable (const RandomVariable &ranvar) |
172 { |
172 { |
173 NS_LOG_FUNCTION; |
173 NS_LOG_FUNCTION_NOARGS (); |
174 m_ranvar = ranvar; |
174 m_ranvar = ranvar; |
175 } |
175 } |
176 |
176 |
177 bool |
177 bool |
178 RateErrorModel::DoCorrupt (Ptr<Packet> p) |
178 RateErrorModel::DoCorrupt (Ptr<Packet> p) |
179 { |
179 { |
180 NS_LOG_FUNCTION; |
180 NS_LOG_FUNCTION_NOARGS (); |
181 if (!m_enable) |
181 if (!m_enable) |
182 { |
182 { |
183 return false; |
183 return false; |
184 } |
184 } |
185 switch (m_unit) |
185 switch (m_unit) |
198 } |
198 } |
199 |
199 |
200 bool |
200 bool |
201 RateErrorModel::DoCorruptPkt (Ptr<Packet> p) |
201 RateErrorModel::DoCorruptPkt (Ptr<Packet> p) |
202 { |
202 { |
203 NS_LOG_FUNCTION; |
203 NS_LOG_FUNCTION_NOARGS (); |
204 return (m_ranvar.GetValue () < m_rate); |
204 return (m_ranvar.GetValue () < m_rate); |
205 } |
205 } |
206 |
206 |
207 bool |
207 bool |
208 RateErrorModel::DoCorruptByte (Ptr<Packet> p) |
208 RateErrorModel::DoCorruptByte (Ptr<Packet> p) |
209 { |
209 { |
210 NS_LOG_FUNCTION; |
210 NS_LOG_FUNCTION_NOARGS (); |
211 // compute pkt error rate, assume uniformly distributed byte error |
211 // compute pkt error rate, assume uniformly distributed byte error |
212 double per = 1 - pow (1.0 - m_rate, p->GetSize ()); |
212 double per = 1 - pow (1.0 - m_rate, p->GetSize ()); |
213 return (m_ranvar.GetValue () < per); |
213 return (m_ranvar.GetValue () < per); |
214 } |
214 } |
215 |
215 |
216 bool |
216 bool |
217 RateErrorModel::DoCorruptBit(Ptr<Packet> p) |
217 RateErrorModel::DoCorruptBit(Ptr<Packet> p) |
218 { |
218 { |
219 NS_LOG_FUNCTION; |
219 NS_LOG_FUNCTION_NOARGS (); |
220 // compute pkt error rate, assume uniformly distributed bit error |
220 // compute pkt error rate, assume uniformly distributed bit error |
221 double per = 1 - pow (1.0 - m_rate, (8 * p->GetSize ()) ); |
221 double per = 1 - pow (1.0 - m_rate, (8 * p->GetSize ()) ); |
222 return (m_ranvar.GetValue () < per); |
222 return (m_ranvar.GetValue () < per); |
223 } |
223 } |
224 |
224 |
225 void |
225 void |
226 RateErrorModel::DoReset (void) |
226 RateErrorModel::DoReset (void) |
227 { |
227 { |
228 NS_LOG_FUNCTION; |
228 NS_LOG_FUNCTION_NOARGS (); |
229 /* re-initialize any state; no-op for now */ |
229 /* re-initialize any state; no-op for now */ |
230 } |
230 } |
231 |
231 |
232 // |
232 // |
233 // ListErrorModel |
233 // ListErrorModel |
244 return tid; |
244 return tid; |
245 } |
245 } |
246 |
246 |
247 ListErrorModel::ListErrorModel () |
247 ListErrorModel::ListErrorModel () |
248 { |
248 { |
249 NS_LOG_FUNCTION; |
249 NS_LOG_FUNCTION_NOARGS (); |
250 } |
250 } |
251 |
251 |
252 ListErrorModel::~ListErrorModel () |
252 ListErrorModel::~ListErrorModel () |
253 { |
253 { |
254 NS_LOG_FUNCTION; |
254 NS_LOG_FUNCTION_NOARGS (); |
255 } |
255 } |
256 |
256 |
257 std::list<uint32_t> |
257 std::list<uint32_t> |
258 ListErrorModel::GetList (void) const |
258 ListErrorModel::GetList (void) const |
259 { |
259 { |
260 NS_LOG_FUNCTION; |
260 NS_LOG_FUNCTION_NOARGS (); |
261 return m_packetList; |
261 return m_packetList; |
262 } |
262 } |
263 |
263 |
264 void |
264 void |
265 ListErrorModel::SetList (const std::list<uint32_t> &packetlist) |
265 ListErrorModel::SetList (const std::list<uint32_t> &packetlist) |
266 { |
266 { |
267 NS_LOG_FUNCTION; |
267 NS_LOG_FUNCTION_NOARGS (); |
268 m_packetList = packetlist; |
268 m_packetList = packetlist; |
269 } |
269 } |
270 |
270 |
271 // When performance becomes a concern, the list provided could be |
271 // When performance becomes a concern, the list provided could be |
272 // converted to a dynamically-sized array of uint32_t to avoid |
272 // converted to a dynamically-sized array of uint32_t to avoid |
273 // list iteration below. |
273 // list iteration below. |
274 bool |
274 bool |
275 ListErrorModel::DoCorrupt (Ptr<Packet> p) |
275 ListErrorModel::DoCorrupt (Ptr<Packet> p) |
276 { |
276 { |
277 NS_LOG_FUNCTION; |
277 NS_LOG_FUNCTION_NOARGS (); |
278 if (!m_enable) |
278 if (!m_enable) |
279 { |
279 { |
280 return false; |
280 return false; |
281 } |
281 } |
282 uint32_t uid = p->GetUid (); |
282 uint32_t uid = p->GetUid (); |