summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 49275db)
raw | patch | inline | side by side (parent: 49275db)
author | octo <octo> | |
Mon, 30 Jan 2006 21:23:11 +0000 (21:23 +0000) | ||
committer | octo <octo> | |
Mon, 30 Jan 2006 21:23:11 +0000 (21:23 +0000) |
ChangeLog | patch | blob | history | |
TODO | patch | blob | history | |
src/collectd.conf.pod | patch | blob | history | |
src/configfile.c | patch | blob | history | |
src/network.c | patch | blob | history | |
src/network.h | patch | blob | history |
diff --git a/ChangeLog b/ChangeLog
index eecef0fa420f34b9f223aea6be554638ab94967a..7d6ea115545bbf70f57b84e83ea85efc102d3469 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
address and/or port than localhost.
* The `df' plugin now prefers `statvfs' over `statfs'.
* The network code has been rewritten. collectd now supports unicast
- and multicast, and IPv4 and IPv6. Also, the TTL of multicast packets
- can be set in the configfile.
+ and multicast, and IPv4 and IPv6. Also, the TTL of sent packages can
+ be set in the configfile.
2006-01-24, Version 3.6.2
* Due to a bug in the configfile handling collectd wouldn't start in
index ae003f0300f47d18823b4205034942d02271b4ea..1fe76c84b0b4bfcad78cbb788086dc8192bef283 100644 (file)
--- a/TODO
+++ b/TODO
-For version 3.6:
-* Fix RPM package
-
For version 3.*:
* Port nfs module to solaris
* Port tape module to Linux
* Maybe look into porting the serial module
-* Ping bug (disabled)
-* Write battery status, using /proc/pmu/battery_%i
diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod
index dfbe1eabf1a79548c305163bb20135fddc138849..3e4b958749338074022440114c216a560ccfff27 100644 (file)
--- a/src/collectd.conf.pod
+++ b/src/collectd.conf.pod
using a numeric port number or a service name. If the argument is omited the
default port B<25826> is assumed.
-=item B<MulticastTTL> I<1-255>
+=item B<TimeToLive> I<1-255>
-Set the time-to-live of multicast packets. The default is a TTL of C<1>.
+Set the time-to-live of sent packets. This applies to all, unicast and
+multicast, and IPv4 and IPv6 packets. The default is to not change this value.
+That means that multicast packets will be sent with a TTL of C<1> (one) on most
+operating systems.
=back
diff --git a/src/configfile.c b/src/configfile.c
index 41439ee187059cc1e50c20ef7544ff499bb810bb..252bd31d8eaad59b7c0c9551711b7d63daf3f7c6 100644 (file)
--- a/src/configfile.c
+++ b/src/configfile.c
*/
static cf_mode_item_t cf_mode_list[] =
{
- {"MulticastTTL",NULL, MODE_CLIENT },
+ {"TimeToLive", NULL, MODE_CLIENT },
{"PIDFile", NULL, MODE_CLIENT | MODE_SERVER | MODE_LOCAL},
{"DataDir", NULL, MODE_CLIENT | MODE_SERVER | MODE_LOCAL},
{"LogFile", NULL, MODE_CLIENT | MODE_SERVER | MODE_LOCAL}
diff --git a/src/network.c b/src/network.c
index cecf0bad743186158393292c7676621b3556fd3c..5f9aa7419c5ab8127002a3783d161361499150bb 100644 (file)
--- a/src/network.c
+++ b/src/network.c
static sockent_t *socklist_head = NULL;
-static int network_bind_socket (const sockent_t *se, const struct addrinfo *ai)
+static int network_set_ttl (const sockent_t *se, const struct addrinfo *ai)
{
- int loop = 1;
-
char *ttl_str;
int ttl_int;
- ttl_str = cf_get_option ("MulticastTTL", NULL);
- ttl_int = 0;
- if (ttl_str != NULL)
- ttl_int = atoi (ttl_str);
+ ttl_str = cf_get_option ("TimeToLive", NULL);
+ if (ttl_str == NULL)
+ return (-1);
+
+ ttl_int = atoi (ttl_str);
if ((ttl_int < 1) || (ttl_int > 255))
- ttl_int = NET_DEFAULT_MC_TTL;
+ {
+ syslog (LOG_WARNING, "A TTL value of %i is invalid.", ttl_int);
+ return (-1);
+ }
+
+ DBG ("ttl = %i", ttl_int);
+
+ if (ai->ai_family == AF_INET)
+ {
+ struct sockaddr_in *addr = (struct sockaddr_in *) ai->ai_addr;
+ int optname;
+
+ if (IN_MULTICAST (ntohl (addr->sin_addr.s_addr)))
+ optname = IP_MULTICAST_TTL;
+ else
+ optname = IP_TTL;
+
+ if (setsockopt (se->fd, IPPROTO_IP, optname,
+ &ttl_int, sizeof (ttl_int)) == -1)
+ {
+ syslog (LOG_ERR, "setsockopt: %s", strerror (errno));
+ return (-1);
+ }
+ }
+ else if (ai->ai_family == AF_INET6)
+ {
+ /* Useful example: http://gsyc.escet.urjc.es/~eva/IPv6-web/examples/mcast.html */
+ struct sockaddr_in6 *addr = (struct sockaddr_in6 *) ai->ai_addr;
+ int optname;
+
+ if (IN6_IS_ADDR_MULTICAST (&addr->sin6_addr))
+ optname = IPV6_MULTICAST_HOPS;
+ else
+ optname = IPV6_UNICAST_HOPS;
+
+ if (setsockopt (se->fd, IPPROTO_IPV6, optname,
+ &ttl_int, sizeof (ttl_int)) == -1)
+ {
+ syslog (LOG_ERR, "setsockopt: %s", strerror (errno));
+ return (-1);
+ }
+ }
+
+ return (0);
+}
+
+static int network_bind_socket (const sockent_t *se, const struct addrinfo *ai)
+{
+ int loop = 1;
DBG ("fd = %i; calling `bind'", se->fd);
return (-1);
}
- /* IP_MULTICAST_TTL */
- if (setsockopt (se->fd, IPPROTO_IP, IP_MULTICAST_TTL,
- &ttl_int, sizeof (ttl_int)) == -1)
- {
- syslog (LOG_ERR, "setsockopt: %s", strerror (errno));
- return (-1);
- }
-
if (setsockopt (se->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
&mreq, sizeof (mreq)) == -1)
{
@@ -147,13 +186,6 @@ static int network_bind_socket (const sockent_t *se, const struct addrinfo *ai)
return (-1);
}
- if (setsockopt (se->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
- &ttl_int, sizeof (ttl_int)) == -1)
- {
- syslog (LOG_ERR, "setsockopt: %s", strerror (errno));
- return (-1);
- }
-
if (setsockopt (se->fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
&mreq, sizeof (mreq)) == -1)
{
}
if (operating_mode == MODE_SERVER)
+ {
if (network_bind_socket (se, ai_ptr) != 0)
{
free (se->addr);
free (se);
continue;
}
+ }
+ else if (operating_mode == MODE_CLIENT)
+ {
+ network_set_ttl (se, ai_ptr);
+ }
if (socklist_tail == NULL)
{
diff --git a/src/network.h b/src/network.h
index aa3d3fcd03d3a85e040137efbf0b652eddeeefa5..374448cc7a3c53b2eb50a640f753fa048ff3f100 100644 (file)
--- a/src/network.h
+++ b/src/network.h
#define NET_DEFAULT_V4_ADDR "239.192.74.66"
#define NET_DEFAULT_V6_ADDR "ff18::efc0:4a42"
#define NET_DEFAULT_PORT "25826"
-#define NET_DEFAULT_MC_TTL 1
int network_create_socket (const char *node, const char *service);
int network_receive (char **host, char **type, char **instance, char **value);