diff options
author | harti <harti@FreeBSD.org> | 2005-10-04 14:41:06 +0000 |
---|---|---|
committer | harti <harti@FreeBSD.org> | 2005-10-04 14:41:06 +0000 |
commit | efb2dfa1774240830b3f74b7fe4ab8050cc1cda0 (patch) | |
tree | 939b9a00cfa4d79510a088859c9352b689740218 /contrib/bsnmp/snmp_mibII/mibII.c | |
parent | 2b366eef52ee173d11c8c3b0570cd771e5c0044a (diff) | |
download | FreeBSD-src-efb2dfa1774240830b3f74b7fe4ab8050cc1cda0.zip FreeBSD-src-efb2dfa1774240830b3f74b7fe4ab8050cc1cda0.tar.gz |
Virgin import of bsnmpd 1.11
Diffstat (limited to 'contrib/bsnmp/snmp_mibII/mibII.c')
-rw-r--r-- | contrib/bsnmp/snmp_mibII/mibII.c | 67 |
1 files changed, 65 insertions, 2 deletions
diff --git a/contrib/bsnmp/snmp_mibII/mibII.c b/contrib/bsnmp/snmp_mibII/mibII.c index 7de7fbe..2f7881f 100644 --- a/contrib/bsnmp/snmp_mibII/mibII.c +++ b/contrib/bsnmp/snmp_mibII/mibII.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Begemot: bsnmp/snmp_mibII/mibII.c,v 1.22 2005/05/23 09:03:37 brandt_h Exp $ + * $Begemot: bsnmp/snmp_mibII/mibII.c,v 1.23 2005/06/09 12:36:52 brandt_h Exp $ * * Implementation of the standard interfaces and ip MIB. */ @@ -941,6 +941,10 @@ handle_rtmsg(struct rt_msghdr *rtm) process_arp(rtm, (struct sockaddr_dl *)(void *)addrs[RTAX_GATEWAY], (struct sockaddr_in *)(void *)addrs[RTAX_DST]); + } else { + if (rtm->rtm_errno == 0 && (rtm->rtm_flags & RTF_UP)) + mib_sroute_process(rtm, addrs[RTAX_GATEWAY], + addrs[RTAX_DST], addrs[RTAX_NETMASK]); } break; @@ -955,9 +959,68 @@ handle_rtmsg(struct rt_msghdr *rtm) process_arp(rtm, (struct sockaddr_dl *)(void *)addrs[RTAX_GATEWAY], (struct sockaddr_in *)(void *)addrs[RTAX_DST]); + } else { + if (rtm->rtm_errno == 0 && (rtm->rtm_flags & RTF_UP)) + mib_sroute_process(rtm, addrs[RTAX_GATEWAY], + addrs[RTAX_DST], addrs[RTAX_NETMASK]); } break; + + case RTM_DELETE: + mib_extract_addrs(rtm->rtm_addrs, (u_char *)(rtm + 1), addrs); + if (rtm->rtm_errno == 0 && !(rtm->rtm_flags & RTF_LLINFO)) + mib_sroute_process(rtm, addrs[RTAX_GATEWAY], + addrs[RTAX_DST], addrs[RTAX_NETMASK]); + break; + } +} + +/* + * send a routing message + */ +void +mib_send_rtmsg(struct rt_msghdr *rtm, struct sockaddr *gw, + struct sockaddr *dst, struct sockaddr *mask) +{ + size_t len; + struct rt_msghdr *msg; + char *cp; + ssize_t sent; + + len = sizeof(*rtm) + SA_SIZE(gw) + SA_SIZE(dst) + SA_SIZE(mask); + if ((msg = malloc(len)) == NULL) { + syslog(LOG_ERR, "%s: %m", __func__); + return; + } + cp = (char *)(msg + 1); + + memset(msg, 0, sizeof(*msg)); + msg->rtm_flags = 0; + msg->rtm_version = RTM_VERSION; + msg->rtm_addrs = RTA_DST | RTA_GATEWAY; + + memcpy(cp, dst, SA_SIZE(dst)); + cp += SA_SIZE(dst); + memcpy(cp, gw, SA_SIZE(gw)); + cp += SA_SIZE(gw); + if (mask != NULL) { + memcpy(cp, mask, SA_SIZE(mask)); + cp += SA_SIZE(mask); + msg->rtm_addrs |= RTA_NETMASK; + } + msg->rtm_msglen = cp - (char *)msg; + msg->rtm_type = RTM_GET; + if ((sent = write(route, msg, msg->rtm_msglen)) == -1) { + syslog(LOG_ERR, "%s: write: %m", __func__); + free(msg); + return; + } + if (sent != msg->rtm_msglen) { + syslog(LOG_ERR, "%s: short write", __func__); + free(msg); + return; } + free(msg); } /* @@ -1428,6 +1491,7 @@ mibII_start(void) mib_refresh_iflist(); update_ifa_info(); mib_arp_update(); + (void)mib_fetch_route(); mib_iftable_last_change = 0; mib_ifstack_last_change = 0; @@ -1474,7 +1538,6 @@ mibII_init(struct lmodule *mod, int argc __unused, char *argv[] __unused) syslog(LOG_ERR, "PF_ROUTE: %m"); return (-1); } - (void)shutdown(route, SHUT_WR); if ((mib_netsock = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { syslog(LOG_ERR, "PF_INET: %m"); |