We can now tell WLAN interfaces from wired interfaces on Windows.
authorThomas Lopatic <thomas@lopatic.de>
Wed, 15 Sep 2004 10:10:33 +0000 (10:10 +0000)
committerThomas Lopatic <thomas@lopatic.de>
Wed, 15 Sep 2004 10:10:33 +0000 (10:10 +0000)
12 files changed:
README-WIN32.txt
gui/win32/Frontend.ncb
gui/win32/Frontend.opt
gui/win32/Main/Frontend.clw
gui/win32/Main/FrontendDlg.cpp
gui/win32/Main/FrontendDlg.h
gui/win32/Main/MyDialog2.cpp
gui/win32/Main/MyDialog2.h
gui/win32/Main/MyDialog3.cpp
gui/win32/Main/MyTabCtrl.cpp
gui/win32/Main/MyTabCtrl.h
src/win32/ifnet.c

index 1aaa928..f1ed505 100644 (file)
@@ -45,6 +45,12 @@ how this version differs from the original Linux version.
   addresses to enable you to find out which made-up interface name
   corresponds to which of your physical interfaces.
 
+  "+" in front of the IP addresses means that the OLSR server has
+  identified the interface as a WLAN interface. "-" indicates that the
+  OLSR server considers this interface to be a wired interface. "?"
+  means "no idea". Detection currently only works on NT, 2000, and
+  XP. Windows 9x and ME will always display "?".
+
   For techies: The made-up names consist of the string "if" followed
   by a two-digit hex representation of the least significant byte of
   the Windows-internal interface index, which should be different for
@@ -131,13 +137,6 @@ how this version differs from the original Linux version.
 
     * Link layer statistics.
 
-    * WLAN interface detection. The Windows port does not recognize
-      whether an interface is a WLAN interface or a wired LAN
-      interface. All specified interfaces are assumed to be WLAN
-      interfaces. So, for example, specifying a different HELLO
-      interval for wired interfaces does not currently work. Instead,
-      the HELLO interval for WLAN interfaces is always used.
-
     * Gateway tunnelling. This is currently experimental on
       Windows. It is intended to work reliably on Windows 2000 and
       Windows XP in a later version. It is based on the ipinip.sys
@@ -234,4 +233,4 @@ please bear with me if there are any problems. Please do also feel
 free to suggest any features that you'd like to see in future
 releases.
 
-Thomas Lopatic <thomas@lopatic.de>, 2004-09-14
+Thomas Lopatic <thomas@lopatic.de>, 2004-09-15
index ebe15c6..31adf84 100644 (file)
Binary files a/gui/win32/Frontend.ncb and b/gui/win32/Frontend.ncb differ
index 1c5aeb6..5fdb258 100644 (file)
Binary files a/gui/win32/Frontend.opt and b/gui/win32/Frontend.opt differ
index 720fa52..37e589f 100644 (file)
@@ -19,10 +19,10 @@ Class7=MyEdit
 Class8=MyTabCtrl\r
 \r
 ResourceCount=5\r
-Resource1=IDD_DIALOG1\r
-Resource2=IDD_DIALOG2\r
-Resource3=IDD_DIALOG3\r
-Resource4=IDD_FRONTEND_DIALOG\r
+Resource1=IDD_DIALOG3\r
+Resource2=IDD_FRONTEND_DIALOG\r
+Resource3=IDD_DIALOG1\r
+Resource4=IDD_DIALOG2\r
 Resource5=IDD_DIALOG4\r
 \r
 [CLS:CFrontendApp]\r
index 5af9f10..c27520c 100644 (file)
@@ -61,6 +61,7 @@ BEGIN_MESSAGE_MAP(CFrontendDlg, CDialog)
        //}}AFX_MSG_MAP\r
 END_MESSAGE_MAP()\r
 \r
+#if 0\r
 static void HexDump(unsigned char *Mem, int Len)\r
 {\r
        char Buff[10000];\r
@@ -94,6 +95,7 @@ static void HexDump(unsigned char *Mem, int Len)
 \r
        ::MessageBox(NULL, Buff, "HEXDUMP", MB_OK);\r
 }\r
+#endif\r
 \r
 // XXX - pretty inefficient\r
 \r
@@ -562,13 +564,14 @@ unsigned int CFrontendDlg::LogThreadFunc(void)
                                if (PipeMode == PIPE_MODE_RUN)\r
                                        m_TabCtrl.m_Dialog1.AddOutputLine(Line);\r
 \r
-                               else if (Line.GetLength() > 6 && Line[0] == 'i' && Line[1] == 'f')\r
+                               else if (Line.GetLength() > 8 && Line[0] == 'i' && Line[1] == 'f')\r
                                {\r
                                        Int = Line.Mid(0, 4);\r
                                        Int.MakeUpper();\r
 \r
                                        Interfaces.Add(Int);\r
-                                       Addresses.Add(Line.Mid(6));\r
+                                       IsWlan.Add(Line.Mid(6, 1));\r
+                                       Addresses.Add(Line.Mid(8));\r
                                }\r
 \r
                                Line.Empty();\r
@@ -867,7 +870,7 @@ BOOL CFrontendDlg::OnInitDialog()
        m_TabCtrl.InsertItem(2, "Nodes");\r
        m_TabCtrl.InsertItem(3, "Routes");\r
 \r
-       m_TabCtrl.InitTabDialogs(&Interfaces, &Addresses);\r
+       m_TabCtrl.InitTabDialogs(&Interfaces, &Addresses, &IsWlan);\r
 \r
        m_StopButton.EnableWindow(FALSE);\r
 \r
index 3fae975..3f47467 100644 (file)
@@ -86,6 +86,7 @@ protected:
 \r
        CStringArray Interfaces;\r
        CStringArray Addresses;\r
+       CStringArray IsWlan;\r
 \r
        HANDLE OutRead, InWrite;\r
        HANDLE ShimProc;\r
index 741fc30..891ebe9 100644 (file)
@@ -165,7 +165,13 @@ void MyDialog2::Reset(void)
        m_TunnelCheck.SetCheck(FALSE);\r
 \r
        for (i = 0; i < Interfaces->GetSize(); i++)\r
-               m_InterfaceList.SetCheck(i, TRUE);\r
+       {\r
+               if ((*IsWlan)[i] == "-")\r
+                       m_InterfaceList.SetCheck(i, FALSE);\r
+\r
+               else\r
+                       m_InterfaceList.SetCheck(i, TRUE);\r
+       }\r
 \r
        m_ManualWindow.SetWindowText("");\r
 }\r
index eb6aff1..722eb67 100644 (file)
@@ -41,6 +41,7 @@ public:
 \r
        CStringArray *Interfaces;\r
        CStringArray *Addresses;\r
+       CStringArray *IsWlan;\r
 \r
        //{{AFX_DATA(MyDialog2)\r
        enum { IDD = IDD_DIALOG2 };\r
index 0ed47cd..81b3235 100644 (file)
@@ -257,6 +257,8 @@ void MyDialog3::OnItemchangedNodeList(NMHDR* pNMHDR, LRESULT* pResult)
        int Idx;\r
        int Num;\r
 \r
+       pNMHDR = pNMHDR;\r
+\r
        *pResult = 0;\r
 \r
        Item = m_NodeList.GetNextItem(-1, LVNI_SELECTED);\r
index 01aa2ab..43a8783 100644 (file)
@@ -45,7 +45,8 @@ BEGIN_MESSAGE_MAP(MyTabCtrl, CTabCtrl)
 END_MESSAGE_MAP()\r
 \r
 void MyTabCtrl::InitTabDialogs(CStringArray *Interfaces,\r
-                                                          CStringArray *Addresses)\r
+                                                          CStringArray *Addresses,\r
+                                                          CStringArray *IsWlan)\r
 {\r
        int i;\r
        CRect Client;\r
@@ -53,6 +54,7 @@ void MyTabCtrl::InitTabDialogs(CStringArray *Interfaces,
 \r
        m_Dialog2.Interfaces = Interfaces;\r
        m_Dialog2.Addresses = Addresses;\r
+       m_Dialog2.IsWlan = IsWlan;\r
 \r
        m_Dialog1.Create(GetParent());\r
        m_Dialog2.Create(GetParent());\r
index 8586d64..ad097bb 100644 (file)
@@ -42,7 +42,7 @@ public:
        class MyDialog3 m_Dialog3;\r
        class MyDialog4 m_Dialog4;\r
 \r
-       void InitTabDialogs(CStringArray *, CStringArray *);\r
+       void InitTabDialogs(CStringArray *, CStringArray *, CStringArray *);\r
        void DisplayTabDialog(void);\r
 \r
        //{{AFX_VIRTUAL(MyTabCtrl)\r
index ef46522..4d55b34 100644 (file)
@@ -72,7 +72,8 @@ static int IntNameToMiniIndex(int *MiniIndex, char *String)
   int i, k;
   char ch;
 
-  if (String[0] != 'i' || String[1] != 'f')
+  if ((String[0] != 'i' && String[0] != 'I') ||
+      (String[1] != 'f' && String[1] != 'F'))
     return -1;
 
   *MiniIndex = 0;
@@ -95,6 +96,50 @@ static int IntNameToMiniIndex(int *MiniIndex, char *String)
   return 0;
 }
 
+static int MiniIndexToGuid(char *Guid, int MiniIndex)
+{
+  IP_ADAPTER_INFO AdInfo[MAX_INTERFACES], *Walker;
+  unsigned long AdInfoLen;
+  unsigned long Res;
+  
+  if (ipversion == AF_INET6)
+  {
+    fprintf(stderr, "IPv6 not supported by MiniIndexToGuid()!\n");
+    return -1;
+  }
+
+  AdInfoLen = sizeof (AdInfo);
+
+  Res = GetAdaptersInfo(AdInfo, &AdInfoLen);
+
+  if (Res != NO_ERROR)
+  {
+    fprintf(stderr, "GetAdaptersInfo() = %08lx, %s", GetLastError(),
+            StrError(Res));
+    return -1;
+  }
+
+  for (Walker = AdInfo; Walker != NULL; Walker = Walker->Next)
+  {
+    olsr_printf(5, "Index = %08x\n", Walker->Index);
+
+    if ((Walker->Index & 255) == MiniIndex)
+      break;
+  }
+
+  if (Walker != NULL)
+  {
+    olsr_printf(5, "Found interface.\n");
+
+    strcpy(Guid, Walker->AdapterName);
+    return 0;
+  }
+
+  olsr_printf(5, "Cannot map mini index %02x to an adapter GUID.\n",
+              MiniIndex);
+  return -1;
+}
+
 static int AddrToIndex(int *Index, unsigned int Addr)
 {
   unsigned int IntAddr;
@@ -145,6 +190,74 @@ static int AddrToIndex(int *Index, unsigned int Addr)
   return -1;
 }
 
+#if !defined OID_802_11_CONFIGURATION
+#define OID_802_11_CONFIGURATION 0x0d010211
+#endif
+
+#if !defined IOCTL_NDIS_QUERY_GLOBAL_STATS
+#define IOCTL_NDIS_QUERY_GLOBAL_STATS 0x00170002
+#endif
+
+static int IsWireless(char *IntName)
+{
+  int MiniIndex;
+  char DevName[43];
+  HANDLE DevHand;
+  unsigned int ErrNo;
+  unsigned int Oid;
+  unsigned char OutBuff[100];
+  unsigned long OutBytes;
+
+  if (IntNameToMiniIndex(&MiniIndex, IntName) < 0)
+    return -1;
+
+  DevName[0] = '\\';
+  DevName[1] = '\\';
+  DevName[2] = '.';
+  DevName[3] = '\\';
+
+  if (MiniIndexToGuid(DevName + 4, MiniIndex) < 0)
+    return -1;
+
+  olsr_printf(5, "Checking whether interface %s is wireless.\n", DevName);
+
+  DevHand = CreateFile(DevName, GENERIC_READ,
+                       FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+                       FILE_ATTRIBUTE_NORMAL, NULL);
+
+  if (DevHand == INVALID_HANDLE_VALUE)
+  {
+    ErrNo = GetLastError();
+
+    olsr_printf(5, "CreateFile() = %08lx, %s\n", ErrNo, StrError(ErrNo));
+    return -1;
+  }
+
+  Oid = OID_802_11_CONFIGURATION;
+
+  if (!DeviceIoControl(DevHand, IOCTL_NDIS_QUERY_GLOBAL_STATS,
+                       &Oid, sizeof (Oid),
+                       OutBuff, sizeof (OutBuff),
+                       &OutBytes, NULL))
+  {
+    ErrNo = GetLastError();
+
+    CloseHandle(DevHand);
+
+    if (ErrNo == ERROR_GEN_FAILURE)
+    {
+      olsr_printf(5, "OID not supported. Device probably not wireless.\n");
+      return 0;
+    }
+
+    olsr_printf(5, "DeviceIoControl() = %08lx, %s\n", ErrNo, StrError(ErrNo));
+    return -1;
+  }
+
+  CloseHandle(DevHand);
+  return 1;
+}
+
 void ListInterfaces(void)
 {
   IP_ADAPTER_INFO AdInfo[MAX_INTERFACES], *Walker;
@@ -152,6 +265,7 @@ void ListInterfaces(void)
   char IntName[5];
   IP_ADDR_STRING *Walker2;
   unsigned long Res;
+  int IsWlan;
   
   if (ipversion == AF_INET6)
   {
@@ -181,7 +295,18 @@ void ListInterfaces(void)
 
     MiniIndexToIntName(IntName, Walker->Index);
 
-    printf("%s:", IntName);
+    printf("%s: ", IntName);
+
+    IsWlan = IsWireless(IntName);
+
+    if (IsWlan < 0)
+      printf("?");
+
+    else if (IsWlan == 0)
+      printf("-");
+
+    else
+      printf("+");
 
     for (Walker2 = &Walker->IpAddressList; Walker2 != NULL;
          Walker2 = Walker2->Next)
@@ -463,6 +588,7 @@ int chk_if_up(struct if_name *IntName, int DebugLevel)
   int Index;
   unsigned int AddrSockAddr;
   struct ifchgf *Walker;
+  int IsWlan;
   
   if (ipversion == AF_INET6)
   {
@@ -489,7 +615,15 @@ int chk_if_up(struct if_name *IntName, int DebugLevel)
   strcpy(New->int_name, IntName->name);
 
   New->if_nr = IntName->index;
-  New->is_wireless = 1;
+
+  IsWlan = IsWireless(IntName->name);
+
+  if (IsWlan < 0)
+    New->is_wireless = 1;
+
+  else
+    New->is_wireless = IsWlan;
+
   New->olsr_seqnum = random() & 0xffff;
     
   olsr_printf(1, "\tInterface %s set up for use with index %d\n\n",