I use following code to set network interface address and mask. The IP
address is set correctly, however, even the SIOCSIFNETMASK call returns
0, the network mask is not been set correctly, it’s always defaults to
255.255.255.0 when I want to set it to 255.255.0.0.
Thanks for any help.
-Beth
int set_interface(char *p_name, ip_addr *p_addr, ip_addr *p_mask, int
flag)
{
int fd;
struct ifreq req;
struct sockaddr_in *sin = (struct sockaddr_in *)&req.ifr_addr;
int rc=EINVAL;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if( fd > 0 )
{
strcpy ( req.ifr_name, p_name);
sin->sin_len = sizeof (struct sockaddr_in);
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = p_addr->net_order.s_addr;
if ( ( rc=ioctl (fd, SIOCSIFADDR, &req) ) < 0 )
return errno;
strcpy ( req.ifr_name, p_name);
sin->sin_len = sizeof (struct sockaddr_in);
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = p_mask->net_order.s_addr;
if ( ( rc=ioctl (fd, SIOCSIFNETMASK, &req) ) < 0 )
return errno;
if ( flag != 0 ) {
if ( (rc = ioctl (fd, SIOCGIFFLAGS, &req) )< 0)
return errno;
req.ifr_flags |= flag;
if (( rc = ioctl (fd, SIOCSIFFLAGS, &req) )< 0)
return errno;
}
} else {
return errno;
}
return rc;
}