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 */