netlink question

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

            I wanted a program to get the broadcast address of an
interface. I wanted for selected interface. I followed the iproute
source code to write it. How ever i find that iam not able to get the
bcast address for that particular interface. If i use NLM_F_ROOT i get
all info.

I have pasted my code. Its roughly done. Could someone point me how to
get broadcast address also for particular interface?

Regards,
Varun
#include <errno.h>
#include <error.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>

#define NIPQUAD(addr) \
        ((unsigned char *)&addr)[0], \
        ((unsigned char *)&addr)[1], \
        ((unsigned char *)&addr)[2], \
        ((unsigned char *)&addr)[3]
#define NIPQUAD_FMT "%u.%u.%u.%u"


char buf[INET6_ADDRSTRLEN];


main()
{

   struct {
                struct nlmsghdr n;
                struct ifaddrmsg r;
                char   buf[1024];
        } req;

   struct rtattr *rta;
   struct sockaddr_in6 *sin6p;
   struct sockaddr_in *sinp;
   int status;
   char buf[16384];
   struct nlmsghdr *nlmp;
   struct ifaddrmsg *rtmp;
                                     struct rtattr *rtatp;
   int rtattrlen;
   struct in_addr *inp;
   int fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);

   memset(&req, 0, sizeof(req));
   req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
   req.n.nlmsg_flags = NLM_F_REQUEST;
   req.n.nlmsg_type = RTM_GETADDR;

   req.r.ifa_family = AF_INET;
   req.r.ifa_index = 1; // I tried to set to this index.....not sure if
its correct
    rta = (struct rtattr *)(((char *)&req) + NLMSG_ALIGN(req.n.nlmsg_len));
   rta->rta_type = IFA_BROADCAST;
   rta->rta_len = RTA_LENGTH(4);

    status = send(fd, &req, req.n.nlmsg_len, 0);
        if (status < 0) {
                perror("send");
                return 1;
        }

        status = recv(fd, buf, sizeof(buf), 0);
        if (status < 0) {
                perror("recv");
                return 1;
        }

        nlmp = (struct nlmsghdr *)buf;
        if (!NLMSG_OK(nlmp, status)) {
                printf("NLMSG not OK\n");
                return 1;
        }
        rtmp = (struct ifaddrmsg *)NLMSG_DATA(nlmp);
        rtatp = (struct rtattr *)IFA_RTA(rtmp);
        printf("%d\n",rtmp->ifa_index);
        rtattrlen = IFA_PAYLOAD(nlmp);
      
        for (; RTA_OK(rtatp, rtattrlen); rtatp = RTA_NEXT(rtatp,
rtattrlen)) {
            if(rtatp->rta_type == IFA_BROADCAST)
                {

                    inp = (struct in_addr *)RTA_DATA(rtatp);
                  printf("addr: "NIPQUAD_FMT"\n",NIPQUAD(*inp));
               }
         }
}
-
To unsubscribe from this list: send the line "unsubscribe linux-net" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux