[ECOS] Change IP during run-time
sebastien Couret
sebastien.couret@elios-informatique.fr
Thu Mar 11 15:38:00 GMT 2004
On Thursday 11 March 2004 16:20, Daniel Lidsten wrote:
> Hi,
>
> I want to change the IP address of my "eth0" interface during run-time.
> Is that possible? I tried to do it using ioctl but encountered some
> problems:
>
> 1. First i tried to just change the current IP with the below calls but
> the old IP address still answers ping calls toghether with the new IP
> address. I could successfull ping two addresses. That's not goos since i
> want to old address to stop responding.
>
> struct sockaddr_in *inaddr = (struct sockaddr_in *)&ifreq.ifr_addr;
> inet_aton("111.22.33.444", &inaddr->sin_addr );
> ioctl( sock, SIOCSIFADDR, &ifreq );
>
>
> 2. The next thing to try was to delete the interface and then
> change/create the new one:
>
> if (ioctl(sock, SIOCDIFADDR, &ifreq)) { /* delete IF addr */
> inet_aton("111.22.33.444", &inaddr->sin_addr );
> ioctl( sock, SIOCSIFADDR, &ifreq );
>
> With this code i only get ping responses from the new IP address
> (good...) but when creating a new socket and sending out data then the
> package source (i logg all ethernet traffic) are set to the OLD IP
> address.
>
> Any ideas how to change IP address of the board during run-time?
>
> Regards, Daniel Lidsten
FreeBSD stack can managing several IP interface on the same physical device.
Using only SIOCSIFADDR is creating a new one.
Have a look at show_network_tables((pr_fun*)diag_printf); (declare it as
extern before using, I haven't found it in an header file ... : extern int
show_network_tables(pr_fun *pr);) to see that ...
For the last point '
>but when creating a new socket and sending out data then the
> package source (i logg all ethernet traffic) are set to the OLD IP
> address.'
I have not check it fully.
Anyway, here is a code I wrote for doing such think (sorry comments are in
French ... ;o) )
interface is the name of the interface a.ka "eth0" for example, adresse is
the IP adress to set "192.168.0.76" for example.
//--------------------------------------------------------------------------------------------
// Fixe l'adresse IP de l'interface en paramétre
// Remarque : le masque et l'adresse de broadcast sont automatiquement changés
// Retourne -1 en cas d'erreur, 0 sinon
//--------------------------------------------------------------------------------------------
int IP_SetIP(const char* interface,const char * adresse)
{
int test_sock=0;
struct sockaddr_in* addr=NULL;
struct ifreq ifr;
test_sock = socket( PF_INET, SOCK_DGRAM, 0 );
if( test_sock == -1 )
{
printf("Impossible d'obtenir la socket");
return (-1);
}
memset(&ifr,0,sizeof( struct ifreq ) );
strncpy(ifr.ifr_name,interface,IFNAMSIZ);
if( ioctl( test_sock, SIOCGIFADDR, &ifr ) == -1 )
{
printf("Impossible d'obtenir l'adresse IP de '%s' car
'%s'",interface,strerror(errno));
}
else
{
if( ioctl( test_sock, SIOCDIFADDR, &ifr ) != 0 )
{
printf("Impossible de supprimer l'adresse IP de '%s' car
'%s'",interface,strerror(errno));
}
}
memset( &ifr, 0, sizeof( struct ifreq ) );
addr= (struct sockaddr_in *)&(ifr.ifr_addr);
memset(addr, 0, sizeof( struct sockaddr_in) );
addr->sin_len=sizeof(struct sockaddr_in);
addr->sin_family=AF_INET;
addr->sin_addr.s_addr=inet_addr(adresse);
strncpy(ifr.ifr_name,interface,IFNAMSIZ);
if( ioctl( test_sock, SIOCSIFADDR, &ifr ) != 0 )
{
printf("Impossible de fixer l'adresse IP de '%s' Ã '%s' car
'%s'",interface,adresse,strerror(errno));
close(test_sock);
return (-1);
}
else
printf("Adresse IP de '%s' fixée Ã
'%s'",interface,inet_ntoa(addr->sin_addr));
close(test_sock);
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
More information about the Ecos-discuss
mailing list