Hi, I need to enter some entries in the ARP table to bypass the ARP protocol with the FreeBSD stack.
I started by using the code that came with this previous post: http://sourceware.org/ml/ecos-discuss/2005-09/msg00023.html but I cant make it work. Say that I want to link the IP Address 10.10.10.90 to Ethernet Address 00:07:E9:E3:07:A7, what will the parameters be to the call of AddMAC function? Any help/suggestion will be greatly appreciated. Im new to eCos and networking stuff, so Im a little lost here Thanks, Michael P.S.: Je parle français, alors si Sébastien Couret est encore sur la liste, tu peux me faire un reply en français. int AddMAC(const char* dest,const char* gateway,const int index) { struct sockaddr_dl gway; // Adresse passerelle struct sockaddr_in dst; // Réseau/hote cible char ds[IPSTRING]; struct ecos_rtentry *rt=NULL; // Entrée dans la table de routage int s=0; // Descripteur de socket u_char cp[MACSTRING]; // Adresse MAC sous forme chaine memset(&gway,0,sizeof(struct sockaddr_dl)); gway.sdl_family=AF_LINK; // AF_UNSPEC ? gway.sdl_len=sizeof(struct sockaddr_dl); gway.sdl_index=index; gway.sdl_type=IFT_ETHER; gway.sdl_alen=ETHER_ADDR_LEN; memcpy(gway.sdl_data,gateway,ETHER_ADDR_LEN); memset(&dst,0,sizeof(struct sockaddr_in)); dst.sin_family=AF_INET; dst.sin_port=0; dst.sin_len=sizeof(struct sockaddr_in); dst.sin_addr.s_addr=inet_addr(dest); rt=(struct ecos_rtentry*)malloc(sizeof(struct ecos_rtentry)); if (!rt) { diag_printf("Erreur d'allocation d'une route :'%s'",strerror(errno)); return(-1); } memset(rt,0,sizeof(struct ecos_rtentry)); rt->rt_flags|=RTF_LLINFO; rt->rt_flags|=RTF_HOST; // Host entry memcpy(&(rt->rt_gateway), &gway, sizeof(struct sockaddr)); memcpy(&(rt->rt_dst), &dst, sizeof(struct sockaddr_in)); rt->rt_flags|=RTF_UP; // Route utilisable // rt->rt_flags|=RTF_WAS_CLONED; //rt->rt_use=0; rt->rt_dev=NULL; rt->rt_metric=1; // Reseau local strncpy(ds,inet_ntoa(dst.sin_addr),IPSTRING); ether_print((u_char*)gateway,(char*)cp,MACSTRING); diag_printf("Ajout d'une adresse MAC pour '%s' :'%s' sur interface eth%d",ds,cp,index-1); s=socket(AF_INET,SOCK_DGRAM,0); if (s<0) { diag_printf("Socket error :'%s'",strerror(errno)); free(rt); return(-1); } if (ioctl(s,SIOCADDRT,rt)<0) { diag_printf("Ioctl error :'%s'",strerror(errno)); switch (errno) { case EINVAL:diag_printf("Invalid Command or agument"); break; case ENOTTY:diag_printf("Not a device"); break; case EBADF:diag_printf("Bad File descriptor"); break; case EEXIST:diag_printf("Already existing"); break; default:diag_printf("Unknown error %d:'%s'",errno,strerror(errno)); } free(rt); close(s); return (-1); } diag_printf("ARP entry added"); free(rt); close(s); return(0); } -- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
