Daily Archives: 8 November 2016


IEEE Region 8 Porto 2016 1

This application holds all the reports and basic information of the 107th IEEE Region 8 Committee Meeting held in Porto on 24-25 of September 2016.

You will find:

  • The Agenda Book
  • All available OpCom reports
  • All available Committee reports
  • All available Section reports
  • Meeting schedule
  • Order of the day
  • Travel information

Get it on Google Play

This slideshow requires JavaScript.

Advertisements

Building SnoopSnitch on Ubuntu 16.10 64bit

Step A: Update the system and install all necessary packages

sudo dpkg --add-architecture i386;
sudo apt-get update;
sudo apt-get upgrade -y;
sudo apt-get install git openjdk-8-jdk dh-autoreconf ant libncurses5:i386 libstdc++6:i386 zlib1g:i386 -y;
cd ~/;
mkdir Android;
cd Android;

Step B: Download the Android SDK and install all required packages

The following download link we got it from this page https://developer.android.com/studio/

wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz;
tar -xf android-sdk_r24.4.1-linux.tgz;
cd android-sdk-linux/tools;
#To list all available packages, including the obsolete extra-android-support
#./android list sdk --all –extended;
./android update sdk --no-ui --all --filter extra-android-support,tools,platform-tools,build-tools-19.1.0,android-19;

You will get a prompt for a license agreement, you need to type Y to proceed

November 20, 2015
Do you accept the license 'android-sdk-license-c81a61d9' [y/n]: y
cd ../..;
export ANDROID_HOME=`pwd`/android-sdk-linux;

Step C: Once the installation is complete, we need to install the Android NDK.

The following link we got it from https://developer.android.com/ndk/downloads/

wget https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip;
unzip -q android-ndk-r13b-linux-x86_64.zip;
export NDK_DIR=`pwd`/android-ndk-r13b;
#If we do not update the PATH we will get the following error: ../libtool: line 1719: arm-linux-androideabi-ranlib: command not found
PATH=$PATH:`pwd`/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin;
mkdir Projects;
cd Projects;

Step D: Afterwards, we can download SnoopSnitch and all of the git submodules of it using the following command.

git clone --recursive https://opensource.srlabs.de/git/snoopsnitch.git;

Step E: Then we need to compile two separate parts of the project.

We will start by compiling contrib/ projects, that are the supplementary projects needed for SnoopSnitch to get data.

cd snoopsnitch/contrib/;
./compile.sh -t android -u;
cd ..;

Step F: Finally, we can proceed to compile the android project of SnoopSnitch.

cd ./SnoopSnitch;

We need to update Application.mk and add APP_ABI := armeabi to it.
We do this to make sure that we compile  diag-helper.c only for armeabi as the rest of the packages will be available only on that architecture.
If we do not do this and we have a processor that supports armeabi-v7a (or different), then it will only install diag-helper.so and it will ignore the rest. Which will of course cause the application to fail.

echo "APP_ABI := armeabi" >> jni/Application.mk;
ant debug;
~/Android/android-sdk-linux/platform-tools/adb start-server

Once the compilation is complete, we can upload our apk to a device using the following commands:

#First we make sure that the adb server is running
$ANDROID_HOME/platform-tools/adb start-server;
#Then we check that our device is visible to the adb
$ANDROID_HOME/platform-tools/adb devices;
#Finally, we install the application to the device.
$ANDROID_HOME/platform-tools/adb install bin/SnoopSnitch-debug.apk;

This guide was tested on freshly installed Ubuntu 16.10 64bit.

snoopsnitch-map

Useful links


VirtualBox: Failed to attach the USB device to the virtual machine 25

Recently we were using a Windows 10 64bit machine which had Oracle VirtualBox installed.
At some point all USB devices stopped mounting on the guest systems.
We would get errors similar to the following:

Failed to attach the USB device OnePlus A0001 [0232] to the virtual machine Ubuntu.

USB device 'OnePlus A0001' with UUID {544e5582-9e77-4301-a538-5326cf2250c0} is busy with a previous request. Please try again later.

Result Code: E_INVALIDARG (0x80070057)
Component: HostUSBDeviceWrap
Interface: IHostUSBDevice {c19073dd-cc7b-431b-98b2-951fda8eab89}

Callee: IConsole {872da645-4a9b-1727-bee2-5585105b9eed}

USB device  with UUID  is busy with a previous request. Please try again later.

After a couple of restarts of both the guest and the host machines we realized that this time, a restart was not enough to fix the error.
Right before this error occurred, we had installed Wireshark with USBPcap support.
Apparently this was the root of our problem.

Resolution:

Following are the steps we followed to solve this issue:

Step A: Delete problematic system configuration.

Press the key combination Win + R to pop up the Run prompt.
Type regedit in the input box and hit the Enter key.

regedit

On the left side of the new window, navigate to the following location:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}

upperfilters

In the right part, select the UpperFilters entry, right click it and select Delete.

delete-upperfilters
When a prompt window appear asks you to confirm that you want to delete the value, click Yes.

confirm-delete-upperfilters

Step B: Manually re-install VirtualBox USB drivers (Optional)

Just in case there is an issue with the VirtualBox USB drivers, you can re-install them to be sure everything is OK.
To do that, you can either re-install the whole VirtualBox using their installer or manually re-install the driver itself.

To re-install the VirtualBox USB driver manually, using Windows Explore navigate to this folder

C:\Program Files\Oracle\VirtualBox\drivers\USB\filter

Right click the file VBoxUSBMon.inf and select Install.

install-virtualbox-usb-driver
You will get a confirmation once the installation is complete.
Restart your machine, so that new changes will get applied.
Your USB devices should work as expected.


Compiling GobiNet on Ubuntu 16.10 64bit 5

Recently, we tried to compile the GobiNet drivers for Linux on an Ubuntu 16.10 64bit machine.

The version of GobiNet was GobiNet_2016-10-20.tar.gz ( GobiNet_2016-10-20.tar.gz (150 downloads) ).

To our surprise, we got a errors while compiling.

Solution:

Get the full project after it was patched from here: GobiNet_2016-10-20_Patched.16.10.tar.xz for Ubuntu 16.10 64bit (269 downloads)

or

Download the following patched version of QMIDevice.c and replace it on your machine QMIDevice.c patched (compressed) (239 downloads) .

Download the following patched version of GobiUSBNet.c and replace it on your machine GobiUSBNet.c patched for Ubuntu 16.10 64bit (compressed) (172 downloads) .

Errors:

First error: ‘struct net_device’ has no member named ‘trans_start’ (GobiUSBNet.c:876:8)

We removed the call to pNet->trans_start = jiffies; and replaced it with netif_trans_update(pNet); which as we can see below, it does the same thing in the end.

/* legacy drivers only, netdev_start_xmit() sets txq->trans_start */
static inline void netif_trans_update(struct net_device *dev)
{
    struct netdev_queue *txq = netdev_get_tx_queue(dev, 0);
    if (txq->trans_start != jiffies)
        txq->trans_start = jiffies;
}
GobiUSBNet.c:876 
@@ -873,7 +873,7 @@ int GobiUSBNetStartXmit( 
    complete( &pAutoPM->mThreadDoWork ); 
  
    // Start transfer timer 
-   pNet->trans_start = jiffies; 
+   netif_trans_update(pNet); 
    // Free SKB 
    dev_kfree_skb_any( pSKB );

Second error: return from incompatible pointer type [-Werror=incompatible-pointer-types] (GobiUSBNet.c:1692:13)

We got the following error:

/home/george/Downloads/gobiusbnet/GobiUSBNet.c: In function ‘__exittest’: 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c:1692:13: error: return from incompatible pointer type [-Werror=incompatible-pointer-types] 
 module_exit(GobiUSBNetModExit); 
             ^ 
./include/linux/module.h:137:11: note: in definition of macro ‘module_exit’ 
  { return exitfn; }

module_exit is defined as follows:

typedef void (*exitcall_t)(void);
#define module_exit(exitfn)                                     \
         static inline exitcall_t __exittest(void)               \
         { return exitfn; }                                      \
         void cleanup_module(void) __attribute__((alias(#exitfn)));

So we see that we need to update static int GobiUSBNetModExit(void) to become static void GobiUSBNetModExit(void) and have it return nothing.

GobiUSBNet.c:1669 
@@ -1666,11 +1666,11 @@ RETURN VALUE: 
    void 
 ===========================================================================*/ 
 // static int GobiUSBNetModExit(struct platform_device *pdev) 
-static int GobiUSBNetModExit(void) 
+static void GobiUSBNetModExit(void) 
 { 
    usb_deregister( &GobiNet ); 
    class_destroy( gpClass ); 
-   return 0; 
+   return; 
 }

Third error: passing argument 1 of ‘atomic_read’ from incompatible pointer type [-Werror=incompatible-pointer-types] (QMIDevice.c:2393:21)

On this 64bit architecture the f_count of the struct file  is defined as long (64bit) so we should not use atomic_read but atomic_long_read instead.

@@ -2390,7 +2390,7 @@ int UserspaceClose(
    }
 
    // Fallthough.  If f_count == 1 no need to do more checks
-   if (atomic_read( &pFilp->f_count ) != 1)
+   if (atomic_long_read( &pFilp->f_count ) != 1)^M
    {
       rcu_read_lock();
       for_each_process( pEachTask )

Fourth error: ‘struct file’ has no member named ‘f_dentry’ (in 9 placed of QMIDevice.c)

The error was error: struct file has no member named f_dentry
Apparently, there was a change in the struct that contained f_dentry in the kernel 3.19 source code which created this bug.

@@ -2269,7 +2269,7 @@ int UserspaceIOCTL(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
 
@@ -2427,7 +2427,7 @@ int UserspaceClose(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
    
@@ -2486,7 +2486,7 @@ ssize_t UserspaceRead(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
    
@@ -2567,7 +2567,7 @@ ssize_t UserspaceWrite(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
 
@@ -2646,7 +2646,7 @@ unsigned int UserspacePoll(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return POLLERR;
    }
 
@@ -3003,9 +3003,9 @@ void DeregisterQMIDevice( sGobiUSBNet * pDev )
             for (count = 0; count < pFDT->max_fds; count++)
             {
                pFilp = pFDT->fd[count];
-               if (pFilp != NULL &&  pFilp->f_dentry != NULL)
+               if (pFilp != NULL &&  pFilp->f_path.dentry != NULL)^M
                {
-                  if (pFilp->f_dentry->d_inode == pOpenInode)
+                  if (pFilp->f_path.dentry->d_inode == pOpenInode)^M
                   {
                      // Close this file handle
                      rcu_assign_pointer( pFDT->fd[count], NULL );                     
@@ -3050,9 +3050,9 @@ void DeregisterQMIDevice( sGobiUSBNet * pDev )
                for (count = 0; count < pFDT->max_fds; count++)
                {
                   pFilp = pFDT->fd[count];
-                  if (pFilp != NULL &&  pFilp->f_dentry != NULL)
+                  if (pFilp != NULL &&  pFilp->f_path.dentry != NULL)^M
                   {
-                     if (pFilp->f_dentry->d_inode == pOpenInode)
+                     if (pFilp->f_path.dentry->d_inode == pOpenInode)^M
                      {
                         // Close this file handle
                         rcu_assign_pointer( pFDT->fd[count], NULL );

 

Following is the original output of the make commands before and while we were patching the source files.

[email protected]:~/Downloads$ lsb_release -a 
No LSB modules are available. 
Distributor ID:    Ubuntu 
Description:    Ubuntu 16.10 
Release:    16.10 
Codename:    yakkety 
[email protected]:~/Downloads$ wget https://portland.source.codeaurora.org/patches/quic/gobi/Gobi_Linux/GobiNet_2016-10-20.tar.gz 
--2017-04-24 09:42:08--  https://portland.source.codeaurora.org/patches/quic/gobi/Gobi_Linux/GobiNet_2016-10-20.tar.gz 
Resolving portland.source.codeaurora.org (portland.source.codeaurora.org)... 198.145.29.80 
Connecting to portland.source.codeaurora.org (portland.source.codeaurora.org)|198.145.29.80|:443... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: 43818 (43K) [application/x-gzip] 
Saving to: ‘GobiNet_2016-10-20.tar.gz’ 
 
GobiNet_2016-10-20.tar.gz    100%[=============================================>]  42,79K   217KB/s    in 0,2s     
 
2017-04-24 09:42:09 (217 KB/s) - ‘GobiNet_2016-10-20.tar.gz’ saved [43818/43818] 
 
[email protected]:~/Downloads$ tar -xzf GobiNet_2016-10-20.tar.gz  
[email protected]:~/Downloads$ cd gobiusbnet/ 
[email protected]:~/Downloads/gobiusbnet$ make 
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order 
make -C /lib/modules/4.8.0-27-generic/build M=/home/george/Downloads/gobiusbnet modules 
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic' 
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o 
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c: In function ‘GobiUSBNetStartXmit’: 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c:876:8: error: ‘struct net_device’ has no member named ‘trans_start’; did you mean ‘mem_start’? 
    pNet->trans_start = jiffies; 
        ^~ 
In file included from ./include/linux/phy.h:24:0, 
                 from ./include/net/dsa.h:19, 
                 from ./include/linux/netdevice.h:44, 
                 from ./include/linux/etherdevice.h:26, 
                 from /home/george/Downloads/gobiusbnet/Structs.h:47, 
                 from /home/george/Downloads/gobiusbnet/GobiUSBNet.c:57: 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c: In function ‘__exittest’: 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c:1692:13: error: return from incompatible pointer type [-Werror=incompatible-pointer-types] 
 module_exit(GobiUSBNetModExit); 
             ^ 
./include/linux/module.h:137:11: note: in definition of macro ‘module_exit’ 
  { return exitfn; }     \ 
           ^~~~~~ 
cc1: some warnings being treated as errors 
scripts/Makefile.build:289: recipe for target '/home/george/Downloads/gobiusbnet/GobiUSBNet.o' failed 
make[2]: *** [/home/george/Downloads/gobiusbnet/GobiUSBNet.o] Error 1 
Makefile:1489: recipe for target '_module_/home/george/Downloads/gobiusbnet' failed 
make[1]: *** [_module_/home/george/Downloads/gobiusbnet] Error 2 
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic' 
Makefile:8: recipe for target 'all' failed 
make: *** [all] Error 2 
[email protected]:~/Downloads/gobiusbnet$  
 
 
GobiUSBNet.c:1669 
@@ -1666,11 +1666,11 @@ RETURN VALUE: 
    void 
 ===========================================================================*/ 
 // static int GobiUSBNetModExit(struct platform_device *pdev) 
-static int GobiUSBNetModExit(void) 
+static void GobiUSBNetModExit(void) 
 { 
    usb_deregister( &GobiNet ); 
    class_destroy( gpClass ); 
-   return 0; 
+   return; 
 } 
 
[email protected]:~/Downloads/gobiusbnet$ make all 
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order 
make -C /lib/modules/4.8.0-27-generic/build M=/home/george/Downloads/gobiusbnet modules 
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic' 
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o 
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c: In function ‘GobiUSBNetStartXmit’: 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c:876:8: error: ‘struct net_device’ has no member named ‘trans_start’; did you mean ‘mem_start’? 
    pNet->trans_start = jiffies; 
        ^~ 
scripts/Makefile.build:289: recipe for target '/home/george/Downloads/gobiusbnet/GobiUSBNet.o' failed 
make[2]: *** [/home/george/Downloads/gobiusbnet/GobiUSBNet.o] Error 1 
Makefile:1489: recipe for target '_module_/home/george/Downloads/gobiusbnet' failed 
make[1]: *** [_module_/home/george/Downloads/gobiusbnet] Error 2 
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic' 
Makefile:8: recipe for target 'all' failed 
make: *** [all] Error 2 
[email protected]:~/Downloads/gobiusbnet$  
 
  
GobiUSBNet.c:876 
@@ -873,7 +873,7 @@ int GobiUSBNetStartXmit( 
    complete( &pAutoPM->mThreadDoWork ); 
  
    // Start transfer timer 
-   pNet->trans_start = jiffies; 
+   netif_trans_update(pNet); 
    // Free SKB 
    dev_kfree_skb_any( pSKB ); 
 
[email protected]:~/Downloads/gobiusbnet$ make all 
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order 
make -C /lib/modules/4.8.0-27-generic/build M=/home/george/Downloads/gobiusbnet modules 
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic' 
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o 
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o 
  CC [M]  /home/george/Downloads/gobiusbnet/QMIDevice.o 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceIOCTL’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2272:26: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop; 
                          ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceClose’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2393:21: error: passing argument 1 of ‘atomic_read’ from incompatible pointer type [-Werror=incompatible-pointer-types] 
    if (atomic_read( &pFilp->f_count ) != 1) 
                     ^ 
In file included from ./arch/x86/include/asm/msr.h:66:0, 
                 from ./arch/x86/include/asm/processor.h:20, 
                 from ./arch/x86/include/asm/cpufeature.h:4, 
                 from ./arch/x86/include/asm/thread_info.h:52, 
                 from ./include/linux/thread_info.h:54, 
                 from ./arch/x86/include/asm/preempt.h:6, 
                 from ./include/linux/preempt.h:59, 
                 from ./include/linux/spinlock.h:50, 
                 from ./include/linux/mm_types.h:8, 
                 from ./include/linux/kmemcheck.h:4, 
                 from ./include/linux/skbuff.h:18, 
                 from ./include/linux/if_ether.h:23, 
                 from ./include/linux/etherdevice.h:25, 
                 from /home/george/Downloads/gobiusbnet/Structs.h:47, 
                 from /home/george/Downloads/gobiusbnet/QMIDevice.h:95, 
                 from /home/george/Downloads/gobiusbnet/QMIDevice.c:91: 
./arch/x86/include/asm/atomic.h:24:28: note: expected ‘const atomic_t * {aka const struct <anonymous> *}’ but argument is of type ‘atomic_long_t * {aka struct <anonymous> *}’ 
 static __always_inline int atomic_read(const atomic_t *v) 
                            ^~~~~~~~~~~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2430:26: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop; 
                          ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceRead’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2489:26: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop; 
                          ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceWrite’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2570:26: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop; 
                          ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspacePoll’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2649:26: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop; 
                          ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘DeregisterQMIDevice’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:3006:43: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
                if (pFilp != NULL &&  pFilp->f_dentry != NULL) 
                                           ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c:3008:28: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
                   if (pFilp->f_dentry->d_inode == pOpenInode) 
                            ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c:3053:46: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
                   if (pFilp != NULL &&  pFilp->f_dentry != NULL) 
                                              ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c:3055:31: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
                      if (pFilp->f_dentry->d_inode == pOpenInode) 
                               ^~ 
cc1: some warnings being treated as errors 
scripts/Makefile.build:289: recipe for target '/home/george/Downloads/gobiusbnet/QMIDevice.o' failed 
make[2]: *** [/home/george/Downloads/gobiusbnet/QMIDevice.o] Error 1 
Makefile:1489: recipe for target '_module_/home/george/Downloads/gobiusbnet' failed 
make[1]: *** [_module_/home/george/Downloads/gobiusbnet] Error 2 
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic' 
Makefile:8: recipe for target 'all' failed 
make: *** [all] Error 2 
 
     
    -               if (pFilp != NULL &&  pFilp->f_dentry != NULL) 
+               if (pFilp != NULL &&  pFilp->f_path.dentry != NULL)^M 
[email protected]:~/Downloads/gobiusbnet$ make all 
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order 
make -C /lib/modules/4.8.0-27-generic/build M=/home/george/Downloads/gobiusbnet modules 
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic' 
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o 
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o 
  CC [M]  /home/george/Downloads/gobiusbnet/QMIDevice.o 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceClose’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2393:21: error: passing argument 1 of ‘atomic_read’ from incompatible pointer type [-Werror=incompatible-pointer-types] 
    if (atomic_read( &pFilp->f_count ) != 1) 
                     ^ 
In file included from ./arch/x86/include/asm/msr.h:66:0, 
                 from ./arch/x86/include/asm/processor.h:20, 
                 from ./arch/x86/include/asm/cpufeature.h:4, 
                 from ./arch/x86/include/asm/thread_info.h:52, 
                 from ./include/linux/thread_info.h:54, 
                 from ./arch/x86/include/asm/preempt.h:6, 
                 from ./include/linux/preempt.h:59, 
                 from ./include/linux/spinlock.h:50, 
                 from ./include/linux/mm_types.h:8, 
                 from ./include/linux/kmemcheck.h:4, 
                 from ./include/linux/skbuff.h:18, 
                 from ./include/linux/if_ether.h:23, 
                 from ./include/linux/etherdevice.h:25, 
                 from /home/george/Downloads/gobiusbnet/Structs.h:47, 
                 from /home/george/Downloads/gobiusbnet/QMIDevice.h:95, 
                 from /home/george/Downloads/gobiusbnet/QMIDevice.c:91: 
./arch/x86/include/asm/atomic.h:24:28: note: expected ‘const atomic_t * {aka const struct <anonymous> *}’ but argument is of type ‘atomic_long_t * {aka struct <anonymous> *}’ 
 static __always_inline int atomic_read(const atomic_t *v) 
                            ^~~~~~~~~~~ 
cc1: some warnings being treated as errors 
scripts/Makefile.build:289: recipe for target '/home/george/Downloads/gobiusbnet/QMIDevice.o' failed 
make[2]: *** [/home/george/Downloads/gobiusbnet/QMIDevice.o] Error 1 
Makefile:1489: recipe for target '_module_/home/george/Downloads/gobiusbnet' failed 
make[1]: *** [_module_/home/george/Downloads/gobiusbnet] Error 2 
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic' 
Makefile:8: recipe for target 'all' failed 
make: *** [all] Error 2 
 
@@ -2390,7 +2390,7 @@ int UserspaceClose( 
    } 
  
    // Fallthough.  If f_count == 1 no need to do more checks 
-   if (atomic_read( &pFilp->f_count ) != 1) 
+   if (atomic_long_read( &pFilp->f_count ) != 1)^M 
    { 
       rcu_read_lock(); 
       for_each_process( pEachTask ) 
[email protected]:~/Downloads/gobiusbnet$ make all 
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order 
make -C /lib/modules/4.8.0-27-generic/build M=/home/george/Downloads/gobiusbnet modules 
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic' 
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o 
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o 
  CC [M]  /home/george/Downloads/gobiusbnet/QMIDevice.o 
  CC [M]  /home/george/Downloads/gobiusbnet/QMI.o 
  LD [M]  /home/george/Downloads/gobiusbnet/GobiNet.o 
  Building modules, stage 2. 
  MODPOST 1 modules 
  CC      /home/george/Downloads/gobiusbnet/GobiNet.mod.o 
  LD [M]  /home/george/Downloads/gobiusbnet/GobiNet.ko 
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic'

The disk is offline because it has a signature collision with another disk that is online 1

Recently, we cloned a hard disk using dd.
When we booted into Windows, the new drive was not visible.
After checking with the disk utilities, we got the following informative message:

The disk is offline because it has a signature collision with another disk that is online

To resolve the issue, we used diskpart.
To start diskpart, press the key combination Win + R which will pop up the Run prompt.
Type diskpart in the input box and hit the Enter key.

A new terminal window will appear.
Using that we identified the two disks and changed the label for the second one.

First step:

We issued list disk to get the list of disks.

DISKPART

Microsoft DiskPart version 10.0.14393.0
Copyright (C) 1999-2013 Microsoft Corporation.
On computer: BYTEFREAKS-NET

DISKPART> list disk

  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online          931 GB      0 B
  Disk 1    Offline         465 GB      0 B

Second step:

We issued select disk 1 so that we could process the disk 1 that was offline and using uniqueid disk we got the signature of the disk.

DISKPART> select disk 1
Disk 1 is now the selected disk.

DISKPART> uniqueid disk
Disk ID: 09FC13CB

Third step:

Set the signature of the disk to a random value other than the one that it already had using the command uniqueid disk ID=FFAABBCCDD

DISKPART> uniqueid disk ID=FFAABBCCDD

DISKPART> uniqueid disk
Disk ID: FFAABBCCDD

The random value must be 8 characters long and each character must be a value between 0-9 or A-F.

Finally:

Restart the machine to get both disks running.


Compiling GobiNet on Ubuntu 16.04 64bit

Recently, we tried to compile the GobiNet drivers for Linux on an Ubuntu 16.04 64bit machine.

The version of GobiNet was GobiNet_2016-10-20.tar.gz ( GobiNet_2016-10-20.tar.gz (150 downloads) ).

To our surprise, we got a errors while compiling.

Solution:

Get the full project after it was patched from here: GobiNet_2016-10-20_Patched.16.04.tar.xz for Ubuntu 16.04 64bit (180 downloads)

or

Download the following patched version of QMIDevice.c and replace it on your machine QMIDevice.c patched (compressed) (239 downloads) .

Download the following patched version of GobiUSBNet.c and replace it on your machine GobiUSBNet.c patched for Ubuntu 16.04 64bit (compressed) (120 downloads) .

Errors/Warnings:

First warning: return from incompatible pointer type [-Wincompatible-pointer-types] (GobiUSBNet.c:1692:13)

We got the following warning:

 module_exit(GobiUSBNetModExit);
             ^
include/linux/module.h:135:11: note: in definition of macro ‘module_exit’
  { return exitfn; }     \

module_exit is defined as follows:

typedef void (*exitcall_t)(void);
#define module_exit(exitfn)                                     \
         static inline exitcall_t __exittest(void)               \
         { return exitfn; }                                      \
         void cleanup_module(void) __attribute__((alias(#exitfn)));

So we see that we need to update static int GobiUSBNetModExit(void) to become static void GobiUSBNetModExit(void) and have it return nothing.

GobiUSBNet.c:1669 
@@ -1666,11 +1666,11 @@ RETURN VALUE: 
    void 
 ===========================================================================*/ 
 // static int GobiUSBNetModExit(struct platform_device *pdev) 
-static int GobiUSBNetModExit(void) 
+static void GobiUSBNetModExit(void) 
 { 
    usb_deregister( &GobiNet ); 
    class_destroy( gpClass ); 
-   return 0; 
+   return; 
 }

Second warning: passing argument 1 of ‘atomic_read’ from incompatible pointer type [-Wincompatible-pointer-types] (QMIDevice.c:2393:21)

On this 64bit architecture the f_count of the struct file  is defined as long (64bit) so we should not use atomic_read but atomic_long_read instead.

@@ -2390,7 +2390,7 @@ int UserspaceClose(
    }
 
    // Fallthough.  If f_count == 1 no need to do more checks
-   if (atomic_read( &pFilp->f_count ) != 1)
+   if (atomic_long_read( &pFilp->f_count ) != 1)^M
    {
       rcu_read_lock();
       for_each_process( pEachTask )

First error: ‘struct file’ has no member named ‘f_dentry’ (in 9 placed of QMIDevice.c)

The error was error: struct file has no member named f_dentry
Apparently, there was a change in the struct that contained f_dentry in the kernel 3.19 source code which created this bug.

@@ -2269,7 +2269,7 @@ int UserspaceIOCTL(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
 
@@ -2427,7 +2427,7 @@ int UserspaceClose(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
    
@@ -2486,7 +2486,7 @@ ssize_t UserspaceRead(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
    
@@ -2567,7 +2567,7 @@ ssize_t UserspaceWrite(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
 
@@ -2646,7 +2646,7 @@ unsigned int UserspacePoll(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return POLLERR;
    }
 
@@ -3003,9 +3003,9 @@ void DeregisterQMIDevice( sGobiUSBNet * pDev )
             for (count = 0; count < pFDT->max_fds; count++)
             {
                pFilp = pFDT->fd[count];
-               if (pFilp != NULL &&  pFilp->f_dentry != NULL)
+               if (pFilp != NULL &&  pFilp->f_path.dentry != NULL)^M
                {
-                  if (pFilp->f_dentry->d_inode == pOpenInode)
+                  if (pFilp->f_path.dentry->d_inode == pOpenInode)^M
                   {
                      // Close this file handle
                      rcu_assign_pointer( pFDT->fd[count], NULL );                     
@@ -3050,9 +3050,9 @@ void DeregisterQMIDevice( sGobiUSBNet * pDev )
                for (count = 0; count < pFDT->max_fds; count++)
                {
                   pFilp = pFDT->fd[count];
-                  if (pFilp != NULL &&  pFilp->f_dentry != NULL)
+                  if (pFilp != NULL &&  pFilp->f_path.dentry != NULL)^M
                   {
-                     if (pFilp->f_dentry->d_inode == pOpenInode)
+                     if (pFilp->f_path.dentry->d_inode == pOpenInode)^M
                      {
                         // Close this file handle
                         rcu_assign_pointer( pFDT->fd[count], NULL );

Following is the original output of the make commands before and while we were patching the source files.

[email protected]:~/Downloads$ lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 16.04.1 LTS
Release:    16.04
Codename:    xenial

[email protected]:~/Downloads$ wget https://portland.source.codeaurora.org/patches/quic/gobi/Gobi_Linux/GobiNet_2016-10-20.tar.gz
--2017-04-24 10:05:54--  https://portland.source.codeaurora.org/patches/quic/gobi/Gobi_Linux/GobiNet_2016-10-20.tar.gz
Resolving portland.source.codeaurora.org (portland.source.codeaurora.org)... 198.145.29.80
Connecting to portland.source.codeaurora.org (portland.source.codeaurora.org)|198.145.29.80|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 43818 (43K) [application/x-gzip]
Saving to: ‘GobiNet_2016-10-20.tar.gz’

GobiNet_2016-10-20.tar 100%[===========================>]  42,79K   111KB/s    in 0,4s    

2017-04-24 10:05:56 (111 KB/s) - ‘GobiNet_2016-10-20.tar.gz’ saved [43818/43818]

[email protected]:~/Downloads$ tar -xzf GobiNet_2016-10-20.tar.gz 
[email protected]:~/Downloads$ cd gobiusbnet/
[email protected]:~/Downloads/gobiusbnet$ make
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order
make -C /lib/modules/4.4.0-57-generic/build M=/home/george/Downloads/gobiusbnet modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-57-generic'
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o
In file included from include/linux/phy.h:22:0,
                 from include/net/dsa.h:19,
                 from include/linux/netdevice.h:44,
                 from include/linux/etherdevice.h:26,
                 from /home/george/Downloads/gobiusbnet/Structs.h:47,
                 from /home/george/Downloads/gobiusbnet/GobiUSBNet.c:57:
/home/george/Downloads/gobiusbnet/GobiUSBNet.c: In function ‘__exittest’:
/home/george/Downloads/gobiusbnet/GobiUSBNet.c:1692:13: warning: return from incompatible pointer type [-Wincompatible-pointer-types]
 module_exit(GobiUSBNetModExit);
             ^
include/linux/module.h:135:11: note: in definition of macro ‘module_exit’
  { return exitfn; }     \
           ^
  CC [M]  /home/george/Downloads/gobiusbnet/QMIDevice.o
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceIOCTL’:
/home/george/Downloads/gobiusbnet/QMIDevice.c:2272:26: error: ‘struct file’ has no member named ‘f_dentry’
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
                          ^
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceClose’:
/home/george/Downloads/gobiusbnet/QMIDevice.c:2393:21: warning: passing argument 1 of ‘atomic_read’ from incompatible pointer type [-Wincompatible-pointer-types]
    if (atomic_read( &pFilp->f_count ) != 1)
                     ^
In file included from include/linux/atomic.h:4:0,
                 from ./arch/x86/include/asm/thread_info.h:53,
                 from include/linux/thread_info.h:54,
                 from ./arch/x86/include/asm/preempt.h:6,
                 from include/linux/preempt.h:59,
                 from include/linux/spinlock.h:50,
                 from include/linux/mm_types.h:8,
                 from include/linux/kmemcheck.h:4,
                 from include/linux/skbuff.h:18,
                 from include/linux/if_ether.h:23,
                 from include/linux/etherdevice.h:25,
                 from /home/george/Downloads/gobiusbnet/Structs.h:47,
                 from /home/george/Downloads/gobiusbnet/QMIDevice.h:95,
                 from /home/george/Downloads/gobiusbnet/QMIDevice.c:91:
./arch/x86/include/asm/atomic.h:25:28: note: expected ‘const atomic_t * {aka const struct <anonymous> *}’ but argument is of type ‘atomic_long_t * {aka struct <anonymous> *}’
 static __always_inline int atomic_read(const atomic_t *v)
                            ^
/home/george/Downloads/gobiusbnet/QMIDevice.c:2430:26: error: ‘struct file’ has no member named ‘f_dentry’
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
                          ^
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceRead’:
/home/george/Downloads/gobiusbnet/QMIDevice.c:2489:26: error: ‘struct file’ has no member named ‘f_dentry’
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
                          ^
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceWrite’:
/home/george/Downloads/gobiusbnet/QMIDevice.c:2570:26: error: ‘struct file’ has no member named ‘f_dentry’
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
                          ^
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspacePoll’:
/home/george/Downloads/gobiusbnet/QMIDevice.c:2649:26: error: ‘struct file’ has no member named ‘f_dentry’
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
                          ^
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘DeregisterQMIDevice’:
/home/george/Downloads/gobiusbnet/QMIDevice.c:3006:43: error: ‘struct file’ has no member named ‘f_dentry’
                if (pFilp != NULL &&  pFilp->f_dentry != NULL)
                                           ^
/home/george/Downloads/gobiusbnet/QMIDevice.c:3008:28: error: ‘struct file’ has no member named ‘f_dentry’
                   if (pFilp->f_dentry->d_inode == pOpenInode)
                            ^
/home/george/Downloads/gobiusbnet/QMIDevice.c:3053:46: error: ‘struct file’ has no member named ‘f_dentry’
                   if (pFilp != NULL &&  pFilp->f_dentry != NULL)
                                              ^
/home/george/Downloads/gobiusbnet/QMIDevice.c:3055:31: error: ‘struct file’ has no member named ‘f_dentry’
                      if (pFilp->f_dentry->d_inode == pOpenInode)
                               ^
scripts/Makefile.build:258: recipe for target '/home/george/Downloads/gobiusbnet/QMIDevice.o' failed
make[2]: *** [/home/george/Downloads/gobiusbnet/QMIDevice.o] Error 1
Makefile:1420: recipe for target '_module_/home/george/Downloads/gobiusbnet' failed
make[1]: *** [_module_/home/george/Downloads/gobiusbnet] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-57-generic'
Makefile:8: recipe for target 'all' failed
make: *** [all] Error 2


[email protected]:~/Downloads/gobiusbnet$ git diff
diff --git a/GobiUSBNet.c b/GobiUSBNet.c
index b8151e2..3b88372 100644
--- a/GobiUSBNet.c
+++ b/GobiUSBNet.c
@@ -1666,11 +1666,11 @@ RETURN VALUE:
    void
 ===========================================================================*/
 // static int GobiUSBNetModExit(struct platform_device *pdev)
-static int GobiUSBNetModExit(void)
+static void GobiUSBNetModExit(void)
 {
    usb_deregister( &GobiNet );
    class_destroy( gpClass );
-   return 0;
+   return;
 }
 
 #if 0
diff --git a/QMIDevice.c b/QMIDevice.c
index e7b3f72..6be39a6 100644
--- a/QMIDevice.c
+++ b/QMIDevice.c
@@ -2269,7 +2269,7 @@ int UserspaceIOCTL(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
 
@@ -2390,7 +2390,7 @@ int UserspaceClose(
    }
 
    // Fallthough.  If f_count == 1 no need to do more checks
-   if (atomic_read( &pFilp->f_count ) != 1)
+   if (atomic_long_read( &pFilp->f_count ) != 1)^M
    {
       rcu_read_lock();
       for_each_process( pEachTask )
@@ -2427,7 +2427,7 @@ int UserspaceClose(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
    
@@ -2486,7 +2486,7 @@ ssize_t UserspaceRead(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
    
@@ -2567,7 +2567,7 @@ ssize_t UserspaceWrite(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
 
@@ -2646,7 +2646,7 @@ unsigned int UserspacePoll(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return POLLERR;
    }
 
@@ -3003,9 +3003,9 @@ void DeregisterQMIDevice( sGobiUSBNet * pDev )
             for (count = 0; count < pFDT->max_fds; count++)
             {
                pFilp = pFDT->fd[count];
-               if (pFilp != NULL &&  pFilp->f_dentry != NULL)
+               if (pFilp != NULL &&  pFilp->f_path.dentry != NULL)^M
                {
-                  if (pFilp->f_dentry->d_inode == pOpenInode)
+                  if (pFilp->f_path.dentry->d_inode == pOpenInode)^M
                   {
                      // Close this file handle
                      rcu_assign_pointer( pFDT->fd[count], NULL );                     
@@ -3050,9 +3050,9 @@ void DeregisterQMIDevice( sGobiUSBNet * pDev )
                for (count = 0; count < pFDT->max_fds; count++)
                {
                   pFilp = pFDT->fd[count];
-                  if (pFilp != NULL &&  pFilp->f_dentry != NULL)
+                  if (pFilp != NULL &&  pFilp->f_path.dentry != NULL)^M
                   {
-                     if (pFilp->f_dentry->d_inode == pOpenInode)
+                     if (pFilp->f_path.dentry->d_inode == pOpenInode)^M
                      {
                         // Close this file handle
                         rcu_assign_pointer( pFDT->fd[count], NULL );     

[email protected]:~/Downloads/gobiusbnet$ make
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order
make -C /lib/modules/4.4.0-57-generic/build M=/home/george/Downloads/gobiusbnet modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-57-generic'
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o
  CC [M]  /home/george/Downloads/gobiusbnet/QMIDevice.o
  CC [M]  /home/george/Downloads/gobiusbnet/QMI.o
  LD [M]  /home/george/Downloads/gobiusbnet/GobiNet.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/george/Downloads/gobiusbnet/GobiNet.mod.o
  LD [M]  /home/george/Downloads/gobiusbnet/GobiNet.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-57-generic'