void kaodv_update_route_timeouts(int hooknum, const struct net_device *dev, struct iphdr *iph) { struct expl_entry e; struct in_addr bcaddr; int res; bcaddr.s_addr = 0; /* Stop compiler from complaining about * uninitialized bcaddr */ res = if_info_from_ifindex(NULL, &bcaddr, dev->ifindex); if (res < 0) return; if (hooknum == NF_INET_PRE_ROUTING) kaodv_netlink_send_rt_update_msg(PKT_INBOUND, iph->saddr, iph->daddr, dev->ifindex); else if (iph->daddr != INADDR_BROADCAST && iph->daddr != bcaddr.s_addr) kaodv_netlink_send_rt_update_msg(PKT_OUTBOUND, iph->saddr, iph->daddr, dev->ifindex); /* First update forward route and next hop */ if (kaodv_expl_get(iph->daddr, &e)) { kaodv_expl_update(e.daddr, e.nhop, ACTIVE_ROUTE_TIMEOUT, e.flags, dev->ifindex); if (e.nhop != e.daddr && kaodv_expl_get(e.nhop, &e)) kaodv_expl_update(e.daddr, e.nhop, ACTIVE_ROUTE_TIMEOUT, e.flags, dev->ifindex); } /* Update reverse route */ if (kaodv_expl_get(iph->saddr, &e)) { kaodv_expl_update(e.daddr, e.nhop, ACTIVE_ROUTE_TIMEOUT, e.flags, dev->ifindex); if (e.nhop != e.daddr && kaodv_expl_get(e.nhop, &e)) kaodv_expl_update(e.daddr, e.nhop, ACTIVE_ROUTE_TIMEOUT, e.flags, dev->ifindex); } }
static void kaodv_update_route_timeouts(int hooknum, const struct net_device *dev, struct iphdr *iph) { struct expl_entry e; struct netdev_info *netdi; netdi = netdev_info_from_ifindex(dev->ifindex); if (!netdi) return; if (hooknum == NF_IP_PRE_ROUTING) kaodv_netlink_send_rt_update_msg(PKT_INBOUND, iph->saddr, iph->daddr, dev->ifindex); else if (iph->daddr != INADDR_BROADCAST && iph->daddr != netdi->bc_addr) kaodv_netlink_send_rt_update_msg(PKT_OUTBOUND, iph->saddr, iph->daddr, dev->ifindex); /* First update forward route and next hop */ if (kaodv_expl_get(iph->daddr, &e)) { kaodv_expl_update(e.daddr, e.nhop, ACTIVE_ROUTE_TIMEOUT, e.flags); if (e.nhop != e.daddr && kaodv_expl_get(e.nhop, &e)) kaodv_expl_update(e.daddr, e.nhop, ACTIVE_ROUTE_TIMEOUT, e.flags); } /* Update reverse route */ if (kaodv_expl_get(iph->saddr, &e)) { kaodv_expl_update(e.daddr, e.nhop, ACTIVE_ROUTE_TIMEOUT, e.flags); if (e.nhop != e.daddr && kaodv_expl_get(e.nhop, &e)) kaodv_expl_update(e.daddr, e.nhop, ACTIVE_ROUTE_TIMEOUT, e.flags); } }