NETWORK ATTACKS FRAMEWORK  1.0.0
A NETwork Attacks framework. Making network attacks impact evaluation easier!
NA_routing_table.cc File Reference
#include <time.h>
#include "../NA_aodv_uu_omnet.h"

Go to the source code of this file.

Defines

#define NS_PORT
#define OMNETPP

Functions

void NS_CLASS rt_table_init ()
void NS_CLASS rt_table_destroy ()
rt_table_t *NS_CLASS rt_table_insert (struct in_addr dest_addr, struct in_addr next, u_int8_t hops, u_int32_t seqno, u_int32_t life, u_int8_t state, u_int16_t flags, unsigned int ifindex, uint32_t cost, uint8_t hopfix)
rt_table_t *NS_CLASS rt_table_find (struct in_addr dest_addr)
rt_table_t *NS_CLASS rt_table_find_gateway ()
int NS_CLASS rt_table_invalidate (rt_table_t *rt)
void NS_CLASS rt_table_delete (rt_table_t *rt)
void NS_CLASS precursor_add (rt_table_t *rt, struct in_addr addr)
void NS_CLASS precursor_remove (rt_table_t *rt, struct in_addr addr)
rt_table_t *NS_CLASS modifyAODVTables (struct in_addr dest_addr, struct in_addr next, u_int8_t hops, u_int32_t seqno, u_int32_t life, u_int8_t state, u_int16_t flags, unsigned int ifindex)
void precursor_list_destroy (rt_table_t *rt)
rt_table_t *NS_CLASS rt_table_update (rt_table_t *rt, struct in_addr next, u_int8_t hops, u_int32_t seqno, u_int32_t lifetime, u_int8_t state, u_int16_t flags, int iface, uint32_t cost, uint8_t hopfix)
NS_INLINE rt_table_t *NS_CLASS rt_table_update_timeout (rt_table_t *rt, u_int32_t lifetime)
void NS_CLASS rt_table_update_route_timeouts (rt_table_t *fwd_rt, rt_table_t *rev_rt)

Define Documentation

#define NS_PORT

Definition at line 22 of file NA_routing_table.cc.

#define OMNETPP

Definition at line 23 of file NA_routing_table.cc.


Function Documentation

rt_table_t* NS_CLASS modifyAODVTables ( struct in_addr  dest_addr,
struct in_addr  next,
u_int8_t  hops,
u_int32_t  seqno,
u_int32_t  life,
u_int8_t  state,
u_int16_t  flags,
unsigned int  ifindex 
)

Definition at line 484 of file NA_routing_table.cc.

{

    rt_table_t *rt;
    struct in_addr nm;
    nm.s_addr = ManetAddress::ZERO;

    ManetAddress dest = dest_addr.s_addr;

    DEBUG(LOG_INFO, 0, "modifyAODVTables");
    /* Check if we already have an entry for dest_addr */

    if ((rt = (rt_table_t *) malloc(sizeof(rt_table_t))) == NULL)
    {
        fprintf(stderr, "Malloc failed!\n");
        exit(-1);
    }
    memset(rt, 0, sizeof(rt_table_t));
    rt->dest_addr = dest_addr;
    rt->next_hop = next;
    rt->dest_seqno = seqno;
    rt->flags = flags;
    rt->hcnt = hops;
    rt->ifindex = ifindex;
    rt->hash = 0;
    rt->state = state;
    timer_init(&rt->rt_timer, &NS_CLASS route_expire_timeout, rt);
    timer_init(&rt->ack_timer, &NS_CLASS rrep_ack_timeout, rt);
    timer_init(&rt->hello_timer, &NS_CLASS hello_timeout, rt);
    rt->last_hello_time.tv_sec = 0;
    rt->last_hello_time.tv_usec = 0;
    rt->hello_cnt = 0;
    rt->nprec = 0;

    DEBUG(LOG_INFO, 0, "Inserting %s next hop %s",ip_to_str(dest_addr), ip_to_str(next));

    aodvRtTableMap.insert(std::make_pair(dest,rt));
    rt_tbl.num_entries = (int) aodvRtTableMap.size();
    if (state == INVALID)
    {

        if (flags & RT_REPAIR)
        {
            rt->rt_timer.handler = &NS_CLASS local_repair_timeout;
            life = ACTIVE_ROUTE_TIMEOUT;
        }
        else
        {
            rt->rt_timer.handler = &NS_CLASS route_delete_timeout;
            life = DELETE_PERIOD;
        }
    }
    else
    {
        rt_tbl.num_active++;
    }
#ifdef CONFIG_GATEWAY_DISABLE
    if (rt->flags & RT_GATEWAY)
        rt_table_update_inet_rt(rt, life);
#endif

//#ifdef NS_PORT
    DEBUG(LOG_INFO, 0, "New timer for %s, life=%d",
          ip_to_str(rt->dest_addr), life);

    if (life != 0)
        timer_set_timeout(&rt->rt_timer, life);
//#endif
    /* In case there are buffered packets for this destination, we
     * send them on the new route. */

    std::vector<ManetAddress> list;
    getListRelatedAp(dest_addr.s_addr, list);

    for (unsigned int i = 0; i < list.size(); i++)
    {
        struct in_addr auxAaddr;
        auxAaddr.s_addr = list[i];
        if ((rt->state == VALID || rt->state == IMMORTAL) && seek_list_remove(seek_list_find(auxAaddr)))
        {
            if (rt->flags & RT_INET_DEST)
                packet_queue_set_verdict(auxAaddr, PQ_ENC_SEND);
            else
                packet_queue_set_verdict(auxAaddr, PQ_SEND);
        }
    }
    if ( state == IMMORTAL)
    {
        timer_remove(&rt->rt_timer);
        timer_remove(&rt->ack_timer);
        timer_remove(&rt->hello_timer);
    }
    return rt;
}
void NS_CLASS precursor_add ( rt_table_t rt,
struct in_addr  addr 
)

Definition at line 447 of file NA_routing_table.cc.

{
    /* Sanity check */
    if (!rt)
        return;
    for (unsigned int i = 0; i < rt->precursors.size(); i++)
    {
        if (rt->precursors[i].neighbor.s_addr == addr.s_addr)
            return;
    }
    precursor_t pr;
    pr.neighbor.s_addr = addr.s_addr;
    rt->precursors.push_back(pr);
    rt->nprec = (int)rt->precursors.size();
    return;
}

Definition at line 583 of file NA_routing_table.cc.

{
    /* Sanity check */
    if (!rt)
        return;
    rt->precursors.clear();
    rt->nprec=0;
}
void NS_CLASS precursor_remove ( rt_table_t rt,
struct in_addr  addr 
)

Definition at line 468 of file NA_routing_table.cc.

{
    /* Sanity check */
    if (!rt)
        return;
    for (unsigned int i = 0; i < rt->precursors.size(); i++)
    {
        if (rt->precursors[i].neighbor.s_addr == addr.s_addr)
        {
            rt->precursors.erase(rt->precursors.begin()+i);
            rt->nprec = (int)rt->precursors.size();
            return;
        }
    }
}

Definition at line 407 of file NA_routing_table.cc.

{
    if (!rt)
    {
        DEBUG(LOG_ERR, 0, "No route entry to delete");
        return;
    }

    ManetAddress dest = rt->dest_addr.s_addr;
    AodvRtTableMap::iterator it = aodvRtTableMap.find(dest);
    if (it != aodvRtTableMap.end())
    {
        if (it->second != rt)
            opp_error("AODV routing table error");
    }
    aodvRtTableMap.erase(it);

    if (rt->state == VALID || rt->state == IMMORTAL)
    {

        /* delete route to omnet inet routing table ... */
        /* if delete is true fiels next, hops and mask are nor used */
        struct in_addr nm;
        nm.s_addr = ManetAddress(IPv4Address::ALLONES_ADDRESS);
        omnet_chg_rte(rt->dest_addr, rt->dest_addr, nm, 0,true);
        rt_tbl.num_active--;
    }
    /* Make sure timers are removed... */
    timer_remove(&rt->rt_timer);
    timer_remove(&rt->hello_timer);
    timer_remove(&rt->ack_timer);
    rt_tbl.num_entries = (int) aodvRtTableMap.size();
    free(rt);
    return;
}

Definition at line 66 of file NA_routing_table.cc.

{
    while (!aodvRtTableMap.empty())
    {
        rt_table_delete (aodvRtTableMap.begin()->second);
    }
}
rt_table_t* NS_CLASS rt_table_find ( struct in_addr  dest_addr)

Definition at line 222 of file NA_routing_table.cc.

{

    if (aodvRtTableMap.empty())
        return NULL;

    /* Check if we already have an entry for dest_addr */
    AodvRtTableMap::iterator it = aodvRtTableMap.find(dest_addr.s_addr);

    if (it != aodvRtTableMap.end())
        return it->second;
    else
    {
        ManetAddress apAdd;
        if (getAp(dest_addr.s_addr, apAdd))
        {
            it = aodvRtTableMap.find(apAdd);
            if (it != aodvRtTableMap.end())
                return it->second;
        }
        return NULL;
    }
    return NULL;
}

Definition at line 247 of file NA_routing_table.cc.

{
    rt_table_t *gw = NULL;
    for (AodvRtTableMap::iterator it = aodvRtTableMap.begin(); it != aodvRtTableMap.end(); it++)
    {
        rt_table_t *rt = it->second;
        if ((rt->flags & RT_GATEWAY) && rt->state == VALID)
        {
            if (!gw || rt->hcnt < gw->hcnt)
                gw = rt;
        }
    }
    return gw;
}

Definition at line 55 of file NA_routing_table.cc.

{
    while (!aodvRtTableMap.empty())
    {
        rt_table_delete (aodvRtTableMap.begin()->second);
        aodvRtTableMap.erase(aodvRtTableMap.begin());
    }
    rt_tbl.num_entries = 0;
    rt_tbl.num_active = 0;
}
rt_table_t* NS_CLASS rt_table_insert ( struct in_addr  dest_addr,
struct in_addr  next,
u_int8_t  hops,
u_int32_t  seqno,
u_int32_t  life,
u_int8_t  state,
u_int16_t  flags,
unsigned int  ifindex,
uint32_t  cost,
uint8_t  hopfix 
)

Definition at line 74 of file NA_routing_table.cc.

{
    rt_table_t *rt;
    struct in_addr nm;
    ManetAddress dest;
    nm.s_addr = ManetAddress::ZERO;

    dest = dest_addr.s_addr;
    /* Check if we already have an entry for dest_addr */
    AodvRtTableMap::iterator it = aodvRtTableMap.find(dest);
    if (it != aodvRtTableMap.end())
    {
        DEBUG(LOG_INFO, 0, "%s already exist in routing table!",
              ip_to_str(dest_addr));
        return NULL;
    }

    ManetAddress apAdd;
    if (getAp(dest, apAdd))
    {
        struct in_addr dest_addrAux;
        dest_addrAux.s_addr = apAdd;
        rt_table_t * e = rt_table_find(dest_addrAux);
        if (e)
        {
            if (e->next_hop.s_addr != next.s_addr &&
                    e->dest_seqno != seqno &&
                    e->flags != flags &&
                    e->hcnt != hops &&
                    e->ifindex != ifindex &&
                    e->state != state &&
                    e->cost != cost &&
                    e->hopfix != hopfix)
                rt_table_update(e, next,hops,  seqno,life,  state, flags, ifindex, cost, hopfix);
            return NULL;
        }
        else
            rt = rt_table_insert(dest_addrAux, next,hops,  seqno,life,  state, flags, ifindex, cost, hopfix);
        return rt;
    }


    if ((rt = (rt_table_t *) malloc(sizeof(rt_table_t))) == NULL)
    {
        fprintf(stderr, "Malloc failed!\n");
        exit(-1);
    }

    memset(rt, 0, sizeof(rt_table_t));
    rt->dest_addr = dest_addr;
    rt->next_hop = next;
    rt->dest_seqno = seqno;
    rt->flags = flags;
    rt->hcnt = hops;
    rt->ifindex = ifindex;
    rt->hash = 0;
    rt->state = state;
    rt->cost = cost;
    rt->hopfix = hopfix;

    timer_init(&rt->rt_timer, &NS_CLASS route_expire_timeout, rt);

    timer_init(&rt->ack_timer, &NS_CLASS rrep_ack_timeout, rt);

    timer_init(&rt->hello_timer, &NS_CLASS hello_timeout, rt);

    rt->last_hello_time.tv_sec = 0;
    rt->last_hello_time.tv_usec = 0;
    rt->hello_cnt = 0;

    rt->nprec = 0;


    /* Insert first in bucket... */
    DEBUG(LOG_INFO, 0, "Inserting %s (bucket %d) next hop %s",
          ip_to_str(dest_addr), index, ip_to_str(next));
    aodvRtTableMap.insert(std::make_pair(dest,rt));
    rt_tbl.num_entries = (int) aodvRtTableMap.size();
    if (state == INVALID)
    {

        if (flags & RT_REPAIR)
        {
            rt->rt_timer.handler = &NS_CLASS local_repair_timeout;
            life = ACTIVE_ROUTE_TIMEOUT;
        }
        else
        {
            rt->rt_timer.handler = &NS_CLASS route_delete_timeout;
            life = DELETE_PERIOD;
        }

    }
    else
    {
        rt_tbl.num_active++;
        /* Add route to omnet inet routing table ... */
        nm.s_addr = ManetAddress(IPv4Address::ALLONES_ADDRESS);
        if (useIndex)
            omnet_chg_rte(dest_addr, next, nm, hops,false,ifindex);
        else
            omnet_chg_rte(dest_addr, next, nm, hops,false,DEV_NR(ifindex).ipaddr);
    }

#ifdef CONFIG_GATEWAY_DISABLE
    if (rt->flags & RT_GATEWAY)
        rt_table_update_inet_rt(rt, life);
#endif

//#ifdef NS_PORT
    DEBUG(LOG_INFO, 0, "New timer for %s, life=%d",
          ip_to_str(rt->dest_addr), life);

    if (life != 0)
        timer_set_timeout(&rt->rt_timer, life);
//#endif
    /* In case there are buffered packets for this destination, we
     * send them on the new route. */
    std::vector<ManetAddress> list;
    getListRelatedAp(dest_addr.s_addr, list);
    for (unsigned int i = 0; i < list.size(); i++)
    {
        struct in_addr auxAaddr;
        auxAaddr.s_addr = list[i];
        if ((rt->state == VALID || rt->state == IMMORTAL)  && seek_list_remove(seek_list_find(auxAaddr)))
        {
            if (rt->flags & RT_INET_DEST)
                packet_queue_set_verdict(auxAaddr, PQ_ENC_SEND);
            else
                packet_queue_set_verdict(auxAaddr, PQ_SEND);
        }
    }

    if ( state == IMMORTAL)
    {
        timer_remove(&rt->rt_timer);
        timer_remove(&rt->ack_timer);
        timer_remove(&rt->hello_timer);
    }
    return rt;
}

Definition at line 286 of file NA_routing_table.cc.

{
    struct timeval now;

    gettimeofday(&now, NULL);

    if (rt == NULL)
        return -1;

    /* If the route is already invalidated, do nothing... */
    if (rt->state == INVALID)
    {
        DEBUG(LOG_DEBUG, 0, "Route %s already invalidated!!!",
              ip_to_str(rt->dest_addr));
        return -1;
    }

    if (rt->state == IMMORTAL)
    {
        DEBUG(LOG_DEBUG, 0, "Route %s is immortal!!!",
              ip_to_str(rt->dest_addr));
        return -1;
    }

    if (rt->hello_timer.used)
    {
        DEBUG(LOG_DEBUG, 0, "last HELLO: %ld",
              timeval_diff(&now, &rt->last_hello_time));
    }

    /* Remove any pending, but now obsolete timers. */
    timer_remove(&rt->rt_timer);
    timer_remove(&rt->hello_timer);
    timer_remove(&rt->ack_timer);

    /* Mark the route as invalid */
    rt->state = INVALID;
    rt_tbl.num_active--;

    rt->hello_cnt = 0;

    /* When the lifetime of a route entry expires, increase the sequence
       number for that entry. */
    seqno_incr(rt->dest_seqno);

    rt->last_hello_time.tv_sec = 0;
    rt->last_hello_time.tv_usec = 0;

    /* delete route to omnet inet routing table ... */
    /* if delete is true fiels next, hops and mask are nor used */
    struct in_addr nm;
    nm.s_addr = ManetAddress(IPv4Address::ALLONES_ADDRESS);
    omnet_chg_rte(rt->dest_addr, rt->dest_addr, nm, 0,true);

#ifdef CONFIG_GATEWAY
    /* If this was a gateway, check if any Internet destinations were using
     * it. In that case update them to use a backup gateway or invalide them
     * too. */
    if (rt->flags & RT_GATEWAY)
    {
        int i;

        rt_table_t *gw = rt_table_find_gateway();
        for (AodvRtTableMap::iterator it = aodvRtTableMap.begin(); it != aodvRtTableMap.end(); it++)
        {
            rt_table_t *rt2 = it->second;
            if (rt2->state == VALID && (rt2->flags & RT_INET_DEST) && (rt2->next_hop.s_addr == rt->dest_addr.s_addr))
            {
                if (0)
                {
                    DEBUG(LOG_DEBUG, 0,
                            "Invalidated GW %s but found new GW %s for %s",
                            ip_to_str(rt->dest_addr),
                            ip_to_str(gw->dest_addr),
                            ip_to_str(rt2->dest_addr));
#ifdef AODV_USE_STL
                    double val  = SIMTIME_DBL(rt->rt_timer.timeout - simTime())*1000.0;
                    u_int32_t lifetime = 0;
                    if (val >0)
                        lifetime = val;
                    rt_table_update(rt2, gw->dest_addr, gw->hcnt, 0,
                            lifetime, VALID, rt2->flags,rt2->ifindex);
#else
                    rt_table_update(rt2, gw->dest_addr, gw->hcnt, 0,
                            timeval_diff(&rt->rt_timer.timeout,&now), VALID, rt2->flags,rt2->ifindex);
#endif
                }
                else
                {
                    rt_table_invalidate(rt2);
                    precursor_list_destroy(rt2);
                }
            }
        }
    }
#endif

    if (rt->flags & RT_REPAIR)
    {
        /* Set a timeout for the repair */

        rt->rt_timer.handler = &NS_CLASS local_repair_timeout;
        timer_set_timeout(&rt->rt_timer, ACTIVE_ROUTE_TIMEOUT);

        DEBUG(LOG_DEBUG, 0, "%s kept for repairs during %u msecs",
              ip_to_str(rt->dest_addr), ACTIVE_ROUTE_TIMEOUT);
    }
    else
    {

        /* Schedule a deletion timer */
        rt->rt_timer.handler = &NS_CLASS route_delete_timeout;
        timer_set_timeout(&rt->rt_timer, DELETE_PERIOD);

        DEBUG(LOG_DEBUG, 0, "%s removed in %u msecs",
              ip_to_str(rt->dest_addr), DELETE_PERIOD);
    }

    return 0;
}
rt_table_t* NS_CLASS rt_table_update ( rt_table_t rt,
struct in_addr  next,
u_int8_t  hops,
u_int32_t  seqno,
u_int32_t  lifetime,
u_int8_t  state,
u_int16_t  flags,
int  iface,
uint32_t  cost,
uint8_t  hopfix 
)

Definition at line 1240 of file NA_routing_table.cc.

{
    struct in_addr nm;
    nm.s_addr = ManetAddress::ZERO;

    if ((rt->state == INVALID && state == VALID) || (state == IMMORTAL))
    {

        /* If this previously was an expired route, but will now be
           active again we must add it to the kernel routing
           table... */
        if (rt->state == INVALID)
            rt_tbl.num_active++;

        if (rt->flags & RT_REPAIR)
            flags &= ~RT_REPAIR;
        if (iface >=0 && rt->ifindex!=(uint32_t)iface)
            rt->ifindex=iface;

#ifndef NS_PORT
        nl_send_add_route_msg(rt->dest_addr, next, hops, lifetime,
                              flags, rt->ifindex);
#else
#ifdef OMNETPP
        /* Add route to omnet inet routing table ... */
        nm.s_addr = ManetAddress(IPv4Address::ALLONES_ADDRESS);
        if (useIndex)
            omnet_chg_rte(rt->dest_addr, next, nm, hops,false,rt->ifindex);
        else
            omnet_chg_rte(rt->dest_addr, next, nm, hops,false,DEV_NR(rt->ifindex).ipaddr);
#endif
#endif

    }
    else if (!rt->next_hop.s_addr.isUnspecified() &&
             rt->next_hop.s_addr != next.s_addr)
    {
        DEBUG(LOG_INFO, 0, "rt->next_hop=%s, new_next_hop=%s",
              ip_to_str(rt->next_hop), ip_to_str(next));
        if (iface >=0 && rt->ifindex!=(uint32_t)iface)
             rt->ifindex=iface;
#ifndef NS_PORT
        nl_send_add_route_msg(rt->dest_addr, next, hops, lifetime,
                              flags, rt->ifindex);
#else
#ifdef OMNETPP
        /* change route to omnet inet routing table ... */
        nm.s_addr = ManetAddress(IPv4Address::ALLONES_ADDRESS);
        if (useIndex)
            omnet_chg_rte(rt->dest_addr, next, nm, hops,false,rt->ifindex);
        else
            omnet_chg_rte(rt->dest_addr, next, nm, hops,false,DEV_NR(rt->ifindex).ipaddr);
#endif
#endif
    }

    if (hops > 1 && rt->hcnt == 1)
    {
        rt->last_hello_time.tv_sec = 0;
        rt->last_hello_time.tv_usec = 0;
        rt->hello_cnt = 0;
        timer_remove(&rt->hello_timer);
        /* Must also do a "link break" when updating a 1 hop
        neighbor in case another routing entry use this as
        next hop... */
#ifndef OMNETPP
        neighbor_link_break(rt);
#else
        // Added in version aodv-uu 0.9.3, it's commented for performance reasons
        //  neighbor_link_break(rt);
#endif

    }
    rt->flags = flags;
    rt->dest_seqno = seqno;
    rt->next_hop = next;
    rt->hcnt = hops;
    rt->cost = cost;
    rt->hopfix = hopfix;

#ifdef CONFIG_GATEWAY
    if (rt->flags & RT_GATEWAY)
        rt_table_update_inet_rt(rt, lifetime);
#endif

//#ifdef NS_PORT
    if (state != IMMORTAL)
    {
        rt->rt_timer.handler = &NS_CLASS route_expire_timeout;
        if (!(rt->flags & RT_INET_DEST))
            rt_table_update_timeout(rt, lifetime);
    }
    else
    {
        timer_remove(&rt->rt_timer);
        timer_remove(&rt->ack_timer);
        timer_remove(&rt->hello_timer);
    }
//#endif

    /* Finally, mark as VALID */
    rt->state = state;

    /* In case there are buffered packets for this destination, we send
     * them on the new route. */
    std::vector<ManetAddress> list;
    getListRelatedAp(rt->dest_addr.s_addr, list);
    for (unsigned int i = 0; i < list.size(); i++)
    {
        struct in_addr auxAaddr;
        auxAaddr.s_addr = list[i];
        if ((rt->state == VALID || rt->state == IMMORTAL)&& seek_list_remove(seek_list_find(auxAaddr)))
        {
#ifdef NS_PORT

            if (rt->flags & RT_INET_DEST)
                packet_queue_set_verdict(auxAaddr, PQ_ENC_SEND);
            else
                packet_queue_set_verdict(auxAaddr, PQ_SEND);
        }
#endif
    }
    return rt;
}
void NS_CLASS rt_table_update_route_timeouts ( rt_table_t fwd_rt,
rt_table_t rev_rt 
)

Definition at line 1409 of file NA_routing_table.cc.

{
    rt_table_t *next_hop_rt = NULL;

    /* When forwarding a packet, we update the lifetime of the
       destination's routing table entry, as well as the entry for the
       next hop neighbor (if not the same). AODV draft 10, section
       6.2. */

    if (fwd_rt && fwd_rt->state == VALID)
    {
        if (llfeedback || (fwd_rt->flags & RT_INET_DEST) || fwd_rt->hcnt != 1 || fwd_rt->hello_timer.used)
            rt_table_update_timeout(fwd_rt, ACTIVE_ROUTE_TIMEOUT);
        next_hop_rt = rt_table_find(fwd_rt->next_hop);

        if (next_hop_rt && next_hop_rt->state == VALID &&
                next_hop_rt->dest_addr.s_addr != fwd_rt->dest_addr.s_addr &&
                (llfeedback || fwd_rt->hello_timer.used))
            rt_table_update_timeout(next_hop_rt, ACTIVE_ROUTE_TIMEOUT);

    }
    /* Also update the reverse route and reverse next hop along the
       path back, since routes between originators and the destination
       are expected to be symmetric. */
    if (rev_rt && rev_rt->state == VALID)
    {

        if (llfeedback || rev_rt->hcnt != 1 || rev_rt->hello_timer.used)
            rt_table_update_timeout(rev_rt, ACTIVE_ROUTE_TIMEOUT);

        next_hop_rt = rt_table_find(rev_rt->next_hop);

        if (next_hop_rt && next_hop_rt->state == VALID && rev_rt &&
                next_hop_rt->dest_addr.s_addr != rev_rt->dest_addr.s_addr &&
                (llfeedback || rev_rt->hello_timer.used))
            rt_table_update_timeout(next_hop_rt, ACTIVE_ROUTE_TIMEOUT);

        /* Update HELLO timer of next hop neighbor if active */
        /*  if (!llfeedback && next_hop_rt->hello_timer.used) { */
        /*      struct timeval now; */

        /*      gettimeofday(&now, NULL); */
        /*      hello_update_timeout(next_hop_rt, &now,  */
        /*               ALLOWED_HELLO_LOSS * HELLO_INTERVAL); */
        /*  } */
    }
}
NS_INLINE rt_table_t* NS_CLASS rt_table_update_timeout ( rt_table_t rt,
u_int32_t  lifetime 
)

Definition at line 1368 of file NA_routing_table.cc.

{
    if (!rt)
        return NULL;

    if (rt->state == IMMORTAL)
    {
        timer_remove(&rt->rt_timer);
        timer_remove(&rt->ack_timer);
        timer_remove(&rt->hello_timer);
        return rt;
    }

    if (rt->state == VALID)
    {
        /* Check if the current valid timeout is larger than the new
           one - in that case keep the old one. */
        DEBUG(LOG_DEBUG, 0, "Route %s update time out to %d milliseconds",
              ip_to_str(rt->dest_addr),lifetime);

#ifdef AODV_USE_STL
        double interval = ((double)lifetime)/1000.0;
        simtime_t new_timeout = simTime() + interval;
        if (rt->rt_timer.timeout < new_timeout)
            timer_set_timeout(&rt->rt_timer, lifetime);
#else
        struct timeval new_timeout;
        gettimeofday(&new_timeout, NULL);
        timeval_add_msec(&new_timeout, lifetime);
        if (timeval_diff(&rt->rt_timer.timeout, &new_timeout) < 0)
            timer_set_timeout(&rt->rt_timer, lifetime);
#endif
    }
    else
        timer_set_timeout(&rt->rt_timer, lifetime);

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