All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.