ときどきログがのこっている "arp: unknown hardware address format (0x0800)" について調べてみた。

arp: unknown hardware address format (0x0800) (from 00:00:00:00:00:00 to 00:00:0a:01:xx:yy)

ログを出しているのはここ。

</usr/src/sys/netinet/if_ether.c>
static void
arpintr(struct mbuf *m)
{
	struct arphdr *ar;

	if (m->m_len < sizeof(struct arphdr) &&
	    ((m = m_pullup(m, sizeof(struct arphdr))) == NULL)) {
		log(LOG_NOTICE, "arp: runt packet -- m_pullup failed\n");
		return;
	}
	ar = mtod(m, struct arphdr *);

	if (ntohs(ar->ar_hrd) != ARPHRD_ETHER &&
	    ntohs(ar->ar_hrd) != ARPHRD_IEEE802 &&
	    ntohs(ar->ar_hrd) != ARPHRD_ARCNET &&
	    ntohs(ar->ar_hrd) != ARPHRD_IEEE1394 &&
	    ntohs(ar->ar_hrd) != ARPHRD_INFINIBAND) {
		log(LOG_NOTICE, "arp: unknown hardware address format (0x%2D)"
		    " (from %*D to %*D)\n", (unsigned char *)&ar->ar_hrd, "",
		    ETHER_ADDR_LEN, (u_char *)ar_sha(ar), ":",
		    ETHER_ADDR_LEN, (u_char *)ar_tha(ar), ":");
		m_freem(m);
		return;
	}
</usr/src/sys/net/if_arp.h>
struct	arphdr {
	u_short	ar_hrd;		/* format of hardware address */
#define ARPHRD_ETHER 	1	/* ethernet hardware format */
#define ARPHRD_IEEE802	6	/* token-ring hardware format */
#define ARPHRD_ARCNET	7	/* arcnet hardware format */
#define ARPHRD_FRELAY 	15	/* frame relay hardware format */
#define ARPHRD_IEEE1394	24	/* firewire hardware format */
#define ARPHRD_INFINIBAND 32	/* infiniband hardware format */
	u_short	ar_pro;		/* format of protocol address */
	u_char	ar_hln;		/* length of hardware address */
	u_char	ar_pln;		/* length of protocol address */
	u_short	ar_op;		/* one of: */
#define	ARPOP_REQUEST	1	/* request to resolve address */
#define	ARPOP_REPLY	2	/* response to previous request */
#define	ARPOP_REVREQUEST 3	/* request protocol address given hardware */
#define	ARPOP_REVREPLY	4	/* response giving protocol address */
#define ARPOP_INVREQUEST 8 	/* request to identify peer */
#define ARPOP_INVREPLY	9	/* response identifying peer */
/*
 * The remaining fields are variable in size,
 * according to the sizes above.
 */
#ifdef COMMENT_ONLY
	u_char	ar_sha[];	/* sender hardware address */
	u_char	ar_spa[];	/* sender protocol address */
	u_char	ar_tha[];	/* target hardware address */
	u_char	ar_tpa[];	/* target protocol address */
#endif
};

#define ar_sha(ap)	(((caddr_t)((ap)+1)) +   0)
#define ar_spa(ap)	(((caddr_t)((ap)+1)) +   (ap)->ar_hln)
#define ar_tha(ap)	(((caddr_t)((ap)+1)) +   (ap)->ar_hln + (ap)->ar_pln)
#define ar_tpa(ap)	(((caddr_t)((ap)+1)) + 2*(ap)->ar_hln + (ap)->ar_pln)

"format (0x0800)"の部分はそのまま16進数ダンプしてるのでネットワークバイトオーダがそのまま表示されていてar_hrd=0x0800。ar_hrd はハードウェア・タイプと呼ぶものらしい。0x0800が何に割り当てられているか調べてみたが0x0800=2048はUnassingedになっていた。 -> http://www.iana.org/assignments/arp-parameters/arp-parameters.xml

"from 00:00:00:00:00:00 to 00:00:0a:01:xx:yy" の部分はsender hardware address と target hardware address を16進ダンプしていて"00:00:0a:01:xx:yy" はどうにも社内でつかっているプライベートアドレスくさい。アドレスはDHCPで払出している範囲のものなのでDHCPサーバのログをみてみたら、払い出し時刻とsyslogの時刻も一致しているのでこいつで間違いない。

lease 10.1.xx.yy {
  starts 3 2012/12/12 07:39:58;
  ends 3 2012/12/12 07:41:58;
  binding state free;
  hardware ethernet **:**:**:**:**:**;
  uid "\0***\3***\3**\2**\3**";
  client-hostname "AP************";
}

名前がアクセスポイントくさいのでつかってそうな人にきいてみたらビンゴ。これだった。

BUFFALO WLAE-AG300N http://buffalo.jp/products/catalog/network/wlae-ag300n/

パケットキャプチャはしてないので詳しいARPの中身はわかってない。

koie