NETWORK ATTACKS FRAMEWORK  1.0.0
A NETwork Attacks framework. Making network attacks impact evaluation easier!
NA_packet_queue_omnet.cc File Reference
#include "NA_aodv_uu_omnet.h"
#include "IPv4Datagram.h"

Go to the source code of this file.

Defines

#define GARBAGE_COLLECT
#define ARP_DELAY   0.005

Functions

void NS_CLASS packet_queue_init (void)
void NS_CLASS packet_queue_destroy (void)
int NS_CLASS packet_queue_garbage_collect (void)
void NS_CLASS packet_queue_add (cPacket *p, struct in_addr dest_addr)
int NS_CLASS packet_queue_set_verdict (struct in_addr dest_addr, int verdict)

Define Documentation

#define ARP_DELAY   0.005
#define GARBAGE_COLLECT

Definition at line 26 of file NA_packet_queue_omnet.cc.


Function Documentation

void NS_CLASS packet_queue_add ( cPacket *  p,
struct in_addr  dest_addr 
)

Definition at line 324 of file NA_packet_queue_omnet.cc.

{
    struct q_pkt *qp;
    cPacket *dgram;

    if (PQ.pkQueue.size() >= MAX_QUEUE_LENGTH)
    {
        DEBUG(LOG_DEBUG, 0, "MAX Queue length! Removing first packet.");
        qp = PQ.pkQueue.front();
        PQ.pkQueue.erase(PQ.pkQueue.begin());
        dgram = qp->p;
        sendICMP(dgram);
        free(qp);
    }

    qp = (struct q_pkt *) malloc(sizeof(struct q_pkt));

    if (qp == NULL)
    {
        fprintf(stderr, "Malloc failed!\n");
        exit(-1);
    }
    qp->p = p;
    qp->dest_addr = dest_addr;

    gettimeofday(&qp->q_time, NULL);
    PQ.pkQueue.push_back(qp);

    DEBUG(LOG_INFO, 0, "buffered pkt to %s qlen=%u",
          ip_to_str(dest_addr), PQ.length());
}
void NS_CLASS packet_queue_destroy ( void  )

Definition at line 278 of file NA_packet_queue_omnet.cc.

{
    int count = 0;
    while (!PQ.pkQueue.empty())
    {
        struct q_pkt *qp = PQ.pkQueue.back();
        PQ.pkQueue.pop_back();
        delete  qp->p;
        free(qp);
        count++;
    }
    DEBUG(LOG_INFO, 0, "Destroyed %d buffered packets!", count);
}

Definition at line 293 of file NA_packet_queue_omnet.cc.

{
    int count = 0;
    struct timeval now;

    gettimeofday(&now, NULL);

    for (unsigned int i=0; i < PQ.pkQueue.size();)
    {
        struct q_pkt *qp = PQ.pkQueue[i];
        if (timeval_diff(&now, &qp->q_time) > MAX_QUEUE_TIME)
        {
            PQ.pkQueue.erase(PQ.pkQueue.begin()+i);
            sendICMP(qp->p);
            free(qp);
            count++;
        }
        else
            i++;
    }

    if (count)
    {
        DEBUG(LOG_DEBUG, 0, "Removed %d packet(s)!", count);
    }

    return count;
}
void NS_CLASS packet_queue_init ( void  )

Definition at line 266 of file NA_packet_queue_omnet.cc.

{
    PQ.pkQueue.clear();
#ifdef GARBAGE_COLLECT
    /* Set up garbage collector */
    timer_init(&PQ.garbage_collect_timer, &NS_CLASS packet_queue_timeout, &PQ);

    timer_set_timeout(&PQ.garbage_collect_timer, GARBAGE_COLLECT_TIME);
#endif
}
int NS_CLASS packet_queue_set_verdict ( struct in_addr  dest_addr,
int  verdict 
)

Definition at line 356 of file NA_packet_queue_omnet.cc.

{
    int count = 0;
    rt_table_t *rt, *next_hop_rt, *inet_rt = NULL;
    struct in_addr gw_addr;

    double delay = 0;
#define ARP_DELAY 0.005

    if (verdict == PQ_ENC_SEND)
    {
        gw_addr.s_addr = ManetAddress(*gateWayAddress);
        rt = rt_table_find(gw_addr);
    }
    else
        rt = rt_table_find(dest_addr);

    std::vector<ManetAddress> list;
    if (isInMacLayer())
    {
        std::vector<MACAddress> listMac;
        getApList(dest_addr.s_addr.getMAC(),listMac);
        while (!listMac.empty())
        {
            list.push_back(ManetAddress(listMac.back()));
            listMac.pop_back();
        }
    }
    else
    {
        std::vector<IPv4Address> listIp;
        getApListIp(dest_addr.s_addr.getIPv4(),listIp);
        while (!listIp.empty())
        {
            list.push_back(ManetAddress(listIp.back()));
            listIp.pop_back();
        }
    }

    while (!list.empty())
    {
        struct in_addr dest_addr;
        dest_addr.s_addr = list.back();
        list.pop_back();
        for (unsigned int i=0; i < PQ.pkQueue.size();)
        {
            struct q_pkt *qp = PQ.pkQueue[i];
            if (qp->dest_addr.s_addr == dest_addr.s_addr)
            {
                PQ.pkQueue.erase(PQ.pkQueue.begin()+i);
                switch (verdict)
                {
                    case PQ_ENC_SEND:
                        if (dynamic_cast <IPv4Datagram *> (qp->p))
                        {
                            qp->p = pkt_encapsulate(dynamic_cast <IPv4Datagram *> (qp->p), *gateWayAddress);
                            // now Ip layer decremented again
                            /* Apparently, the link layer implementation can't handle a burst of packets. So to keep ARP happy, buffered
                             * packets are sent with ARP_DELAY seconds between sends. */
                            sendDelayed(qp->p, delay, "to_ip");
                            delay += ARP_DELAY;
                        }
                        else
                        {
                            sendICMP(qp->p);
                        }
                    break;
                    case PQ_SEND:
                        if (!rt)
                            return -1;
                        /* Apparently, the link layer implementation can't handle
                         * a burst of packets. So to keep ARP happy, buffered
                         * packets are sent with ARP_DELAY seconds between
                         * sends. */
                         // now Ip layer decremented again
                        sendDelayed(qp->p, delay, "to_ip");
                        delay += ARP_DELAY;
                    break;
                    case PQ_DROP:
                        sendICMP(qp->p);
                    break;
                }
                free(qp);
                count++;
            }
            else
                i++;
        }
    }
    /* Update rt timeouts */
    if (rt && rt->state == VALID &&
            (verdict == PQ_SEND || verdict == PQ_ENC_SEND))
    {
        if (dest_addr.s_addr != DEV_IFINDEX(rt->ifindex).ipaddr.s_addr)
        {
            if (verdict == PQ_ENC_SEND && inet_rt)
                rt_table_update_timeout(inet_rt, ACTIVE_ROUTE_TIMEOUT);

            rt_table_update_timeout(rt, ACTIVE_ROUTE_TIMEOUT);

            next_hop_rt = rt_table_find(rt->next_hop);

            if (next_hop_rt && next_hop_rt->state == VALID &&
                    next_hop_rt->dest_addr.s_addr != rt->dest_addr.s_addr)
                rt_table_update_timeout(next_hop_rt, ACTIVE_ROUTE_TIMEOUT);
        }

        DEBUG(LOG_INFO, 0, "SENT %d packets to %s qlen=%u",
              count, ip_to_str(dest_addr), PQ.length());
    }
    else if (verdict == PQ_DROP)
    {
        DEBUG(LOG_INFO, 0, "DROPPED %d packets for %s!",
              count, ip_to_str(dest_addr));
    }

    return count;
}
 All Classes Files Functions Variables Typedefs Enumerator Defines