queue上错误模型的处理
12-12
原文件errmodel.pizhu.cc
//错误模型的接收处理函数,总览错误生成的整体机制
//handle the packet dropping mechanism
void ErrorModel::recv(Packet* p, Handler* h)
{
// 1. Determine the error by calling corrupt(p)
// 1, 调用corrupt(p)来生成错误
// int error = corrupt(p);
// 2. Set the packet's error flag if it is corrupted
// 2, 生成了的错误鹞标志它的错误标志
// ch->error() |= error;
// 3. If there is no error, no drop_ target or markecn is true,
// let pkt continue, otherwise hand the corrupted packet to drop_
// 这第三条什么意思?
hdr_cmn* ch = hdr_cmn::access(p);
int error = corrupt(p);
//此赋值操作后,error只有两种情形:
//0,没有错误
//1,有错误报生成
// XXX When we do ECN, the packet is marked but NOT dropped.
// So we don't resume handler here.
if (!markecn_ && !delay_pkt_ && (h && ((error && drop_) || !target_))) {
// if we drop or there is no target_, then resume handler
double delay = Random::uniform(8.0 * ch->size() / bandwidth_);
//根据带宽和包的总的二进制位,可以知道花费多长时间处理
Scheduler::instance().schedule(h, &intr_, delay);
}
if (error) {
ch->error() |= error;
//位操作中的或,赋值给包头的错误标志,什么意思?
//如果该标志位已经是1,则即使这里的error是0也仍然让它保持1的状态
//如果该标志位是0,而corrupt()给error以1的状态,则让该标志位为1
//如果该标志位为1,且corrupt决定error是1,则该标志位设为1
//只有当该标志位为0,且error也为0,该标志位保持为0
//在有error的情况下,分三种情况:
//在ErrorModel类自己中的markecn_标记使能ecn的话,标记而不
//在ErrorModel类自己中的delay_plt_为1下,延迟发送
//在何处来的变量drop_存在时,调用它来recv这个数据包
if (markecn_) {
hdr_flags* hf = hdr_flags::access(p);
hf->ce() = 1;
} else if (delay_pkt_) {
// Delay the packet.分组延迟
Scheduler::instance().schedule(target_, p, delay_)
return;
} else if (drop_) {
drop_->recv(p);
return;
}
}
if (target_) { //如果没有error错误,则执行target_的recv方法
target_->recv(p, h);
}
}
//错误模型的接收处理函数,总览错误生成的整体机制
//handle the packet dropping mechanism
void ErrorModel::recv(Packet* p, Handler* h)
{
// 1. Determine the error by calling corrupt(p)
// 1, 调用corrupt(p)来生成错误
// int error = corrupt(p);
// 2. Set the packet's error flag if it is corrupted
// 2, 生成了的错误鹞标志它的错误标志
// ch->error() |= error;
// 3. If there is no error, no drop_ target or markecn is true,
// let pkt continue, otherwise hand the corrupted packet to drop_
// 这第三条什么意思?
hdr_cmn* ch = hdr_cmn::access(p);
int error = corrupt(p);
//此赋值操作后,error只有两种情形:
//0,没有错误
//1,有错误报生成
// XXX When we do ECN, the packet is marked but NOT dropped.
// So we don't resume handler here.
if (!markecn_ && !delay_pkt_ && (h && ((error && drop_) || !target_))) {
// if we drop or there is no target_, then resume handler
double delay = Random::uniform(8.0 * ch->size() / bandwidth_);
//根据带宽和包的总的二进制位,可以知道花费多长时间处理
Scheduler::instance().schedule(h, &intr_, delay);
}
if (error) {
ch->error() |= error;
//位操作中的或,赋值给包头的错误标志,什么意思?
//如果该标志位已经是1,则即使这里的error是0也仍然让它保持1的状态
//如果该标志位是0,而corrupt()给error以1的状态,则让该标志位为1
//如果该标志位为1,且corrupt决定error是1,则该标志位设为1
//只有当该标志位为0,且error也为0,该标志位保持为0
//在有error的情况下,分三种情况:
//在ErrorModel类自己中的markecn_标记使能ecn的话,标记而不
//在ErrorModel类自己中的delay_plt_为1下,延迟发送
//在何处来的变量drop_存在时,调用它来recv这个数据包
if (markecn_) {
hdr_flags* hf = hdr_flags::access(p);
hf->ce() = 1;
} else if (delay_pkt_) {
// Delay the packet.分组延迟
Scheduler::instance().schedule(target_, p, delay_)
return;
} else if (drop_) {
drop_->recv(p);
return;
}
}
if (target_) { //如果没有error错误,则执行target_的recv方法
target_->recv(p, h);
}
}
里面有几处不太明白的地方,我在自己做的注释里面问了
尤其是英文第三条注释的意义好像和代码的逻辑不符
盼望高手来指教指教,这里的逻辑流程是什么意思?
后面解释的不是挺清楚的了嘛,没看懂你想问什么
相关文章:
- Ns中如何设置错误模型的单位?(05-08)
- NS2: Queue set limit_ 。有上限吗?(05-08)
- NS2:Queue set limit_ ,最大能设多大?(05-08)
- 请问通信上的queue怎么仿真比较方便?(05-08)
射频专业培训教程推荐