yonah wrote:
Hi,
i need to get MAC Address IP Address for IPv6 with C Programming for
OpenSolaris.
I found the following code:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <netinet/in.h>
#include <arpa/inet.h>
main(int argc,char *argv)
{
unsigned char eth_addr[6];
int i,j,sock;
unsigned char *p;
struct lifconf lic;
struct lifreq lifrs[30];
struct lifnum num;
struct arpreq ar;
struct sockaddr_in *soap,*soap2;
/* Enumerate all IP addresses of the system */
sock=socket(PF_INET,SOCK_DGRAM,IPPROTO_IP);
num.lifn_family=AF_INET;
num.lifn_flags=0;
ioctl(sock,SIOCGLIFNUM,&num);
lic.lifc_family=AF_INET;
lic.lifc_flags=0;
lic.lifc_len=sizeof(lifrs);
lic.lifc_buf=(caddr_t)&(lifrs[0] );
ioctl(sock,SIOCGLIFCONF,&lic);
/* Get the ethernet address for each of them */
for(i=0;i<num.lifn_count;i++)
{
/* Get IP address */
ioctl(sock,SIOCGLIFADDR,&(lifrs[ i ]));
soap=(struct sockaddr_in *)&(lifrs[ i ].lifr_addr);
soap2=(struct sockaddr_in *)&(ar.arp_pa);
*soap2=*soap;
/* Print IP address */
p=(unsigned char *)&(soap->sin_addr);
printf("%s: %u.%u.%u.%u - ",lifrs[ i ].lifr_name,
p[0],p[1],p[2],p[3]);
/* Get ethernet address */
if(ioctl(sock,SIOCGARP,&ar)<0)
{
printf("No ethernet address.\n");
}
else
{
p=(unsigned char *)&(ar.arp_ha.sa_data);
printf("%02X:%02X:%02X:%02X:%02X:%02X\n",
p[0],p[1],p[2],p[3],p[4],p[5]);
}
}
close(sock);
}
But this work only for IPv4. I changed Addressfamily and structures to IPv6,
but it does not work.
Which part of the above does not work for IPv6?
What happens if you use SIOCGLIFCONF and SIOCGLIFADDR for IPv6?
Darren
_______________________________________________
networking-discuss mailing list
[email protected]