Fix byte orders in mac address

This commit is contained in:
Mygod
2021-05-19 16:17:04 -04:00
parent 68f8ac5c92
commit 0b6e5e39c0
2 changed files with 19 additions and 25 deletions

View File

@@ -21,18 +21,6 @@ value class MacAddressCompat(val addr: Long) {
val ALL_ZEROS_ADDRESS = MacAddressCompat(0) val ALL_ZEROS_ADDRESS = MacAddressCompat(0)
val ANY_ADDRESS = MacAddressCompat(2) val ANY_ADDRESS = MacAddressCompat(2)
fun bytesToString(addr: ByteArray) = when (addr.size) {
ETHER_ADDR_LEN -> addr.joinToString(":") { "%02x".format(it) }
8 -> {
require(addr.take(2).all { it == 0.toByte() }) {
"Unrecognized padding " + addr.joinToString(":") { "%02x".format(it) }
}
addr.drop(2).joinToString(":") { "%02x".format(it) }
}
else -> throw IllegalArgumentException(addr.joinToString(":") { "%02x".format(it) } +
" was not a valid MAC address")
}
/** /**
* Creates a MacAddress from the given byte array representation. * Creates a MacAddress from the given byte array representation.
* A valid byte array representation for a MacAddress is a non-null array of length 6. * A valid byte array representation for a MacAddress is a non-null array of length 6.
@@ -41,13 +29,21 @@ value class MacAddressCompat(val addr: Long) {
* @return the MacAddress corresponding to the given byte array representation. * @return the MacAddress corresponding to the given byte array representation.
* @throws IllegalArgumentException if the given byte array is not a valid representation. * @throws IllegalArgumentException if the given byte array is not a valid representation.
*/ */
fun fromBytes(addr: ByteArray): MacAddressCompat { fun fromBytes(addr: ByteArray) = ByteBuffer.allocate(Long.SIZE_BYTES).run {
require(addr.size == ETHER_ADDR_LEN) { addr.joinToString() + " was not a valid MAC address" } order(ByteOrder.LITTLE_ENDIAN)
return ByteBuffer.allocate(Long.SIZE_BYTES).run { put(when (addr.size) {
put(addr) ETHER_ADDR_LEN -> addr
rewind() 8 -> {
MacAddressCompat(long) require(addr.take(2).all { it == 0.toByte() }) {
} "Unrecognized padding " + addr.joinToString(":") { "%02x".format(it) }
}
addr.drop(2).toByteArray()
}
else -> throw IllegalArgumentException(addr.joinToString(":") { "%02x".format(it) } +
" was not a valid MAC address")
})
rewind()
MacAddressCompat(long)
} }
/** /**
* Creates a MacAddress from the given String representation. A valid String representation * Creates a MacAddress from the given String representation. A valid String representation

View File

@@ -91,12 +91,10 @@ fun makeMacSpan(mac: String) = if (app.hasTouch) SpannableString(mac).apply {
fun NetworkInterface.formatAddresses(macOnly: Boolean = false) = SpannableStringBuilder().apply { fun NetworkInterface.formatAddresses(macOnly: Boolean = false) = SpannableStringBuilder().apply {
try { try {
val address = hardwareAddress val address = hardwareAddress?.let(MacAddressCompat::fromBytes)
if (address != null && try { if (address != null && address != MacAddressCompat.ANY_ADDRESS) appendLine(makeMacSpan(address.toString()))
MacAddressCompat.fromBytes(address) == MacAddressCompat.ANY_ADDRESS } catch (e: IllegalArgumentException) {
} catch (_: IllegalArgumentException) { true }) { Timber.w(e)
appendLine(makeMacSpan(MacAddressCompat.bytesToString(address)))
}
} catch (_: SocketException) { } } catch (_: SocketException) { }
if (!macOnly) for (address in interfaceAddresses) { if (!macOnly) for (address in interfaceAddresses) {
append(makeIpSpan(address.address)) append(makeIpSpan(address.address))