STOP STOP STOP¶
HoRNDIS is unmaintained software. For years now, I have wanted to write an essay on why this is the case. I never got around to doing that, but here's what I usually send in response to people who e-mail me asking for help installing the version of HoRNDIS that was packaged along with their DJI drone:
Unfortunately, HoRNDIS is unsupported and has been since OS X 10.11. Actually, DJI is a big part of this: for a few years, DJI’s customers were sending me daily email about HoRNDIS, though DJI had never so much as sent me a thank you, let alone having paid me even a dime for my work that seemed to be critical to their products! Nowadays this email has tapered off enough that I can respond to each one, but HoRNDIS still sadly does not support newer versions of macOS. I suggest that you contact DJI’s technical support directly for assistance with their products.
It doesn't help that MacOS's USB APIs all changed, though. Anyway, Android users got caught in this crossfire. Don't install HoRNDIS anymore; it has been untouched since 2018! This page is preserved for posterity.
Original introduction¶
HoRNDIS (pronounce: "horrendous") is a driver for Mac OS X that allows you to use your Android phone's native USB tethering mode to get Internet access. It is known to work with Mac OS X versions 10.6.8 (Snow Leopard) through 10.14 (Mojave -- see notes below), and has been tested on a wide variety of phones. Although you should be careful with all drivers that you install on your computer, HoRNDIS has been tested at least well enough for the author (and many others) to run full time on their own personal computers.
HoRNDIS is implemented as a kext, rather than as a user-space program that opens a TAP or TUN device; this means that it does not conflict with other TAP/TUN kexts that you might have installed (like OpenVPN, Tunnelblick, or Cisco VPN). The driver implements Microsoft's proprietary RNDIS protocol, which is the only protocol supported natively by Android devices; although Linux and Windows users have enjoyed native RNDIS drivers for years, Mac OS X supports only CDC Ethernet devices out of the box1.
The chief advantage of HoRNDIS over other tethering solutions is that it uses the a first-class supported feature in the phone's firmware. Other solutions either take over the phone's Wi-Fi stack without the Android operating system's knowledge, or create an emulation IP stack in userspace on the phone; in many cases, the built-in USB tethering support can be more stable, more reliable, and faster2.
This page is also available in Russian: HoRNDIS: драйвер USB-модема для Mac OS X. My thanks to Vlad Brown for his effort in translation!
Downloading and installing HoRNDIS¶
HoRNDIS is available in source form from its project page on GitHub, and in binary form on this site. For quick start instructions:
- Download the appropriate binary package, and double-click on it in your Downloads folder. Follow the instructions in the installer.
- Assuming that the installation proceeds without errors, after it completes, connect your phone to your Mac by USB.
- Enter the settings menu on your phone.
- In the connections section, below Wi-Fi and Bluetooth, select "More...".
- Select "Tethering & portable hotspot".
- Check the "USB tethering" box. It should flash once, and then become solidly checked.
On some versions of OS X, a dialog box may pop up, prompting you to configure the device; follow its instructions. To verify that the device is connected, start the System Preferences program, and select "Network"; you should see your phone appear in the box at left. With any luck, you should be able to turn off Wi-Fi on your Mac, and browse the Internet through your phone's network connection.
Available versions¶
- The latest version available is 9.2: HoRNDIS-9.2.pkg (46919 bytes) (md5sum
8207800ef89dc1bb0cca530e4ef39009
; GPG signature). Improves support for devices including Nokia 7 Plus. This release was developed by Mikhail Iakhiaev, who is the current maintainer of HoRNDIS. This version only supports MacOS 10.11 and up. - Older versions:
-
Release 9.1: HoRNDIS-9.1.pkg (46924 bytes) (md5sum
a444af529261f4f611986b268d7f9fb7
; GPG signature). Improves support for devices including Galaxy S7 Edge and BeagleBone, and fixes some suspend- / resume-related bugs. This release was developed by Mikhail Iakhiaev, who is the current maintainer of HoRNDIS. -
Release 9.0: HoRNDIS-9.0.pkg (42820 bytes) (md5sum
8d8e2bc421520b8a264c9962ef3dbbd3
; GPG signature). Converts HoRNDIS core code to use more modern MacOS USB interfaces, for improved reliability on newer versions of MacOS. This release was developed by Mikhail Iakhiaev, who is the current maintainer of HoRNDIS. -
Release 8: HoRNDIS-rel8.pkg (78985 bytes) (md5sum
8991552bd384a06b7ec775f7198f7bba
; GPG signature). Adds support for OS X 10.11 (El Capitan) and 10.12 (Sierra). Thanks also to David Ryskalczyk for his help in wrestling Xcode. This is the newest version that supports OS X 10.10. -
Release 7: HoRNDIS-rel7.pkg (116491 bytes) (md5sum
45a1a7457966b1dc79897af2864f68e4
; GPG signature). Adds support for OS X 10.10 (Yosemite). Fixes issue where unsigned kext would not be installed (restoring support for OS X 10.6 - 10.8). Thanks also to David Ryskalczyk for his help in tracking down the issues with 10.10. -
Release 6: HoRNDIS-rel6.pkg (116473 bytes) (md5sum
fe3e5ae4c0a509b06cf11ef65b1715da
; GPG signature). Adds support for multicast mode, enabling mDNS (thanks to Dan Yocom at Intel). Adds code signing support in Installer and for kext. -
Release 5: HoRNDIS-rel5.pkg (60906 bytes) (md5sum
059164db5a76e5c0b57b9ef9acb65da5
; GPG signature). Adds support for Mac OS X's Internet Connection Sharing, enabling BeagleBoard users to connect their boards to the Internet through their Macs. -
Release 4: HoRNDIS-rel4.pkg (60519 bytes) (md5sum
8cf81024d8514d2a8654420fc7491b84
; GPG signature). Actually fixes issue #5 and #9, adding support for Samsung Galaxy S II and HTC Desire S (thanks to Griskha). Improves compatibility with older versions of OS X (early 10.6). -
Release 3: HoRNDIS-rel3.pkg (60488 bytes) (md5sum
a46960e3cdb2a046e08af00c766b6ff9
; GPG signature). Fixes issue #3 (reenabling installation on 32-bit machines). Adds potential fix for issue #5. -
Release 2: HoRNDIS-rel2.pkg (60843 bytes) (md5sum
8b2c371e78ccfe3b07750fbe07f55bb5
; GPG signature). Disables installation on 32-bit machines, and includes new device support. -
Release 1: HoRNDIS-rel1.pkg (38681 bytes) (md5sum
4169c222448e2a2caaa067caf84189d3
; GPG signature). Fixes issue #2. -
Release 0: HoRNDIS-rel0.pkg (36807 bytes) (md5sum
be4e879198d3b6e52af993b008198e8e
; GPG signature). Initial release.
-
Release 9.1: HoRNDIS-9.1.pkg (46924 bytes) (md5sum
A special note about 32-bit machines¶
In previous versions, HoRNDIS required a 64-bit kernel. If you get an error message about 64-bit support on installing HoRNDIS, please try again with the version 3 package (or newer).
Notes about specific Mac OS X versions¶
OS X 10.9 (Mavericks) and 10.10 (Yosemite) are supported by HoRNDIS, but there are some gotchas. If you upgraded from an earlier version of OS X, you may find that phones appear to be replicating with abandon in your network control panel. If this happens to you, one somewhat heavy-handed workaround is to clean your network configuration files -- take a backup of /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
and /Library/Preferences/SystemConfiguration/preferences.plist
, and then either move them out of the way or delete them. (Note that this will remove any custom network configuration that you have performed!) I am still not sure what causes this problem, and so I do not yet have a workaround with finer granularity.
Versions of Mac OS X 10.11 and newer have a rewritten USB stack that is substantially less compatible than that in 10.10 and below. HoRNDIS 9.0 has been rewritten to support MacOS 10.11 and above (El Capitan, Sierra, High Sierra, and Mojave); for those versions of MacOS, please try the latest version of HoRNDIS! The latest version of HoRNDIS that supports older versions of MacOS (Yosemite and below) is HoRNDIS rel8.
Uninstalling¶
If, for some reason, you need to uninstall HoRNDIS, you can simply drag the extension to the trash. In the Finder, go to the "Go" menu, and select "Go to folder..."; in that, type "/System/Library/Extensions". Find "HoRNDIS.kext", and drag it to the trash. When prompted, type your password. Do the same for the "HoRNDIS.kext" that lives in "/Library/Extensions", as well. Then, restart your Mac to be sure it is unloaded.
Getting and building the source¶
(Fork me on GitHub!) The source is available on GitHub; it is licensed under the GNU General Purpose License, version 3. To build the source, you'll need Xcode 4.0+ installed; to build a version that will work under Snow Leopard, you will also need the Snow Leopard SDK installed. Unfortunately, the Snow Leopard SDK is hard to come by nowadays; you'll need to find it somewhere on the web, and manually install it into your Xcode SDKs folder. (For most applications, it's OK to build against a newer SDK; for a kernel module, the magic vtable space-saving tricks require you to compile against the lowest common denominator.)
Simply running xcodebuild
in the checkout directory should be sufficient to build the kext. If you wish to package it up, you can run make
to assemble the package in the build/
directory (though please don't publish versions you built as if they were official!).
Acknowledgements¶
On the shoulders of giants, I stand. My vague thanks to Apple for having at least some IOKit sample code available (even though the last time it successfully built was 10.2.x); it was a decent start reading to understand how I might want to structure this. Substantial thanks to David Brownell, who wrote the rndis_host
driver for Linux; some portions of HoRNDIS were ported over from that work. David Brownell also wrote the f_rndis
driver that allows Android/Linux devices to behave like RNDIS devices; reading that source helped to understand why HoRNDIS wasn't working in the early stages. (Sadly, David Brownell passed away in April of 2011. Thanks for all of your hard work, David; may you rest in peace.)
Thanks also to those who helped test HoRNDIS before I released it, as well as all of the other folks from the days of the unrEVOked project, without whom I would likely not be involved in Android development at all...
Finally, thanks to Mikhail Iakhiaev, who is the current maintainer of HoRNDIS, and who did the hard work of porting HoRNDIS to the new USB APIs in the latest versions of MacOS.
Support and contact¶
Being free software, HoRNDIS comes with no warranty (not even a guarantee that it won't break your phone or computer! But I'm pretty sure it won't.), express or implied. (For more on that, read the license.) However, I hope that it works for you; if it doesn't, and you're able to assist in debugging, I'd like to hear from you.
So, for feedback, feel free to get in touch with me, or HoRNDIS's current maintainer, Mikhail Iakhiaev; especially if it works for you, or makes your life easier, I'd like to hear about it!
-
You might ask -- if CDC is the standard way to act like a network device over USB, why did Google choose the Microsoft proprietary way? Sadly, it turns out to have been something of a compromise; in Windows XP, CDC Ethernet devices were not supported, and in the choice between XP users and Mac users, we got the short end of the stick. ↩
-
Of course, the downside to using a tethering solution with first-class support is that the phone itself must support USB tethering, and it may need to be explicitly permitted by your carrier. Consult your nearest phone hacking forum for instructions on how to bypass such limitations, as needed. ↩