Facebook
From asdasdas, 2 Weeks ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 155
  1. int compare_route_entries(const void *a, const void *b)
  2. {
  3.  const struct route_table_entry *entry_a = (const struct route_table_entry *)a;
  4.  const struct route_table_entry *entry_b = (const struct route_table_entry *)b;
  5.  
  6.  if (entry_a->prefix == entry_b->prefix)
  7.  {
  8.   if (entry_a->mask == entry_b->mask)
  9.   {
  10.    return 0;
  11.   }
  12.   else
  13.   {
  14.    if (entry_a->mask > entry_b->mask)
  15.     return 1;
  16.    else
  17.     return -1;
  18.   }
  19.  }
  20.  else
  21.  {
  22.   if (entry_a->prefix > entry_b->prefix)
  23.    return 1;
  24.   else
  25.    return -1;
  26.  }
  27. }
  28.  
  29.  
  30.  
  31.  
  32. struct route_table_entry *best_route(struct route_table_entry *route_table, int rt_len, uint32_t ip)
  33. {
  34.  int left = 0, right = rt_len - 1;
  35.  struct route_table_entry *best = NULL;
  36.  while (left <= right)
  37.  {
  38.   int mid = left + (right - left) / 2;
  39.   struct route_table_entry *rt = &route;_table[mid];
  40.   if ((rt->mask & ip) == (rt->mask & rt->prefix))
  41.   {
  42.    if (best == NULL || rt->mask > best->mask)
  43.    {
  44.     best = rt;
  45.    }
  46.    left = mid + 1;
  47.   }
  48.   else
  49.   {
  50.    right = mid - 1;
  51.   }
  52.  }
  53.  return best;
  54. }