Upgrade olsrd to 0.5.0, important note : ther is no mod-power sources in the 0.5.0 release, backport coming soon (#1572)

git-svn-id: svn://svn.openwrt.org/openwrt/packages/net/olsrd@6931 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
Florian Fainelli 2007-04-11 10:58:23 +00:00
parent fa3f2c52fd
commit ae7e6cab45
19 changed files with 6 additions and 12800 deletions

View File

@ -9,13 +9,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=olsrd
PKG_VERSION:=0.4.10
PKG_VERSION:=0.5.0
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:=http://www.olsr.org/releases/0.4
PKG_MD5SUM:=9807d4451e65cb4ec385155eef7bf3cf
PKG_SOURCE_URL:=http://www.olsr.org/releases/0.5
PKG_MD5SUM:=c82c72d7a55a423aa9d9e571084f041b
PKG_CAT:=bzcat
PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
@ -62,13 +62,6 @@ define Package/olsrd-mod-nameservice
MENU:=0
endef
define Package/olsrd-mod-power
$(call Package/olsrd)
DEPENDS:=olsrd
TITLE:=Power status plugin
MENU:=0
endef
define Package/olsrd-mod-secure
$(call Package/olsrd)
DEPENDS:=olsrd
@ -100,6 +93,9 @@ define Build/Compile
OS="linux" \
INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
LIBDIR="$(PKG_INSTALL_DIR)/usr/lib" \
SBINDIR="$(PKG_INSTALL_DIR)/usr/sbin/" \
ETCDIR="$(PKG_INSTALL_DIR)/etc" \
MANDIR="$(PKG_INSTALL_DIR)/usr/share/man" \
STRIP="/bin/true" \
all libs install install_libs
endef
@ -133,11 +129,6 @@ define Package/olsrd-mod-nameservice/install
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/olsrd_nameservice.so.* $(1)/usr/lib/
endef
define Package/olsrd-mod-power/install
$(INSTALL_DIR) $(1)/usr/lib
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/olsrd_power.so.* $(1)/usr/lib/
endef
define Package/olsrd-mod-secure/install
$(INSTALL_DIR) $(1)/etc/olsrd.d
$(CP) ./files/olsrd_secure_key $(1)/etc/olsrd.d/
@ -156,6 +147,5 @@ $(eval $(call BuildPackage,olsrd-mod-dot-draw))
$(eval $(call BuildPackage,olsrd-mod-dyn-gw))
$(eval $(call BuildPackage,olsrd-mod-httpinfo))
$(eval $(call BuildPackage,olsrd-mod-nameservice))
$(eval $(call BuildPackage,olsrd-mod-power))
$(eval $(call BuildPackage,olsrd-mod-secure))
$(eval $(call BuildPackage,olsrd-mod-tas))

View File

@ -1,9 +0,0 @@
diff -Nur olsrd-0.4.10.orig/lib/Makefile olsrd-0.4.10/lib/Makefile
--- olsrd-0.4.10.orig/lib/Makefile 2005-05-26 18:09:25.000000000 +0200
+++ olsrd-0.4.10/lib/Makefile 2006-12-01 08:18:12.000000000 +0100
@@ -1,4 +1,4 @@
-SUBDIRS = dot_draw dyn_gw httpinfo mini nameservice powerinfo secure tas
+SUBDIRS = $(shell find -maxdepth 1 -type d -not -name ".*" -not -name "CVS" -printf "%f\n")
.PHONY: $(SUBDIRS)

View File

@ -1,12 +0,0 @@
diff -ruN olsrd-0.4.10-old/Makefile.inc olsrd-0.4.10-new/Makefile.inc
--- olsrd-0.4.10-old/Makefile.inc 2006-01-01 16:58:20.000000000 +0100
+++ olsrd-0.4.10-new/Makefile.inc 2006-01-05 17:57:23.000000000 +0100
@@ -21,7 +21,7 @@
ifndef CFLAGS
CFLAGS += -Wall -Wmissing-prototypes -Wstrict-prototypes \
-Wmissing-declarations -Wsign-compare
-CFLAGS += -O2 -g
+CFLAGS += $(OFLAGS)
endif
ifdef OLSRD_PLUGIN

View File

@ -1,364 +0,0 @@
diff -Nur olsrd-0.4.10.orig/lib/dyn_gw_plain/Makefile olsrd-0.4.10/lib/dyn_gw_plain/Makefile
--- olsrd-0.4.10.orig/lib/dyn_gw_plain/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ olsrd-0.4.10/lib/dyn_gw_plain/Makefile 2006-12-01 08:26:58.000000000 +0100
@@ -0,0 +1,57 @@
+# The olsr.org Optimized Link-State Routing daemon(olsrd)
+# Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of olsr.org, olsrd nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# Visit http://www.olsr.org for more information.
+#
+# If you find this software useful feel free to make a donation
+# to the project. For more information see the website or contact
+# the copyright holders.
+#
+# $Id: olsrd-dyngwplain.patch,v 1.5 2006/12/04 08:33:46 sven-ola Exp $
+
+OLSRD_PLUGIN = true
+PLUGIN_NAME = olsrd_dyn_gw_plain
+PLUGIN_VER = 0.4
+
+TOPDIR = ../..
+include $(TOPDIR)/Makefile.inc
+
+default_target: $(PLUGIN_FULLNAME)
+
+$(PLUGIN_FULLNAME): $(OBJS)
+ $(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS)
+
+install: $(PLUGIN_FULLNAME)
+ $(STRIP) $(PLUGIN_FULLNAME)
+ $(INSTALL_LIB)
+
+clean:
+ rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME)
diff -Nur olsrd-0.4.10.orig/lib/dyn_gw_plain/README_DYN_GW_PLAIN olsrd-0.4.10/lib/dyn_gw_plain/README_DYN_GW_PLAIN
--- olsrd-0.4.10.orig/lib/dyn_gw_plain/README_DYN_GW_PLAIN 1970-01-01 01:00:00.000000000 +0100
+++ olsrd-0.4.10/lib/dyn_gw_plain/README_DYN_GW_PLAIN 2006-12-01 08:26:58.000000000 +0100
@@ -0,0 +1,17 @@
+DYNAMIC INTERNET GATEWAY PLAIN PLUGIN FOR olsr.org olsrd
+by Andreas Tønnesen(andreto@olsr.org)
+additions by Sven-Ola Tuecke
+
+This plugin is without Ping/libthread. It is the plain dyn_gw!
+
+HOW TO USE
+
+Add an entry like this to your olsrd configuration file:
+
+LoadPlugin "olsrd_dyn_gw_plain.so.0.4"
+{
+}
+
+ABOUT
+
+Plugin is IPv4 only.
diff -Nur olsrd-0.4.10.orig/lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.c olsrd-0.4.10/lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.c
--- olsrd-0.4.10.orig/lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.c 1970-01-01 01:00:00.000000000 +0100
+++ olsrd-0.4.10/lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.c 2006-12-01 08:26:58.000000000 +0100
@@ -0,0 +1,186 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ */
+
+#include "olsr_types.h"
+#include "olsrd_dyn_gw_plain.h"
+#include "scheduler.h"
+#include "olsr.h"
+#include "local_hna_set.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <net/route.h>
+#include <linux/in_route.h>
+#include <unistd.h>
+#include <errno.h>
+
+#define DEBUGLEV 1
+
+static int has_inet_gateway;
+
+/**
+ * Plugin interface version
+ * Used by main olsrd to check plugin interface version
+ */
+int
+olsrd_plugin_interface_version()
+{
+ return OLSRD_PLUGIN_INTERFACE_VERSION;
+}
+
+/**
+ * Register parameters from config file
+ * Called for all plugin parameters
+ */
+int
+olsrd_plugin_register_param(char *key, char *value)
+{
+ return 1;
+}
+
+/**
+ * Initialize plugin
+ * Called after all parameters are passed
+ */
+int
+olsrd_plugin_init()
+{
+ gw_net.v4 = INET_NET;
+ gw_netmask.v4 = INET_PREFIX;
+
+ has_inet_gateway = 0;
+
+ /* Remove all local Inet HNA entries */
+ while(remove_local_hna4_entry(&gw_net, &gw_netmask)) {
+ olsr_printf(DEBUGLEV, "HNA Internet gateway deleted\n");
+ }
+
+ /* Register the GW check */
+ olsr_register_scheduler_event(&olsr_event, NULL, 3, 4, NULL);
+
+ return 1;
+}
+
+int
+check_gw(union olsr_ip_addr *net, union olsr_ip_addr *mask)
+{
+ char buff[1024], iface[16];
+ olsr_u32_t gate_addr, dest_addr, netmask;
+ unsigned int iflags;
+ int num, metric, refcnt, use;
+ int retval = 0;
+
+ FILE *fp = fopen(PROCENTRY_ROUTE, "r");
+
+ if (!fp)
+ {
+ perror(PROCENTRY_ROUTE);
+ olsr_printf(DEBUGLEV, "INET (IPv4) not configured in this system.\n");
+ return -1;
+ }
+
+ rewind(fp);
+
+ /*
+ olsr_printf(DEBUGLEV, "Genmask Destination Gateway "
+ "Flags Metric Ref Use Iface\n");
+ /**/
+ while (fgets(buff, 1023, fp))
+ {
+ num = sscanf(buff, "%16s %128X %128X %X %d %d %d %128X \n",
+ iface, &dest_addr, &gate_addr,
+ &iflags, &refcnt, &use, &metric, &netmask);
+
+ if (num < 8)
+ {
+ continue;
+ }
+
+ /*
+ olsr_printf(DEBUGLEV, "%-15s ", olsr_ip_to_string((union olsr_ip_addr *)&netmask));
+
+ olsr_printf(DEBUGLEV, "%-15s ", olsr_ip_to_string((union olsr_ip_addr *)&dest_addr));
+
+ olsr_printf(DEBUGLEV, "%-15s %-6d %-2d %7d %s\n",
+ olsr_ip_to_string((union olsr_ip_addr *)&gate_addr),
+ metric, refcnt, use, iface);
+ /**/
+
+ if(//(iflags & RTF_GATEWAY) &&
+ (iflags & RTF_UP) &&
+ (metric == 0) &&
+ (netmask == mask->v4) &&
+ (dest_addr == net->v4))
+ {
+ olsr_printf(DEBUGLEV, "INTERNET GATEWAY VIA %s detected in routing table.\n", iface);
+ retval=1;
+ }
+
+ }
+
+ fclose(fp);
+
+ if(retval == 0)
+ {
+ olsr_printf(DEBUGLEV, "No Internet GWs detected...\n");
+ }
+
+ return retval;
+}
+
+/**
+ * Scheduled event to update the hna table,
+ * called from olsrd main thread to keep the hna table thread-safe
+ */
+void olsr_event(void* foo)
+{
+ int res = check_gw(&gw_net, &gw_netmask);
+ if (1 == res && 0 == has_inet_gateway) {
+ olsr_printf(DEBUGLEV, "Adding OLSR local HNA entry for Internet\n");
+ add_local_hna4_entry(&gw_net, &gw_netmask);
+ has_inet_gateway = 1;
+ }
+ else if (0 == res && 1 == has_inet_gateway) {
+ /* Remove all local Inet HNA entries */
+ while(remove_local_hna4_entry(&gw_net, &gw_netmask)) {
+ olsr_printf(DEBUGLEV, "Removing OLSR local HNA entry for Internet\n");
+ }
+ has_inet_gateway = 0;
+ }
+}
diff -Nur olsrd-0.4.10.orig/lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.h olsrd-0.4.10/lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.h
--- olsrd-0.4.10.orig/lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.h 1970-01-01 01:00:00.000000000 +0100
+++ olsrd-0.4.10/lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.h 2006-12-01 08:26:58.000000000 +0100
@@ -0,0 +1,59 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ */
+
+#ifndef _OLSRD_PLUGIN_TEST
+#define _OLSRD_PLUGIN_TEST
+
+#include "olsrd_plugin.h"
+#include "olsr.h"
+
+#define INET_NET 0
+#define INET_PREFIX 0
+
+#define PROCENTRY_ROUTE "/proc/net/route"
+
+union olsr_ip_addr gw_net;
+union olsr_ip_addr gw_netmask;
+
+int check_gw(union olsr_ip_addr *net, union olsr_ip_addr *mask);
+
+/* Event function to register with the scheduler */
+void olsr_event(void* foo);
+
+#endif
diff -Nur olsrd-0.4.10.orig/lib/dyn_gw_plain/version-script.txt olsrd-0.4.10/lib/dyn_gw_plain/version-script.txt
--- olsrd-0.4.10.orig/lib/dyn_gw_plain/version-script.txt 1970-01-01 01:00:00.000000000 +0100
+++ olsrd-0.4.10/lib/dyn_gw_plain/version-script.txt 2006-12-01 08:26:58.000000000 +0100
@@ -0,0 +1,10 @@
+VERS_1.0
+{
+ global:
+ olsrd_plugin_interface_version;
+ olsrd_plugin_register_param;
+ olsrd_plugin_init;
+
+ local:
+ *;
+};
diff -Nur olsrd-0.4.10.orig/Makefile olsrd-0.4.10/Makefile
--- olsrd-0.4.10.orig/Makefile 2006-01-04 09:45:38.000000000 +0100
+++ olsrd-0.4.10/Makefile 2006-12-01 08:26:58.000000000 +0100
@@ -144,6 +144,11 @@
$(MAKE) -C lib/dyn_gw
$(MAKE) -C lib/dyn_gw install
+dyn_gw_plain:
+ $(MAKE) -C lib/dyn_gw_plain clean
+ $(MAKE) -C lib/dyn_gw_plain
+ $(MAKE) -C lib/dyn_gw_plain install
+
powerinfo:
$(MAKE) -C lib/powerinfo clean
$(MAKE) -C lib/powerinfo

File diff suppressed because it is too large Load Diff

View File

@ -1,853 +0,0 @@
diff -Nur olsrd-0.4.10.orig/lib/txtinfo/Makefile olsrd-0.4.10/lib/txtinfo/Makefile
--- olsrd-0.4.10.orig/lib/txtinfo/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ olsrd-0.4.10/lib/txtinfo/Makefile 2006-12-01 08:26:58.000000000 +0100
@@ -0,0 +1,57 @@
+# The olsr.org Optimized Link-State Routing daemon(olsrd)
+# Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of olsr.org, olsrd nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# Visit http://www.olsr.org for more information.
+#
+# If you find this software useful feel free to make a donation
+# to the project. For more information see the website or contact
+# the copyright holders.
+#
+# $Id: olsrd-txtinfo.patch,v 1.5 2006/12/04 08:33:46 sven-ola Exp $
+
+OLSRD_PLUGIN = true
+PLUGIN_NAME = olsrd_txtinfo
+PLUGIN_VER = 0.1
+
+TOPDIR = ../..
+include $(TOPDIR)/Makefile.inc
+
+default_target: $(PLUGIN_FULLNAME)
+
+$(PLUGIN_FULLNAME): $(OBJS)
+ $(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS)
+
+install: $(PLUGIN_FULLNAME)
+ $(STRIP) $(PLUGIN_FULLNAME)
+ $(INSTALL_LIB)
+
+clean:
+ rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME)
diff -Nur olsrd-0.4.10.orig/lib/txtinfo/README_TXTINFO olsrd-0.4.10/lib/txtinfo/README_TXTINFO
--- olsrd-0.4.10.orig/lib/txtinfo/README_TXTINFO 1970-01-01 01:00:00.000000000 +0100
+++ olsrd-0.4.10/lib/txtinfo/README_TXTINFO 2006-12-01 08:26:58.000000000 +0100
@@ -0,0 +1,16 @@
+LoadPlugin "olsrd_txtinfo.so.0.1"
+{
+ PlParam "accept" "10.247.200.4"
+}
+
+ABOUT
+
+telnet 127.0.0.1 2006
+or
+wget localhost:2006 -qO -
+
+installation:
+make
+make install
+
+- Lorenz Schori
diff -Nur olsrd-0.4.10.orig/lib/txtinfo/src/olsrd_plugin.c olsrd-0.4.10/lib/txtinfo/src/olsrd_plugin.c
--- olsrd-0.4.10.orig/lib/txtinfo/src/olsrd_plugin.c 1970-01-01 01:00:00.000000000 +0100
+++ olsrd-0.4.10/lib/txtinfo/src/olsrd_plugin.c 2006-12-01 08:26:58.000000000 +0100
@@ -0,0 +1,142 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ * $Id: olsrd-txtinfo.patch,v 1.5 2006/12/04 08:33:46 sven-ola Exp $
+ */
+
+/*
+ * Dynamic linked library for the olsr.org olsr daemon
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+
+#include "olsrd_plugin.h"
+#include "olsrd_txtinfo.h"
+
+
+#define PLUGIN_NAME "OLSRD txtinfo plugin"
+#define PLUGIN_VERSION "0.1"
+#define PLUGIN_AUTHOR "Lorenz Schori"
+#define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
+#define PLUGIN_INTERFACE_VERSION 4
+
+
+struct in_addr ipc_accept_ip;
+int ipc_port;
+int nompr;
+
+
+static void __attribute__ ((constructor))
+my_init(void);
+
+static void __attribute__ ((destructor))
+my_fini(void);
+
+
+/**
+ *Constructor
+ */
+static void
+my_init()
+{
+ /* Print plugin info to stdout */
+ printf("%s\n", MOD_DESC);
+
+ /* defaults for parameters */
+ ipc_port = 2006;
+ ipc_accept_ip.s_addr = htonl(INADDR_LOOPBACK);
+
+ /* highlite neighbours by default */
+ nompr = 0;
+}
+
+
+/**
+ *Destructor
+ */
+static void
+my_fini()
+{
+ /* Calls the destruction function
+ * olsr_plugin_exit()
+ * This function should be present in your
+ * sourcefile and all data destruction
+ * should happen there - NOT HERE!
+ */
+ olsr_plugin_exit();
+}
+
+
+int
+olsrd_plugin_interface_version()
+{
+ return PLUGIN_INTERFACE_VERSION;
+}
+
+
+int
+olsrd_plugin_register_param(char *key, char *value)
+{
+ if(!strcmp(key, "port"))
+ {
+ ipc_port = atoi(value);
+ printf("(TXTINFO) listening on port: %d\n", ipc_port);
+ }
+
+ if(!strcmp(key, "accept"))
+ {
+ inet_aton(value, &ipc_accept_ip);
+ printf("(TXTINFO) accept only: %s\n", inet_ntoa(ipc_accept_ip));
+ }
+/*
+ if(!strcmp(key, "hilitemprneighbours"))
+ {
+ if(!strcmp(value, "false") || !strcmp(value, "0"))
+ {
+ nompr=1;
+ }
+ }
+ */
+ return 1;
+}
diff -Nur olsrd-0.4.10.orig/lib/txtinfo/src/olsrd_txtinfo.c olsrd-0.4.10/lib/txtinfo/src/olsrd_txtinfo.c
--- olsrd-0.4.10.orig/lib/txtinfo/src/olsrd_txtinfo.c 1970-01-01 01:00:00.000000000 +0100
+++ olsrd-0.4.10/lib/txtinfo/src/olsrd_txtinfo.c 2006-12-01 08:26:58.000000000 +0100
@@ -0,0 +1,542 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+ * includes code by Bruno Randolf
+ * includes code by Andreas Lopatic
+ * includes code by Sven-Ola Tuecke
+ * includes code by Lorenz Schori
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ * $Id: olsrd-txtinfo.patch,v 1.5 2006/12/04 08:33:46 sven-ola Exp $
+ */
+
+/*
+ * Dynamic linked library for the olsr.org olsr daemon
+ */
+
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/select.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/time.h>
+#include <time.h>
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "olsr.h"
+#include "olsr_types.h"
+#include "neighbor_table.h"
+#include "two_hop_neighbor_table.h"
+#include "mpr_selector_set.h"
+#include "tc_set.h"
+#include "hna_set.h"
+#include "mid_set.h"
+#include "link_set.h"
+#include "socket_parser.h"
+
+#include "olsrd_txtinfo.h"
+#include "olsrd_plugin.h"
+
+
+#ifdef WIN32
+#define close(x) closesocket(x)
+#endif
+
+
+static int ipc_socket;
+static int ipc_open;
+static int ipc_connection;
+static int ipc_socket_up;
+
+
+/* IPC initialization function */
+static int
+plugin_ipc_init(void);
+
+static void
+send_info(int neighonly);
+
+static void
+ipc_action(int);
+
+static void inline
+ipc_print_neigh_link(void);
+
+static void inline
+ipc_print_routes(void);
+
+static void inline
+ipc_print_topology(void);
+
+static void inline
+ipc_print_hna(void);
+
+#define TXT_IPC_BUFSIZE 256
+static int
+ipc_sendf(const char* format, ...);
+
+/**
+ *Do initialization here
+ *
+ *This function is called by the my_init
+ *function in uolsrd_plugin.c
+ */
+int
+olsrd_plugin_init()
+{
+ /* Initial IPC value */
+ ipc_open = 0;
+ ipc_socket_up = 0;
+
+ plugin_ipc_init();
+ return 1;
+}
+
+
+/**
+ * destructor - called at unload
+ */
+void
+olsr_plugin_exit()
+{
+ if(ipc_open)
+ close(ipc_socket);
+}
+
+
+
+static int
+plugin_ipc_init()
+{
+ struct sockaddr_in sin;
+ olsr_u32_t yes = 1;
+
+ /* Init ipc socket */
+ if ((ipc_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ {
+#ifndef NODEBUG
+ olsr_printf(1, "(TXTINFO) socket()=%s\n", strerror(errno));
+#endif
+ return 0;
+ }
+ else
+ {
+ if (setsockopt(ipc_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0)
+ {
+#ifndef NODEBUG
+ olsr_printf(1, "(TXTINFO) setsockopt()=%s\n", strerror(errno));
+#endif
+ return 0;
+ }
+
+#if defined __FreeBSD__ && defined SO_NOSIGPIPE
+ if (setsockopt(ipc_socket, SOL_SOCKET, SO_NOSIGPIPE, (char *)&yes, sizeof(yes)) < 0)
+ {
+ perror("SO_REUSEADDR failed");
+ return 0;
+ }
+#endif
+
+ /* Bind the socket */
+
+ /* complete the socket structure */
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = INADDR_ANY;
+ sin.sin_port = htons(ipc_port);
+
+ /* bind the socket to the port number */
+ if (bind(ipc_socket, (struct sockaddr *) &sin, sizeof(sin)) == -1)
+ {
+#ifndef NODEBUG
+ olsr_printf(1, "(TXTINFO) bind()=%s\n", strerror(errno));
+#endif
+ return 0;
+ }
+
+ /* show that we are willing to listen */
+ if (listen(ipc_socket, 1) == -1)
+ {
+#ifndef NODEBUG
+ olsr_printf(1, "(TXTINFO) listen()=%s\n", strerror(errno));
+#endif
+ return 0;
+ }
+
+ /* Register with olsrd */
+ add_olsr_socket(ipc_socket, &ipc_action);
+
+#ifndef NODEBUG
+ olsr_printf(2, "(TXTINFO) listening on port %d\n",ipc_port);
+#endif
+ ipc_socket_up = 1;
+ }
+
+ return 1;
+}
+
+
+static void
+ipc_action(int fd)
+{
+ struct sockaddr_in pin;
+ socklen_t addrlen;
+ char *addr;
+
+ addrlen = sizeof(struct sockaddr_in);
+
+ if(ipc_open)
+ return;
+
+ if ((ipc_connection = accept(fd, (struct sockaddr *) &pin, &addrlen)) == -1)
+ {
+#ifndef NODEBUG
+ olsr_printf(1, "(TXTINFO) accept()=%s\n", strerror(errno));
+#endif
+ exit(1);
+ }
+ else
+ {
+ addr = inet_ntoa(pin.sin_addr);
+ if(ntohl(pin.sin_addr.s_addr) != ntohl(ipc_accept_ip.s_addr))
+ {
+ olsr_printf(1, "(TXTINFO) From host(%s) not allowed!\n", addr);
+ close(ipc_connection);
+ return;
+ }
+ else
+ {
+ ipc_open = 1;
+#ifndef NODEBUG
+ olsr_printf(2, "(TXTINFO) Connect from %s\n",addr);
+#endif
+
+ /* purge read buffer to prevent blocking on linux*/
+ fd_set rfds;
+ FD_ZERO(&rfds);
+ FD_SET(ipc_connection, &rfds);
+ struct timeval tv = {0,0};
+ int neighonly = 0;
+ if(select(ipc_connection+1, &rfds, NULL, NULL, &tv)) {
+ char requ[128];
+ ssize_t s = recv(ipc_connection, &requ, sizeof(requ), 0);
+ if (0 < s) {
+ requ[s] = 0;
+ /* To print out neighbours only on the Freifunk Status
+ * page the normal output is somewhat lengthy. The
+ * header parsing is sufficient for standard wget.
+ */
+ neighonly = (0 != strstr(requ, "/neighbours"));
+ }
+ }
+
+ send_info(neighonly);
+
+ close(ipc_connection);
+ ipc_open = 0;
+ }
+ }
+}
+
+static void inline
+ipc_print_neigh_link(void)
+{
+ struct neighbor_entry *neigh;
+ struct neighbor_2_list_entry *list_2;
+ struct link_entry *link = NULL;
+ int index, thop_cnt;
+
+ ipc_sendf("Table: Links\nLocal IP\tremote IP\tHysteresis\tLinkQuality\tlost\ttotal\tNLQ\tETX\n");
+
+ /* Link set */
+ link = link_set;
+ while(link)
+ {
+ ipc_sendf( "%s\t%s\t%0.2f\t%0.2f\t%d\t%d\t%0.2f\t%0.2f\t\n",
+ olsr_ip_to_string(&link->local_iface_addr),
+ olsr_ip_to_string(&link->neighbor_iface_addr),
+ link->L_link_quality,
+ link->loss_link_quality,
+ link->lost_packets,
+ link->total_packets,
+ link->neigh_link_quality,
+ (link->loss_link_quality * link->neigh_link_quality) ? 1.0 / (link->loss_link_quality * link->neigh_link_quality) : 0.0);
+ link = link->next;
+ }
+ ipc_sendf("\nTable: Neighbors\nIP address\tSYM\tMPR\tMPRS\tWillingness\t2 Hop Neighbors\n");
+
+ /* Neighbors */
+ for(index=0;index<HASHSIZE;index++)
+ {
+ for(neigh = neighbortable[index].next;
+ neigh != &neighbortable[index];
+ neigh = neigh->next)
+ {
+ ipc_sendf(
+ "%s\t%s\t%s\t%s\t%d\t",
+ olsr_ip_to_string(&neigh->neighbor_main_addr),
+ (neigh->status == SYM) ? "YES" : "NO",
+ neigh->is_mpr ? "YES" : "NO",
+ olsr_lookup_mprs_set(&neigh->neighbor_main_addr) ? "YES" : "NO",
+ neigh->willingness);
+
+ thop_cnt = 0;
+
+ for(list_2 = neigh->neighbor_2_list.next;
+ list_2 != &neigh->neighbor_2_list;
+ list_2 = list_2->next)
+ {
+ //size += sprintf(&buf[size], "<option>%s</option>\n", olsr_ip_to_string(&list_2->neighbor_2->neighbor_2_addr));
+ thop_cnt ++;
+ }
+ ipc_sendf("%d\n", thop_cnt);
+ }
+ }
+
+ ipc_sendf("\n");
+}
+
+
+static void inline
+ipc_print_routes(void)
+{
+ int size = 0, index;
+ struct rt_entry *routes;
+
+ ipc_sendf("Table: Routes\nDestination\tGateway\tMetric\tETX\tInterface\tType\n");
+
+ /* Neighbors */
+ for(index = 0;index < HASHSIZE;index++)
+ {
+ for(routes = routingtable[index].next;
+ routes != &routingtable[index];
+ routes = routes->next)
+ {
+ size = 0;
+ ipc_sendf( "%s\t%s\t%d\t%.2f\t%s\tHOST\n",
+ olsr_ip_to_string(&routes->rt_dst),
+ olsr_ip_to_string(&routes->rt_router),
+ routes->rt_metric,
+ routes->rt_etx,
+ routes->rt_if->int_name);
+ }
+ }
+
+ /* HNA */
+ for(index = 0;index < HASHSIZE;index++)
+ {
+ for(routes = hna_routes[index].next;
+ routes != &hna_routes[index];
+ routes = routes->next)
+ {
+ ipc_sendf("%s\t%s\t%d\t%s\t\tHNA\n",
+ olsr_ip_to_string(&routes->rt_dst),
+ olsr_ip_to_string(&routes->rt_router),
+ routes->rt_metric,
+ routes->rt_if->int_name);
+ }
+ }
+
+ ipc_sendf("\n");
+
+}
+
+static void inline
+ipc_print_topology(void)
+{
+ olsr_u8_t index;
+ struct tc_entry *entry;
+ struct topo_dst *dst_entry;
+
+
+ ipc_sendf("Table: Topology\nDestination IP\tLast hop IP\tLQ\tILQ\tETX\n");
+
+ /* Topology */
+ for(index=0;index<HASHSIZE;index++)
+ {
+ /* For all TC entries */
+ entry = tc_table[index].next;
+ while(entry != &tc_table[index])
+ {
+ /* For all destination entries of that TC entry */
+ dst_entry = entry->destinations.next;
+ while(dst_entry != &entry->destinations)
+ {
+ ipc_sendf( "%s\t%s\t%0.2f\t%0.2f\t%0.2f\n",
+ olsr_ip_to_string(&dst_entry->T_dest_addr),
+ olsr_ip_to_string(&entry->T_last_addr),
+ dst_entry->link_quality,
+ dst_entry->inverse_link_quality,
+ (dst_entry->link_quality * dst_entry->inverse_link_quality) ? 1.0 / (dst_entry->link_quality * dst_entry->inverse_link_quality) : 0.0);
+
+ dst_entry = dst_entry->next;
+ }
+ entry = entry->next;
+ }
+ }
+
+ ipc_sendf("\n");
+}
+
+static void inline
+ipc_print_hna(void)
+{
+ int size;
+ olsr_u8_t index;
+ struct hna_entry *tmp_hna;
+ struct hna_net *tmp_net;
+
+ size = 0;
+
+ ipc_sendf("Table: HNA\nNetwork\tNetmask\tGateway\n");
+
+ /* Announced HNA entries */
+ struct hna4_entry *hna4;
+ for(hna4 = olsr_cnf->hna4_entries; hna4; hna4 = hna4->next)
+ {
+ ipc_sendf("%s\t%s\t%s\n",
+ olsr_ip_to_string((union olsr_ip_addr *)&hna4->net),
+ olsr_ip_to_string((union olsr_ip_addr *)&hna4->netmask),
+ olsr_ip_to_string((union olsr_ip_addr *)&main_addr));
+ }
+ struct hna6_entry *hna6;
+ for(hna6 = olsr_cnf->hna6_entries; hna6; hna6 = hna6->next)
+ {
+ ipc_sendf("%s\t%d\t%s\n",
+ olsr_ip_to_string((union olsr_ip_addr *)&hna6->net),
+ hna6->prefix_len,
+ olsr_ip_to_string((union olsr_ip_addr *)&main_addr));
+ }
+
+ /* HNA entries */
+ for(index=0;index<HASHSIZE;index++)
+ {
+ tmp_hna = hna_set[index].next;
+ /* Check all entrys */
+ while(tmp_hna != &hna_set[index])
+ {
+ /* Check all networks */
+ tmp_net = tmp_hna->networks.next;
+
+ while(tmp_net != &tmp_hna->networks)
+ {
+ if (AF_INET == olsr_cnf->ip_version) {
+ ipc_sendf("%s\t%s\t%s\n",
+ olsr_ip_to_string(&tmp_net->A_network_addr),
+ olsr_ip_to_string((union olsr_ip_addr *)&tmp_net->A_netmask.v4),
+ olsr_ip_to_string(&tmp_hna->A_gateway_addr));
+ }
+ else {
+ ipc_sendf("%s\t%d\t%s\n",
+ olsr_ip_to_string(&tmp_net->A_network_addr),
+ tmp_net->A_netmask.v6,
+ olsr_ip_to_string(&tmp_hna->A_gateway_addr));
+ }
+ tmp_net = tmp_net->next;
+ }
+
+ tmp_hna = tmp_hna->next;
+ }
+ }
+
+ ipc_sendf("\n");
+
+}
+
+
+static void
+send_info(int neighonly)
+{
+
+ /* Print minimal http header */
+ ipc_sendf("HTTP/1.0 200 OK\n");
+ ipc_sendf("Content-type: text/plain\n\n");
+
+ /* Print tables to IPC socket */
+
+ /* links + Neighbors */
+ ipc_print_neigh_link();
+
+ /* topology */
+ if (!neighonly) ipc_print_topology();
+
+ /* hna */
+ if (!neighonly) ipc_print_hna();
+
+ /* routes */
+ if (!neighonly) ipc_print_routes();
+}
+
+/*
+ * In a bigger mesh, there are probs with the fixed
+ * bufsize. Because the Content-Length header is
+ * optional, the sprintf() is changed to a more
+ * scalable solution here.
+ */
+
+static int
+ipc_sendf(const char* format, ...)
+{
+ char txtnetbuf[TXT_IPC_BUFSIZE];
+
+ va_list arg;
+ int rv;
+#if defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined __MacOSX__
+ int flags = 0;
+#else
+ int flags = MSG_NOSIGNAL;
+#endif
+ va_start(arg, format);
+ rv = vsnprintf(txtnetbuf, sizeof(txtnetbuf), format, arg);
+ va_end(arg);
+ if(ipc_socket_up) {
+ if (0 > send(ipc_connection, txtnetbuf, rv, flags)) {
+#ifndef NODEBUG
+ olsr_printf(1, "(TXTINFO) Failed sending data to client!\n");
+#endif
+ close(ipc_connection);
+ return - 1;
+ }
+ }
+ return rv;
+}
diff -Nur olsrd-0.4.10.orig/lib/txtinfo/src/olsrd_txtinfo.h olsrd-0.4.10/lib/txtinfo/src/olsrd_txtinfo.h
--- olsrd-0.4.10.orig/lib/txtinfo/src/olsrd_txtinfo.h 1970-01-01 01:00:00.000000000 +0100
+++ olsrd-0.4.10/lib/txtinfo/src/olsrd_txtinfo.h 2006-12-01 08:26:58.000000000 +0100
@@ -0,0 +1,62 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+ * includes code by Bruno Randolf
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ * $Id: olsrd-txtinfo.patch,v 1.5 2006/12/04 08:33:46 sven-ola Exp $
+ */
+
+/*
+ * Dynamic linked library for the olsr.org olsr daemon
+ */
+
+#ifndef _OLSRD_DOT_DRAW
+#define _OLSRD_DOT_DRAW
+
+
+extern struct in_addr ipc_accept_ip;
+extern int ipc_port;
+extern int nompr;
+
+
+int
+olsrd_plugin_init(void);
+
+void
+olsr_plugin_exit(void);
+
+#endif
diff -Nur olsrd-0.4.10.orig/lib/txtinfo/version-script.txt olsrd-0.4.10/lib/txtinfo/version-script.txt
--- olsrd-0.4.10.orig/lib/txtinfo/version-script.txt 1970-01-01 01:00:00.000000000 +0100
+++ olsrd-0.4.10/lib/txtinfo/version-script.txt 2006-12-01 08:26:58.000000000 +0100
@@ -0,0 +1,10 @@
+VERS_1.0
+{
+ global:
+ olsrd_plugin_interface_version;
+ olsrd_plugin_register_param;
+ olsrd_plugin_init;
+
+ local:
+ *;
+};

File diff suppressed because it is too large Load Diff

View File

@ -1,259 +0,0 @@
diff -Nur olsrd-0.4.10.orig/src/main.c olsrd-0.4.10/src/main.c
--- olsrd-0.4.10.orig/src/main.c 2005-09-29 07:53:34.000000000 +0200
+++ olsrd-0.4.10/src/main.c 2006-12-01 09:10:15.000000000 +0100
@@ -280,6 +280,9 @@
/* Initialize parser */
olsr_init_parser();
+ /* Initialize route-exporter */
+ olsr_init_export_route();
+
/* Initialize message sequencnumber */
init_msg_seqno();
diff -Nur olsrd-0.4.10.orig/src/process_routes.c olsrd-0.4.10/src/process_routes.c
--- olsrd-0.4.10.orig/src/process_routes.c 2005-05-30 15:13:38.000000000 +0200
+++ olsrd-0.4.10/src/process_routes.c 2006-12-01 09:10:15.000000000 +0100
@@ -3,6 +3,9 @@
* Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
* All rights reserved.
*
+ * export_route_entry interface added by Immo 'FaUl Wehrenberg
+ * <immo@chaostreff-dortmund.de>
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -39,7 +42,6 @@
* $Id: process_routes.c,v 1.27 2005/05/30 13:13:38 kattemat Exp $
*/
-
#include "defs.h"
#include "olsr.h"
#include "log.h"
@@ -51,10 +53,162 @@
#define strerror(x) StrError(x)
#endif
+struct export_route_entry
+{
+ olsr_u8_t type; /* AF_INET/AF_INET6 */
+ int (*function)(struct rt_entry*);
+ struct export_route_entry *next;
+};
+
+
+static struct export_route_entry *add_routes;
+static struct export_route_entry *del_routes;
+
struct rt_entry old_routes[HASHSIZE];
struct rt_entry old_hna[HASHSIZE];
+void
+olsr_addroute_add_function(int (*function)(struct rt_entry*), olsr_u8_t type)
+{
+ struct export_route_entry *tmp;
+ tmp = olsr_malloc(sizeof *tmp, "olsr_addroute_add_function");
+ tmp->type = type;
+ tmp->function = function;
+ tmp->next = add_routes;
+ add_routes = tmp;
+}
+
+void
+olsr_delroute_add_function(int (*function) (struct rt_entry*), olsr_u8_t type)
+{
+ struct export_route_entry *tmp;
+ tmp = olsr_malloc(sizeof *tmp, "olsr_delroute_add_function");
+ tmp->type = type;
+ tmp->function = function;
+ tmp->next = del_routes;
+ del_routes = tmp;
+}
+
+
+int
+olsr_addroute_remove_function(int (*function) (struct rt_entry*), olsr_u8_t type)
+{
+ struct export_route_entry *tmp, *prev = NULL /* Make compiler happy */;
+ tmp = add_routes;
+ while (tmp)
+ {
+ if (function == tmp->function && type == tmp->type)
+ {
+ if (tmp == add_routes)
+ {
+ add_routes = add_routes->next;
+ free (tmp);
+ return 1;
+ }
+ else
+ {
+ prev->next = tmp->next;
+ free (tmp);
+ return 1;
+ }
+ }
+ prev = tmp;
+ tmp = tmp->next;
+ }
+ return 0;
+}
+
+int
+olsr_delroute_remove_function(int (*function) (struct rt_entry*), olsr_u8_t type)
+{
+ struct export_route_entry *tmp, *prev = NULL /* Make compiler happy */;
+ tmp = del_routes;
+ while (tmp)
+ {
+ if (function == tmp->function && type == tmp->type)
+ {
+ if (tmp == del_routes)
+ {
+ del_routes = del_routes->next;
+ free (tmp);
+ return 1;
+ }
+ else
+ {
+ prev->next = tmp->next;
+ free (tmp);
+ return 1;
+ }
+ }
+ prev = tmp;
+ tmp = tmp->next;
+ }
+ return 0;
+}
+
+void
+olsr_init_export_route()
+{
+ olsr_addroute_add_function(&olsr_ioctl_add_route, AF_INET);
+ olsr_addroute_add_function(&olsr_ioctl_add_route6, AF_INET6);
+ olsr_delroute_add_function(&olsr_ioctl_del_route, AF_INET);
+ olsr_delroute_add_function(&olsr_ioctl_del_route6, AF_INET6);
+}
+
+int
+olsr_export_add_route (struct rt_entry *e)
+{
+ int retval = 0;
+ struct export_route_entry *tmp;
+ for (tmp = add_routes; tmp; tmp = tmp->next)
+ {
+ if (tmp->type == AF_INET)
+ retval = tmp->function(e);
+ }
+ return retval;
+}
+
+int
+olsr_export_add_route6 (struct rt_entry *e)
+{
+ int retval = 0;
+ struct export_route_entry *tmp;
+ for (tmp = add_routes; tmp; tmp = tmp->next)
+ {
+ if (tmp->type == AF_INET6)
+ retval = tmp->function(e);
+ }
+ return retval;
+}
+
+int
+olsr_export_del_route (struct rt_entry *e)
+{
+ int retval = 0;
+ struct export_route_entry *tmp;
+ for (tmp = del_routes; tmp; tmp = tmp->next)
+ {
+ if (tmp->type == AF_INET)
+ retval = tmp->function(e);
+ }
+ return retval;
+}
+
+int
+olsr_export_del_route6 (struct rt_entry *e)
+{
+ int retval = 0;
+ struct export_route_entry *tmp;
+ for (tmp = del_routes; tmp; tmp = tmp->next)
+ {
+ if (tmp->type == AF_INET6)
+ retval = tmp->function(e);
+ }
+ return retval;
+}
+
+
int
olsr_init_old_table()
@@ -348,9 +502,9 @@
if(!olsr_cnf->host_emul)
{
if(olsr_cnf->ip_version == AF_INET)
- error = olsr_ioctl_del_route(destination_ptr->destination);
+ error = olsr_export_del_route(destination_ptr->destination);
else
- error = olsr_ioctl_del_route6(destination_ptr->destination);
+ error = olsr_export_del_route6(destination_ptr->destination);
if(error < 0)
{
@@ -436,9 +590,9 @@
if(!olsr_cnf->host_emul)
{
if(olsr_cnf->ip_version == AF_INET)
- error=olsr_ioctl_add_route(destination_kernel->destination);
+ error=olsr_export_add_route(destination_kernel->destination);
else
- error=olsr_ioctl_add_route6(destination_kernel->destination);
+ error=olsr_export_add_route6(destination_kernel->destination);
if(error < 0)
{
diff -Nur olsrd-0.4.10.orig/src/process_routes.h olsrd-0.4.10/src/process_routes.h
--- olsrd-0.4.10.orig/src/process_routes.h 2005-05-29 14:47:45.000000000 +0200
+++ olsrd-0.4.10/src/process_routes.h 2006-12-01 09:10:15.000000000 +0100
@@ -50,6 +50,34 @@
extern struct rt_entry old_routes[HASHSIZE];
extern struct rt_entry old_hna[HASHSIZE];
+void
+olsr_init_export_route(void);
+
+void
+olsr_addroute_add_function(int (*)(struct rt_entry*), olsr_u8_t);
+
+int
+olsr_addroute_remove_function(int (*)(struct rt_entry*), olsr_u8_t);
+
+void
+olsr_delroute_add_function(int (*)(struct rt_entry*), olsr_u8_t);
+
+int
+olsr_delroute_remove_function(int (*)(struct rt_entry*), olsr_u8_t);
+
+int
+olsr_export_add_route (struct rt_entry*);
+
+int
+olsr_export_del_route (struct rt_entry*);
+
+int
+olsr_export_add_route6 (struct rt_entry*);
+
+int
+olsr_export_del_route6 (struct rt_entry*);
+
+
int
olsr_init_old_table(void);

File diff suppressed because it is too large Load Diff

View File

@ -1,336 +0,0 @@
diff -Nur olsrd-0.4.10.orig/lib/bmf/src/Bmf.c olsrd-0.4.10/lib/bmf/src/Bmf.c
--- olsrd-0.4.10.orig/lib/bmf/src/Bmf.c 2006-11-29 12:45:19.000000000 +0100
+++ olsrd-0.4.10/lib/bmf/src/Bmf.c 2006-11-29 12:47:49.000000000 +0100
@@ -114,7 +114,15 @@
/* Only forward multicast or local broadcast packets */
COPY_IP(&destIp, &ipData->ip_dst);
- if (! IsMulticast(&destIp) && ! IsLocalBroadcast(&destIp, intf))
+ if (! IsMulticast(&destIp)
+#ifdef SVEN_OLA_DISABLED
+ /*
+ * Sven-Ola@gmx.de: In a bigger mesh, there are a lot of
+ * accidential bcast sources. Disabled to save bandwidth
+ */
+ && ! IsLocalBroadcast(&destIp, intf)
+#endif
+ )
{
return;
}
@@ -128,9 +136,10 @@
COPY_IP(&srcIp, &ipData->ip_src);
olsr_printf(
9,
- "%s: pkt of %d bytes incoming on \"%s\": %s->%s\n",
+ "%s: pkt of %d bytes ttl=%d incoming on \"%s\": %s->%s\n",
PLUGIN_NAME_SHORT,
ethPktLen,
+ GetIpTtl(ethPkt),
intf->ifName,
olsr_ip_to_string(&srcIp),
olsr_ip_to_string(&destIp));
@@ -191,6 +200,7 @@
struct TEncapHeader* encapHdr = (struct TEncapHeader*) buffer;
memset (encapHdr, 0, ENCAP_HDR_LEN);
encapHdr->crc32 = htonl(crc32);
+ encapHdr->encapttl = GetIpTtl(ethPkt);
/* If this packet is captured on an OLSR interface from an OLSR neighbor,
* check with OLSR if I am MPR for that neighbor */
@@ -248,7 +258,7 @@
/* If the TTL is <= 0, do not forward this packet */
if (GetIpTtl(ethPkt) <= 0)
{
- OLSR_PRINTF(
+ olsr_printf(
9,
"%s: --> not forwarding on \"%s\": TTL=0\n",
PLUGIN_NAME_SHORT,
@@ -272,10 +282,11 @@
}
else
{
- OLSR_PRINTF(
+ olsr_printf(
9,
- "%s: --> forwarded to \"%s\"\n",
+ "%s: --> forwarded(capt) ttl=%d to \"%s\"\n",
PLUGIN_NAME_SHORT,
+ GetIpTtl(ethPkt),
fwIntf->ifName);
}
}
@@ -291,6 +302,7 @@
if (isToOlsrIntf && !iAmNotMpr)
{
int nBytesWritten;
+ unsigned char ttl;
/* Change encapsulated source MAC address to that of sending interface */
memcpy(ethPkt + IFHWADDRLEN, fwIntf->macAddr, IFHWADDRLEN);
@@ -298,6 +310,10 @@
/* Destination address is local broadcast */
encapDest.sin_addr.s_addr = ((struct sockaddr_in*)&fwIntf->olsrIntf->int_broadaddr)->sin_addr.s_addr;
+ /* SVEN_OLA: Normal TTL of this socket will be 64 if unset */
+ ttl = GetIpTtl(ethPkt);
+ if (0 <= (nBytesWritten = setsockopt(fwIntf->encapsulatingSkfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl))))
+
nBytesWritten = sendto(
fwIntf->encapsulatingSkfd,
buffer,
@@ -306,6 +322,18 @@
(struct sockaddr*) &encapDest,
sizeof(encapDest));
+ /*
+ * Sven-Ola@gmx.de: Very primitive testing of forward error correction
+ */
+ if (nBytesWritten == len)
+ nBytesWritten = sendto(
+ fwIntf->encapsulatingSkfd,
+ buffer,
+ len,
+ MSG_DONTROUTE,
+ (struct sockaddr*) &encapDest,
+ sizeof(encapDest));
+
if (nBytesWritten != len)
{
olsr_printf(
@@ -318,10 +346,11 @@
}
else
{
- OLSR_PRINTF(
+ olsr_printf(
9,
- "%s: --> encapsulated and forwarded to \"%s\"\n",
+ "%s: --> encapsulated and forwarded ttl=%d to \"%s\"\n",
PLUGIN_NAME_SHORT,
+ GetIpTtl(ethPkt),
fwIntf->ifName);
} /* if (nBytesWritten != len) */
} /* else if (isToOlsrIntf && !iAmNotMpr) */
@@ -329,7 +358,7 @@
else /* (!isFromOlsrIntf || isToOlsrIntf) && (!isToOlsrIntf || iAmNotMpr) */
if (!isFromOlsrIntf && !isToOlsrIntf)
{
- OLSR_PRINTF(
+ olsr_printf(
9,
"%s: --> not forwarding from \"%s\" to \"%s\": both non-OLSR interfaces\n",
PLUGIN_NAME_SHORT,
@@ -339,7 +368,7 @@
else /* (!isFromOlsrIntf || isToOlsrIntf) && (!isToOlsrIntf || iAmNotMpr) && (isFromOlsrIntf || isToOlsrIntf) */
{
- OLSR_PRINTF(
+ olsr_printf(
9,
"%s: --> not forwarding from \"%s\" to \"%s\": I am not selected as MPR by %s\n",
PLUGIN_NAME_SHORT,
@@ -402,17 +431,21 @@
ipData = (struct ip*) (ethPkt + IP_HDR_OFFSET);
- OLSR_PRINTF(
+ olsr_printf(
9,
- "%s: encapsulated pkt of %d bytes incoming on \"%s\": %s->",
+ "%s: encapsulated pkt of %d bytes ttl=%d incoming on \"%s\": %s->",
PLUGIN_NAME_SHORT,
ethPktLen,
+ GetIpTtl(ethPkt),
intf->ifName,
inet_ntoa(ipData->ip_src));
- OLSR_PRINTF(
+ olsr_printf(
9,
- "%s, forwarded by %s\n",
- inet_ntoa(ipData->ip_dst), /* not possible to call inet_ntoa twice in same printf */
+ "%s, ",
+ inet_ntoa(ipData->ip_dst)); /* not possible to call inet_ntoa twice in same printf */
+ olsr_printf(
+ 9,
+ "forwarded by %s\n",
olsr_ip_to_string(fromIp));
/* Get encapsulation header */
@@ -421,7 +454,7 @@
/* Check if this packet was seen recently */
if (CheckAndMarkRecentPacket(Hash16(ntohl(encapHdr->crc32))))
{
- OLSR_PRINTF(
+ olsr_printf(
9,
"%s: --> discarding: packet is duplicate\n",
PLUGIN_NAME_SHORT);
@@ -448,12 +481,28 @@
}
else
{
- OLSR_PRINTF(
+ olsr_printf(
9,
- "%s: --> unpacked and forwarded to \"%s\"\n",
+ "%s: --> unpacked and forwarded ttl=%d to \"%s\"\n",
PLUGIN_NAME_SHORT,
+ GetIpTtl(ethPkt),
EtherTunTapIfName);
}
+
+ /*
+ * Sven-Ola@gmx.de: The original implemenation make a wave
+ * through the complete mesh for every packet. Packets are
+ * discarded if any device has seen it (most bad case). We
+ * Want some "local" distribution mode, so I've added some
+ * hopcounter here - derived from the original ttl
+ */
+ if (0 == encapHdr->encapttl || 0 == --encapHdr->encapttl) {
+ olsr_printf(
+ 9,
+ "%s: --> dicarding encapsulated: TTL=0\n",
+ PLUGIN_NAME_SHORT);
+ return;
+ }
/* Lookup main address of forwarding node */
forwarder = mid_lookup_main_addr(fromIp);
@@ -489,7 +538,7 @@
/* If the TTL is <= 0, do not forward this packet */
if (GetIpTtl(ethPkt) <= 0)
{
- OLSR_PRINTF(
+ olsr_printf(
9,
"%s: --> not forwarding on \"%s\": TTL=0\n",
PLUGIN_NAME_SHORT,
@@ -509,10 +558,12 @@
}
else
{
- OLSR_PRINTF(
+ olsr_printf(
9,
- "%s: --> unpacked and forwarded to \"%s\"\n",
+ "%s: --> unpacked and forwarded ttl=%d, sttl=%d to \"%s\"\n",
PLUGIN_NAME_SHORT,
+ GetIpTtl(ethPkt),
+ sttl.ttl,
fwIntf->ifName);
}
}
@@ -551,17 +602,18 @@
}
else
{
- OLSR_PRINTF(
+ olsr_printf(
9,
- "%s: --> forwarded to \"%s\"\n",
+ "%s: --> forwarded(encrec) ttl=%d to \"%s\"\n",
PLUGIN_NAME_SHORT,
+ GetIpTtl(ethPkt),
fwIntf->ifName);
}
} /* else if (iAmMpr) */
else /* fwIntf->olsrIntf != NULL && !iAmMpr */
{
/* fwIntf is an OLSR interface and I am not selected as MPR */
- OLSR_PRINTF(
+ olsr_printf(
9,
"%s: --> not forwarding to \"%s\": I am not selected as MPR by %s\n",
PLUGIN_NAME_SHORT,
@@ -690,7 +742,15 @@
{
union olsr_ip_addr destIp;
COPY_IP(&destIp, &ipData->ip_dst);
- if (IsMulticast(&destIp) || IsLocalBroadcast(&destIp, currIf))
+ if (IsMulticast(&destIp)
+#ifdef SVEN_OLA_DISABLED
+ /*
+ * Sven-Ola@gmx.de: In a bigger mesh, there are a lot of
+ * accidential bcast sources. Disabled to save bandwidth
+ */
+ || IsLocalBroadcast(&destIp, currIf)
+#endif
+ )
{
if (! IsOlsrOrBmfPacket(currIf, ethPkt, nBytes))
{
@@ -701,8 +761,15 @@
}
}
}
- else if (pktAddr.sll_pkttype == PACKET_MULTICAST ||
- pktAddr.sll_pkttype == PACKET_BROADCAST)
+ else if (pktAddr.sll_pkttype == PACKET_MULTICAST
+#ifdef SVEN_OLA_DISABLED
+ /*
+ * Sven-Ola@gmx.de: In a bigger mesh, there are a lot of
+ * accidential bcast sources. Disabled to save bandwidth
+ */
+ || pktAddr.sll_pkttype == PACKET_BROADCAST
+#endif
+ )
{
/* An inbound multicast or broadcast packet was captured */
BmfPacketCaptured(currIf, buffer, nBytes + ENCAP_HDR_LEN);
diff -Nur olsrd-0.4.10.orig/lib/bmf/src/NetworkInterfaces.c olsrd-0.4.10/lib/bmf/src/NetworkInterfaces.c
--- olsrd-0.4.10.orig/lib/bmf/src/NetworkInterfaces.c 2006-11-29 12:45:19.000000000 +0100
+++ olsrd-0.4.10/lib/bmf/src/NetworkInterfaces.c 2006-11-29 12:47:49.000000000 +0100
@@ -568,7 +568,7 @@
newIf->next = BmfInterfaces;
BmfInterfaces = newIf;
- OLSR_PRINTF(
+ olsr_printf(
9,
"%s: opened %s interface \"%s\"\n",
PLUGIN_NAME_SHORT,
@@ -738,7 +738,7 @@
nClosed++;
}
- OLSR_PRINTF(
+ olsr_printf(
9,
"%s: closed %s interface \"%s\"\n",
PLUGIN_NAME_SHORT,
@@ -756,7 +756,7 @@
close(EtherTunTapFd);
nClosed++;
- OLSR_PRINTF(9, "%s: closed \"%s\"\n", PLUGIN_NAME_SHORT, EtherTunTapIfName);
+ olsr_printf(9, "%s: closed \"%s\"\n", PLUGIN_NAME_SHORT, EtherTunTapIfName);
}
BmfInterfaces = NULL;
diff -Nur olsrd-0.4.10.orig/lib/bmf/src/Packet.c olsrd-0.4.10/lib/bmf/src/Packet.c
--- olsrd-0.4.10.orig/lib/bmf/src/Packet.c 2006-11-29 12:45:19.000000000 +0100
+++ olsrd-0.4.10/lib/bmf/src/Packet.c 2006-11-29 12:50:35.000000000 +0100
@@ -46,6 +46,8 @@
#include <assert.h> /* assert() */
#include <sys/types.h> /* u_int32_t */
#include <netinet/in.h> /* ntohs(), htons() */
+/* Fixes (k)ubuntu linux-kernel-headers package */
+#include <asm/byteorder.h>
#include <linux/ip.h>
/* -------------------------------------------------------------------------
diff -Nur olsrd-0.4.10.orig/lib/bmf/src/Packet.h olsrd-0.4.10/lib/bmf/src/Packet.h
--- olsrd-0.4.10.orig/lib/bmf/src/Packet.h 2006-11-29 12:45:19.000000000 +0100
+++ olsrd-0.4.10/lib/bmf/src/Packet.h 2006-11-29 12:47:49.000000000 +0100
@@ -66,7 +66,8 @@
u_int32_t crc32;
u_int32_t futureExpansion1;
u_int32_t futureExpansion2;
- u_int32_t futureExpansion3;
+ u_int8_t futureExpansion3[3];
+ u_int8_t encapttl;
} __attribute__((__packed__));
#define ENCAP_HDR_LEN sizeof(struct TEncapHeader)

View File

@ -1,426 +0,0 @@
diff -Nur olsrd-0.4.10.orig/src/duplicate_set.c olsrd-0.4.10/src/duplicate_set.c
--- olsrd-0.4.10.orig/src/duplicate_set.c 2005-02-27 19:39:43.000000000 +0100
+++ olsrd-0.4.10/src/duplicate_set.c 2006-11-12 09:33:49.000000000 +0100
@@ -93,7 +93,7 @@
/* Hash the senders address */
- hash = olsr_hashing(originator);
+ hash = HASHMASK & seqno;
new_dup_entry = olsr_malloc(sizeof(struct dup_entry), "New dup entry");
@@ -131,7 +131,7 @@
struct dup_entry *tmp_dup_table;
/* Hash the senders address */
- hash = olsr_hashing(originator);
+ hash = HASHMASK & seqno;
/* Check for entry */
for(tmp_dup_table = dup_set[hash].next;
@@ -163,7 +163,7 @@
struct dup_entry *tmp_dup_table;
/* Hash the senders address */
- hash = olsr_hashing(originator);
+ hash = HASHMASK & seqno;
/* Check for entry */
for(tmp_dup_table = dup_set[hash].next;
@@ -268,7 +268,7 @@
struct dup_iface *new_iface;
/* Hash the senders address */
- hash = olsr_hashing(originator);
+ hash = HASHMASK & seqno;
/* Check for entry */
@@ -313,7 +313,7 @@
struct dup_entry *tmp_dup_table;
/* Hash the senders address */
- hash = olsr_hashing(originator);
+ hash = HASHMASK & seqno;
/* Check for entry */
for(tmp_dup_table = dup_set[hash].next;
diff -Nur olsrd-0.4.10.orig/src/hashing.c olsrd-0.4.10/src/hashing.c
--- olsrd-0.4.10.orig/src/hashing.c 2005-02-20 19:52:18.000000000 +0100
+++ olsrd-0.4.10/src/hashing.c 2006-11-12 09:33:49.000000000 +0100
@@ -58,7 +58,7 @@
if(olsr_cnf->ip_version == AF_INET)
/* IPv4 */
- hash = (ntohl(address->v4));
+ hash = address->v4x[0] ^ address->v4x[1] ^ address->v4x[2] ^ address->v4x[3];
else
{
/* IPv6 */
diff -Nur olsrd-0.4.10.orig/src/hashing.h olsrd-0.4.10/src/hashing.h
--- olsrd-0.4.10.orig/src/hashing.h 2005-02-20 19:52:18.000000000 +0100
+++ olsrd-0.4.10/src/hashing.h 2006-11-12 09:33:49.000000000 +0100
@@ -43,7 +43,7 @@
#ifndef _OLSR_HASHING
#define _OLSR_HASHING
-#define HASHSIZE 32
+#define HASHSIZE 128
#define HASHMASK (HASHSIZE - 1)
#include "olsr_types.h"
diff -Nur olsrd-0.4.10.orig/src/lq_avl.c olsrd-0.4.10/src/lq_avl.c
--- olsrd-0.4.10.orig/src/lq_avl.c 2005-01-22 15:30:57.000000000 +0100
+++ olsrd-0.4.10/src/lq_avl.c 2006-11-12 09:33:49.000000000 +0100
@@ -40,6 +40,9 @@
*/
#include <stddef.h>
+#ifndef DISABLE_SVEN_OLA
+#include <time.h>
+#endif
#include "lq_avl.h"
@@ -52,11 +55,33 @@
tree->comp = comp;
}
+#ifndef DISABLE_SVEN_OLA
+static struct avl_node *avl_find_rec_ipv4(struct avl_node *node, void *key)
+{
+ if (*(unsigned int *)key < *(unsigned int *)node->key) {
+ if (node->left != NULL) {
+ return avl_find_rec_ipv4(node->left, key);
+ }
+ }
+ else if (*(unsigned int *)key > *(unsigned int *)node->key) {
+ if (node->right != NULL) {
+ return avl_find_rec_ipv4(node->right, key);
+ }
+ }
+ return node;
+}
+#endif
+
static struct avl_node *avl_find_rec(struct avl_node *node, void *key,
int (*comp)(void *, void *))
{
int diff;
+#ifndef DISABLE_SVEN_OLA
+ if (0 == comp) {
+ return avl_find_rec_ipv4(node, key);
+ }
+#endif
diff = (*comp)(key, node->key);
if (diff < 0)
@@ -87,6 +112,13 @@
node = avl_find_rec(tree->root, key, tree->comp);
+#ifndef DISABLE_SVEN_OLA
+ if (0 == tree->comp) {
+ if (0 != svenola_avl_comp_ipv4(node->key, key))
+ return NULL;
+ }
+ else
+#endif
if ((*tree->comp)(node->key, key) != 0)
return NULL;
@@ -228,6 +260,12 @@
node = avl_find_rec(tree->root, new->key, tree->comp);
+#ifndef DISABLE_SVEN_OLA
+ if (0 == tree->comp) {
+ diff = svenola_avl_comp_ipv4(new->key, node->key);
+ }
+ else
+#endif
diff = (*tree->comp)(new->key, node->key);
if (diff == 0)
diff -Nur olsrd-0.4.10.orig/src/lq_avl.h olsrd-0.4.10/src/lq_avl.h
--- olsrd-0.4.10.orig/src/lq_avl.h 2005-02-20 19:52:18.000000000 +0100
+++ olsrd-0.4.10/src/lq_avl.h 2006-11-12 09:33:49.000000000 +0100
@@ -62,4 +62,9 @@
struct avl_node *avl_find(struct avl_tree *, void *);
int avl_insert(struct avl_tree *, struct avl_node *);
+#ifndef DISABLE_SVEN_OLA
+#define svenola_avl_comp_ipv4(ip1, ip2) \
+ (*(unsigned int *)ip1 == *(unsigned int *)ip2 ? 0 : \
+ *(unsigned int *)ip1 < *(unsigned int *)ip2 ? -1 : +1)
+#endif
#endif
diff -Nur olsrd-0.4.10.orig/src/lq_list.c olsrd-0.4.10/src/lq_list.c
--- olsrd-0.4.10.orig/src/lq_list.c 2004-12-04 18:06:57.000000000 +0100
+++ olsrd-0.4.10/src/lq_list.c 2006-11-12 09:33:49.000000000 +0100
@@ -48,6 +48,7 @@
list->tail = NULL;
}
+#ifdef DISABLE_SVEN_OLA
struct list_node *list_get_head(struct list *list)
{
return list->head;
@@ -67,6 +68,7 @@
{
return node->prev;
}
+#endif
void list_add_head(struct list *list, struct list_node *node)
{
diff -Nur olsrd-0.4.10.orig/src/lq_list.h olsrd-0.4.10/src/lq_list.h
--- olsrd-0.4.10.orig/src/lq_list.h 2005-02-20 19:52:18.000000000 +0100
+++ olsrd-0.4.10/src/lq_list.h 2006-11-12 09:33:49.000000000 +0100
@@ -58,11 +58,18 @@
void list_init(struct list *list);
+#ifndef DISABLE_SVEN_OLA
+#define list_get_head(node) (node)->head
+#define list_get_tail(node) (node)->tail
+#define list_get_next(node) (node)->next
+#define list_get_prev(node) (node)->prev
+#else
struct list_node *list_get_head(struct list *list);
struct list_node *list_get_tail(struct list *list);
struct list_node *list_get_next(struct list_node *node);
struct list_node *list_get_prev(struct list_node *node);
+#endif
void list_add_head(struct list *list, struct list_node *node);
void list_add_tail(struct list *list, struct list_node *node);
diff -Nur olsrd-0.4.10.orig/src/lq_route.c olsrd-0.4.10/src/lq_route.c
--- olsrd-0.4.10.orig/src/lq_route.c 2005-11-29 19:37:58.000000000 +0100
+++ olsrd-0.4.10/src/lq_route.c 2006-11-12 09:34:46.000000000 +0100
@@ -205,6 +205,16 @@
// add the vertex to the list, if it's not us
+#ifndef DISABLE_SVEN_OLA
+ if (0 == comp) {
+ if (svenola_avl_comp_ipv4(&main_addr, node->key) != 0)
+ {
+ vert->node.data = vert;
+ list_add_tail(vertex_list, &vert->node);
+ }
+ }
+ else
+#endif
if ((*comp)(&main_addr, node->key) != 0)
{
vert->node.data = vert;
@@ -266,6 +276,154 @@
}
// XXX - bad complexity
+#define SVEN_OPT
+#undef SVEN_OPT_DBG
+
+/*
+ * The function extract_best() is most expensive (>50% CPU in profiling).
+ * It is called in two modes: while doing Dijkstra route calculation and
+ * while searching for a direct route/hna. The latter can be optimized
+ * because the stored verices do not change from call to call and it is
+ * more sufficient to have them sorted/popped from a list rather than
+ * searching the complete list by every call. Sven-Ola@gmx.de, 11/2006
+ */
+
+#ifdef SVEN_OPT
+static struct dijk_vertex **etx_cache = 0;
+static int etx_cache_count;
+static int etx_cache_get;
+static int etx_cache_saved = 0;
+
+static int etx_cache_compare(const void *a, const void *b)
+{
+ // Oh jeah. I love this macro assembler :)
+
+ if ((*(struct dijk_vertex **)a)->path_etx > (*(struct dijk_vertex **)b)->path_etx) return 1;
+ if ((*(struct dijk_vertex **)a)->path_etx < (*(struct dijk_vertex **)b)->path_etx) return -1;
+
+ // This is for debugging only: etx==etx then compare pointers
+ // to make it possible to compare to the original search algo.
+ if (*(struct dijk_vertex **)a > *(struct dijk_vertex **)b) return 1;
+ if (*(struct dijk_vertex **)a < *(struct dijk_vertex **)b) return -1;
+
+ return 0;
+}
+
+static struct dijk_vertex *extract_best_route(struct list *vertex_list)
+{
+#ifdef SVEN_OPT_DBG
+ float best_etx = INFINITE_ETX + 1.0;
+#endif
+ struct list_node *node;
+ struct dijk_vertex *vert;
+ struct dijk_vertex *res = NULL;
+
+#ifdef SVEN_OPT_DBG
+ node = list_get_head(vertex_list);
+
+ // loop through all vertices
+
+ while (node != NULL)
+ {
+ vert = node->data;
+
+ // see whether the current vertex is better than what we have
+
+ if (!vert->done && vert->path_etx < best_etx)
+ {
+ best_etx = vert->path_etx;
+ res = vert;
+ }
+ else if (!vert->done && vert->path_etx == best_etx && vert < res)
+ {
+ // Otherwise order is undefined if etx==etx and debug will complain
+ best_etx = vert->path_etx;
+ res = vert;
+ }
+
+ node = list_get_next(node);
+ }
+#endif
+ if (NULL == etx_cache)
+ {
+ int count = 0;
+ node = list_get_head(vertex_list);
+ while (node != NULL)
+ {
+ vert = node->data;
+ if (!vert->done && vert->path_etx < INFINITE_ETX) count++;
+ node = list_get_next(node);
+ }
+ if (0 < count)
+ {
+ etx_cache = olsr_malloc(sizeof(etx_cache[0]) * count, "ETX Cache");
+#ifdef SVEN_OPT_DBG
+ printf("count=%d, Malloc(%d)=%p\n", count, sizeof(etx_cache[0]) * count, etx_cache);
+#endif
+ node = list_get_head(vertex_list);
+ etx_cache_count = 0;
+ etx_cache_get = 0;
+ while (node != NULL)
+ {
+ vert = node->data;
+ if (!vert->done && vert->path_etx < INFINITE_ETX)
+ {
+ etx_cache[etx_cache_count] = vert;
+ etx_cache_count++;
+ }
+ node = list_get_next(node);
+ }
+#ifdef SVEN_OPT_DBG
+ printf("qsort(etx_cache_count=%d)\n", etx_cache_count);
+#endif
+ qsort(etx_cache, etx_cache_count, sizeof(etx_cache[0]), etx_cache_compare);
+#ifdef SVEN_OPT_DBG
+ if (0 < etx_cache_count)
+ {
+ int i = 0;
+ while(i < etx_cache_count && i < 10)
+ {
+ printf("%d: %p=%f\n", i, etx_cache[i], etx_cache[i]->path_etx);
+ i++;
+ }
+ }
+#endif
+ }
+ }
+
+#ifdef SVEN_OPT_DBG
+ if (NULL != etx_cache)
+ {
+ struct dijk_vertex *rescache = NULL;
+ if (etx_cache_get < etx_cache_count)
+ {
+ rescache = etx_cache[etx_cache_get++];
+ }
+ if (res != rescache)
+ {
+ printf("miss: etx_cache_get=%d, res=%p,%f != rescache=%p,%f\n",
+ etx_cache_get, res, (NULL != res ? res->path_etx : -1), rescache, (NULL != rescache ? rescache->path_etx : -1));
+ }
+ else
+ {
+ etx_cache_saved++;
+ }
+ }
+#else
+ if (NULL != etx_cache && etx_cache_get < etx_cache_count)
+ {
+ res = etx_cache[etx_cache_get++];
+ }
+#endif
+
+ // if we've found a vertex, remove it from the set
+
+ if (res != NULL)
+ res->done = OLSR_TRUE;
+
+ return res;
+}
+#endif // SVEN_OPT
static struct dijk_vertex *extract_best(struct list *vertex_list)
{
@@ -371,7 +529,11 @@
struct interface *inter;
if (ipsize == 4)
+#ifndef DISABLE_SVEN_OLA
+ avl_comp = 0;
+#else
avl_comp = avl_comp_ipv4;
+#endif
else
avl_comp = avl_comp_ipv6;
@@ -614,13 +776,27 @@
// add HNA routes - the set of unprocessed network nodes contains
// all reachable network nodes
+#ifdef SVEN_OPT
+#ifdef SVEN_OPT_DBG
+ printf("free etx_cache, saved compares=%d, etx_cache=%p\n", etx_cache_saved, etx_cache);
+ etx_cache_saved = 0;
+#endif
+ if (NULL != etx_cache) {
+ free(etx_cache);
+ etx_cache = NULL;
+ }
+#endif
for (;;)
{
// extract the network node with the best ETX and remove it
// from the set of unprocessed network nodes
+#ifdef SVEN_OPT
+ vert = extract_best_route(&vertex_list);
+#else
vert = extract_best(&vertex_list);
+#endif
// no more nodes left
diff -Nur olsrd-0.4.10.orig/src/olsr_types.h olsrd-0.4.10/src/olsr_types.h
--- olsrd-0.4.10.orig/src/olsr_types.h 2005-05-15 14:57:24.000000000 +0200
+++ olsrd-0.4.10/src/olsr_types.h 2006-11-12 09:33:49.000000000 +0100
@@ -93,6 +93,7 @@
union olsr_ip_addr
{
olsr_u32_t v4;
+ olsr_u8_t v4x[4];
struct in6_addr v6;
};

File diff suppressed because it is too large Load Diff

View File

@ -1,212 +0,0 @@
diff -Nur olsrd-0.4.10.orig/src/defs.h olsrd-0.4.10/src/defs.h
--- olsrd-0.4.10.orig/src/defs.h 2006-11-28 21:17:27.000000000 +0100
+++ olsrd-0.4.10/src/defs.h 2006-11-28 21:18:46.000000000 +0100
@@ -68,10 +68,10 @@
#define OLSRD_GLOBAL_CONF_FILE "/etc/" OLSRD_CONF_FILE_NAME
#endif
-#define HOPCNT_MAX 32 /* maximum hops number */
+#define HOPCNT_MAX 64 /* maximum hops number */
#define MAXMESSAGESIZE 1500 /* max broadcast size */
#define UDP_IPV4_HDRSIZE 28
-#define UDP_IPV6_HDRSIZE 48
+#define UDP_IPV6_HDRSIZE 62
#define MAX_IFS 32
/* Debug helper macro */
diff -Nur olsrd-0.4.10.orig/src/interfaces.h olsrd-0.4.10/src/interfaces.h
--- olsrd-0.4.10.orig/src/interfaces.h 2005-06-03 10:00:55.000000000 +0200
+++ olsrd-0.4.10/src/interfaces.h 2006-11-28 21:18:01.000000000 +0100
@@ -136,6 +136,8 @@
struct vtimes valtimes;
struct if_gen_property *gen_properties;/* Generic interface properties */
+
+ int ttl_index; /* index in TTL array for fish-eye */
struct interface *int_next;
};
diff -Nur olsrd-0.4.10.orig/src/link_set.c olsrd-0.4.10/src/link_set.c
--- olsrd-0.4.10.orig/src/link_set.c 2006-11-28 21:17:27.000000000 +0100
+++ olsrd-0.4.10/src/link_set.c 2006-11-28 21:18:01.000000000 +0100
@@ -963,8 +963,9 @@
entry->loss_link_quality =
(float)(entry->total_packets - entry->lost_packets) /
- (float)(entry->loss_window_size);
-
+ (float)(entry->loss_window_size < (2 * 4) ? entry->loss_window_size:
+ 4 * ((entry->loss_window_size / 4 - 1) * entry->total_packets + entry->loss_window_size) / entry->loss_window_size);
+
// multiply the calculated link quality with the user-specified multiplier
entry->loss_link_quality *= entry->loss_link_multiplier;
diff -Nur olsrd-0.4.10.orig/src/lq_packet.c olsrd-0.4.10/src/lq_packet.c
--- olsrd-0.4.10.orig/src/lq_packet.c 2005-11-17 02:58:51.000000000 +0100
+++ olsrd-0.4.10/src/lq_packet.c 2006-11-28 21:18:01.000000000 +0100
@@ -149,9 +149,8 @@
int i;
struct neighbor_entry *walker;
struct link_entry *link;
- static int ttl_list[] = { MAX_TTL, 3, 2, 1, 2, 1, 1, 3, 2, 1, 2, 1, 1, 0 };
- static int ttl_index = 0;
-
+ static int ttl_list[] = { 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, MAX_TTL-1, 0};
+
// remember that we have generated an LQ TC message; this is
// checked in net_output()
@@ -167,10 +166,13 @@
if (olsr_cnf->lq_fish > 0)
{
- if (ttl_list[ttl_index] == 0)
- ttl_index = 0;
+ // SVEN_OLA: Too lazy to find the different iface inits. This will do it too.
+ if (outif->ttl_index >= sizeof(ttl_list) / sizeof(ttl_list[0])) outif->ttl_index = 0;
+
+ if (ttl_list[outif->ttl_index] == 0)
+ outif->ttl_index = 0;
- lq_tc->comm.ttl = ttl_list[ttl_index++];
+ lq_tc->comm.ttl = ttl_list[outif->ttl_index++];
OLSR_PRINTF(3, "Creating LQ TC with TTL %d.\n", lq_tc->comm.ttl);
}
diff -Nur olsrd-0.4.10.orig/src/olsr.c olsrd-0.4.10/src/olsr.c
--- olsrd-0.4.10.orig/src/olsr.c 2006-11-28 21:17:27.000000000 +0100
+++ olsrd-0.4.10/src/olsr.c 2006-11-28 21:18:01.000000000 +0100
@@ -68,6 +68,7 @@
olsr_bool changes_topology;
olsr_bool changes_neighborhood;
olsr_bool changes_hna;
+olsr_bool changes_force;
/**
* Process changes functions
@@ -142,6 +143,11 @@
OLSR_PRINTF(3, "CHANGES IN HNA\n")
#endif
+ if(!changes_force &&
+ 2 <= olsr_cnf->lq_level &&
+ 0 >= olsr_cnf->lq_dlimit)
+ return;
+
if(!changes_neighborhood &&
!changes_topology &&
!changes_hna)
@@ -171,11 +177,6 @@
olsr_calculate_routing_table();
olsr_calculate_hna_routes();
}
-
- else
- {
- olsr_calculate_lq_routing_table();
- }
}
else if (changes_topology)
@@ -187,11 +188,6 @@
olsr_calculate_routing_table();
olsr_calculate_hna_routes();
}
-
- else
- {
- olsr_calculate_lq_routing_table();
- }
}
else if (changes_hna)
@@ -202,11 +198,11 @@
{
olsr_calculate_hna_routes();
}
-
- else
- {
- olsr_calculate_lq_routing_table();
- }
+ }
+
+ if (olsr_cnf->lq_level >= 2)
+ {
+ olsr_calculate_lq_routing_table();
}
if (olsr_cnf->debug_level > 0)
@@ -243,6 +239,7 @@
changes_neighborhood = OLSR_FALSE;
changes_topology = OLSR_FALSE;
changes_hna = OLSR_FALSE;
+ changes_force = OLSR_FALSE;
return;
diff -Nur olsrd-0.4.10.orig/src/olsr.h olsrd-0.4.10/src/olsr.h
--- olsrd-0.4.10.orig/src/olsr.h 2005-05-29 14:47:45.000000000 +0200
+++ olsrd-0.4.10/src/olsr.h 2006-11-28 21:18:01.000000000 +0100
@@ -49,6 +49,7 @@
extern olsr_bool changes_topology;
extern olsr_bool changes_neighborhood;
extern olsr_bool changes_hna;
+extern olsr_bool changes_force;
void
register_pcf(int (*)(int, int, int));
diff -Nur olsrd-0.4.10.orig/src/scheduler.c olsrd-0.4.10/src/scheduler.c
--- olsrd-0.4.10.orig/src/scheduler.c 2005-12-29 23:34:37.000000000 +0100
+++ olsrd-0.4.10/src/scheduler.c 2006-11-28 21:18:01.000000000 +0100
@@ -70,6 +70,7 @@
changes_neighborhood = OLSR_TRUE;
changes_topology = OLSR_TRUE;
+ changes_force = OLSR_TRUE;
}
/**
diff -Nur olsrd-0.4.10.orig/src/unix/ifnet.c olsrd-0.4.10/src/unix/ifnet.c
--- olsrd-0.4.10.orig/src/unix/ifnet.c 2006-11-28 21:17:27.000000000 +0100
+++ olsrd-0.4.10/src/unix/ifnet.c 2006-11-28 21:18:01.000000000 +0100
@@ -690,6 +690,17 @@
return 1;
}
+static char basename[32];
+char* if_basename(char* name);
+char* if_basename(char* name)
+{
+ char *p = strchr(name, ':');
+ if (0 == p || p - name >= (int)(sizeof(basename) / sizeof(basename[0]) - 1)) return name;
+ memcpy(basename, name, p - name);
+ basename[p - name] = 0;
+ return basename;
+}
+
/**
* Initializes a interface described by iface,
* if it is set up and is of the correct type.
@@ -833,10 +844,10 @@
}
/* Deactivate IP spoof filter */
- deactivate_spoof(ifr.ifr_name, iface->index, olsr_cnf->ip_version);
+ deactivate_spoof(if_basename(ifr.ifr_name), iface->index, olsr_cnf->ip_version);
/* Disable ICMP redirects */
- disable_redirects(ifr.ifr_name, iface->index, olsr_cnf->ip_version);
+ disable_redirects(if_basename(ifr.ifr_name), iface->index, olsr_cnf->ip_version);
}
@@ -894,7 +905,7 @@
ifp->gen_properties = NULL;
ifp->int_name = olsr_malloc(strlen(ifr.ifr_name) + 1, "Interface update 3");
- strcpy(ifp->int_name, ifr.ifr_name);
+ strcpy(ifp->int_name, if_basename(ifr.ifr_name));
/* Segfaults if using strncpy(IFNAMSIZ) why oh why?? */
ifp->int_next = ifnet;
ifnet = ifp;

View File

@ -1,425 +0,0 @@
diff -Nur olsrd-0.4.10.orig/src/bsd/kernel_routes.c olsrd-0.4.10/src/bsd/kernel_routes.c
--- olsrd-0.4.10.orig/src/bsd/kernel_routes.c 2005-02-27 11:43:38.000000000 +0100
+++ olsrd-0.4.10/src/bsd/kernel_routes.c 2006-12-12 08:59:26.000000000 +0100
@@ -170,12 +170,103 @@
return add_del_route(dest, 0);
}
-int olsr_ioctl_add_route6(struct rt_entry *dest)
+static int add_del_route6(struct rt_entry *dest, int add)
{
+ struct rt_msghdr *rtm;
+ unsigned char buff[512];
+ unsigned char *walker;
+ struct sockaddr_in6 sin6;
+ struct sockaddr_dl sdl;
+ int step, step_dl;
+ int len;
+ char Str1[40], Str2[40];
+
+ inet_ntop(AF_INET6, &dest->rt_dst.v6, Str1, 40);
+ inet_ntop(AF_INET6, &dest->rt_router.v6, Str2, 40);
+
+ OLSR_PRINTF(1, "%s IPv6 route to %s/%d via %s.\n",
+ (add != 0) ? "Adding" : "Removing", Str1, dest->rt_mask.v6, Str2)
+
+ memset(buff, 0, sizeof (buff));
+ memset(&sin6, 0, sizeof (sin6));
+ memset(&sdl, 0, sizeof (sdl));
+
+ sin6.sin6_len = sizeof (sin6);
+ sin6.sin6_family = AF_INET6;
+ sdl.sdl_len = sizeof (sdl);
+ sdl.sdl_family = AF_LINK;
+
+ step = 1 + ((sizeof (struct sockaddr_in6) - 1) | 3);
+ step_dl = 1 + ((sizeof (struct sockaddr_dl) - 1) | 3);
+
+ rtm = (struct rt_msghdr *)buff;
+ rtm->rtm_version = RTM_VERSION;
+ rtm->rtm_type = (add != 0) ? RTM_ADD : RTM_DELETE;
+ rtm->rtm_index = 0;
+ rtm->rtm_flags = dest->rt_flags;
+ rtm->rtm_addrs = RTA_DST | RTA_GATEWAY;
+ rtm->rtm_seq = ++seq;
+
+ walker = buff + sizeof (struct rt_msghdr);
+
+ memcpy(&sin6.sin6_addr.s6_addr, &dest->rt_dst.v6, sizeof(struct in6_addr));
+
+ memcpy(walker, &sin6, sizeof (sin6));
+ walker += step;
+
+ if ((rtm->rtm_flags & RTF_GATEWAY) != 0)
+ {
+ memcpy(&sin6.sin6_addr.s6_addr, &dest->rt_router.v6, sizeof(struct in6_addr));
+
+ memcpy(walker, &sin6, sizeof (sin6));
+ walker += step;
+ }
+
+ // the host is directly reachable, so add the output interface's address
+
+ else
+ {
+ memcpy(&sin6.sin6_addr.s6_addr, &dest->rt_if->int6_addr.sin6_addr.s6_addr,
+ sizeof(struct in6_addr));
+
+ memcpy(walker, &sin6, sizeof (sin6));
+ walker += step;
+ rtm->rtm_flags |= RTF_LLINFO;
+ }
+
+ if ((rtm->rtm_flags & RTF_HOST) == 0)
+ {
+ olsr_prefix_to_netmask((union olsr_ip_addr *)&sin6.sin6_addr, dest->rt_mask.v6);
+ memcpy(walker, &sin6, sizeof (sin6));
+ walker += step;
+ rtm->rtm_addrs |= RTA_NETMASK;
+ }
+
+ if ((rtm->rtm_flags & RTF_GATEWAY) != 0)
+ {
+ strcpy(&sdl.sdl_data[0], dest->rt_if->int_name);
+ sdl.sdl_nlen = (u_char)strlen(dest->rt_if->int_name);
+ memcpy(walker, &sdl, sizeof (sdl));
+ walker += step_dl;
+ rtm->rtm_addrs |= RTA_IFP;
+ }
+
+ rtm->rtm_msglen = (unsigned short)(walker - buff);
+
+ len = write(rts, buff, rtm->rtm_msglen);
+
+ if (len < rtm->rtm_msglen)
+ fprintf(stderr, "cannot write to routing socket: %s\n", strerror(errno));
+
return 0;
}
+int olsr_ioctl_add_route6(struct rt_entry *dest)
+{
+ return add_del_route6(dest, 1);
+}
+
int olsr_ioctl_del_route6(struct rt_entry *dest)
{
- return 0;
+ return add_del_route6(dest, 0);
}
diff -Nur olsrd-0.4.10.orig/src/bsd/net.c olsrd-0.4.10/src/bsd/net.c
--- olsrd-0.4.10.orig/src/bsd/net.c 2005-08-28 21:30:29.000000000 +0200
+++ olsrd-0.4.10/src/bsd/net.c 2006-12-12 08:59:30.000000000 +0100
@@ -61,8 +61,10 @@
#endif
#ifdef __FreeBSD__
+#include <ifaddrs.h>
#include <net/if_var.h>
#include <net/ethernet.h>
+#include <netinet/in_var.h>
#ifndef FBSD_NO_80211
#include <net80211/ieee80211.h>
#include <net80211/ieee80211_ioctl.h>
@@ -71,8 +73,8 @@
#endif
#endif
-#ifdef SPOOF
#include <net/if_dl.h>
+#ifdef SPOOF
#include <libnet.h>
#endif /* SPOOF */
@@ -172,6 +174,17 @@
name = "net.inet6.icmp6.rediraccept";
ignore_redir = set_sysctl_int(name, 0);
+#elif defined __FreeBSD__
+ if (olsr_cnf->ip_version == AF_INET)
+ {
+ name = "net.inet.icmp.drop_redirect";
+ ignore_redir = set_sysctl_int(name, 1);
+ }
+ else
+ {
+ name = "net.inet6.icmp6.rediraccept";
+ ignore_redir = set_sysctl_int(name, 0);
+ }
#else
if (olsr_cnf->ip_version == AF_INET)
name = "net.inet.icmp.drop_redirect";
@@ -243,6 +256,12 @@
else
name = "net.inet6.icmp6.rediraccept";
+#elif defined __FreeBSD__
+ if (olsr_cnf->ip_version == AF_INET)
+ name = "net.inet.icmp.drop_redirect";
+
+ else
+ name = "net.inet6.icmp6.rediraccept";
#else
if (olsr_cnf->ip_version == AF_INET)
name = "net.inet.icmp.drop_redirect";
@@ -335,7 +354,6 @@
return (-1);
}
-#ifdef SPOOF
if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0)
{
perror("SO_REUSEPORT failed");
@@ -347,7 +365,6 @@
perror("IP_RECVIF failed");
return (-1);
}
-#endif /* SPOOF */
for (on = bufspace; ; on -= 1024)
{
@@ -406,6 +423,18 @@
return (-1);
}
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0)
+ {
+ perror("SO_REUSEPORT failed");
+ return (-1);
+ }
+
+ if (setsockopt(sock, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof(on)) < 0)
+ {
+ perror("IPV6_RECVPKTINFO failed");
+ return (-1);
+ }
+
if (bind(sock, (struct sockaddr *)sin, sizeof (*sin)) < 0)
{
perror("bind");
@@ -425,31 +454,16 @@
int
join_mcast(struct interface *ifs, int sock)
{
- /* See linux/in6.h */
+ /* See netinet6/in6.h */
struct ipv6_mreq mcastreq;
COPY_IP(&mcastreq.ipv6mr_multiaddr, &ifs->int6_multaddr.sin6_addr);
mcastreq.ipv6mr_interface = ifs->if_index;
-#if 0
OLSR_PRINTF(3, "Interface %s joining multicast %s...", ifs->int_name, olsr_ip_to_string((union olsr_ip_addr *)&ifs->int6_multaddr.sin6_addr))
- /* Send multicast */
- if(setsockopt(sock,
- IPPROTO_IPV6,
- IPV6_ADD_MEMBERSHIP,
- (char *)&mcastreq,
- sizeof(struct ipv6_mreq))
- < 0)
- {
- perror("Join multicast");
- return -1;
- }
-#else
-#warning implement IPV6_ADD_MEMBERSHIP
-#endif
- /* Old libc fix */
+ /* rfc 3493 */
#ifdef IPV6_JOIN_GROUP
/* Join reciever group */
if(setsockopt(sock,
@@ -458,8 +472,8 @@
(char *)&mcastreq,
sizeof(struct ipv6_mreq))
< 0)
-#else
- /* Join reciever group */
+#else /* rfc 2133, obsoleted */
+ /* Join receiver group */
if(setsockopt(sock,
IPPROTO_IPV6,
IPV6_ADD_MEMBERSHIP,
@@ -494,6 +508,70 @@
int get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, int scope_in)
{
+ struct ifaddrs *ifap, *ifa;
+ const struct sockaddr_in6 *sin6 = NULL;
+ struct in6_ifreq ifr6;
+ int found = 0;
+ int s6;
+ u_int32_t flags6;
+
+ if (getifaddrs(&ifap) != 0)
+ {
+ OLSR_PRINTF(3, "get_ipv6_address: getifaddrs() failed.\n")
+ return 0;
+ }
+
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next)
+ {
+ if (ifa->ifa_addr->sa_family == AF_INET6 &&
+ strcmp(ifa->ifa_name, ifname) == 0)
+ {
+ sin6 = (const struct sockaddr_in6 *)ifa->ifa_addr;
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
+ continue;
+ strncpy(ifr6.ifr_name, ifname, sizeof(ifname));
+ if ((s6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
+ {
+ OLSR_PRINTF(3, "socket(AF_INET6,SOCK_DGRAM)");
+ break;
+ }
+ ifr6.ifr_addr = *sin6;
+ if (ioctl(s6, SIOCGIFAFLAG_IN6, &ifr6) < 0)
+ {
+ OLSR_PRINTF(3, "ioctl(SIOCGIFAFLAG_IN6)");
+ close(s6);
+ break;
+ }
+ close(s6);
+ flags6 = ifr6.ifr_ifru.ifru_flags6;
+ if ((flags6 & IN6_IFF_ANYCAST) != 0)
+ continue;
+ if (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))
+ {
+ if (scope_in)
+ {
+ memcpy(&saddr6->sin6_addr, &sin6->sin6_addr,
+ sizeof(struct in6_addr));
+ found = 1;
+ break;
+ }
+ }
+ else
+ {
+ if (scope_in == 0)
+ {
+ memcpy(&saddr6->sin6_addr, &sin6->sin6_addr,
+ sizeof(struct in6_addr));
+ found = 1;
+ break;
+ }
+ }
+ }
+ }
+ freeifaddrs(ifap);
+ if (found)
+ return 1;
+
return 0;
}
@@ -621,16 +699,19 @@
struct sockaddr *from,
socklen_t *fromlen)
{
-#if SPOOF
struct msghdr mhdr;
struct iovec iov;
struct cmsghdr *cm;
struct sockaddr_dl *sdl;
struct sockaddr_in *sin = (struct sockaddr_in *) from; //XXX
+ struct sockaddr_in6 *sin6;
+ struct in6_addr *iaddr6;
+ struct in6_pktinfo *pkti;
+ struct interface *ifc;
+ char addrstr[INET6_ADDRSTRLEN];
+ char iname[IFNAMSIZ];
unsigned char chdr[4096];
int count;
- struct interface *ifc;
- char iname[32];
bzero(&mhdr, sizeof(mhdr));
bzero(&iov, sizeof(iov));
@@ -653,35 +734,45 @@
/* this needs to get communicated back to caller */
*fromlen = mhdr.msg_namelen;
-
- cm = (struct cmsghdr *) chdr;
- sdl = (struct sockaddr_dl *) CMSG_DATA (cm);
- bzero (iname, sizeof (iname));
- memcpy (iname, sdl->sdl_data, sdl->sdl_nlen);
+ if (olsr_cnf->ip_version == AF_INET6)
+ {
+ for (cm = (struct cmsghdr *)CMSG_FIRSTHDR(&mhdr); cm;
+ cm = (struct cmsghdr *)CMSG_NXTHDR(&mhdr, cm))
+ {
+ if (cm->cmsg_level == IPPROTO_IPV6 && cm->cmsg_type == IPV6_PKTINFO)
+ {
+ pkti = (struct in6_pktinfo *) CMSG_DATA(cm);
+ iaddr6 = &pkti->ipi6_addr;
+ if_indextoname(pkti->ipi6_ifindex, iname);
+ }
+ }
+ }
+ else
+ {
+ cm = (struct cmsghdr *) chdr;
+ sdl = (struct sockaddr_dl *) CMSG_DATA (cm);
+ bzero (iname, sizeof (iname));
+ memcpy (iname, sdl->sdl_data, sdl->sdl_nlen);
+ }
ifc = if_ifwithsock (s);
+ sin6 = (struct sockaddr_in6 *)from;
+ OLSR_PRINTF (4, "%d bytes from %s, socket associated %s really received on %s\n",
+ count,
+ (olsr_cnf->ip_version == AF_INET6) ?
+ inet_ntop(AF_INET6, (char *)&sin6->sin6_addr, addrstr,
+ INET6_ADDRSTRLEN):
+ inet_ntoa (sin->sin_addr),
+ ifc->int_name,
+ iname);
+
if (strcmp (ifc->int_name, iname) != 0)
{
return (0);
}
- OLSR_PRINTF (2, "%d bytes from %s, socket associated %s really received on %s\n",
- count,
- inet_ntoa (sin->sin_addr),
- ifc->int_name,
- iname);
-
return (count);
-
-#else /* SPOOF */
- return recvfrom(s,
- buf,
- len,
- 0,
- from,
- fromlen);
-#endif /* SPOOF */
}
/**
diff -Nur olsrd-0.4.10.orig/src/net_olsr.c olsrd-0.4.10/src/net_olsr.c
--- olsrd-0.4.10.orig/src/net_olsr.c 2005-12-29 19:37:16.000000000 +0100
+++ olsrd-0.4.10/src/net_olsr.c 2006-12-12 08:59:35.000000000 +0100
@@ -526,7 +526,7 @@
for(;p > 0; p -= 8)
{
- adr->v6.s6_addr[i] = (p < 8) ? 0xff ^ (0xff << p) : 0xff;
+ adr->v6.s6_addr[i] = (p < 8) ? 0xff ^ (0xff >> p) : 0xff;
i++;
}
@@ -564,7 +564,7 @@
{
for(tmp = adr->v6.s6_addr[i];
tmp > 0;
- tmp = tmp >> 1)
+ tmp = (tmp << 1) & 0xff)
prefix++;
}
}

View File

@ -1,306 +0,0 @@
diff -Nur olsrd-0.4.10.orig/lib/dot_draw/src/olsrd_dot_draw.c olsrd-0.4.10/lib/dot_draw/src/olsrd_dot_draw.c
--- olsrd-0.4.10.orig/lib/dot_draw/src/olsrd_dot_draw.c 2005-12-30 03:23:59.000000000 +0100
+++ olsrd-0.4.10/lib/dot_draw/src/olsrd_dot_draw.c 2006-12-01 20:23:37.000000000 +0100
@@ -136,6 +136,8 @@
/* Register the "ProcessChanges" function */
register_pcf(&pcf_event);
+ plugin_ipc_init();
+
return 1;
}
@@ -237,6 +239,7 @@
/* Register with olsrd */
+ printf("Adding socket with olsrd\n");
add_olsr_socket(ipc_socket, &ipc_action);
ipc_socket_up = 1;
}
diff -Nur olsrd-0.4.10.orig/lib/httpinfo/src/olsrd_httpinfo.c olsrd-0.4.10/lib/httpinfo/src/olsrd_httpinfo.c
--- olsrd-0.4.10.orig/lib/httpinfo/src/olsrd_httpinfo.c 2006-12-01 20:20:31.000000000 +0100
+++ olsrd-0.4.10/lib/httpinfo/src/olsrd_httpinfo.c 2006-12-01 20:23:37.000000000 +0100
@@ -297,6 +297,7 @@
if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) == -1)
{
olsr_printf(1, "(HTTPINFO) bind failed %s\n", strerror(errno));
+ close(s);
return -1;
}
@@ -304,6 +305,7 @@
if (listen(s, 1) == -1)
{
olsr_printf(1, "(HTTPINFO) listen failed %s\n", strerror(errno));
+ close(s);
return -1;
}
diff -Nur olsrd-0.4.10.orig/lib/secure/src/olsrd_secure.c olsrd-0.4.10/lib/secure/src/olsrd_secure.c
--- olsrd-0.4.10.orig/lib/secure/src/olsrd_secure.c 2005-11-19 09:37:23.000000000 +0100
+++ olsrd-0.4.10/lib/secure/src/olsrd_secure.c 2006-12-01 20:23:37.000000000 +0100
@@ -952,7 +952,7 @@
else
{
/* Check configuration timeout */
- if(!TIMED_OUT(&entry->conftime))
+ if(!TIMED_OUT(entry->conftime))
{
/* If registered - do not accept! */
olsr_printf(1, "[ENC]Challenge from registered node...dropping!\n");
@@ -1205,7 +1205,7 @@
while(tmp_list != &timestamps[index])
{
/*Check if the entry is timed out*/
- if((TIMED_OUT(&tmp_list->valtime)) && (TIMED_OUT(&tmp_list->conftime)))
+ if((TIMED_OUT(tmp_list->valtime)) && (TIMED_OUT(tmp_list->conftime)))
{
entry_to_delete = tmp_list;
tmp_list = tmp_list->next;
diff -Nur olsrd-0.4.10.orig/make/Makefile.linux olsrd-0.4.10/make/Makefile.linux
--- olsrd-0.4.10.orig/make/Makefile.linux 2005-11-19 09:43:51.000000000 +0100
+++ olsrd-0.4.10/make/Makefile.linux 2006-12-01 20:23:37.000000000 +0100
@@ -3,7 +3,11 @@
#
INSTALL_PREFIX ?=
+ifeq ($(shell arch),x86_64)
+LIBDIR = $(INSTALL_PREFIX)/usr/lib64
+else
LIBDIR = $(INSTALL_PREFIX)/usr/lib
+endif
SRCS += $(wildcard src/linux/*.c) $(wildcard src/unix/*.c)
HDRS += $(wildcard src/linux/*.h) $(wildcard src/unix/*.h)
diff -Nur olsrd-0.4.10.orig/make/Makefile.osx olsrd-0.4.10/make/Makefile.osx
--- olsrd-0.4.10.orig/make/Makefile.osx 2005-12-29 20:48:43.000000000 +0100
+++ olsrd-0.4.10/make/Makefile.osx 2006-12-01 20:23:37.000000000 +0100
@@ -2,6 +2,10 @@
# MAC OSX SPECIFIC CONFIGURATION
#
+# don't strip executables and bundles for now until we figure out the proper way
+# to do it (flags).
+STRIP = \#
+
INSTALL_PREFIX ?=
LIBDIR = $(INSTALL_PREFIX)/usr/lib
@@ -12,12 +16,10 @@
LIBS =
PLUGIN_FULLNAME ?= $(PLUGIN_NAME).so.$(PLUGIN_VER)
-INSTALL_LIB = install -m 755 $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME); \
- /sbin/ldconfig
+INSTALL_LIB = install -m 755 $(PLUGIN_FULLNAME) $(LIBDIR)/$(PLUGIN_FULLNAME)
ifdef OLSRD_PLUGIN
-CFLAGS += -fPIC
-LDFLAGS = -fPIC -dynamiclib -single_module -flat_namespace -undefined suppress
+LDFLAGS = -bundle -flat_namespace -undefined suppress
else
LDFLAGS = -dynamic
endif
diff -Nur olsrd-0.4.10.orig/Makefile olsrd-0.4.10/Makefile
--- olsrd-0.4.10.orig/Makefile 2006-12-01 20:20:31.000000000 +0100
+++ olsrd-0.4.10/Makefile 2006-12-01 20:23:37.000000000 +0100
@@ -171,3 +171,4 @@
build_all: cfgparser olsrd libs
install_all: install install_libs
+clean_all: uberclean clean_libs
diff -Nur olsrd-0.4.10.orig/src/bsd/net.c olsrd-0.4.10/src/bsd/net.c
--- olsrd-0.4.10.orig/src/bsd/net.c 2005-08-28 21:30:29.000000000 +0200
+++ olsrd-0.4.10/src/bsd/net.c 2006-12-01 20:23:37.000000000 +0100
@@ -290,6 +290,7 @@
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
{
perror("SO_REUSEADDR failed");
+ close(sock);
return (-1);
}
/* connect to PORT on HOST */
@@ -298,6 +299,7 @@
printf("FAILED\n");
fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
printf("connection refused\n");
+ close(sock);
return (-1);
}
@@ -332,6 +334,7 @@
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
{
perror("SO_REUSEADDR failed");
+ close(sock);
return (-1);
}
@@ -339,12 +342,14 @@
if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0)
{
perror("SO_REUSEPORT failed");
+ close(sock);
return (-1);
}
if (setsockopt(sock, IPPROTO_IP, IP_RECVIF, &on, sizeof(on)) < 0)
{
perror("IP_RECVIF failed");
+ close(sock);
return (-1);
}
#endif /* SPOOF */
@@ -403,6 +408,7 @@
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
{
perror("SO_REUSEADDR failed");
+ close(sock);
return (-1);
}
diff -Nur olsrd-0.4.10.orig/src/linux/net.c olsrd-0.4.10/src/linux/net.c
--- olsrd-0.4.10.orig/src/linux/net.c 2005-09-17 22:48:50.000000000 +0200
+++ olsrd-0.4.10/src/linux/net.c 2006-12-01 20:23:37.000000000 +0100
@@ -434,6 +434,7 @@
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
{
perror("SO_REUSEADDR failed");
+ close(sock);
return (-1);
}
/* connect to PORT on HOST */
@@ -442,6 +443,7 @@
printf("FAILED\n");
fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
printf("connection refused\n");
+ close(sock);
return (-1);
}
@@ -487,6 +489,7 @@
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
{
perror("SO_REUSEADDR failed");
+ close(sock);
return (-1);
}
@@ -520,6 +523,7 @@
{
fprintf(stderr, "Could not bind socket to device... exiting!\n\n");
syslog(LOG_ERR, "Could not bind socket to device... exiting!\n\n");
+ close(sock);
return -1;
}
@@ -606,6 +610,7 @@
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
{
perror("SO_REUSEADDR failed");
+ close(sock);
return (-1);
}
@@ -619,6 +624,7 @@
{
fprintf(stderr, "Could not bind socket to device... exiting!\n\n");
syslog(LOG_ERR, "Could not bind socket to device... exiting!\n\n");
+ close(sock);
return -1;
}
diff -Nur olsrd-0.4.10.orig/src/main.c olsrd-0.4.10/src/main.c
--- olsrd-0.4.10.orig/src/main.c 2006-12-01 20:20:31.000000000 +0100
+++ olsrd-0.4.10/src/main.c 2006-12-01 20:23:54.000000000 +0100
@@ -118,7 +118,7 @@
system_tick_divider = 1000/sysconf(_SC_CLK_TCK);
/* Check if user is root */
- if(getuid() || getgid())
+ if(geteuid())
{
fprintf(stderr, "You must be root(uid = 0) to run olsrd!\nExiting\n\n");
exit(EXIT_FAILURE);
@@ -395,6 +395,7 @@
signal(SIGHUP, olsr_reconfigure);
signal(SIGINT, olsr_shutdown);
signal(SIGTERM, olsr_shutdown);
+ signal(SIGPIPE, SIG_IGN);
#endif
/* Register socket poll event */
@@ -535,6 +536,7 @@
fprintf(stderr, " [-hint <hello interval (secs)>] [-tcint <tc interval (secs)>]\n");
fprintf(stderr, " [-midint <mid interval (secs)>] [-hnaint <hna interval (secs)>]\n");
fprintf(stderr, " [-T <Polling Rate (secs)>] [-nofork] [-hemu <ip_address>] \n");
+ fprintf(stderr, " [-lql <LQ level>] [-lqw <LQ winsize>]\n");
}
@@ -635,6 +637,42 @@
memcpy(&ifcnf->ipv4_broadcast.v4, &in.s_addr, sizeof(olsr_u32_t));
continue;
}
+
+ /*
+ * Set LQ level
+ */
+ if (strcmp(*argv, "-lql") == 0)
+ {
+ int tmp_lq_level;
+ NEXT_ARG;
+ CHECK_ARGC;
+
+ /* Sanity checking is done later */
+ sscanf(*argv, "%d", &tmp_lq_level);
+ olsr_cnf->lq_level = tmp_lq_level;
+ continue;
+ }
+
+ /*
+ * Set LQ winsize
+ */
+ if (strcmp(*argv, "-lqw") == 0)
+ {
+ int tmp_lq_wsize;
+ NEXT_ARG;
+ CHECK_ARGC;
+
+ sscanf(*argv, "%d", &tmp_lq_wsize);
+
+ if(tmp_lq_wsize < MIN_LQ_WSIZE || tmp_lq_wsize > MAX_LQ_WSIZE)
+ {
+ printf("LQ winsize %d not allowed. Range [%d-%d]\n",
+ tmp_lq_wsize, MIN_LQ_WSIZE, MAX_LQ_WSIZE);
+ olsr_exit(__func__, EXIT_FAILURE);
+ }
+ olsr_cnf->lq_wsize = tmp_lq_wsize;
+ continue;
+ }
/*
* Enable additional debugging information to be logged.
diff -Nur olsrd-0.4.10.orig/src/scheduler.c olsrd-0.4.10/src/scheduler.c
--- olsrd-0.4.10.orig/src/scheduler.c 2006-12-01 20:20:31.000000000 +0100
+++ olsrd-0.4.10/src/scheduler.c 2006-12-01 20:23:37.000000000 +0100
@@ -330,6 +330,7 @@
{
prev->next = entry->next;
}
+ free(entry);
return 1;
}
diff -Nur olsrd-0.4.10.orig/src/win32/net.c olsrd-0.4.10/src/win32/net.c
--- olsrd-0.4.10.orig/src/win32/net.c 2005-05-30 15:50:27.000000000 +0200
+++ olsrd-0.4.10/src/win32/net.c 2006-12-01 20:23:37.000000000 +0100
@@ -87,6 +87,7 @@
printf("FAILED\n");
fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
printf("connection refused\n");
+ closesocket(sock);
return (-1);
}

View File

@ -1,137 +0,0 @@
diff -Nur olsrd-0.4.10.orig/src/link_set.c olsrd-0.4.10/src/link_set.c
--- olsrd-0.4.10.orig/src/link_set.c 2006-12-01 09:04:56.000000000 +0100
+++ olsrd-0.4.10/src/link_set.c 2006-12-01 09:06:22.000000000 +0100
@@ -381,6 +381,69 @@
}
/**
+ *Delete all interface link entries
+ *
+ *@param interface ip address
+ */
+
+void
+del_if_link_entries(union olsr_ip_addr *int_addr)
+{
+ struct link_entry *tmp_link_set, *last_link_entry;
+
+ if(link_set == NULL)
+ return;
+
+ tmp_link_set = link_set;
+ last_link_entry = NULL;
+
+ while(tmp_link_set)
+ {
+
+ if(COMP_IP(int_addr, &tmp_link_set->local_iface_addr))
+ {
+ if(last_link_entry != NULL)
+ {
+ last_link_entry->next = tmp_link_set->next;
+
+ /* Delete neighbor entry */
+ if(tmp_link_set->neighbor->linkcount == 1)
+ olsr_delete_neighbor_table(&tmp_link_set->neighbor->neighbor_main_addr);
+ else
+ tmp_link_set->neighbor->linkcount--;
+
+ //olsr_delete_neighbor_if_no_link(&tmp_link_set->neighbor->neighbor_main_addr);
+ changes_neighborhood = OLSR_TRUE;
+
+ free(tmp_link_set);
+ tmp_link_set = last_link_entry;
+ }
+ else
+ {
+ link_set = tmp_link_set->next; /* CHANGED */
+
+ /* Delete neighbor entry */
+ if(tmp_link_set->neighbor->linkcount == 1)
+ olsr_delete_neighbor_table(&tmp_link_set->neighbor->neighbor_main_addr);
+ else
+ tmp_link_set->neighbor->linkcount--;
+
+ changes_neighborhood = OLSR_TRUE;
+
+ free(tmp_link_set);
+ tmp_link_set = link_set;
+ continue;
+ }
+ }
+
+ last_link_entry = tmp_link_set;
+ tmp_link_set = tmp_link_set->next;
+ }
+
+ return;
+}
+
+/**
*Nothing mysterious here.
*Adding a new link entry to the link set.
*
diff -Nur olsrd-0.4.10.orig/src/link_set.h olsrd-0.4.10/src/link_set.h
--- olsrd-0.4.10.orig/src/link_set.h 2005-10-23 22:58:14.000000000 +0200
+++ olsrd-0.4.10/src/link_set.h 2006-12-01 09:06:22.000000000 +0100
@@ -116,6 +116,9 @@
void
olsr_init_link_set(void);
+void
+del_if_link_entries(union olsr_ip_addr *);
+
struct link_entry *
get_best_link_to_neighbor(union olsr_ip_addr *);
diff -Nur olsrd-0.4.10.orig/src/linux/kernel_routes.c olsrd-0.4.10/src/linux/kernel_routes.c
--- olsrd-0.4.10.orig/src/linux/kernel_routes.c 2005-02-27 19:39:43.000000000 +0100
+++ olsrd-0.4.10/src/linux/kernel_routes.c 2006-12-01 09:06:22.000000000 +0100
@@ -244,9 +244,8 @@
inet_ntop(AF_INET, &destination->rt_mask.v4, mask_str, 16);
inet_ntop(AF_INET, &destination->rt_router.v4, router_str, 16);
- OLSR_PRINTF(1, "(ioctl)Deleting route with metric %d to %s/%s via %s/%s.\n",
- destination->rt_metric, dst_str, mask_str, router_str,
- destination->rt_if->int_name)
+ OLSR_PRINTF(1, "(ioctl)Deleting route with metric %d to %s/%s via %s.\n",
+ destination->rt_metric, dst_str, mask_str, router_str)
memset(&kernel_route,0,sizeof(struct rtentry));
diff -Nur olsrd-0.4.10.orig/src/lq_packet.c olsrd-0.4.10/src/lq_packet.c
--- olsrd-0.4.10.orig/src/lq_packet.c 2006-12-01 09:04:56.000000000 +0100
+++ olsrd-0.4.10/src/lq_packet.c 2006-12-01 09:06:22.000000000 +0100
@@ -225,8 +225,10 @@
link = get_best_link_to_neighbor(&neigh->main);
- neigh->link_quality = link->loss_link_quality;
- neigh->neigh_link_quality = link->neigh_link_quality;
+ if (link) {
+ neigh->link_quality = link->loss_link_quality;
+ neigh->neigh_link_quality = link->neigh_link_quality;
+ }
// queue the neighbour entry
diff -Nur olsrd-0.4.10.orig/src/unix/ifnet.c olsrd-0.4.10/src/unix/ifnet.c
--- olsrd-0.4.10.orig/src/unix/ifnet.c 2006-12-01 09:04:56.000000000 +0100
+++ olsrd-0.4.10/src/unix/ifnet.c 2006-12-01 09:06:22.000000000 +0100
@@ -56,6 +56,7 @@
#include "mantissa.h"
#include "lq_packet.h"
#include "log.h"
+#include "link_set.h"
#include <signal.h>
#include <sys/types.h>
#include <net/if.h>
@@ -393,6 +394,8 @@
OLSR_PRINTF(1, "Removing interface %s\n", iface->name)
olsr_syslog(OLSR_LOG_INFO, "Removing interface %s\n", iface->name);
+ del_if_link_entries(&ifp->ip_addr);
+
/*
*Call possible ifchange functions registered by plugins
*/

View File

@ -1,36 +0,0 @@
diff -Nur olsrd-0.4.10.orig/src/parser.c olsrd-0.4.10/src/parser.c
--- olsrd-0.4.10.orig/src/parser.c 2005-11-19 09:49:44.000000000 +0100
+++ olsrd-0.4.10/src/parser.c 2006-12-04 09:12:40.000000000 +0100
@@ -61,6 +61,14 @@
#define strerror(x) StrError(x)
#endif
+/* Sven-Ola: On very slow devices used in huge networks
+ * the amount of lq_tc messages is so high, that the
+ * recv() loop never ends. This is a small hack to end
+ * the loop in this cases
+ */
+
+unsigned int cpu_overload_exit = 0;
+
struct parse_function_entry *parse_functions;
static char inbuf[MAXMESSAGESIZE+1];
@@ -347,9 +355,16 @@
int cc;
struct interface *olsr_in_if;
union olsr_ip_addr from_addr;
-
+ cpu_overload_exit = 0;
+
for (;;)
{
+ if (32 < ++cpu_overload_exit)
+ {
+ OLSR_PRINTF(1, "CPU overload detected, ending olsr_input() loop\n")
+ break;
+ }
+
fromlen = sizeof(struct sockaddr_storage);
cc = olsr_recvfrom(fd,

View File

@ -1,12 +0,0 @@
diff -Nur olsrd-0.4.10.orig/lib/secure/src/olsrd_secure.h olsrd-0.4.10/lib/secure/src/olsrd_secure.h
--- olsrd-0.4.10.orig/lib/secure/src/olsrd_secure.h 2005-11-19 09:30:45.000000000 +0100
+++ olsrd-0.4.10/lib/secure/src/olsrd_secure.h 2006-12-01 08:50:41.000000000 +0100
@@ -46,7 +46,7 @@
#include "hashing.h"
-#define KEYFILE "/root/.olsr/olsrd_secure_key"
+#define KEYFILE "/etc/olsrd.d/olsrd_secure_key"
/* Schemes */
#define ONE_CHECKSUM 1

View File

@ -1,22 +0,0 @@
diff -Nur olsrd-0.4.10.orig/src/cfgparser/oparse.c olsrd-0.4.10/src/cfgparser/oparse.c
--- olsrd-0.4.10.orig/src/cfgparser/oparse.c 2006-01-01 17:15:57.000000000 +0100
+++ olsrd-0.4.10/src/cfgparser/oparse.c 2006-12-01 08:21:39.000000000 +0100
@@ -1921,6 +1921,7 @@
return -1;
}
h->netmask.v4 = in.s_addr;
+ h->net.v4 &= h->netmask.v4;
/* Queue */
h->next = cnf->hna4_entries;
cnf->hna4_entries = h;
diff -Nur olsrd-0.4.10.orig/src/cfgparser/oparse.y olsrd-0.4.10/src/cfgparser/oparse.y
--- olsrd-0.4.10.orig/src/cfgparser/oparse.y 2005-11-17 05:25:44.000000000 +0100
+++ olsrd-0.4.10/src/cfgparser/oparse.y 2006-12-01 08:23:05.000000000 +0100
@@ -701,6 +701,7 @@
return -1;
}
h->netmask.v4 = in.s_addr;
+ h->net.v4 &= h->netmask.v4;
/* Queue */
h->next = cnf->hna4_entries;
cnf->hna4_entries = h;