This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
Re: ARP static entry
- From: Birahim Larou Fall <BLFall at scmmicro dot fr>
- To: "Michael Grimard" <michaelg at maxt dot com>
- Cc: ecos-discuss at sourceware dot org
- Date: Mon, 27 Mar 2006 10:16:48 +0200
- Subject: Re: [ECOS] ARP static entry
The code posted by Sebastien just add a route in ARP table but does not
disable/bypass the ARP protocole. What does the function ioct returns?
use show_network_tables(); to print all routes:
typedef int pfunc( const char *fmt, ... )
CYGBLD_ATTRIB_PRINTF_FORMAT(1,2);
externC void show_network_tables(pfunc *pfct);//
packages/net/bsd_tcpip/current/src/ecos/support.c
show_network_tables(diag_printf);// show all routes.
Why you don't use use LWIP stack? you can easily remove the ARP protocole.
Give more informations about your project.
PS: je parle franÃais mais l'anglais permet d'en faire profiter un max de
softer.
Fall Birahim
Elsys Design for SCM Microsystems
"Michael Grimard" <michaelg@maxt.com>
Sent by: ecos-discuss-owner@ecos.sourceware.org
25/03/2006 04:28
To
<ecos-discuss@sourceware.org>
cc
Subject
[ECOS] ARP static entry
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 canât
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. Iâm new to eCos and
networking stuff, so Iâm 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