char* sr_find_next_hop(struct sr_instance* sr, uint32_t dest) { struct sr_rt* rt_walker = 0; struct sr_rt* next_hop = 0; int max_prefix = 0; int temp = 0; if(sr->routing_table == 0) { printf(" *warning* Routing table empty \n"); return 0; } rt_walker = sr->routing_table; while(rt_walker) { sr_print_routing_entry(rt_walker); temp = prefix_match(ntohl((rt_walker->dest).s_addr), ntohl(dest), ntohl((rt_walker->mask).s_addr)); printf("%d\n", temp); if (temp > max_prefix) { next_hop = rt_walker; max_prefix = temp; } rt_walker = rt_walker->next; } if (!next_hop) return 0; printf("find a interface=%s\n",next_hop->interface); return next_hop->interface; }
void sr_print_routing_table(struct sr_instance* sr) { struct sr_rt* rt_walker = 0; if(sr->routing_table == 0) { fprintf(stderr," *warning* Routing table empty \n"); return; } fprintf(stderr,"Destination\tGateway\t\tMask\tIface\n"); rt_walker = sr->routing_table; sr_print_routing_entry(rt_walker); while(rt_walker->next) { rt_walker = rt_walker->next; sr_print_routing_entry(rt_walker); } } /* -- sr_print_routing_table -- */