Тут 3 варианта.
- Вызвать arp и отпарсить ее выхлоп;
- Проанализировать исходники arp, просветлится и научится читать данные из системной ARP-таблицы;
- Прочитать про RFC Addr Resolution Protocol, просветлится и написать через libnet/libpcap свою реализацию этого протокола.
Пункты расставлены в порядке приоритета для ленивого человека.
Посмотрел исходники. Оказывается все было просто, как я и думал. В функции static int arp_show(char *name) просто читается файл /proc/net/arp.
Я полагал, что существует стандарт на получения информации из arp таблицы, поэтому и задал вопрос. Например, такой способ не сработает в FreeBSD. Т.е. необходим кроссплатформенный способ. Не буду заморачивать вам голову, спасибо всем, кто ответил.
За strace тоже спасибо, просто разбирать системные вызовы еще больше лень:)