Set interface address and network mask

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;
}

Are you using tiny stack (ttcpip)?

-xtang
Beth <id@address.com> wrote in message news:3EB03BFD.24DFE2C4@address.com

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;
}

Yes, I am using Tiny TCPIP, and QNX 6.1a

-Beth

Xiaodan Tang wrote:

Are you using tiny stack (ttcpip)?

-xtang
Beth <> id@address.com> > wrote in message news:> 3EB03BFD.24DFE2C4@address.com> …
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;
}

If you’re using a class C address, this is expected. The tiny
stack doesn’t suport “supernetting”. This is mentioned in the
docs.

-seanb

Beth <id@address.com> wrote:

Yes, I am using Tiny TCPIP, and QNX 6.1a

-Beth

Xiaodan Tang wrote:

Are you using tiny stack (ttcpip)?

-xtang
Beth <> id@address.com> > wrote in message news:> 3EB03BFD.24DFE2C4@address.com> …
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;
}

Thanks for your response. That explains why it’s not working since we used class C
address.

Given an interface name, how do I bring the interface down using the ioctl call for
both Tiny and full TCPIP ?

The following code doesn’t seem to work for full tcp, but worked on tiny. ( setting
the flag to 0).

int interface_down(char * pname) {
int rc=0;
int fd;
struct ifreq req;
struct sockaddr_in *sin = (struct sockaddr_in *)&req.ifr_addr;

fd = socket(AF_INET, SOCK_DGRAM, 0);
if( fd > 0 )
{
strcpy ( req.ifr_name, pname);
sin->sin_len = sizeof (struct sockaddr_in);
sin->sin_family = AF_INET;
req.ifr_flags = 0 ;
if ( (rc = ioctl (fd, SIOCGIFFLAGS, &req) )< 0) {
return errno;
}
} else {
rc=errno;
}
return rc;
}

Sean Boudreau wrote:

If you’re using a class C address, this is expected. The tiny
stack doesn’t suport “supernetting”. This is mentioned in the
docs.

-seanb

Beth <> id@address.com> > wrote:
Yes, I am using Tiny TCPIP, and QNX 6.1a

-Beth

Xiaodan Tang wrote:

Are you using tiny stack (ttcpip)?

-xtang
Beth <> id@address.com> > wrote in message news:> 3EB03BFD.24DFE2C4@address.com> …
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;
}

Beth <id@address.com> wrote:

Thanks for your response. That explains why it’s not working since we used class C
address.

Given an interface name, how do I bring the interface down using the ioctl call for
both Tiny and full TCPIP ?

The following code doesn’t seem to work for full tcp, but worked on tiny. ( setting
the flag to 0).

int interface_down(char * pname) {
int rc=0;
int fd;
struct ifreq req;
struct sockaddr_in *sin = (struct sockaddr_in *)&req.ifr_addr;

fd = socket(AF_INET, SOCK_DGRAM, 0);
if( fd > 0 )
{
memset(&req, 0x00, sizeof(req);
strcpy ( req.ifr_name, pname);
#if 0 /* This is a union */
sin->sin_len = sizeof (struct sockaddr_in);
sin->sin_family = AF_INET;
#endif
req.ifr_flags = 0 ;
if ( (rc = ioctl (fd, SIOCGIFFLAGS, &req) )< 0) {
return errno;
}

req.ifr_flags &= ~IFF_UP;
if (ioctl (fd, SIOCSIFFLAGS, &req) == -1)
return errno;

} else {
rc=errno;
}
return rc;
}

Sean Boudreau wrote:

You probably also want to make sure ‘fd’ is always closed
before returning from that func as well.

-seanb


Sean Boudreau <seanb@node25.ott.qnx.com> wrote:


Beth <> id@address.com> > wrote:
Thanks for your response. That explains why it’s not working since we used class C
address.

Given an interface name, how do I bring the interface down using the ioctl call for
both Tiny and full TCPIP ?

The following code doesn’t seem to work for full tcp, but worked on tiny. ( setting
the flag to 0).

int interface_down(char * pname) {
int rc=0;
int fd;
struct ifreq req;
struct sockaddr_in *sin = (struct sockaddr_in *)&req.ifr_addr;

fd = socket(AF_INET, SOCK_DGRAM, 0);
if( fd > 0 )
{
memset(&req, 0x00, sizeof(req);
strcpy ( req.ifr_name, pname);
#if 0 /* This is a union */
sin->sin_len = sizeof (struct sockaddr_in);
sin->sin_family = AF_INET;
#endif
req.ifr_flags = 0 ;
if ( (rc = ioctl (fd, SIOCGIFFLAGS, &req) )< 0) {
return errno;
}

req.ifr_flags &= ~IFF_UP;
if (ioctl (fd, SIOCSIFFLAGS, &req) == -1)
return errno;

} else {
rc=errno;
}
return rc;
}

Sean Boudreau wrote: