--- .../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 Net-snmp-coders@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/net-snmp-coders