見出し画像

シン・TWSNMP開発日誌:MACアドレスからベンダーを調べる処理を改善しています

今朝は4時から開発開始です。
昨日発見したARP監視のページの問題を修正しています。
まず、MACアドレスからベンダーコードを調べる処理ですが、2年前に

のような記事を書きました。これを読むと今は亡き助手の猫が2時に起こしてくれていたようです。
この方法に間違いがあることに気づきました。
データをダウンロードする

の解説をよむと、

MAC address block:
MA-L: MAC Address Block Large (previously named OUI). Number of address 2^24 (~16 Million)
MA-M: MAC Address Block Medium. Number of address 2^20 (~1 Million)
MA-S: MAC Address Block Small (previously named OUI-36, encompasses IAB Assignments). Number of address 2^12 (4096)
CID: Company Identifier. This prefix will not be used for globally unique applications. Number of address 2^24 (~16 Million)

 という記載があります。2年前にもあったのだと思いますが見逃していたようです。
MACアドレスの上位3バイトがベンダーコードだと思って処理を作っていましたが、 MA-M:3.5バイト、MA-S:4.5バイトもあることに気づきました。
検索する処理を書き換えました。

// FindVendor : Find Vendor Name from MAC Address
func FindVendor(mac string) string {
	if mac == "" {
		return ""
	}
	mac = strings.TrimSpace(mac)
	mac = strings.ReplaceAll(mac, ":", "")
	mac = strings.ReplaceAll(mac, "-", "")
	if len(mac) > 6 {
		mac = strings.ToUpper(mac)
		if n, ok := ouiMap[mac[:6]]; ok {
			return n
		}
		if n, ok := ouiMap[mac[:7]]; ok {
			return n
		}
		if n, ok := ouiMap[mac[:9]]; ok {
			return n
		}
		if h, err := hex.DecodeString(mac); err == nil {
			if (h[0] & 0x02) == 0x02 {
				h[0] = h[0] & 0xfd
				mac = strings.ToUpper(hex.EncodeToString(h))
				if n, ok := ouiMap[mac[:6]]; ok {
					return n + "(Local)"
				}
				if n, ok := ouiMap[mac[:7]]; ok {
					return n + "(Local)"
				}
				if n, ok := ouiMap[mac[:9]]; ok {
					return n + "(Local)"
				}
				return "Local"
			}
		}
	}
	return "Unknown"
}

新しいデータベースファイルをダウンロードして入れ替えると、昨日、UnknownになっていたプリンターがEPSONと表示されました。

ARP監視の画面は、ARPログとアドレス管理の画面に分割しました。
もう少し調整が必要ですが、DHCPのアドレス割りてが少なくてIPアドレスが重複する問題を検知しやすくなったと思います。

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。