* [LARTC] problem in Route add using netlink
@ 2006-07-25 14:59 VijayaLakshmi Seshadri
2006-07-25 17:48 ` Adorean Alexandru Raul
0 siblings, 1 reply; 2+ messages in thread
From: VijayaLakshmi Seshadri @ 2006-07-25 14:59 UTC (permalink / raw)
To: lartc
[-- Attachment #1.1: Type: text/plain, Size: 5570 bytes --]
Hi all
Iam trying to implement "route add " using netlink. The changes are not reflected in the routing table. I have given my code and screen shots of the routing tables.
Can anybody tell me is there any mistake iam making in defining the fields .
or any other mistake iam commiting
thanxs
viji
//////////////////////////////////// CODE //////////////////////////////////////////////////////
#include <asm/types.h>
#include <netinet/ether.h>
#include <netinet/in.h>
#include <net/if.h>
#include <stdio.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <sys/types.h>
#define BUFSIZE 192
struct route_info{
u_int dstAddr;
u_int srcAddr;
u_int gateWay;
char ifName[IF_NAMESIZE];
};
void fillRoute (struct route_info *rinfo, const char* dstAddr,
const char* srcAddr, const char* gateway, const char* ifName)
{
/* Convert from the standrad numbers and dots notation
to binary data */
inet_aton("192.168.51.0", (struct in_addr *)&rinfo->dstAddr);
inet_aton("192.168.51.90", (struct in_addr *)&rinfo->gateWay);
}
int addAttr (struct nlmsghdr *nlhdr, int maxlen, int type,
void *data, int alen)
{
struct rtattr *rta;
int len = RTA_LENGTH(alen);
if (NLMSG_ALIGN(nlhdr->nlmsg_len) + len > maxlen)
return -1;
rta = (struct rtattr*)((char *)nlhdr + NLMSG_ALIGN(nlhdr->nlmsg_len));
rta->rta_type = type;
rta->rta_len = len;
memcpy(RTA_DATA(rta), data, alen);
nlhdr->nlmsg_len = NLMSG_ALIGN(nlhdr->nlmsg_len) + len;
return 0;
}
int main()
{
struct nlmsghdr *nlMsg;
struct rtmsg *rtMsg;
char dstAddr[30] ;
char srcAddr[30] ;
char gateway[30] ;
char ifName[30];
char msgBuf[BUFSIZE];
struct route_info rinfo;
int sock, len, msgSeq = 0;
int val, i;
/* Create Socket */
if((sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0)
perror("Socket Creation: ");
/* Initialize the buffer */
memset(msgBuf, 0, BUFSIZE);
/* point the header and the msg structure pointers into the buffer */
nlMsg = (struct nlmsghdr *)msgBuf;
rtMsg = (struct rtmsg *)NLMSG_DATA(nlMsg);
/* Fill in the nlmsg header*/
nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); // Length ofmessage.
nlMsg->nlmsg_type = RTM_NEWROUTE; // Get the routes from kernel routing table .
nlMsg->nlmsg_flags = NLM_F_CREATE ; // The message is a request for dump.
nlMsg->nlmsg_seq = msgSeq++; // Sequence of the message packet.
nlMsg->nlmsg_pid = getpid(); // PID of process sending the request.
rtMsg->rtm_family = AF_INET;
rtMsg->rtm_table = RT_TABLE_UNSPEC;
rtMsg->rtm_dst_len = 16;
rtMsg->rtm_src_len = 16;
rtMsg->rtm_scope = RT_SCOPE_UNIVERSE;
rtMsg->rtm_type = RTN_UNICAST;
rtMsg->rtm_protocol = RTPROT_UNSPEC;
rtMsg->rtm_flags = RTM_F_NOTIFY;
fillRoute (&rinfo, dstAddr, srcAddr, gateway, ifName);
addAttr (nlMsg, BUFSIZE, RTA_DST,
&rinfo.dstAddr, 4);
addAttr (nlMsg, BUFSIZE, RTA_GATEWAY,
&rinfo.gateWay, 4);
/* Send the request */
if((val = send(sock, nlMsg, nlMsg->nlmsg_len,0 )) < 0){
printf("Write To Socket Failed...\n");
return -1;
}
printf (" No of Bytes sent %d \n", val);
printf (" Value that is sent \n " );
for (i =0 ; i < val ; i ++)
printf ("%u", msgBuf[i]);
printf ("\n");
close(sock);
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
OUTPUT
[root@vijdom]gcc netlink_addroute.c -o addroute
[root@vijdom]# ./addroute
No of Bytes sent 44
Value that is sent
4400024004000042949672398800216160000101008010429496723242949672085108050429496723242949672085190
//////////////////////////////////////////////////////////////////////////////////////////////////////////
SCREEN SHOTS
Routing table before execution of program
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.51.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default embedded 0.0.0.0 UG 0 0 0 eth0
Routing table after the execution of program
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.51.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default embedded 0.0.0.0 UG 0 0 0 eth0
---------------------------------
Find out what India is talking about on Yahoo! Answers India.
SMS memory full? Store all your important SMS in your Yahoo! Mail. Register for SMS BAK UP now!
[-- Attachment #1.2: Type: text/html, Size: 12070 bytes --]
[-- Attachment #2: Type: text/plain, Size: 143 bytes --]
_______________________________________________
LARTC mailing list
LARTC@mailman.ds9a.nl
http://mailman.ds9a.nl/cgi-bin/mailman/listinfo/lartc
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [LARTC] problem in Route add using netlink
2006-07-25 14:59 [LARTC] problem in Route add using netlink VijayaLakshmi Seshadri
@ 2006-07-25 17:48 ` Adorean Alexandru Raul
0 siblings, 0 replies; 2+ messages in thread
From: Adorean Alexandru Raul @ 2006-07-25 17:48 UTC (permalink / raw)
To: lartc
VijayaLakshmi Seshadri wrote:
> Hi all
> Iam trying to implement "route add " using netlink. The changes are
> not reflected in the routing table. I have given my code and screen
> shots of the routing tables.
>
> Can anybody tell me is there any mistake iam making in defining the
> fields .
> or any other mistake iam commiting
>
> thanxs
>
> viji
>
> //////////////////////////////////// CODE
> //////////////////////////////////////////////////////
> #include <asm/types.h>
> #include <netinet/ether.h>
> #include <netinet/in.h>
> #include <net/if.h>
> #include <stdio.h>
> #include <sys/socket.h>
> #include <sys/ioctl.h>
> #include <linux/netlink.h>
> #include <linux/rtnetlink.h>
> #include <sys/types.h>
> #define BUFSIZE 192
> struct route_info{
> u_int dstAddr;
> u_int srcAddr;
> u_int gateWay;
> char ifName[IF_NAMESIZE];
> };
> void fillRoute (struct route_info *rinfo, const char* dstAddr,
> const char* srcAddr, const char* gateway, const char*
> ifName)
> {
> /* Convert from the standrad numbers and dots notation
> to binary data */
> inet_aton("192.168.51.0", (struct in_addr *)&rinfo->dstAddr);
> inet_aton("192.168.51.90", (struct in_addr *)&rinfo->gateWay);
> }
> int addAttr (struct nlmsghdr *nlhdr, int maxlen, int type,
> void *data, int alen)
> {
> struct rtattr *rta;
> int len = RTA_LENGTH(alen);
> if (NLMSG_ALIGN(nlhdr->nlmsg_len) + len > maxlen)
> return -1;
> rta = (struct rtattr*)((char *)nlhdr +
> NLMSG_ALIGN(nlhdr->nlmsg_len));
> rta->rta_type = type;
> rta->rta_len = len;
> memcpy(RTA_DATA(rta), data, alen);
> nlhdr->nlmsg_len = NLMSG_ALIGN(nlhdr->nlmsg_len) + len;
> return 0;
> }
> int main()
> {
> struct nlmsghdr *nlMsg;
> struct rtmsg *rtMsg;
> char dstAddr[30] ;
> char srcAddr[30] ;
> char gateway[30] ;
> char ifName[30];
> char msgBuf[BUFSIZE];
> struct route_info rinfo;
> int sock, len, msgSeq = 0;
> int val, i;
> /* Create Socket */
> if((sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0)
> perror("Socket Creation: ");
> /* Initialize the buffer */
> memset(msgBuf, 0, BUFSIZE);
> /* point the header and the msg structure pointers into the
> buffer */
> nlMsg = (struct nlmsghdr *)msgBuf;
> rtMsg = (struct rtmsg *)NLMSG_DATA(nlMsg);
> /* Fill in the nlmsg header*/
> nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); //
> Length ofmessage.
> nlMsg->nlmsg_type = RTM_NEWROUTE; // Get
> the routes from kernel routing table .
> nlMsg->nlmsg_flags = NLM_F_CREATE ; // The message is a
> request for dump.
> nlMsg->nlmsg_seq = msgSeq++; //
> Sequence of the message packet.
> nlMsg->nlmsg_pid = getpid(); // PID
> of process sending the request.
> rtMsg->rtm_family = AF_INET;
> rtMsg->rtm_table = RT_TABLE_UNSPEC;
> rtMsg->rtm_dst_len = 16;
> rtMsg->rtm_src_len = 16;
> rtMsg->rtm_scope = RT_SCOPE_UNIVERSE;
> rtMsg->rtm_type = RTN_UNICAST;
> rtMsg->rtm_protocol = RTPROT_UNSPEC;
> rtMsg->rtm_flags = RTM_F_NOTIFY;
> fillRoute (&rinfo, dstAddr, srcAddr, gateway, ifName);
> addAttr (nlMsg, BUFSIZE, RTA_DST,
> &rinfo.dstAddr, 4);
> addAttr (nlMsg, BUFSIZE, RTA_GATEWAY,
> &rinfo.gateWay, 4);
> /* Send the request */
> if((val = send(sock, nlMsg, nlMsg->nlmsg_len,0 )) < 0){
> printf("Write To Socket Failed...\n");
> return -1;
> }
> printf (" No of Bytes sent %d \n", val);
> printf (" Value that is sent \n " );
> for (i =0 ; i < val ; i ++)
> printf ("%u", msgBuf[i]);
> printf ("\n");
> close(sock);
> return 0;
> }
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////
> OUTPUT
> [root@vijdom]gcc netlink_addroute.c -o addroute
> [root@vijdom]# ./addroute
> No of Bytes sent 44
> Value that is sent
> 4400024004000042949672398800216160000101008010429496723242949672085108050429496723242949672085190
> //////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> SCREEN SHOTS
>
> *Routing table before execution of program*
> Kernel IP routing table
> Destination Gateway Genmask Flags Metric Ref
> Use Iface
> 192.168.51.0 * 255.255.255.0 U 0 0
> 0 eth0
> 169.254.0.0 * 255.255.0.0 U 0 0
> 0 eth0
> 127.0.0.0 * 255.0.0.0 U 0 0 0 lo
> default embedded 0.0.0.0 UG 0 0
> 0 eth0
>
> *Routing table after the execution of program
> *Kernel IP routing table
> Destination Gateway Genmask Flags Metric Ref
> Use Iface
> 192.168.51.0 * 255.255.255.0 U 0 0
> 0 eth0
> 169.254.0.0 * 255.255.0.0 U 0 0
> 0 eth0
> 127.0.0.0 * 255.0.0.0 U 0 0 0 lo
> default embedded 0.0.0.0 UG 0 0
> 0 eth0
>
>
>
>
>
>
> ------------------------------------------------------------------------
> Find out what India is talking about on Yahoo! Answers India.
> <http://us.rd.yahoo.com/mail/in/mailanswersshare/*http://in.answers.yahoo.com/>
> SMS memory full? Store all your important SMS in your Yahoo! Mail.
> Register for SMS BAK UP now!
> <http://us.rd.yahoo.com/mail/in/mailbackup/*http://in.mobile.yahoo.com/smsbakup.html>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> LARTC mailing list
> LARTC@mailman.ds9a.nl
> http://mailman.ds9a.nl/cgi-bin/mailman/listinfo/lartc
>
I have a similar network 4 /24 ip classess splitet in 7 regions. rhus i
have to do routing. For this i use:::
/sbin/ip route add class via ip for
eatch region.
ex::: /sbin/ip route add 89.34.23.0/26 via 81.181.180.21
89.34.23.0/26 > region ip address
81.181.180.21 > router ip
This i what i use....
looking forward to learning about netlink,
Good luck,
Adorean Alexandru Raul
_______________________________________________
LARTC mailing list
LARTC@mailman.ds9a.nl
http://mailman.ds9a.nl/cgi-bin/mailman/listinfo/lartc
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2006-07-25 17:48 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-07-25 14:59 [LARTC] problem in Route add using netlink VijayaLakshmi Seshadri
2006-07-25 17:48 ` Adorean Alexandru Raul
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.