---
.../mibgroup/if-mib/data_access/interface_linux.c | 55 +++++++++++---------
1 file changed, 31 insertions(+), 24 deletions(-)
diff --git a/agent/mibgroup/if-mib/data_access/interface_linux.c
b/agent/mibgroup/if-mib/data_access/interface_linux.c
index e291b9f..d4ac61b 100644
--- a/agent/mibgroup/if-mib/data_access/interface_linux.c
+++ b/agent/mibgroup/if-mib/data_access/interface_linux.c
@@ -69,14 +69,12 @@ typedef __u8 u8; /* ditto */
#define SIOCGMIIREG 0x8948
#endif
-#ifdef NETSNMP_ENABLE_IPV6
#if defined(HAVE_LINUX_RTNETLINK_H)
#include <linux/rtnetlink.h>
-#ifdef RTMGRP_IPV6_PREFIX
+#if defined(NETSNMP_ENABLE_IPV6) && defined(RTMGRP_IPV6_PREFIX)
#define SUPPORT_PREFIX_FLAGS 1
-#endif /* RTMGRP_IPV6_PREFIX */
+#endif
#endif /* HAVE_LINUX_RTNETLINK_H */
-#endif /* NETSNMP_ENABLE_IPV6 */
unsigned long long
netsnmp_linux_interface_get_if_speed(int fd, const char *name,
unsigned long long defaultspeed);
@@ -1023,42 +1021,51 @@ netsnmp_linux_interface_get_if_speed(int fd, const char
*name,
}
return retspeed;
}
-#ifdef SUPPORT_PREFIX_FLAGS
-void netsnmp_prefix_process(int fd, void *data);
-/* Open netlink socket to watch new ipv6 addresses and prefixes. */
-int netsnmp_prefix_listen()
+#ifdef HAVE_LINUX_RTNETLINK_H
+static int netsnmp_netlink_listen(unsigned subscriptions)
{
- struct {
- struct nlmsghdr n;
- struct ifinfomsg r;
- char buf[1024];
- } req;
-
- struct rtattr *rta;
- int status;
struct sockaddr_nl localaddrinfo;
- unsigned groups = 0;
-
int fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
if (fd < 0) {
- snmp_log(LOG_ERR, "netsnmp_prefix_listen: Cannot create socket.\n");
- return -1;
+ snmp_log(LOG_ERR, "netsnmp_netlink_listen: Cannot create socket.\n");
+ return -1;
}
memset(&localaddrinfo, 0, sizeof(struct sockaddr_nl));
- groups |= RTMGRP_IPV6_IFADDR;
- groups |= RTMGRP_IPV6_PREFIX;
localaddrinfo.nl_family = AF_NETLINK;
- localaddrinfo.nl_groups = groups;
+ localaddrinfo.nl_groups = subscriptions;
if (bind(fd, (struct sockaddr*)&localaddrinfo, sizeof(localaddrinfo)) < 0)
{
- snmp_log(LOG_ERR,"netsnmp_prefix_listen: Bind failed.\n");
+ snmp_log(LOG_ERR,"netsnmp_netlink_listen: Bind failed.\n");
close(fd);
return -1;
}
+ return fd;
+}
+#endif
+
+#ifdef SUPPORT_PREFIX_FLAGS
+void netsnmp_prefix_process(int fd, void *data);
+
+/* Open netlink socket to watch new ipv6 addresses and prefixes. */
+int netsnmp_prefix_listen()
+{
+ struct {
+ struct nlmsghdr n;
+ struct ifinfomsg r;
+ char buf[1024];
+ } req;
+
+ struct rtattr *rta;
+ int status;
+
+ int fd = netsnmp_netlink_listen(RTMGRP_IPV6_IFADDR |
+ RTMGRP_IPV6_PREFIX);
+ if (fd < 0) return -1;
+
memset(&req, 0, sizeof(req));
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT;
--
1.7.10.4
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Net-snmp-coders mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders