/* IMPORTANT CALLS */ int get_dsteth(ipaddr_t dstaddr,ethaddr_t ethaddr,int *ifnum) { /* first search interfaces */ ipaddr_t gateway; switch(find_if(dstaddr,ifnum)) { case IFRET_LOOPBACK: //printf("Directly on interface (loopback)\n"); bzero(ethaddr,6); return 0; case IFRET_RESOLVE: //printf("Directly on interface\n"); return arp_resolve_ip(dstaddr,ethaddr,*ifnum); case IFRET_BROADCAST: //printf("Broadcast\n"); memset(ethaddr,0xff,6); return 0; case IFRET_NOTFOUND: /* fall through */ } if (find_route(dstaddr,gateway) == 0) { //printf("Via gateway: %s\n",pripaddr(gateway)); switch(find_if(gateway,ifnum)) { case IFRET_LOOPBACK: bzero(ethaddr,6); return 0; case IFRET_RESOLVE: //printf("Directly on interface\n"); return arp_resolve_ip(gateway,ethaddr,*ifnum); case IFRET_BROADCAST: //printf("Broadcast\n"); memset(ethaddr,0xff,6); return 0; case IFRET_NOTFOUND: /* fall through */ } } printf("get_dsteth: could not find route to destination: %s\n",pripaddr(dstaddr)); return -1; } #define ASSERTIFNUM(ifnum) \ EnterCritical(); \ assert(ifnum < GETNUMIFENTRIES && ifnum >= 0); \ ExitCritical(); void get_ifnum_ethernet(int ifnum, ethaddr_t ethaddr) { if_entry_p ife; ASSERTIFNUM(ifnum); EnterCritical(); ife = GETIFP(ifnum); bcopy(ife->ethaddr,ethaddr, 6); ExitCritical(); }
int main(int argc, char** argv) { syssig_init(log_init_cast_user("test_arp", LOG_PID|LOG_CONS|LOG_PERROR), NULL); struct arp_entry_s entry; if(!arp_find_from_table("192.168.43.1", &entry)) { printf("ARP table\nIP: %s\nMAC: %s\nFlags:", entry.ip, entry.mac); if(arp_entry_is_inuse(&entry)) printf(" INUSE"); if(arp_entry_is_permanent(&entry)) printf(" PERM"); if(arp_entry_is_published(&entry)) printf(" PUBLISHED"); if(arp_entry_is_trailers(&entry)) printf(" TRAILERS"); if(arp_entry_is_proxy(&entry)) printf(" PROXY"); printf("\n"); } /* arp_add_in_table("wlan0", "192.168.1.18", "74:e5:43:5a:ea:ff"); */ struct netiface_info_s info; netiface_get_info_by_name("wlan0", &info); netiface_mac_t mac; int ret = arp_resolve_ip(DEF_ARP_DBG, info, "192.168.43.1", &mac); //int ret = arp_resolve_ip(DEF_ARP_DBG, info, "192.168.43.1", &mac); printf("Ret: %d, mac: '%s'\n", ret, mac); log_close(); return 0; }