hi, I try to answer as i know. > Yes another fight in my netlink saga. Thanks to all who have replied before > and I have learned alot from the rfc's and zebra/iproute and have contructed > a much more robust implementation. I have sent the kernel a message defined > as below. However I have not learned what exactly I should be expecting from > the kernel. That is, my message gets a reply from the kernel about eth0, > however on my machine i have eth0,1,2,ppp0 and I would like information about > them all. I have NLM_F_ROOT set on the packet as I was under the impression > that this would dump information about all the interfaces. I have also tried > incrementing msg.info.ifi_index to 0,1,2,3 etc. No matter what these values > I always recieve this output form my program. > #./nl_test_prog > Found device: eth0 - 1 > Found address: <--(Dont care about blank yet, main problem is only > 1 if shows. This is minor) > > -Am I wrong to expect the kernel to send me data about all the interfaces? > -Am I calling this wrong? > -What can I do to query all the interfaces? i've checked your code, it's all right. if you want to receive the information of all interfaces, you should use the rtgenmsg as follows: struct { struct nlmsghdr nlh; struct rtgenmsg r; } req; and then you fill the nlh as you did and set req.r.rtgen_family=AF_UNSPEC. Otherwise, you can send msg to receive the information concerning each interface that you know the interface name or index as you did. IMHO, to know exactly the address of the hardware, you can determine the length of the address by using : case IFLA_ADDRESS: len=RTA_PAYLOAD(rta); // don't try to printf all the string that you dont know where it ends. nary tra > I do loop through all the rta messages and I receive only 1 packet from the > kernel when calling recvmsg(). I have also tried without OR'ing NLM_F_MATCH. > I have run it through a debugger and confirmed although there are multiple > RTA atributes in my netlink packet, they all refer to eth0. > > -Should I be expecting multiple packets (NLM_F_MULTI)? > > Here is my nl_packet construction. > > msg.hdr.nlmsg_len = sizeof(msg); > msg.hdr.nlmsg_type = RTM_GETLINK; > msg.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT | NLM_F_MATCH; > msg.hdr.nlmsg_pid = getpid(); > msg.hdr.nlmsg_seq = seq++; > msg.info.ifi_family = AF_UNSPEC; //AF_UNSPEC for ipv4 > msg.info.ifi_type = NETLINK_ROUTE; > msg.info.ifi_index = 0; > msg.info.ifi_change = (0-1); > > ----------------Looping over the attributes later in code-------------- > /* Loop over the attributes in this message */ > while(RTA_OK(rta, len)) > { > switch(rta->rta_type) > { > case IFLA_IFNAME: > cout << "Found device: " << (char *)RTA_DATA(rta)<< " - " << > info->ifi_index << endl; > break; > case IFLA_ADDRESS: > cout << "Found address: " << (char *)RTA_DATA(rta) << endl; > break; > } > rta = RTA_NEXT(rta, len); > /* We hit the next packet */ > }// Packet Looping while() > > > More info/code available upon request. > > Any help would be appreciated. > > ---------------------------------------- > EB > > > All is fine except that I can reliably "oops" it simply by trying to read > > from /proc/apm (e.g. cat /proc/apm). > > oops output and ksymoops-2.3.4 output is attached. > > Is there anything else I can contribute? > > The latitude and longtitude of the bios writers current position, and > a ballistic missile. > > --Alan Cox 2000-12-08 > > ---------------------------------------- > - > : send the line "unsubscribe linux-net" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > - : send the line "unsubscribe linux-net" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html