Пример #1
0
McPosAckObj::McPosAckObj(RoutedFrame* frame, McTree* group)
{

    group_name = std::string(group->group_name_);

    packet_id = frame->header_.packet_id;
    sequence_num = frame->header_.packet_sequence_num;

    //memcpy(incoming_mac,frame->eh_h_.eh_source,6);



    if (!compareMac(group->route_uplink_->next_hop, frame->eh_h_.eh_source) && !group->root)
    {
        unsigned char* mac_p = new unsigned char[6];
        memcpy(mac_p, group->route_uplink_->next_hop, 6);
        missing_acks_l.push_back(mac_p);
        //ROS_ERROR("ADD Uplink %s", getMacAsCStr(mac_p));
    }

    for (std::list<mac*>::iterator i = group->downlinks_l_.begin(); i != group->downlinks_l_.end(); i++)
    {
        mac* m = *i;


        if (!compareMac(frame->eh_h_.eh_source, m->mac_adr))
        {
            unsigned char* mac_p = new unsigned char[6];
            memcpy(mac_p, m->mac_adr, 6);
            missing_acks_l.push_back(mac_p);
            //ROS_ERROR("ADD Downlink %s", getMacAsCStr(mac_p));
        }
    }
}
std::vector<McTree *> McHandler::lostConnectionUplinks(unsigned char *mac_a)
{

    std::vector<McTree *> affected_trees;
    for (std::list<McTree *>::iterator it = groups_->begin();
         it != groups_->end(); ++it)
    {
        McTree *tree = *it;

        if (compareMac(tree->route_uplink_->next_hop, mac_a))
        {

            tree->connected = false;
            affected_trees.push_back(tree);
        }
    }
    return affected_trees;
}
Пример #3
0
bool McPosAckObj::GotAck(McAckFrame* ack)
{
    if (ack->mc_group_.compare(group_name) == 0 && ack->header_.packet_id == packet_id && ack->header_.frame_seq_num == sequence_num)
    {
        for (std::list<unsigned char*>::iterator i = missing_acks_l.begin(); i != missing_acks_l.end();)
        {
            if (compareMac(*i, ack->eh_h_.eh_source))
            {
                delete (*i);
                i = missing_acks_l.erase(i);
                return missing_acks_l.empty();
            }
            else
                i++;
        }
    }
    return false;
}