[LARTC] Re: problem in Route add using netlink

2006-07-31 Thread Jarek Poplawski

On 25-07-2006 16:59, 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


I had some free time at the weekend - it's probably to late and I 
hope you've found this bugs yet, but maybe someone else (like me) 
will be looking here some day with similar problem, so here is 
what I've found.


Jarek P

 
 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;
charifName[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);
}


Of corse you always have to be sure to have the valid route to 
192.168.51.90 on the testing box...



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 


// the flag is needed here
nlMsg-nlmsg_flags = NLM_F_CREATE | NLM_F_REQUEST;


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;


// this should be address' lenghts in bits so:
 rtMsg-rtm_dst_len = 32;
 rtMsg-rtm_src_len = 32;


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
[EMAIL PROTECTED] netlink_addroute.c -o addroute
[EMAIL PROTECTED] ./addroute
 No of Bytes sent 44
 Value that is sent
 
44000240044294967239880021616101008010429496723242949672085108050429496723242949672085190
// 


  SCREEN SHOTS
 
*Routing table before execution of program*

Kernel IP routing table
Destination  

[LARTC] Re: problem in Route add using netlink

2006-07-31 Thread Jarek Poplawski

On 31-07-2006 09:03, Jarek Poplawski wrote:
...
Of corse you always have to be sure to have the valid route to 


Cursed! I wish I could spel too:

http://www.cherwell.org/of_corse_we_can_spel

Jarek P.

___
LARTC mailing list
LARTC@mailman.ds9a.nl
http://mailman.ds9a.nl/cgi-bin/mailman/listinfo/lartc