Do you have a question? Post it now! No Registration Necessary
- Scott Derrick
July 28, 2004, 5:27 pm

I'm trying to set the gateway on a multiNIC machine. The code below works
fine for eth0 but does nothing for eth1 or eth2
the parameter gate == IP in dotted notatio, the parameter device == "eth0",
"eth1" or "eth2"
I'm using the decimal equivelant of eth"0" for the RTA_OIF, so eth0 would
be decimal 0, eth1 woudl be decimal 1, etc..
what am I doing wrong that would allow this to work fine for eth0 but not
the other NIC's. I can use the route program and add or delete gateways to
al theNIC's.
thanks, Scott
*****************code follows*******************
const char *envLinux :: ip_gateway ( const char *gate, const char *device )
{
////////////////////////////////////////////////////////////////////////
//
// OVERLOAD IConfigIP
//
// PURPOSE
// - Sets/retreives the current IP gateway address.
//
// PARAMETERS
// - addr specifies the new gateway address (set to NULL to retrieve)
//
// RETURN VALUE
// Ptr. to current gateway address
//
////////////////////////////////////////////////////////////////////////
int inet_sock = -1, ret;
IException *ex = NULL;
char GATEWAY[9];
struct in_addr tempAddr;
int ind = 0;
struct{
struct nlmsghdr netlink_header;
struct rtmsg rt_message;
char buffer[1024];
}request;
try
{
ind = atoi(device + 3);
if(!strcmp(gate, "0.0.0.0") == 0) // add a gateway
{
inet_sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (inet_sock == -1)
{
printf( "ip_gateway : Unable to create a socket" );
fflush(stdout);
return 0;
}
memset(&request, 0, sizeof(request));
request.netlink_header.nlmsg_len =NLMSG_LENGTH(sizeof(struct rtmsg));
request.netlink_header.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE;
request.netlink_header.nlmsg_type = RTM_NEWROUTE;
request.rt_message.rtm_family = AF_INET;
request.rt_message.rtm_table = RT_TABLE_MAIN;
request.rt_message.rtm_protocol = RTPROT_BOOT;
request.rt_message.rtm_scope = RT_SCOPE_UNIVERSE;
request.rt_message.rtm_type = RTN_UNICAST;
if(inet_aton(gate, &tempAddr))
addattr_l(&request.netlink_header, sizeof(request),
RTA_GATEWAY, (void*)&(tempAddr.s_addr), 4);
if(inet_aton("0.0.0.0", &tempAddr))
addattr_l(&request.netlink_header, sizeof(request),
RTA_DST, (void*)&(tempAddr.s_addr), 4);
addattr32(&request.netlink_header, sizeof(request), RTA_OIF, ind);
struct sockaddr_nl nladdr;
struct iovec iov =;
struct msghdr msg = {
(void*)&nladdr,
sizeof(nladdr),
&iov,
1,
NULL,
0,
0};
qq
memset(&nladdr, 0, sizeof(nladdr));
nladdr.nl_family = AF_NETLINK;
nladdr.nl_pid = 0;
nladdr.nl_groups = 0;
ret = sendmsg(inet_sock, &msg, 0);
if (ret < 1)
{
printf("ip_gateway: send returned %d error %d\n", ret, errno);
fflush(stdout);
}
} // if
} // try
catch ( IException *_ex )
{
ex = _ex;
} // catch
// Clean up
if (inet_sock != -1) close ( inet_sock );
if (ex != NULL) throw ex;
else
printf ( "%s: Gateway : %s on %s\n", name, tempstr, device );
return tempstr;
} // ip_gateway
fine for eth0 but does nothing for eth1 or eth2
the parameter gate == IP in dotted notatio, the parameter device == "eth0",
"eth1" or "eth2"
I'm using the decimal equivelant of eth"0" for the RTA_OIF, so eth0 would
be decimal 0, eth1 woudl be decimal 1, etc..
what am I doing wrong that would allow this to work fine for eth0 but not
the other NIC's. I can use the route program and add or delete gateways to
al theNIC's.
thanks, Scott
*****************code follows*******************
const char *envLinux :: ip_gateway ( const char *gate, const char *device )
{
////////////////////////////////////////////////////////////////////////
//
// OVERLOAD IConfigIP
//
// PURPOSE
// - Sets/retreives the current IP gateway address.
//
// PARAMETERS
// - addr specifies the new gateway address (set to NULL to retrieve)
//
// RETURN VALUE
// Ptr. to current gateway address
//
////////////////////////////////////////////////////////////////////////
int inet_sock = -1, ret;
IException *ex = NULL;
char GATEWAY[9];
struct in_addr tempAddr;
int ind = 0;
struct{
struct nlmsghdr netlink_header;
struct rtmsg rt_message;
char buffer[1024];
}request;
try
{
ind = atoi(device + 3);
if(!strcmp(gate, "0.0.0.0") == 0) // add a gateway
{
inet_sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (inet_sock == -1)
{
printf( "ip_gateway : Unable to create a socket" );
fflush(stdout);
return 0;
}
memset(&request, 0, sizeof(request));
request.netlink_header.nlmsg_len =NLMSG_LENGTH(sizeof(struct rtmsg));
request.netlink_header.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE;
request.netlink_header.nlmsg_type = RTM_NEWROUTE;
request.rt_message.rtm_family = AF_INET;
request.rt_message.rtm_table = RT_TABLE_MAIN;
request.rt_message.rtm_protocol = RTPROT_BOOT;
request.rt_message.rtm_scope = RT_SCOPE_UNIVERSE;
request.rt_message.rtm_type = RTN_UNICAST;
if(inet_aton(gate, &tempAddr))
addattr_l(&request.netlink_header, sizeof(request),
RTA_GATEWAY, (void*)&(tempAddr.s_addr), 4);
if(inet_aton("0.0.0.0", &tempAddr))
addattr_l(&request.netlink_header, sizeof(request),
RTA_DST, (void*)&(tempAddr.s_addr), 4);
addattr32(&request.netlink_header, sizeof(request), RTA_OIF, ind);
struct sockaddr_nl nladdr;
struct iovec iov =;
struct msghdr msg = {
(void*)&nladdr,
sizeof(nladdr),
&iov,
1,
NULL,
0,
0};
memset(&nladdr, 0, sizeof(nladdr));
nladdr.nl_family = AF_NETLINK;
nladdr.nl_pid = 0;
nladdr.nl_groups = 0;
ret = sendmsg(inet_sock, &msg, 0);
if (ret < 1)
{
printf("ip_gateway: send returned %d error %d\n", ret, errno);
fflush(stdout);
}
} // if
} // try
catch ( IException *_ex )
{
ex = _ex;
} // catch
// Clean up
if (inet_sock != -1) close ( inet_sock );
if (ex != NULL) throw ex;
else
printf ( "%s: Gateway : %s on %s\n", name, tempstr, device );
return tempstr;
} // ip_gateway
Site Timeline
- » RISCWatch w/ Linux running on ppc405D: Virtual/Physical mem issues
- — Next thread in » Embedded Linux
-
- » Linux Interrupt handling
- — Previous thread in » Embedded Linux
-
- » Crosscompiling for ARM: reloc type R_ARM_ABS32 is not supported for PIC - ...
- — Newest thread in » Embedded Linux
-
- » Panasonic KX-TC 160 buczenie w sĹ‚uchawce.
- — The site's Newest Thread. Posted in » Electronics (Polish)
-