From: <mik...@us...> - 2008-08-01 00:11:36
|
Revision: 808 http://omc.svn.sourceforge.net/omc/?rev=808&view=rev Author: mike-brasher Date: 2008-08-01 00:11:46 +0000 (Fri, 01 Aug 2008) Log Message: ----------- Rework of network interface discovery. Modified Paths: -------------- cmpiprofiles/sblim-cmpi-ethernet_port_profile/trunk/src/Resource.c cmpiprofiles/sblim-cmpi-ethernet_port_profile/trunk/src/Resource.h Modified: cmpiprofiles/sblim-cmpi-ethernet_port_profile/trunk/src/Resource.c =================================================================== --- cmpiprofiles/sblim-cmpi-ethernet_port_profile/trunk/src/Resource.c 2008-07-31 21:34:47 UTC (rev 807) +++ cmpiprofiles/sblim-cmpi-ethernet_port_profile/trunk/src/Resource.c 2008-08-01 00:11:46 UTC (rev 808) @@ -11,6 +11,7 @@ #include <errno.h> #include "Resource.h" #include "common.h" +#include <ifaddrs.h> #define MAX_IFREQ 64 @@ -101,6 +102,114 @@ return 0; } +static struct EthernetPortResource* _find( + struct EthernetPortResource* head, + const char* name) +{ + struct EthernetPortResource* p; + + for (p = head; p; p = p->next) + { + if (strcasecmp(p->name, name) == 0) + return p; + } + + /* Not found! */ + return NULL; +} + +static int _fixup_addrs(struct EthernetPortResource* head) +{ + struct ifaddrs* list; + struct ifaddrs* p; + char buf[256]; + + if (getifaddrs(&list) != 0) + return -1; + + for (p = list; p; p = p->ifa_next) + { + struct EthernetPortResource* info; + int family; + + /* Skip if null address */ + + if (!p->ifa_addr) + continue; + + /* Skip unknown families */ + + family = p->ifa_addr->sa_family; + + if (family != AF_INET && family != AF_INET6) + continue; + + /* See if it already exists */ + + if (!(info = _find(head, p->ifa_name))) + continue; + + /* Get EthernetPortResource.name */ + + strlcpy(info->name, p->ifa_name, sizeof(info->name)); + + if (family == AF_INET6) + { + inet_ntop( + AF_INET6, + &((struct sockaddr_in6*)p->ifa_addr)->sin6_addr, + info->inet6_addr, + sizeof(info->inet6_addr) - 1); + + if(p->ifa_netmask) + { + inet_ntop( + AF_INET6, + &((struct sockaddr_in6*)p->ifa_netmask)->sin6_addr, + info->inet6_netmask, + sizeof(info->inet6_netmask) - 1); + } + + if(p->ifa_broadaddr) + { + inet_ntop( + AF_INET6, + &((struct sockaddr_in6*)p->ifa_broadaddr)->sin6_addr, + info->inet6_broadcast, + sizeof(info->inet6_broadcast) - 1); + } + } + else if(family == AF_INET) + { + inet_ntop( + AF_INET, + &((struct sockaddr_in*)p->ifa_addr)->sin_addr, + info->inet_addr, + sizeof(info->inet_addr) - 1); + + if (p->ifa_netmask) + { + inet_ntop( + AF_INET, + &((struct sockaddr_in*)p->ifa_netmask)->sin_addr, + info->inet_netmask, + sizeof(info->inet_netmask) - 1); + } + + if (p->ifa_broadaddr) + { + inet_ntop( + AF_INET, + &((struct sockaddr_in*)p->ifa_broadaddr)->sin_addr, + info->inet_broadcast, + sizeof(info->inet_broadcast) - 1); + } + } + } + + return 0; +} + struct EthernetPortResource* GetEthernetPortResources() { int sock; @@ -145,6 +254,11 @@ ifr = (struct ifreq*)p; p += sizeof(struct ifreq); + /* Skip duplicates */ + + if (_find(head, ifr->ifr_name)) + continue; + /* Clear info structure */ memset(&info, 0, sizeof(info)); @@ -166,50 +280,22 @@ addr_len = sizeof(struct sockaddr); } - /* Skip non-eth? ports */ + /* Skip non-ethernet ports */ #if defined(ETHERNET_INTERFACES_ONLY) if (strncmp(ifr->ifr_name, "eth", 3) != 0) continue; #endif + /* Skip unknown address families */ + + if (family != AF_INET && family != AF_INET6) + continue; + /* Get EthernetPortResource.name */ -printf("NAME[%s]\n", ifr->ifr_name); - strlcpy(info.name, ifr->ifr_name, sizeof(info.name)); -{ - struct EthernetPortResource* p; - int size = 0; - - for (p = head; p; p = p->next) - { - size++; - if (strcasecmp(p->name, ifr->ifr_name) == 0) - { -printf("ALREADY IN LIST[%s]\n", ifr->ifr_name); - } - } - -printf("SIZE[%d]\n", size); -} - - /* Get EthernetPortResource.family_name */ - - if (family == AF_INET) - { - strlcpy(info.family, "inet", sizeof(info.family)); - } - else if (family == AF_INET6) - { - strlcpy(info.family, "inet6", sizeof(info.family)); - } - else - { - strlcpy(info.family, "unknown", sizeof(info.family)); - } - /* Get EthernetPortResource.index */ info.index = if_nametoindex(info.name); @@ -257,6 +343,7 @@ info.is_p2p = flags & IFF_POINTOPOINT ? 1 : 0; } +#if 0 /* Get EthernetPortResource.inet_addr */ if (family == AF_INET) @@ -317,7 +404,7 @@ in = (struct sockaddr_in*)&tmp.ifr_addr; inet_ntop(tmp.ifr_addr.sa_family, &in->sin_addr, str, sizeof(str)); - strlcpy(info.broadcast, str, sizeof(info.broadcast)); + strlcpy(info.inet_broadcast, str, sizeof(info.inet_broadcast)); } /* Get EthernetPortResource.netmask */ @@ -337,8 +424,9 @@ in = (struct sockaddr_in*)&tmp.ifr_addr; inet_ntop(tmp.ifr_addr.sa_family, &in->sin_addr, str, sizeof(str)); - strlcpy(info.netmask, str, sizeof(info.netmask)); + strlcpy(info.inet_netmask, str, sizeof(info.inet_netmask)); } +#endif /* Get additional information using the ethtool program */ @@ -376,6 +464,10 @@ } close(sock); + + /* Set address info for all elements in this list */ + _fixup_addrs(head); + return head; } @@ -391,8 +483,6 @@ } } -#if defined(LSIF) - void PrintEtherPortResources(const struct EthernetPortResource* head) { const struct EthernetPortResource* p; @@ -401,19 +491,20 @@ { printf("EthernetPortResource\n"); printf("{\n"); -printf(" ptr{%p}\n", p); printf(" name{%s}\n", p->name); printf(" index{%d}\n", p->index); printf(" mac{%s}\n", p->mac); - printf(" family{%s}\n", p->family); + printf(" inet_addr{%s}\n", p->inet_addr); + printf(" inet_netmask{%s}\n", p->inet_netmask); + printf(" inet_broadcast{%s}\n", p->inet_broadcast); + printf(" inet6_addr{%s}\n", p->inet6_addr); + printf(" inet6_netmask{%s}\n", p->inet6_netmask); + printf(" inet6_broadcast{%s}\n", p->inet6_broadcast); printf(" is_up{%d}\n", p->is_up); printf(" is_broadcast{%d}\n", p->is_broadcast); printf(" is_multicast{%d}\n", p->is_multicast); printf(" is_loopback{%d}\n", p->is_loopback); printf(" is_p2p{%d}\n", p->is_p2p); - printf(" inet_addr{%s}\n", p->inet_addr); - printf(" broadcast{%s}\n", p->broadcast); - printf(" netmask{%s}\n", p->netmask); printf(" full_duplex{%d}\n", p->full_duplex); printf(" speed_mbps{%d}\n", p->speed_mbps); printf(" supports_wake_on{%d}\n", p->supports_wake_on); @@ -422,6 +513,8 @@ } } +#if defined(LSIF) + int main() { struct EthernetPortResource* info; Modified: cmpiprofiles/sblim-cmpi-ethernet_port_profile/trunk/src/Resource.h =================================================================== --- cmpiprofiles/sblim-cmpi-ethernet_port_profile/trunk/src/Resource.h 2008-07-31 21:34:47 UTC (rev 807) +++ cmpiprofiles/sblim-cmpi-ethernet_port_profile/trunk/src/Resource.h 2008-08-01 00:11:46 UTC (rev 808) @@ -22,9 +22,6 @@ /* MAC address in display format (e.g., "00:50:56:C0:00:01") */ char mac[18]; - /* Address family name in display format (e.g., "inet", "inet6") */ - char family[16]; - /* Non-zero if interface is up */ int is_up; @@ -40,15 +37,24 @@ /* Non-zero if p2p */ int is_p2p; - /* ASCII internet address */ - char inet_addr[64]; + /* ASCII IPV4 address */ + char inet_addr[128]; - /* ASCII broadcast address */ - char broadcast[64]; + /* ASCII IPV4 broadcast address */ + char inet_broadcast[128]; - /* ASCII Netmask */ - char netmask[64]; + /* ASCII IPV4 Netmask */ + char inet_netmask[128]; + /* ASCII IPV6 address */ + char inet6_addr[128]; + + /* ASCII IPV6 broadcast address */ + char inet6_broadcast[128]; + + /* ASCII IPV6 Netmask */ + char inet6_netmask[128]; + /* Non-zero if full duplex */ int full_duplex; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |