This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: setting static arp enteries in arp table


Routing table handling could be done via ioctl calls.

Here's a routine i used to to this with Ecos FreeBSD TCP/IP stack (sorry, comments are in french )
But hope this helps anyway.


Note : 
My own defines and routines :
#define MACSTRING 18
#define IPSTRING 16
char* ether_print(const u_char cp[ETHER_ADDR_LEN], char *etheraddr,const unsigned int len)
{
 snprintf(etheraddr,len,"%02x:%02x:%02x:%02x:%02x:%02x",cp[0],cp[1],cp[2],cp[3],cp[4],cp[5]);
 return(etheraddr);
}


The main sub-routine :
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);
}


On Tue, 6 Sep 2005 17:09:36 -0700 (PDT)
mkhoyila@uci.edu wrote:

> Hi all
> 
> I am using SmartBits to test the performance of my driver. I need to add
> static arp entries in eCos arp table. how can I access arp table of eCos
> and add static entries in there. Thanks.
> 
> Michael
> 
> 
> -- 
> Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
> and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
> 
> 


-- 

Attachment: pgp00000.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]