using rtnetlink

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

 



i have written this sample program to get the interface address
but it seems to give me only the lo interface how do i get information 
about the eth0 interface
can somebody gimme some pointers here


-SIGTERM
amit

-- 
As flies to wanton boys are we to the gods; they kill us for their sport.
		-- Shakespeare, "King Lear"


#include<asm/types.h>
#include<sys/types.h>
//#include<bits/sockaddr.h>
#include<sys/socket.h>
#include<linux/netlink.h>
#include<linux/rtnetlink.h>



int main()
{
	int sockfd =0;
	int bindid =0;
	char buff[1024];
	char temp_addr[50];
	int len =0;
	struct {
		struct nlmsghdr nl;
		struct rtgenmsg g;
		
	}req;
	struct nlmsghdr *reply;
	struct sockaddr_nl l_local;
	struct sockaddr_nl l_sendto;
	struct ifinfomsg *info;
	struct ifaddrmsg *ifaddr;
	struct rtattr *rta;
	memset(buff,'\0',1024);
	sockfd = socket(PF_NETLINK,SOCK_DGRAM,NETLINK_ROUTE);
	l_local.nl_family = AF_NETLINK;
	l_local.nl_groups = 0;
	bindid = bind(sockfd,(struct sockaddr *)&l_local,sizeof(struct sockaddr_nl));
	perror("Bind Result");
	l_sendto.nl_family = AF_NETLINK;
	req.nl.nlmsg_len = sizeof(req);
	req.nl.nlmsg_type = RTM_GETADDR;
	req.nl.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;
	req.nl.nlmsg_pid = 0;
	req.nl.nlmsg_seq = 2;
	req.g.rtgen_family = AF_INET;
//	sendto(sockfd,(void *)&req,sizeof(req),0,(struct sockaddr *)&l_sendto,sizeof(struct sockaddr_nl));
	send(sockfd, &req, req.nl.nlmsg_len, 0);
	perror("sendto Result");
	//while(recv(sockfd,buff,1024,0))
	recv(sockfd,buff,1024,0);
	perror("recvfrom Result");
	reply = (struct nlmsghdr *)malloc(sizeof(struct nlmsghdr));
	reply = (struct nlmsghdr *)buff;
	printf("\nAfter cast\n");
//	info = (struct ifinfomsg *)malloc(sizeof(struct ifinfomsg));
	ifaddr = (struct ifaddrmsg *)malloc(sizeof(struct ifaddrmsg));
	ifaddr  = NLMSG_DATA(reply);
	rta =  (struct rtattr *)malloc(sizeof(struct rtattr));
	rta = IFLA_RTA(ifaddr);
	printf("\nAfter cast\n");
	len = reply->nlmsg_len;
	//RTA_OK(rta,len);
	printf("Length is %d\n",len);
	while(RTA_OK(rta, len)) {
	switch(rta->rta_type) {
	
	case IFA_LOCAL:
		inet_ntop(AF_INET, RTA_DATA(rta), temp_addr, 50);
		printf("addr: %s - \n",	temp_addr);
		break;		
	case IFA_ADDRESS:
		inet_ntop(AF_INET, RTA_DATA(rta), temp_addr, 50);
		printf("addr: %s - \n",	temp_addr);
		break;
	case IFA_LABEL:
		printf("InterFace Name: %s - \n",RTA_DATA(rta));
		break;	
	case IFA_BROADCAST:
		inet_ntop(AF_INET, RTA_DATA(rta), temp_addr, 50);
		printf("addr: %s - \n",	temp_addr);
		break;
	case IFA_ANYCAST:
		inet_ntop(AF_INET, RTA_DATA(rta), temp_addr, 50);
		printf("addr: %s - \n",	temp_addr);
		break;
	case IFA_CACHEINFO:
		printf("cache Info\n");						
	}
	printf("\nLooping\n");
	rta = RTA_NEXT(rta,len);
			
	}
	return 0;
}

[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