官方淘宝店 易迪拓培训 旧站入口
首页 > 无线通信 > 通信技术学习讨论 > queue上错误模型的处理

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);
        }
}

里面有几处不太明白的地方,我在自己做的注释里面问了
尤其是英文第三条注释的意义好像和代码的逻辑不符
盼望高手来指教指教,这里的逻辑流程是什么意思?

后面解释的不是挺清楚的了嘛,没看懂你想问什么

Top