Hi all, i am including a piece of code i have written to get the network interfaces and their IP addresses using rtnetlink. Please do let me know if there is a better way of doing this. #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 NL_BUFSIZE 8192 int readSock(int sockFd, char *bufPtr, int seqNum, int pId) { struct nlmsghdr *nlHdr; int readLen = 0, flag = 0, msgLen = 0; do{ /* Recieve response from kernel */ if((readLen = recv(sockFd, bufPtr, NL_BUFSIZE - msgLen, 0)) < 0){ perror("SOCK READ: "); return -1; } nlHdr = (struct nlmsghdr *)bufPtr; /* Check if header is valid */ if((NLMSG_OK(nlHdr, readLen) == 0) || (nlHdr->nlmsg_type == NLMSG_ERROR)){ perror("Error in recieved packet"); return -1; } /* Check if its the last message */ if(nlHdr->nlmsg_type == NLMSG_DONE) { flag = 1; break; } else{ /* Move the buffer pointer appropriately */ bufPtr += readLen; msgLen += readLen; } if((nlHdr->nlmsg_flags & NLM_F_MULTI) == 0){ flag = 1; break; } } while((nlHdr->nlmsg_seq != seqNum) || (nlHdr->nlmsg_pid != pId) || (flag == 0)); return msgLen; } void parseIfAddr(struct nlmsghdr *nlHdr) { struct ifaddrmsg *ifAddrs; struct rtattr *rtAttr; int rtLen; char *tempBuf = NULL; tempBuf = (char *)malloc(100); ifAddrs = (struct ifaddrmsg *)NLMSG_DATA(nlHdr); rtAttr = (struct rtattr *)IFA_RTA(ifAddrs); rtLen = IFA_PAYLOAD(nlHdr); for(;RTA_OK(rtAttr,rtLen);rtAttr = RTA_NEXT(rtAttr,rtLen)){ switch(rtAttr->rta_type) { case IFA_ADDRESS: inet_ntop(AF_INET, RTA_DATA(rtAttr), tempBuf); fprintf(stdout, "Interface Address : %s\n",tempBuf); break; case IFA_LABEL: fprintf(stdout, "Interface Name : %s\n",RTA_DATA(rtAttr)); break; } } free(tempBuf); return; } int main() { struct nlmsghdr *nlMsg; struct ifaddrmsg *addrMsg; char msgBuf[NL_BUFSIZE]; int sock, len, msgSeq = 0; char buff[1024]; /* Create Socket */ if((sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) < 0) perror("Socket Creation: "); memset(msgBuf, 0, NL_BUFSIZE); nlMsg = (struct nlmsghdr *)msgBuf; addrMsg = (struct ifaddrmsg *)NLMSG_DATA(nlMsg); /* For getting interface addresses */ nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); nlMsg->nlmsg_type = RTM_GETADDR; nlMsg->nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST; nlMsg->nlmsg_seq = msgSeq++; nlMsg->nlmsg_pid = getpid(); if(write(sock, nlMsg, nlMsg->nlmsg_len) < 0){ printf("Write To Socket Failed...\n"); return -1; } if((len = readSock(sock, msgBuf, msgSeq, getpid())) < 0){ printf("Read From Socket Failed...\n"); return -1; } for(;NLMSG_OK(nlMsg,len);nlMsg = NLMSG_NEXT(nlMsg,len)){ /* For getting interface addresses */ parseIfAddr(nlMsg); } close(sock); return 0; } Thanks & Regards, Praveen M Nair. -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/