From fbaa48424bbbb82aa13e3d0e28ed377dceef122b Mon Sep 17 00:00:00 2001 From: Sebastien Vincent Date: Wed, 22 Sep 2010 16:00:23 +0000 Subject: [PATCH] Add getHardwareAddress to the NetworkAddress service that wraps NetworkInterface.getHardwareAddress if it exists otherwise via a JNI. --- .../freebsd-64/libhwaddressretriever.so | Bin 0 -> 7819 bytes lib/native/freebsd/libhwaddressretriever.so | Bin 0 -> 5616 bytes lib/native/linux-64/libhwaddressretriever.so | Bin 0 -> 9023 bytes lib/native/linux/libhwaddressretriever.so | Bin 0 -> 6874 bytes lib/native/mac/libhwaddressretriever.jnilib | Bin 0 -> 41500 bytes lib/native/windows-64/hwaddressretriever.dll | Bin 0 -> 40448 bytes lib/native/windows/hwaddressretriever.dll | Bin 0 -> 41472 bytes src/native/build.xml | 55 ++++++++ .../HardwareAddressRetriever.h | 30 +++++ .../HardwareAddressRetriever_unix.c | 124 +++++++++++++++++ .../HardwareAddressRetriever_win.c | 125 ++++++++++++++++++ ...or_impl_netaddr_HardwareAddressRetriever.c | 35 +++++ ...or_impl_netaddr_HardwareAddressRetriever.h | 21 +++ .../netaddr/HardwareAddressRetriever.java | 33 +++++ .../NetworkAddressManagerServiceImpl.java | 70 ++++++++-- .../netaddr/NetworkAddressManagerService.java | 10 +- 16 files changed, 492 insertions(+), 11 deletions(-) create mode 100755 lib/native/freebsd-64/libhwaddressretriever.so create mode 100755 lib/native/freebsd/libhwaddressretriever.so create mode 100755 lib/native/linux-64/libhwaddressretriever.so create mode 100755 lib/native/linux/libhwaddressretriever.so create mode 100755 lib/native/mac/libhwaddressretriever.jnilib create mode 100755 lib/native/windows-64/hwaddressretriever.dll create mode 100755 lib/native/windows/hwaddressretriever.dll create mode 100644 src/native/hwaddressretriever/HardwareAddressRetriever.h create mode 100644 src/native/hwaddressretriever/HardwareAddressRetriever_unix.c create mode 100644 src/native/hwaddressretriever/HardwareAddressRetriever_win.c create mode 100644 src/native/hwaddressretriever/net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever.c create mode 100644 src/native/hwaddressretriever/net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever.h create mode 100644 src/net/java/sip/communicator/impl/netaddr/HardwareAddressRetriever.java diff --git a/lib/native/freebsd-64/libhwaddressretriever.so b/lib/native/freebsd-64/libhwaddressretriever.so new file mode 100755 index 0000000000000000000000000000000000000000..cd1813cf6ebb7a9d4c74d44047307a9e5bcfdbdc GIT binary patch literal 7819 zcmeHMYit}>6~4P`C)>oYq=BRjrQ6gYDQd>vyx;QLUT18r6U%leG%b_K?l|6bAJ)!n zaMC7N+9b_tabrM&zz-B5Ar*cZBxnE$ESZw)J#eZEJSpa9#;d{CYUIzWfO4>yYfunxAJ)xq!M zY$eyNuU0K6ZC~m@#2IVh0QRv69>TXTb#UTW{f=E(aI!-Y?Sc(XeXzl?BR+u*0}&U~ zU<2=3i8{dB#du^+dc;u|X{~s${51Y}&?>-IN_eXzlNf@+<0MG@Ng;m%_-avp4EP#R zCiWB+{tx&k#TcG=A7cr?X$gt_ajOTIpAA&@xmpuo0e02na0TG>UB*KoQGnI6;9>~` zF#soKy(hkyo%h7y6wpC%H5Xuyuoa&8l8V2$)S=&{YWR02e|YIHW9J*a@a62HC;ljV-4kEIrakeGG1lbO{>RClL6*M8)$Gep=|f4ZH=$ zBhTwoTz}#I{-%aLZa2)WO^)x)o8D& zdM@z=J!eEfFidmMuyRS`xRKMK3#pE!l1Ji-nN_wi%}D5$4kJBcnwn|pIT*W8d#w9Cu#9?~|(n$8h9+my}(&yPfMUoZc1K$4wWG?-8Oo7w(SLYT?hpxhtSG z*9j3=E&L)l%j_-Rs&8TT+Dq^|1!S*9c@&$vb<+k~`!$qt`EHfD{2Iy_!EeoQ`5ejt zl&86T8fAQ?-ns-b@Csr76MOPd&+@y}!k$A|vR135J>T@Vu(>aT`t3%wFcVaZ^;3Y@ z*VIz|t58r&E$Z28`9J=$emj`>_{c{_rl5&(9X9b8=&ghr_3Vt*s7~(rDWJW@*@*pz zd$TwxK?lRv)Z)95=OUkp9PBMVhzt*fZ@`$=tEI(iF@ISt8Z-8k3PA$e=`CJqKJynC zIw*wH$x~(ZO0)sP`r1$ zK`pIT&)#T0bB@=>S4AdXY4t77 %CgR$bnxnG0%*_r%x#OoI2%aP_Eb+^{5rT*#O z$>F+S$zSv}ztLGYQjFB8rBmg()1a>wPE9lGrQTAM{R~fBta!(sns7#~7H6$>SQ9Hn zr+Qc&{qBKn(|W?HhXXBaNG;sAt(EHJ6HkL=m(^0&eYJ2qh;aVyp;_1` zICnM}@{Mclf#?FRy)$Iy;%yKH+Tv!uO;0DbZf=X`tfVsZ?D0@o*`{o2SHj9hB^=t= z-oB$P+}^fvOQ=1(Gu*y&=2$#-&)`Nms(s~Z*vr@%uHM?YNk;Evso3f)eiM|?9p1AwnZToB$HWAKau&fkfV zrj~R5Xyc-u$@i1rpd6A$m$6njAAg!fS-c`S&bT?n4fg55gcOl@i@ zfajt!BfaS`xS_ag=q zq;ZGwabpqVBND|(y1x-l_dHsY!(6*^&0y3Y9QG_$1%)BR87|X0+!Zq2GyfrE8kcDH zLt_{wk*GmOs>+1R_aeeSEhfBE@IJwx7yOvuq+j9ty1I6T*6-VY@R`tN@~my`+rm3S zp+mweUu5imuceqL(w2UNDRBRA_$ZY|b#s&{i4z%6ak!OZ%F#?-fqR9S%x2~Z8r0>C zl#T|XG?ucM!Y@RMWsF0aUyGDnmR~v)V^kZ->1jh7O@QrujQ6LflX0fR;jUwX?66~T z977fwgDVSE!iC7lpoe}i!go9R7M(ltH{$K$z*0SJGx_IJV2i#+_2iGl$A#k|L!Tmh z@{?x(!#c7j|0YiU3@V(+e@G5P0nT!k?8%>q_X$O+m-$|(M_(nJ{FQh}*y9+nZyLXV z8OB^(3$my9K>V;!q$rRe%_ovC>6kM^G9HZhMOV#G6P_aO$66Q`pn`(swWM z?~$V5(s07Qz-CBMaM}JFfaBg% z{}jI|e>EW{T&WlB(73)0GOAELeZQXYB`p&=jKJBL^d&&pAF6`y` z%JL5-dwRc53;O{YsNiHz{3n28ndV>l4i^WH^r#tm|9=h@@|ohg!u}!|3NGs|1H96= zOZTF%zv{xUDBGh`>NEq+&`Gtq>u7( z&eD98kE3;(Eq5IGIP zuMaY26!!$o4s(2AelrcYAM$JTekA<@*RSR`$o3d~*F*gF(r*CVD_^`u=*#)yb%2Me!>^Qf0q&VEZp)jwwp!U1wi~}+ z^h{zyDw#3%vfW4W$&|Grnc2%A9b;Pgkr5>h+1ak)1A|(ucW79H471ifPwMM(RVA|8 z(Ny+`p3?Z|lBVa!8FVq0GAtvZYzc4L#Kw??AW zgq=~j+86&q<9*ehEu?{%l!vb7s3E024io)=scybh2{WsW!iuI0Os-2kvTF8zUT(gl uqmuA;68NqxysNI7t#^S=-rfbwOQt*j2oPCz@BbKJzTNA81OKh;|GxoP``6t7 literal 0 HcmV?d00001 diff --git a/lib/native/freebsd/libhwaddressretriever.so b/lib/native/freebsd/libhwaddressretriever.so new file mode 100755 index 0000000000000000000000000000000000000000..c48366b0f2a91561d21e044e498f5374121658ed GIT binary patch literal 5616 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 N!|~mE9hRQ6{|o3%4q5;J literal 0 HcmV?d00001 diff --git a/lib/native/linux/libhwaddressretriever.so b/lib/native/linux/libhwaddressretriever.so new file mode 100755 index 0000000000000000000000000000000000000000..09574a08278a9f023b7e881f9ae27ff164b9d485 GIT binary patch literal 6874 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 literal 0 HcmV?d00001 diff --git a/lib/native/mac/libhwaddressretriever.jnilib b/lib/native/mac/libhwaddressretriever.jnilib new file mode 100755 index 0000000000000000000000000000000000000000..bbfba5e1d9a9e3903c54d5db15771d4b5f71d33a GIT binary patch literal 41500 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%0A01O5 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 ZZCl5-y2m#?j;{Ut`8NgrO#z(({|ma#9g_e6 literal 0 HcmV?d00001 diff --git a/lib/native/windows/hwaddressretriever.dll b/lib/native/windows/hwaddressretriever.dll new file mode 100755 index 0000000000000000000000000000000000000000..35f20b29e1aa7fec77a7cecb1092ee85d70725e6 GIT binary patch literal 41472 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�+ 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 literal 0 HcmV?d00001 diff --git a/src/native/build.xml b/src/native/build.xml index 3b5dff4d7..fe5d08d9f 100644 --- a/src/native/build.xml +++ b/src/native/build.xml @@ -468,6 +468,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -654,6 +708,7 @@ + diff --git a/src/native/hwaddressretriever/HardwareAddressRetriever.h b/src/native/hwaddressretriever/HardwareAddressRetriever.h new file mode 100644 index 000000000..48a12b166 --- /dev/null +++ b/src/native/hwaddressretriever/HardwareAddressRetriever.h @@ -0,0 +1,30 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ + +/** + * \file HardwareAddressRetriever.h + * \brief Hardware address retriever. + * \author Sebastien Vincent + * \date 2010 + */ + +#ifndef HARDWARE_ADDRESS_RETRIEVER_H +#define HARDWARE_ADDRESS_RETRIEVER_H + +#include + +/** + * \brief Returns the hardware address for the specified interface. + * \param env JNI environment + * \param ifName name of the interface that we want to get the hardware address + * \return byte array representing hardware address or NULL if not found or + * system related errors happen. + */ +jbyteArray getHardwareAddress(JNIEnv* env, jstring ifName); + +#endif /* HARDWARE_ADDRESS_RETRIEVER_H */ + diff --git a/src/native/hwaddressretriever/HardwareAddressRetriever_unix.c b/src/native/hwaddressretriever/HardwareAddressRetriever_unix.c new file mode 100644 index 000000000..f4a79ea12 --- /dev/null +++ b/src/native/hwaddressretriever/HardwareAddressRetriever_unix.c @@ -0,0 +1,124 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ + +/** + * \file HardwareAddressRetriever_unix.c + * \brief Hardware address retriever (Unix specific code). + * \author Sebastien Vincent + * \date 2010 + */ + +#if !defined(_WIN32) && !defined(_WIN64) + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#if defined(__FreeBSD__) || defined(__APPLE__) +#include +#include +#include +#include +#endif + +#include "HardwareAddressRetriever.h" + +jbyteArray getHardwareAddress(JNIEnv* env, jstring ifName) +{ + int sock = -1; + struct ifreq ifr; + jbyteArray hwaddr = NULL; + char* name = NULL; + jbyte* addr = NULL; + int hwlen = 6; + + name = (char*)(*env)->GetStringUTFChars(env, ifName, NULL); + + if(!name) + { + return NULL; + } + +#ifdef __linux__ + + sock = socket(AF_INET, SOCK_DGRAM, 0); + + if(sock == -1) + { + (*env)->ReleaseStringUTFChars(env, ifName, name); + return NULL; + } + + memset(&ifr, 0x00, sizeof(struct ifreq)); + + strncpy(ifr.ifr_name, name, IFNAMSIZ - 1); + ifr.ifr_name[IFNAMSIZ - 1] = 0x00; + + if(ioctl(sock, SIOCGIFHWADDR, &ifr) != 0) + { + (*env)->ReleaseStringUTFChars(env, ifName, name); + close(sock); + return NULL; + } + + close(sock); + addr = (const jbyte*)ifr.ifr_hwaddr.sa_data; + +#else /* BSD like */ + + struct ifaddrs* addrs = NULL; + struct ifaddrs* ifa = NULL; + jbyte buf[hwlen]; + + if(getifaddrs(&addrs) != -1) + { + for(ifa = addrs ; ifa != NULL ; ifa = ifa->ifa_next) + { + if(ifa->ifa_addr->sa_family == AF_LINK && !strcmp(ifa->ifa_name, name)) + { + struct sockaddr_dl* sdl = (struct sockaddr_dl*)ifa->ifa_addr; + + if(sdl->sdl_type == IFT_ETHER) + { + memcpy(buf, LLADDR(sdl), hwlen); + addr = buf; + break; + } + } + } + + freeifaddrs(addrs); + } + +#endif + + if(addr) + { + hwaddr = (*env)->NewByteArray(env, hwlen); + + if(hwaddr) + { + /* copy the hardware address and return it */ + (*env)->SetByteArrayRegion(env, hwaddr, 0, hwlen, addr); + } + } + + /* cleanup */ + (*env)->ReleaseStringUTFChars(env, ifName, name); + return hwaddr; +} + +#endif + diff --git a/src/native/hwaddressretriever/HardwareAddressRetriever_win.c b/src/native/hwaddressretriever/HardwareAddressRetriever_win.c new file mode 100644 index 000000000..384cab090 --- /dev/null +++ b/src/native/hwaddressretriever/HardwareAddressRetriever_win.c @@ -0,0 +1,125 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ + +/** + * \file HardwareAddressRetriever_win.c + * \brief Hardware address retriever (Windows specific code). + * \author Sebastien Vincent + * \date 2010 + */ + +#if defined(_WIN32) || defined(_WIN64) + +/** + * \def WIN32_LEAN_AND_MEAN + * \brief Exclude not commonly used headers from win32 API. + * + * It excludes some unused stuff from windows headers and + * by the way code compiles faster. + */ +#define WIN32_LEAN_AND_MEAN + +#include +#include + +#include +#include + +#include "HardwareAddressRetriever.h" + +jbyteArray getHardwareAddress(JNIEnv* env, jstring ifName) +{ + MIB_IFTABLE* ifTable = NULL; + ULONG size = 15000; + int found = 0; + jbyteArray hwaddr = NULL; + DWORD ret = 0; + DWORD i = 0; + WCHAR* wname = NULL; + MIB_IFROW ifi; + jclass clazz = (*env)->GetObjectClass(env, ifName); + jmethodID method = (*env)->GetMethodID(env, clazz, "compareTo", "(Ljava/lang/String;)I"); + + if(method == NULL) + { + return NULL; + } + + memset(&ifi, 0x00, sizeof(MIB_IFROW)); + + do + { + ifTable = malloc(size); + + if(!ifTable) + { + /* out of memory */ + return NULL; + } + + ret = GetIfTable(ifTable, &size, 1); + + }while(ret == ERROR_INSUFFICIENT_BUFFER); + + if(ret != ERROR_SUCCESS) + { + free(ifTable); + return NULL; + } + + for(i = 0 ; i < ifTable->dwNumEntries ; i++) + { + jstring tmp = NULL; + ifi = ifTable->table[i]; + + if(ifi.dwType == IF_TYPE_OTHER) + { + continue; + } + + /* jstring created by NewStringUTF will be garbage collected at + * the end of the function + */ + tmp = (*env)->NewStringUTF(env, ifi.bDescr); + + if(!tmp) + { + /* printf("error\n"); */ + continue; + } + + if((*env)->CallIntMethod(env, ifName, method, tmp) == 0) + { + found = 1; + break; + } + } + + if(found) + { + DWORD hwlen = ifi.dwPhysAddrLen; + + if(hwlen > 0) + { + hwaddr = (*env)->NewByteArray(env, hwlen); + + if(hwaddr) + { + /* copy the hardware address and return it */ + (*env)->SetByteArrayRegion(env, hwaddr, 0, hwlen, ifi.bPhysAddr); + } + } + } + + /* cleanup */ + free(ifTable); + + return hwaddr; +} + +#endif + diff --git a/src/native/hwaddressretriever/net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever.c b/src/native/hwaddressretriever/net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever.c new file mode 100644 index 000000000..5e8d94408 --- /dev/null +++ b/src/native/hwaddressretriever/net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever.c @@ -0,0 +1,35 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ + +/** + * \file net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever.h + * \brief Hardware address retriever. + * \author Sebastien Vincent + * \date 2010 + */ + +#include +#include + +#include + +#include "HardwareAddressRetriever.h" + +/** + * \brief Returns the byte array representing hardware address. + * \param env JVM environment + * \param clazz Java class + * \param ifName name of the interface + * \return byte array representing the hardware address or NULL if anything + * goes wrong + */ +JNIEXPORT jbyteArray JNICALL Java_net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever_getHardwareAddress + (JNIEnv* env, jclass clazz, jstring ifName) +{ + return getHardwareAddress(env, ifName); +} + diff --git a/src/native/hwaddressretriever/net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever.h b/src/native/hwaddressretriever/net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever.h new file mode 100644 index 000000000..528674185 --- /dev/null +++ b/src/native/hwaddressretriever/net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever */ + +#ifndef _Included_net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever +#define _Included_net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever + * Method: getHardwareAddress + * Signature: (Ljava/lang/String;)[B + */ +JNIEXPORT jbyteArray JNICALL Java_net_java_sip_communicator_impl_netaddr_HardwareAddressRetriever_getHardwareAddress + (JNIEnv *, jclass, jstring); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/net/java/sip/communicator/impl/netaddr/HardwareAddressRetriever.java b/src/net/java/sip/communicator/impl/netaddr/HardwareAddressRetriever.java new file mode 100644 index 000000000..823342582 --- /dev/null +++ b/src/net/java/sip/communicator/impl/netaddr/HardwareAddressRetriever.java @@ -0,0 +1,33 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.netaddr; + +/** + * Class to retrieve hardware address of a specific interface. + * + * We know that starting Java 6, NetworkInterface has getHardwareAddress method + * but as we still support Java 5 we have to do it ourself. + * + * @author Sebastien Vincent + */ +public class HardwareAddressRetriever +{ + /* load library */ + static + { + System.loadLibrary("hwaddressretriever"); + } + + /** + * Returns the hardware address of a particular interface. + * + * @param ifName name of the interface + * @return byte array representing the hardware address of the interface or + * null if interface is not found or other system related errors + */ + public static native byte[] getHardwareAddress(String ifName); +} diff --git a/src/net/java/sip/communicator/impl/netaddr/NetworkAddressManagerServiceImpl.java b/src/net/java/sip/communicator/impl/netaddr/NetworkAddressManagerServiceImpl.java index 11cbcab04..042a7d806 100644 --- a/src/net/java/sip/communicator/impl/netaddr/NetworkAddressManagerServiceImpl.java +++ b/src/net/java/sip/communicator/impl/netaddr/NetworkAddressManagerServiceImpl.java @@ -6,6 +6,7 @@ */ package net.java.sip.communicator.impl.netaddr; +import java.lang.reflect.*; import java.beans.*; import java.io.*; import java.net.*; @@ -119,7 +120,8 @@ public void stop() * @return an InetAddress instance representing the local host, and that * a socket can bind upon or distribute to peers as a contact address. */ - public synchronized InetAddress getLocalHost(InetAddress intendedDestination) + public synchronized InetAddress getLocalHost( + InetAddress intendedDestination) { InetAddress localHost = null; String osVersion = System.getProperty("os.version"); @@ -128,18 +130,20 @@ public synchronized InetAddress getLocalHost(InetAddress intendedDestination) logger.trace( "Querying a localhost addr for dst=" + intendedDestination); - /* use native code (JNI) to find source address for a specific destination - * address on Windows XP SP1 and over. + /* use native code (JNI) to find source address for a specific + * destination address on Windows XP SP1 and over. * * For other systems, we used method based on DatagramSocket.connect * which will returns us source address. The reason why we cannot use it - * on Windows is because its socket implementation returns the any address... + * on Windows is because its socket implementation returns the any + * address... */ if(OSUtils.IS_WINDOWS && !osVersion.startsWith("4") && /* 95/98/Me/NT */ !osVersion.startsWith("5.0")) /* 2000 */ { - byte[] src = Win32LocalhostRetriever.getSourceForDestination(intendedDestination.getAddress()); + byte[] src = Win32LocalhostRetriever.getSourceForDestination( + intendedDestination.getAddress()); if(src == null) { @@ -160,7 +164,8 @@ public synchronized InetAddress getLocalHost(InetAddress intendedDestination) else { - //no point in making sure that the localHostFinderSocket is initialized. + //no point in making sure that the localHostFinderSocket is + //initialized. //better let it through a NullPointerException. localHostFinderSocket.connect(intendedDestination, RANDOM_ADDR_DISC_PORT); @@ -235,8 +240,8 @@ public synchronized InetAddress getLocalHost(InetAddress intendedDestination) if (!(localHost instanceof Inet4Address)) { // return the first non localhost interface we find. - Enumeration interfaces = NetworkInterface - .getNetworkInterfaces(); + Enumeration interfaces = + NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { @@ -278,6 +283,51 @@ public synchronized InetAddress getLocalHost(InetAddress intendedDestination) return localHost; } + /** + * Returns the hardware address (i.e. MAC address) of the specified + * interface name. + * + * @param iface the NetworkInterface + * @return array of bytes representing the layer 2 address or null if + * interface does not exist + */ + public byte[] getHardwareAddress(NetworkInterface iface) + { + String ifName = null; + byte hwAddress[] = null; + + /* try reflection */ + try + { + Method method = iface.getClass(). + getMethod("getHardwareAddress"); + + if(method != null) + { + hwAddress = (byte[])method.invoke(iface, new Object[]{}); + return hwAddress; + } + } + catch(Exception e) + { + } + + /* maybe getHardwareAddress not available on this JVM try + * with our JNI + */ + if(OSUtils.IS_WINDOWS) + { + ifName = iface.getDisplayName(); + } + else + { + ifName = iface.getName(); + } + + hwAddress = HardwareAddressRetriever.getHardwareAddress(ifName); + + return hwAddress; + } /** * Tries to obtain an for the specified port. @@ -556,8 +606,8 @@ public StunCandidateHarvester discoverStunServer(String domainName, if(srvrAddress != null) { - //yay! we seem to have a TURN server, so we'll be using it for both - //TURN and STUN harvesting. + //yay! we seem to have a TURN server, so we'll be using it for + //both TURN and STUN harvesting. return new TurnCandidateHarvester( new TransportAddress(srvrAddress, Transport.UDP), new LongTermCredential(userName, password)); diff --git a/src/net/java/sip/communicator/service/netaddr/NetworkAddressManagerService.java b/src/net/java/sip/communicator/service/netaddr/NetworkAddressManagerService.java index 0893e33a6..90737e412 100644 --- a/src/net/java/sip/communicator/service/netaddr/NetworkAddressManagerService.java +++ b/src/net/java/sip/communicator/service/netaddr/NetworkAddressManagerService.java @@ -7,7 +7,6 @@ package net.java.sip.communicator.service.netaddr; import java.net.*; -import java.text.*; import java.io.*; import org.ice4j.ice.*; @@ -90,6 +89,15 @@ public InetSocketAddress getPublicAddressFor( throws IOException, BindException; + /** + * Returns the hardware address (i.e. MAC address) of the specified + * interface name. + * + * @param iface the NetworkInterface + * @return array of bytes representing the layer 2 address + */ + public byte[] getHardwareAddress(NetworkInterface iface); + /** * Creates a DatagramSocket and binds it to on the specified * localAddress and a port in the range specified by the