fix mini_snmpd on ipv4. Create a separate mini_snmpd_ipv6 package (closes #6578 & #7094)

git-svn-id: svn://svn.openwrt.org/openwrt/packages@20889 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
acoul
2010-04-15 21:11:06 +00:00
parent 3af9a8a492
commit 0318938558
7 changed files with 158 additions and 0 deletions

View File

@ -0,0 +1,48 @@
#
# Copyright (C) 2009 OpenWrt.orgv
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=mini_snmpd
PKG_VERSION:=1.0
PKG_RELEASE:=5
PKG_SOURCE:=mini_snmpd.tar.gz
PKG_SOURCE_URL:=http://members.aon.at/linuxfreak/linux/
PKG_MD5SUM:=13f2202ff01ff6b6463989f34f453063
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/mini-snmpd
SECTION:=net
CATEGORY:=Network
TITLE:=SNMP server for embedded systems
URL:=http://members.aon.at/linuxfreak/linux/mini_snmpd.html
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) \
CC="$(TARGET_CC)" \
OFLAGS="$(TARGET_CFLAGS) -DSYSLOG" \
STRIP="/bin/true" \
INSTALL_ROOT="$(PKG_INSTALL_DIR)" \
mini_snmpd install
endef
define Package/mini-snmpd/install
$(INSTALL_DIR) $(1)/usr/bin
$(CP) $(PKG_INSTALL_DIR)/sbin/mini_snmpd $(1)/usr/bin/
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) ./files/mini_snmpd.config $(1)/etc/config/mini_snmpd
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/mini_snmpd.init $(1)/etc/init.d/mini_snmpd
endef
$(eval $(call BuildPackage,mini-snmpd))

View File

@ -0,0 +1,7 @@
config mini_snmpd
option enabled 1
option community public
option location ''
option contact ''
option disks '/tmp,/jffs'
option interfaces 'lo,br-lan,eth0.1,eth1' # Max 4

View File

@ -0,0 +1,38 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2009 OpenWrt.org
NAME=mini_snmpd
PROG=/usr/bin/$NAME
START=50
append_string() {
local section="$1"
local option="$2"
local value="$3"
local _val
config_get _val "$section" "$option"
[ -n "$_val" ] && append args "$3 $_val"
}
mini_snmpd_config() {
local cfg="$1"
args=""
append_string "$cfg" community "-c"
append_string "$cfg" location "-L"
append_string "$cfg" contact "-C"
append_string "$cfg" disks "-d"
append_string "$cfg" interfaces "-i"
config_get_bool enabled "$cfg" "enabled" '1'c
[ "$enabled" -gt 0 ] && $PROG $args &
}
start() {
config_load mini_snmpd
config_foreach mini_snmpd_config mini_snmpd
}
stop() {
killall mini_snmpd
}

View File

@ -0,0 +1,13 @@
--- a/Makefile
+++ b/Makefile
@@ -30,8 +30,9 @@ HEADERS = mini_snmpd.h
SOURCES = mini_snmpd.c protocol.c mib.c globals.c utils.c linux.c freebsd.c
VERSION = 1.0
VENDOR = .1.3.6.1.4.1
+OFLAGS = -O2 -DDEBUG
CFLAGS = -Wall -Werror -DVERSION="\"$(VERSION)\"" -DVENDOR="\"$(VENDOR)\"" \
- -O2 -DDEBUG -D__LINUX__ -D__DEMO__
+ $(OFLAGS) -D__LINUX__ -D__DEMO__
TARGET = mini_snmpd
MAN = mini_snmpd.8
DOC = CHANGELOG COPYING README TODO

View File

@ -0,0 +1,31 @@
--- a/mini_snmpd.c
+++ b/mini_snmpd.c
@@ -134,7 +134,7 @@
} else if (rv != g_udp_client.size) {
lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: "
"only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
- sockaddr.sin_port, rv, g_udp_client.size);
+ sockaddr.sin_port, rv, (int) g_udp_client.size);
}
#ifdef DEBUG
dump_packet(&g_udp_client);
@@ -211,7 +211,7 @@
} else if (rv != client->size) {
lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: "
"only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
- sockaddr.sin_port, rv, client->size);
+ sockaddr.sin_port, rv, (int) client->size);
close(client->sockfd);
client->sockfd = -1;
return;
--- a/utils.c
+++ b/utils.c
@@ -106,7 +106,7 @@
}
}
lprintf(LOG_DEBUG, "%s %u bytes %s %s:%d (%s)\n",
- client->outgoing ? "transmitted" : "received", client->size,
+ client->outgoing ? "transmitted" : "received", (int) client->size,
client->outgoing ? "to" : "from", inet_ntoa(client_addr),
ntohs(client->port), buffer);
}

View File

@ -0,0 +1,21 @@
--- a/mib.c
+++ b/mib.c
@@ -120,6 +120,9 @@ static int encode_snmp_element_oid(value
int length;
int i;
+ if (oid_value == NULL) {
+ return -1;
+ }
buffer = value->data.buffer;
length = 1;
for (i = 2; i < oid_value->subid_list_length; i++) {
@@ -293,6 +296,8 @@ static int mib_build_entry(const oid_t *
value->data.encoded_length = 0;
value->data.buffer = malloc(value->data.max_length);
if (encode_snmp_element_oid(value, oid_aton((const char *)default_value)) == -1) {
+ lprintf(LOG_ERR, "could not create MIB entry '%s.%d.%d': invalid oid '%s'\n",
+ oid_ntoa(prefix), column, row, (char *)default_value);
return -1;
}
break;

View File

@ -0,0 +1,285 @@
--- a/mini_snmpd.c
+++ b/mini_snmpd.c
@@ -90,9 +90,10 @@
static void handle_udp_client(void)
{
- struct sockaddr_in sockaddr;
+ struct sockaddr_in6 sockaddr;
socklen_t socklen;
int rv;
+ char straddr[INET6_ADDRSTRLEN];
/* Read the whole UDP packet from the socket at once */
socklen = sizeof (sockaddr);
@@ -105,8 +106,8 @@
}
g_udp_client.timestamp = time(NULL);
g_udp_client.sockfd = g_udp_sockfd;
- g_udp_client.addr = sockaddr.sin_addr.s_addr;
- g_udp_client.port = sockaddr.sin_port;
+ g_udp_client.addr = sockaddr.sin6_addr;
+ g_udp_client.port = sockaddr.sin6_port;
g_udp_client.size = rv;
g_udp_client.outgoing = 0;
#ifdef DEBUG
@@ -114,13 +115,14 @@
#endif
/* Call the protocol handler which will prepare the response packet */
+ inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
if (snmp(&g_udp_client) == -1) {
lprintf(LOG_WARNING, "could not handle packet from UDP client %s:%d: %m\n",
- inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+ straddr, sockaddr.sin6_port);
return;
} else if (g_udp_client.size == 0) {
lprintf(LOG_WARNING, "could not handle packet from UDP client %s:%d: ignored\n",
- inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+ straddr, sockaddr.sin6_port);
return;
}
g_udp_client.outgoing = 1;
@@ -128,13 +130,14 @@
/* Send the whole UDP packet to the socket at once */
rv = sendto(g_udp_sockfd, g_udp_client.packet, g_udp_client.size,
MSG_DONTWAIT, (struct sockaddr *)&sockaddr, socklen);
+ inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
if (rv == -1) {
lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: %m\n",
- inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+ straddr, sockaddr.sin6_port);
} else if (rv != g_udp_client.size) {
lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: "
- "only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
- sockaddr.sin_port, rv, (int) g_udp_client.size);
+ "only %d of %d bytes written\n", straddr,
+ sockaddr.sin6_port, rv, (int) g_udp_client.size);
}
#ifdef DEBUG
dump_packet(&g_udp_client);
@@ -143,11 +146,12 @@
static void handle_tcp_connect(void)
{
- struct sockaddr_in tmp_sockaddr;
- struct sockaddr_in sockaddr;
+ struct sockaddr_in6 tmp_sockaddr;
+ struct sockaddr_in6 sockaddr;
socklen_t socklen;
client_t *client;
int rv;
+ char straddr[INET6_ADDRSTRLEN];
/* Accept the new connection (remember the client's IP address and port) */
socklen = sizeof (sockaddr);
@@ -168,10 +172,11 @@
lprintf(LOG_ERR, "could not accept TCP connection: internal error");
exit(EXIT_SYSCALL);
}
- tmp_sockaddr.sin_addr.s_addr = client->addr;
- tmp_sockaddr.sin_port = client->port;
+ tmp_sockaddr.sin6_addr = client->addr;
+ tmp_sockaddr.sin6_port = client->port;
+ inet_ntop(AF_INET6, &tmp_sockaddr.sin6_addr, straddr, sizeof(straddr));
lprintf(LOG_WARNING, "maximum number of %d clients reached, kicking out %s:%d\n",
- MAX_NR_CLIENTS, inet_ntoa(tmp_sockaddr.sin_addr), tmp_sockaddr.sin_port);
+ MAX_NR_CLIENTS, straddr, tmp_sockaddr.sin6_port);
close(client->sockfd);
} else {
client = malloc(sizeof (client_t));
@@ -183,35 +188,38 @@
}
/* Now fill out the client control structure values */
+ inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
lprintf(LOG_DEBUG, "connected TCP client %s:%d\n",
- inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+ straddr, sockaddr.sin6_port);
client->timestamp = time(NULL);
client->sockfd = rv;
- client->addr = sockaddr.sin_addr.s_addr;
- client->port = sockaddr.sin_port;
+ client->addr = sockaddr.sin6_addr;
+ client->port = sockaddr.sin6_port;
client->size = 0;
client->outgoing = 0;
}
static void handle_tcp_client_write(client_t *client)
{
- struct sockaddr_in sockaddr;
+ struct sockaddr_in6 sockaddr;
int rv;
+ char straddr[INET6_ADDRSTRLEN];
/* Send the packet atomically and close socket if that did not work */
- sockaddr.sin_addr.s_addr = client->addr;
- sockaddr.sin_port = client->port;
+ sockaddr.sin6_addr = client->addr;
+ sockaddr.sin6_port = client->port;
rv = send(client->sockfd, client->packet, client->size, 0);
+ inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
if (rv == -1) {
lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: %m\n",
- inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+ straddr, sockaddr.sin6_port);
close(client->sockfd);
client->sockfd = -1;
return;
} else if (rv != client->size) {
lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: "
- "only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
- sockaddr.sin_port, rv, (int) client->size);
+ "only %d of %d bytes written\n", straddr,
+ sockaddr.sin6_port, rv, (int) client->size);
close(client->sockfd);
client->sockfd = -1;
return;
@@ -227,23 +235,25 @@
static void handle_tcp_client_read(client_t *client)
{
- struct sockaddr_in sockaddr;
+ struct sockaddr_in6 sockaddr;
int rv;
+ char straddr[INET6_ADDRSTRLEN];
/* Read from the socket what arrived and put it into the buffer */
- sockaddr.sin_addr.s_addr = client->addr;
- sockaddr.sin_port = client->port;
+ sockaddr.sin6_addr = client->addr;
+ sockaddr.sin6_port = client->port;
rv = read(client->sockfd, client->packet + client->size,
sizeof (client->packet) - client->size);
+ inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
if (rv == -1) {
lprintf(LOG_WARNING, "could not read packet from TCP client %s:%d: %m\n",
- inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+ straddr, sockaddr.sin6_port);
close(client->sockfd);
client->sockfd = -1;
return;
} else if (rv == 0) {
lprintf(LOG_DEBUG, "disconnected TCP client %s:%d\n",
- inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+ straddr, sockaddr.sin6_port);
close(client->sockfd);
client->sockfd = -1;
return;
@@ -255,7 +265,7 @@
rv = snmp_packet_complete(client);
if (rv == -1) {
lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: %m\n",
- inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+ straddr, sockaddr.sin6_port);
close(client->sockfd);
client->sockfd = -1;
return;
@@ -270,13 +280,13 @@
/* Call the protocol handler which will prepare the response packet */
if (snmp(client) == -1) {
lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: %m\n",
- inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+ straddr, sockaddr.sin6_port);
close(client->sockfd);
client->sockfd = -1;
return;
} else if (client->size == 0) {
lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: ignored\n",
- inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+ straddr, sockaddr.sin6_port);
close(client->sockfd);
client->sockfd = -1;
return;
@@ -313,7 +323,7 @@
int option_index = 1;
int c;
- struct sockaddr_in sockaddr;
+ struct sockaddr_in6 sockaddr;
socklen_t socklen;
fd_set rfds;
fd_set wfds;
@@ -399,14 +409,14 @@
#endif
/* Open the server's UDP port and prepare it for listening */
- g_udp_sockfd = socket(PF_INET, SOCK_DGRAM, 0);
+ g_udp_sockfd = socket(PF_INET6, SOCK_DGRAM, 0);
if (g_udp_sockfd == -1) {
lprintf(LOG_ERR, "could not create UDP socket: %m\n");
exit(EXIT_SYSCALL);
}
- sockaddr.sin_family = AF_INET;
- sockaddr.sin_port = htons(g_udp_port);
- sockaddr.sin_addr.s_addr = INADDR_ANY;
+ sockaddr.sin6_family = AF_INET6;
+ sockaddr.sin6_port = htons(g_udp_port);
+ sockaddr.sin6_addr = in6addr_any;
socklen = sizeof (sockaddr);
if (bind(g_udp_sockfd, (struct sockaddr *)&sockaddr, socklen) == -1) {
lprintf(LOG_ERR, "could not bind UDP socket to port %d: %m\n", g_udp_port);
@@ -414,7 +424,7 @@
}
/* Open the server's TCP port and prepare it for listening */
- g_tcp_sockfd = socket(PF_INET, SOCK_STREAM, 0);
+ g_tcp_sockfd = socket(PF_INET6, SOCK_STREAM, 0);
if (g_tcp_sockfd == -1) {
lprintf(LOG_ERR, "could not create TCP socket: %m\n");
exit(EXIT_SYSCALL);
@@ -424,9 +434,9 @@
lprintf(LOG_WARNING, "could not set SO_REUSEADDR on TCP socket: %m\n");
exit(EXIT_SYSCALL);
}
- sockaddr.sin_family = AF_INET;
- sockaddr.sin_port = htons(g_tcp_port);
- sockaddr.sin_addr.s_addr = INADDR_ANY;
+ sockaddr.sin6_family = AF_INET6;
+ sockaddr.sin6_port = htons(g_tcp_port);
+ sockaddr.sin6_addr = in6addr_any;
socklen = sizeof (sockaddr);
if (bind(g_tcp_sockfd, (struct sockaddr *)&sockaddr, socklen) == -1) {
lprintf(LOG_ERR, "could not bind TCP socket to port %d: %m\n", g_tcp_port);
--- a/mini_snmpd.h
+++ b/mini_snmpd.h
@@ -129,7 +129,7 @@
typedef struct client_s {
time_t timestamp;
int sockfd;
- in_addr_t addr;
+ struct in6_addr addr;
in_port_t port;
unsigned char packet[MAX_PACKET_SIZE];
size_t size;
--- a/utils.c
+++ b/utils.c
@@ -91,12 +91,13 @@
void dump_packet(const client_t *client)
{
- struct in_addr client_addr;
+ struct in6_addr client_addr;
+ char straddr[INET6_ADDRSTRLEN];
char buffer[BUFSIZ];
int len;
int i;
- client_addr.s_addr = client->addr;
+ client_addr = client->addr;
len = 0;
for (i = 0; i < client->size; i++) {
len += snprintf(buffer + len, sizeof (buffer) - len,
@@ -105,9 +106,10 @@
break;
}
}
+ inet_ntop(AF_INET6, &client_addr, straddr, sizeof(straddr));
lprintf(LOG_DEBUG, "%s %u bytes %s %s:%d (%s)\n",
client->outgoing ? "transmitted" : "received", (int) client->size,
- client->outgoing ? "to" : "from", inet_ntoa(client_addr),
+ client->outgoing ? "to" : "from", straddr,
ntohs(client->port), buffer);
}