ときどきログがのこっている "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の中身はわかってない。















