Sha256: 359aa07876ea3367440dadd493e87d47b1bd78c4867c2a1ecdde10b73c6e1101

Contents?: true

Size: 1.72 KB

Versions: 4

Compression:

Stored size: 1.72 KB

Contents

require 'json'

require 'louis/const'
require 'louis/helpers'
require 'louis/version'

module Louis
  # This masks out both the 'universal/local' bit as well as the
  # 'unicast/multicast' bit which is the first and second least significant bit
  # of the first byte in a vendor prefix.
  IGNORED_BITS_MASK = 0xfcffffffffff

  # Loads the lookup table, parsing out the uncommented non-blank lines into
  # objects we can compare MACs against to find their vendor.
  LOOKUP_TABLE = JSON.parse(File.read(Louis::PARSED_DATA_FILE))

  # Collect the recorded mask and order it appropriately from most specific to
  # least.
  #
  # @param [Array<Fixnum>]
  def self.mask_keys
    @mask_keys ||= LOOKUP_TABLE.keys.map(&:to_i).sort.reverse
  end

  # Returns the name of the vendor that has the most specific prefix
  # available in the OUI table or failing any matches will return "Unknown".
  #
  # @param [String] mac
  # @return [String]
  def self.lookup(mac)
    numeric_mac = Louis::Helpers.mac_to_num(mac)
    masked_mac = numeric_mac & IGNORED_BITS_MASK

    vendor = search_table(masked_mac)
    return {'long_vendor' => vendor['l'], 'short_vendor' => vendor['s']}.compact if vendor

    # Try again, but this time don't ignore any bits (Looking at you
    # Google... with your 'da' prefix...)
    vendor = search_table(numeric_mac)
    return {'long_vendor' => vendor['l'], 'short_vendor' => vendor['s']}.compact if vendor

    {'long_vendor' => 'Unknown', 'short_vendor' => 'Unknown'}
  end

  def self.search_table(encoded_mac)
    mask_keys.each do |mask|
      table = LOOKUP_TABLE[mask.to_s]
      prefix = (encoded_mac & Louis::Helpers.calculate_mask(nil, mask)).to_s
      return table[prefix] if table.include?(prefix)
    end

    nil
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
louis-2.1.3 lib/louis.rb
louis-2.1.2 lib/louis.rb
louis-2.1.1 lib/louis.rb
louis-2.1.0 lib/louis.rb