Daniel Ouyang
|
Failed to add additional gateway -- socket(PF_ROUTE, SOCK_RAW, 0)
|
Daniel Ouyang
07/04/2013 8:06 AM
post102911
|
Failed to add additional gateway -- socket(PF_ROUTE, SOCK_RAW, 0)
A gateway is successfully added using the following codes but it always failed and returned EEXIST when an additional
gateway is added. How can I add more route and gateway?
struct {
struct rt_msghdr m_rtm;
struct sockaddr_in dst;
struct sockaddr_in gateway;
struct sockaddr_in mask;
} m_rtmsg;
sock = socket(PF_ROUTE, SOCK_RAW, 0);
if (sock < 0) {
return Failed;
}
memset(&m_rtmsg, 0, sizeof(m_rtmsg));
#define rtm m_rtmsg.m_rtm
m_rtmsg.m_rtm.rtm_type = RTM_ADD;
m_rtmsg.m_rtm.rtm_flags = RTF_STATIC | RTF_GATEWAY | RTF_CLONING | RTF_UP;
m_rtmsg.m_rtm.rtm_version = RTM_VERSION;
m_rtmsg.m_rtm.rtm_seq = ++rtm_gateway_seq;
m_rtmsg.m_rtm.rtm_addrs = RTA_NETMASK | RTA_GATEWAY | RTA_DST;
m_rtmsg.m_rtm.rtm_msglen = sizeof(m_rtmsg);
m_rtmsg.m_rtm.rtm_pid = getpid();
m_rtmsg.dst.sin_len = sizeof(struct sockaddr_in);
m_rtmsg.dst.sin_family = AF_INET;
m_rtmsg.gateway.sin_len = sizeof(struct sockaddr_in);
m_rtmsg.gateway.sin_family = AF_INET;
m_rtmsg.gateway.sin_addr.s_addr = ipv4Gateway_u32;
m_rtmsg.mask.sin_len = 0; // not used
m_rtmsg.mask.sin_family = AF_INET;
msgLen = m_rtmsg.m_rtm.rtm_msglen = sizeof(m_rtmsg.m_rtm) +
sizeof(m_rtmsg.dst) +
sizeof(m_rtmsg.gateway) + 4;
ret = write(sock, (char *)&m_rtmsg, msgLen); // return EEXIST when an additional gateway is added
|
|
|