Hi, snmpd pernanently loses its ARP table information:
# snmpctl walk 127.0.0.1 oid ipNetToMediaPhysAddress ipNetToMediaPhysAddress.2.192.168.16.1="xx:xx:xx:xx:xx:xx" ipNetToMediaPhysAddress.2.192.168.16.126="xx:xx:xx:xx:xx:xx" ipNetToMediaPhysAddress.2.192.168.19.132="xx:xx:xx:xx:xx:xx" Query the whole tree and this information is gone: # snmpctl walk 127.0.0.1 oid iso.org>/dev/null # snmpctl walk 127.0.0.1 oid ipNetToMediaPhysAddress 0=6 The reason is that several OIDs in mib.c call kr_updateif() and this function deletes the kif_node and the restores it via fetchifs(). But then the ARP information held by the old kif_node is gone. There is no need to delete the kif_node prior to calling fetchifs() since it only calls rtmsg_process() which is also called during normal processing of messages from the routing socket. And while here, also handle RTM_DESYNC messages. Gerhard Index: usr.sbin/snmpd/kroute.c =================================================================== RCS file: /cvs/src/usr.sbin/snmpd/kroute.c,v retrieving revision 1.31 diff -u -p -u -p -r1.31 kroute.c --- usr.sbin/snmpd/kroute.c 18 Jul 2015 00:27:32 -0000 1.31 +++ usr.sbin/snmpd/kroute.c 2 Nov 2015 11:41:51 -0000 @@ -365,12 +365,6 @@ kr_iflastchange(void) int kr_updateif(u_int if_index) { - struct kif_node *kn; - - if ((kn = kif_find(if_index)) != NULL) - kif_remove(kn); - - /* Do not update the interface address list */ return (fetchifs(if_index)); } @@ -1380,6 +1374,12 @@ rtmsg_process(char *buf, int len) break; case RTM_IFANNOUNCE: if_announce(next); + break; + case RTM_DESYNC: + kr_shutdown(); + if (fetchifs(0) == -1) + fatalx("rtmsg_process: fetchifs"); + ktable_init(); break; default: /* ignore for now */