From b375106e826efd8c20fb17c3997a9e2be259f0c4 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sun, 5 Dec 2010 01:57:21 +0000 Subject: [PATCH 1/1] contrib: remove olsrd-luci --- contrib/package/olsrd-luci/Makefile | 226 - contrib/package/olsrd-luci/files/etc/config/olsrd | 21 - contrib/package/olsrd-luci/files/etc/default/olsrd | 8 - contrib/package/olsrd-luci/files/etc/init.d/olsrd | 581 --- contrib/package/olsrd-luci/ipkg/postinst | 6 - .../olsrd-luci/patches/131-olsrd-tweak-ffetx.patch | 13 - .../olsrd-luci/patches/137-olsrd-192.168.1.1.patch | 11 - .../patches/139-olsrd-magicarprefresh.patch | 44 - .../patches/140-olsrd-optimize-size.patch | 1909 --------- .../package/olsrd-luci/patches/160-add-mdns.patch | 4408 -------------------- .../package/olsrd-luci/patches/170-fcntl-fix.patch | 10 - .../patches/200-mid_memory_cleanup.patch | 256 -- 12 files changed, 7493 deletions(-) delete mode 100644 contrib/package/olsrd-luci/Makefile delete mode 100644 contrib/package/olsrd-luci/files/etc/config/olsrd delete mode 100644 contrib/package/olsrd-luci/files/etc/default/olsrd delete mode 100755 contrib/package/olsrd-luci/files/etc/init.d/olsrd delete mode 100755 contrib/package/olsrd-luci/ipkg/postinst delete mode 100644 contrib/package/olsrd-luci/patches/131-olsrd-tweak-ffetx.patch delete mode 100644 contrib/package/olsrd-luci/patches/137-olsrd-192.168.1.1.patch delete mode 100644 contrib/package/olsrd-luci/patches/139-olsrd-magicarprefresh.patch delete mode 100644 contrib/package/olsrd-luci/patches/140-olsrd-optimize-size.patch delete mode 100644 contrib/package/olsrd-luci/patches/160-add-mdns.patch delete mode 100644 contrib/package/olsrd-luci/patches/170-fcntl-fix.patch delete mode 100644 contrib/package/olsrd-luci/patches/200-mid_memory_cleanup.patch diff --git a/contrib/package/olsrd-luci/Makefile b/contrib/package/olsrd-luci/Makefile deleted file mode 100644 index 766bb606b..000000000 --- a/contrib/package/olsrd-luci/Makefile +++ /dev/null @@ -1,226 +0,0 @@ -# -# Copyright (C) 2008-2009 Freifunk Leipzig -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# -# $Id$ -# - -include $(TOPDIR)/rules.mk - -PKG_BASENAME:=olsrd -PKG_NAME:=$(PKG_BASENAME)-luci -PKG_BASEVER:=0.5.6-r7 -PKG_RELEASE:=2 - -#PKG_HGREV:=438bd63a1ab8 -#PKG_SOURCE:=$(PKG_HGREV).tar.gz -#PKG_SOURCE_URL:=http://gredler.at/hg/olsrd-0.5.6/archive -#PKG_MD5SUM:=18cfb6afd823daa29dee8375223201d2 -#PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_HGREV) -#PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE) -#PKG_VERSION:=$(PKG_BASEVER)+$(PKG_HGREV)+luci1 - -PKG_SOURCE:=$(PKG_BASENAME)-$(PKG_BASEVER).tar.bz2 -PKG_SOURCE_URL:=http://www.olsr.org/releases/0.5 -PKG_MD5SUM:=dde8cb45a10f0cad2010ab2e8ad55146 -PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_BASEVER) -PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xjf $(DL_DIR)/$(PKG_SOURCE) -PKG_VERSION:=$(PKG_BASEVER)+luci1 - -include $(INCLUDE_DIR)/package.mk - - -define Package/olsrd-luci/common_info - SECTION:=luci - CATEGORY:=LuCI - SUBMENU:=Freifunk - TITLE:=OLSR - Optimized Link State Routing Daemon - URL:=http://www.olsr.org/ - MAINTAINER:=Jo-Philipp Wich -endef - -define Package/olsrd-luci - $(call Package/olsrd-luci/common_info) - MENU:=1 - DEPENDS:=+libpthread -endef - -define Package/olsrd-luci/conffiles -/etc/config/olsrd -endef - -define Package/olsrd-luci-mod-arprefresh - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - ARP Refresh Plugin - DEPENDS:=olsrd-luci -endef - -define Package/olsrd-luci-mod-dot-draw - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - Dot Draw Plugin - DEPENDS:=olsrd-luci -endef - -define Package/olsrd-luci-mod-bmf - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - Basic Multicast Forwarding Plugin - DEPENDS:=olsrd-luci +kmod-tun -endef - -define Package/olsrd-luci-mod-dyn-gw - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - Dynamic Gateway Plugin - DEPENDS:=olsrd-luci -endef - -define Package/olsrd-luci-mod-dyn-gw-plain - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - Dynamic Gateway Plugin (Plain Version) - DEPENDS:=olsrd-luci -endef - -define Package/olsrd-luci-mod-httpinfo - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - HTTP/HTML Info Plugin - DEPENDS:=olsrd-luci -endef - -define Package/olsrd-luci-mod-nameservice - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - Hostname Propagation Plugin - DEPENDS:=olsrd-luci -endef - -define Package/olsrd-luci-mod-secure - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - Security Extensions Plugin - DEPENDS:=olsrd-luci -endef - -define Package/olsrd-luci-mod-txtinfo - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - HTTP/Plaintext Info Plugin - DEPENDS:=olsrd-luci -endef - -define Package/olsrd-luci-mod-quagga - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - Quagga Plugin - DEPENDS:=olsrd-luci -endef - -define Package/olsrd-luci-mod-watchdog - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - Watchdog Plugin - DEPENDS:=olsrd-luci -endef - -define Package/olsrd-luci-mod-mdns - $(call Package/olsrd-luci/common_info) - TITLE:=OLSR - mDNS Plugin - DEPENDS:=olsrd-luci -endef - -TARGET_CFLAGS += $(FPIC) - -define Build/Compile - $(MAKE) -C "$(PKG_BUILD_DIR)" olsrd libs \ - $(TARGET_CONFIGURE_OPTS) \ - NODEBUG=1 \ - CFLAGS="$(TARGET_CFLAGS) -DSVEN_OLA_UNBLOAT -DNODEBUG" \ - 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="true" \ - INSTALL_LIB="true" \ - SUBDIRS="arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo nameservice secure txtinfo quagga watchdog mdns" -endef - -define Package/olsrd-luci/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_DIR) $(1)/etc/config - $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) $(PKG_BUILD_DIR)/olsrd $(1)/usr/sbin/ - $(INSTALL_BIN) ./files/etc/init.d/olsrd $(1)/etc/init.d/ - $(INSTALL_CONF) ./files/etc/config/olsrd $(1)/etc/config/ -endef - -define Package/olsrd-luci-mod-arprefresh/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/arprefresh/olsrd_arprefresh.so.* $(1)/usr/lib/ -endef - -define Package/olsrd-luci-mod-dot-draw/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/dot_draw/olsrd_dot_draw.so.* $(1)/usr/lib/ -endef - -define Package/olsrd-luci-mod-bmf/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmf/olsrd_bmf.so.* $(1)/usr/lib/ -endef - -define Package/olsrd-luci-mod-dyn-gw/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/dyn_gw/olsrd_dyn_gw.so.* $(1)/usr/lib/ -endef - -define Package/olsrd-luci-mod-dyn-gw-plain/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/dyn_gw_plain/olsrd_dyn_gw_plain.so.* $(1)/usr/lib/ -endef - -define Package/olsrd-luci-mod-httpinfo/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/httpinfo/olsrd_httpinfo.so.* $(1)/usr/lib/ -endef - -define Package/olsrd-luci-mod-nameservice/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/nameservice/olsrd_nameservice.so.* $(1)/usr/lib/ -endef - -define Package/olsrd-luci-mod-secure/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/secure/olsrd_secure.so.* $(1)/usr/lib/ -endef - -define Package/olsrd-luci-mod-txtinfo/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/txtinfo/olsrd_txtinfo.so.* $(1)/usr/lib/ -endef - -define Package/olsrd-luci-mod-quagga/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/quagga/olsrd_quagga.so.* $(1)/usr/lib/ -endef - -define Package/olsrd-luci-mod-watchdog/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/watchdog/olsrd_watchdog.so.* $(1)/usr/lib/ -endef - -define Package/olsrd-luci-mod-mdns/install - $(INSTALL_DIR) $(1)/usr/lib - $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/mdns/olsrd_mdns.so.* $(1)/usr/lib/ -endef - - -$(eval $(call BuildPackage,olsrd-luci)) -$(eval $(call BuildPackage,olsrd-luci-mod-arprefresh)) -$(eval $(call BuildPackage,olsrd-luci-mod-dot-draw)) -$(eval $(call BuildPackage,olsrd-luci-mod-bmf)) -$(eval $(call BuildPackage,olsrd-luci-mod-dyn-gw)) -$(eval $(call BuildPackage,olsrd-luci-mod-dyn-gw-plain)) -$(eval $(call BuildPackage,olsrd-luci-mod-httpinfo)) -$(eval $(call BuildPackage,olsrd-luci-mod-nameservice)) -$(eval $(call BuildPackage,olsrd-luci-mod-secure)) -$(eval $(call BuildPackage,olsrd-luci-mod-txtinfo)) -$(eval $(call BuildPackage,olsrd-luci-mod-quagga)) -$(eval $(call BuildPackage,olsrd-luci-mod-watchdog)) -$(eval $(call BuildPackage,olsrd-luci-mod-mdns)) diff --git a/contrib/package/olsrd-luci/files/etc/config/olsrd b/contrib/package/olsrd-luci/files/etc/config/olsrd deleted file mode 100644 index 5e490c340..000000000 --- a/contrib/package/olsrd-luci/files/etc/config/olsrd +++ /dev/null @@ -1,21 +0,0 @@ -config 'olsrd' - option 'IpVersion' '4' - option 'FIBMetric' 'flat' - option 'LinkQualityAlgorithm' 'etx_ff' - option 'NatThreshold' '0.75' - -config 'Interface' - option 'ignore' '1' - option 'interface' 'ff' - -config 'LoadPlugin' - option 'library' 'olsrd_dyn_gw_plain.so.0.4' - -config 'LoadPlugin' - option 'library' 'olsrd_nameservice.so.0.3' - option 'suffix' '.olsr' - option 'hosts_file' '/var/etc/hosts.olsr' - -config 'LoadPlugin' - option 'library' 'olsrd_txtinfo.so.0.1' - option 'accept' '127.0.0.1' diff --git a/contrib/package/olsrd-luci/files/etc/default/olsrd b/contrib/package/olsrd-luci/files/etc/default/olsrd deleted file mode 100644 index d89e007bd..000000000 --- a/contrib/package/olsrd-luci/files/etc/default/olsrd +++ /dev/null @@ -1,8 +0,0 @@ -# you can override olsrd's startup variables here -#BIN=/usr/sbin/olsrd -#CONF=/var/etc/olsrd.conf -#PID=/var/run/olsrd.pid - -# place your custom olsrd parameters here -OPTIONS= - diff --git a/contrib/package/olsrd-luci/files/etc/init.d/olsrd b/contrib/package/olsrd-luci/files/etc/init.d/olsrd deleted file mode 100755 index 875800e75..000000000 --- a/contrib/package/olsrd-luci/files/etc/init.d/olsrd +++ /dev/null @@ -1,581 +0,0 @@ -#!/bin/sh /etc/rc.common -# Copyright (C) 2008 Alina Friedrichsen -# Special thanks to bittorf wireless )) -START=50 - -BIN=/usr/sbin/olsrd -CONF=/var/etc/olsrd.conf -PID=/var/run/olsrd.pid - -OLSRD_OLSRD_SCHEMA='ignore:internal config_file:internal DebugLevel=0 IpVersion=4 AllowNoInt:bool=1 Pollrate=0.025 TcRedundancy=2 MprCoverage=3 LinkQualityFishEye=1 LinkQualityDijkstraLimit=0+9.0 FIBMetric=flat ClearScreen:bool=1 Willingness=3 LinkQualityAging=0.1 LinkQualityAlgorithm=etx_fpm MinTCVTime=500.0' -OLSRD_IPCCONNECT_SCHEMA='ignore:internal Host:list Net:list2' -OLSRD_LOADPLUGIN_SCHEMA='ignore:internal library:internal Host:list Net:list2 Ping:list redistribute:list NonOlsrIf:list name:list lat lon latlon_infile HNA:list2 hosts:list2' -OLSRD_INTERFACE_SCHEMA='ignore:internal interface:internal AutoDetectChanges:bool Ip4Broadcast HelloInterval=5.0 HelloValidityTime=40.0 TcInterval=2.0 TcValidityTime=256.0 MidInterval=18.0 MidValidityTime=324.0 HnaInterval=18.0 HnaValidityTime=108.0' - -T=' ' -N=' -' - -validate_varname() { - local varname=$1 - [ -z "$varname" -o "$varname" != "${varname%%[!A-Za-z0-9_]*}" ] && return 1 - return 0 -} - -validate_ifname() { - local ifname=$1 - [ -z "$ifname" -o "$ifname" != "${ifname%%[!A-Za-z0-9.:_-]*}" ] && return 1 - return 0 -} - -validate_olsrd_option() { - local str=$1 - [ -z "$str" -o "$str" != "${str%%[! 0-9A-Za-z./|:_-]*}" ] && return 1 - return 0 -} - -get_ifname() { - IFNAME= - local interface=$1 - validate_varname "$interface" || return 1 - local ifname - - config_get ifname "$interface" ifname - validate_ifname "$ifname" || return 1 - IFNAME=$ifname - - return 0 -} - -system_config() { - local cfg=$1 - local cfgt - local hostname - local latlon - - config_get cfgt "$cfg" TYPE - - if [ "$cfgt" = "system" ]; then - config_get hostname "$cfg" hostname - hostname=${hostname:-OpenWrt} - SYSTEM_HOSTNAME=$hostname - fi - - if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then - config_get latlon "$cfg" latlon - IFS=" ${T}${N}," - set -- $latlon - unset IFS - SYSTEM_LAT=$1 - SYSTEM_LON=$2 - fi -} - -olsrd_find_config_file() { - local cfg=$1 - validate_varname "$cfg" || return 0 - - config_get_bool ignore "$cfg" ignore 0 - [ "$ignore" -ne 0 ] && return 0 - config_get OLSRD_CONFIG_FILE "$cfg" config_file - - return 0 -} - -warning_invalid_value() { - local package=$1 - validate_varname "$package" || package= - local config=$2 - validate_varname "$config" || config= - local option=$3 - validate_varname "$option" || option= - - echo -n "Warning: Invalid value" 1>&2 - - if [ -n "$package" -a -n "$config" ]; then - echo -n " in option '$package.$config${option:+.}$option'" 1>&2 - fi - - echo ", skipped" 1>&2 - - return 0 -} - -olsrd_write_option() { - local param=$1 - local cfg=$2 - validate_varname "$cfg" || return 1 - local option=$3 - validate_varname "$option" || return 1 - local value=$4 - local option_type=$5 - - if [ "$option_type" = bool ]; then - case "$value" in - 1|on|true|enabled|yes) value=yes;; - 0|off|false|disabled|no) value=no;; - *) warning_invalid_value olsrd "$cfg" "$option"; return 1;; - esac - fi - - if ! validate_olsrd_option "$value"; then - warning_invalid_value olsrd "$cfg" "$option" - return 1 - fi - - if [ "$value" != "${value%%[G-Zg-z_-]*}" ]; then - if [ "$option" != "Ip6AddrType" -a "$value" != "yes" -a "$value" != "no" ]; then - value="\"$value\"" - fi - fi - - echo -n "${N}$param$option $value" - - return 0 -} - -olsrd_write_plparam() { - local param=$1 - local cfg=$2 - validate_varname "$cfg" || return 1 - local option=$3 - validate_varname "$option" || return 1 - local value=$4 - local option_type=$5 - local _option - - if [ "$option_type" = bool ]; then - case "$value" in - 1|on|true|enabled|yes) value=yes;; - 0|off|false|disabled|no) value=no;; - *) warning_invalid_value olsrd "$cfg" "$option"; return 1;; - esac - fi - - if ! validate_olsrd_option "$value"; then - warning_invalid_value olsrd "$cfg" "$option" - return 1 - fi - - IFS='-_' - set -- $option - option="$*" - unset IFS - _option="$option" - if [ "$option" = 'hosts' ]; then - set -- $value - option=$1 - shift - value="$*" - fi - - echo -n "${N}${param}PlParam \"$option\" \"$value\"" - - return 0 -} - -config_update_schema() { - unset IFS - local schema_varname=$1 - validate_varname "$schema_varname" || return 1 - local command=$2 - validate_varname "$command" || return 1 - local option=$3 - validate_varname "$option" || return 1 - local value=$4 - local schema - local cur_option - - case "$varname" in - *_LENGTH) return 0;; - *_ITEM*) return 0;; - esac - - eval "export -n -- \"schema=\${$schema_varname}\"" - - for cur_option in $schema; do - [ "${cur_option%%[:=]*}" = "$option" ] && return 0 - done - - if [ "$command" = list ]; then - set -- $value - if [ "$#" -ge "3" ]; then - schema_entry="$option:list3" - elif [ "$#" -ge "2" ]; then - schema_entry="$option:list2" - else - schema_entry="$option:list" - fi - else - schema_entry="$option" - fi - - append "$schema_varname" "$schema_entry" - - return 0 -} - -config_write_options() { - unset IFS - local schema=$1 - local cfg=$2 - validate_varname "$cfg" || return 1 - local write_func=$3 - [ -z "$write_func" ] && output_func=echo - local write_param=$4 - local schema_entry - local option - local option_length - local option_type - local default - local value - local list_size - local list_item - local list_value - local i - local position - - for schema_entry in $schema; do - default=${schema_entry#*[=]} - [ "$default" = "$schema_entry" ] && default= - option=${schema_entry%%[=]*} - IFS=':' - set -- $option - unset IFS - option=$1 - option_type=$2 - validate_varname "$option" || continue - [ -z "$option_type" ] || validate_varname "$option_type" || continue - [ "$option_type" = internal ] && continue - config_get value "$cfg" "$option" - - if [ -z "$value" ]; then - IFS='+' - set -- $default - unset IFS - value=$* - elif [ "$value" = '-' -a -n "$default" ]; then - continue - fi - - [ -z "$value" ] && continue - - case "$option_type" in - list) list_size=1;; - list2) list_size=2;; - list3) list_size=3;; - *) list_size=0;; - esac - - if [ "$list_size" -gt 0 ]; then - config_get option_length "$cfg" "${option}_LENGTH" - if [ -n "$option_length" ]; then - i=1 - while [ "$i" -le "$option_length" ]; do - config_get list_value "$cfg" "${option}_ITEM$i" - "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break - i=$((i + 1)) - done - else - list_value= - i=0 - for list_item in $value; do - append "list_value" "$list_item" - i=$((i + 1)) - position=$((i % list_size)) - if [ "$position" -eq 0 ]; then - "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break - list_value= - fi - done - [ "$position" -ne 0 ] && "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" - fi - else - "$write_func" "$write_param" "$cfg" "$option" "$value" "$option_type" - fi - done - - return 0 -} - -olsrd_write_olsrd() { - local cfg=$1 - validate_varname "$cfg" || return 0 - local ignore - - config_get_bool ignore "$cfg" ignore 0 - [ "$ignore" -ne 0 ] && return 0 - - [ "$OLSRD_COUNT" -gt 0 ] && return 0 - - config_write_options "$OLSRD_OLSRD_SCHEMA" "$cfg" olsrd_write_option - echo - OLSRD_COUNT=$((OLSRD_COUNT + 1)) - - return 0 -} - -olsrd_write_ipcconnect() { - local cfg=$1 - validate_varname "$cfg" || return 0 - local ignore - - config_get_bool ignore "$cfg" ignore 0 - [ "$ignore" -ne 0 ] && return 0 - - [ "$IPCCONNECT_COUNT" -gt 0 ] && return 0 - - echo -n "${N}IpcConnect${N}{" - config_write_options "$OLSRD_IPCCONNECT_SCHEMA" "$cfg" olsrd_write_option "${T}" - echo "${N}}" - IPCCONNECT_COUNT=$((IPCCONNECT_COUNT + 1)) - - return 0 -} - -olsrd_write_hna4() { - local cfg=$1 - validate_varname "$cfg" || return 0 - local ignore - - config_get_bool ignore "$cfg" ignore 0 - [ "$ignore" -ne 0 ] && return 0 - - config_get netaddr "$cfg" netaddr - if ! validate_olsrd_option "$netaddr"; then - warning_invalid_value olsrd "$cfg" "netaddr" - return 0 - fi - - config_get netmask "$cfg" netmask - if ! validate_olsrd_option "$netmask"; then - warning_invalid_value olsrd "$cfg" "netmask" - return 0 - fi - - [ "$HNA4_COUNT" -le 0 ] && echo -n "${N}Hna4${N}{" - echo -n "${N}${T}$netaddr $netmask" - HNA4_COUNT=$((HNA4_COUNT + 1)) - - return 0 -} - -olsrd_write_hna6() { - local cfg=$1 - validate_varname "$cfg" || return 0 - local ignore - - config_get_bool ignore "$cfg" ignore 0 - [ "$ignore" -ne 0 ] && return 0 - - config_get netaddr "$cfg" netaddr - if ! validate_olsrd_option "$netaddr"; then - warning_invalid_value olsrd "$cfg" "netaddr" - return 0 - fi - - config_get prefix "$cfg" prefix - if ! validate_olsrd_option "$prefix"; then - warning_invalid_value olsrd "$cfg" "prefix" - return 0 - fi - - [ "$HNA6_COUNT" -le 0 ] && echo -n "${N}Hna6${N}{" - echo -n "${N}${T}$netaddr $prefix" - HNA6_COUNT=$((HNA6_COUNT + 1)) - - return 0 -} - -olsrd_write_loadplugin() { - local cfg=$1 - validate_varname "$cfg" || return 0 - local ignore - local name - local suffix - local lat - local lon - local latlon_infile - - config_get_bool ignore "$cfg" ignore 0 - [ "$ignore" -ne 0 ] && return 0 - - config_get library "$cfg" library - if ! validate_olsrd_option "$library"; then - warning_invalid_value olsrd "$cfg" "library" - return 0 - fi - if ! [ -x "/lib/$library" -o -x "/usr/lib/$library" -o -x "/usr/local/lib/$library" ]; then - echo "Warning: Plugin library '$library' not found, skipped" 1>&2 - return 0 - fi - - case "$library" in - olsrd_nameservice.*) - config_get name "$cfg" name - [ -z "$name" ] && config_set "$cfg" name $SYSTEM_HOSTNAME - - config_get suffix "$cfg" suffix - [ -z "$suffix" ] && config_set "$cfg" suffix '.olsr' - - config_get lat "$cfg" lat - config_get lon "$cfg" lon - config_get latlon_infile "$cfg" latlon_infile - if [ \( -z "$lat" -o -z "$lat" \) -a -z "$latlon_infile" ]; then - if [ -f '/var/run/latlon.txt' ]; then - config_set "$cfg" lat '' - config_set "$cfg" lon '' - config_set "$cfg" latlon_infile '/var/run/latlon.txt' - else - config_set "$cfg" lat "$SYSTEM_LAT" - config_set "$cfg" lon "$SYSTEM_LON" - fi - fi - - config_get latlon_file "$cfg" latlon_file - ;; - esac - - echo -n "${N}LoadPlugin \"$library\"${N}{" - config_write_options "$OLSRD_LOADPLUGIN_SCHEMA" "$cfg" olsrd_write_plparam "${T}" - echo "${N}}" - - return 0 -} - -olsrd_write_interface() { - local cfg=$1 - validate_varname "$cfg" || return 0 - local ignore - local interfaces - local interface - local ifnames - - config_get_bool ignore "$cfg" ignore 0 - [ "$ignore" -ne 0 ] && return 0 - - ifnames= - config_get interfaces "$cfg" interface - for interface in $interfaces; do - if validate_varname "$interface"; then - if get_ifname "$interface"; then - ifnames="$ifnames \"$IFNAME\"" - else - echo "Warning: Interface '$interface' not found, skipped" 1>&2 - fi - else - warning_invalid_value olsrd "$cfg" "interface" - fi - done - - [ -z "$ifnames" ] && return 0 - - echo -n "${N}Interface$ifnames${N}{" - config_write_options "$OLSRD_INTERFACE_SCHEMA" "$cfg" olsrd_write_option "${T}" - echo "${N}}" - INTERFACES_COUNT=$((INTERFACES_COUNT + 1)) - - return 0 -} - -olsrd_update_schema() { - local command="$1" - validate_varname "$command" || return 0 - local varname="$2" - validate_varname "$varname" || return 0 - local value="$3" - local cfg="$CONFIG_SECTION" - local cfgt - local cur_varname - - config_get cfgt "$cfg" TYPE - case "$cfgt" in - olsrd) config_update_schema OLSRD_OLSRD_SCHEMA "$command" "$varname" "$value";; - IpcConnect) config_update_schema OLSRD_IPCCONNECT_SCHEMA "$command" "$varname" "$value";; - LoadPlugin) config_update_schema OLSRD_LOADPLUGIN_SCHEMA "$command" "$varname" "$value";; - Interface) config_update_schema OLSRD_INTERFACE_SCHEMA "$command" "$varname" "$value";; - esac - - return 0 -} - -olsrd_write_config() { - OLSRD_COUNT=0 - config_foreach olsrd_write_olsrd olsrd - IPCCONNECT_COUNT=0 - config_foreach olsrd_write_ipcconnect IpcConnect - HNA4_COUNT=0 - config_foreach olsrd_write_hna4 Hna4 - [ "$HNA4_COUNT" -gt 0 ] && echo "${N}}" - HNA6_COUNT=0 - config_foreach olsrd_write_hna6 Hna6 - [ "$HNA6_COUNT" -gt 0 ] && echo "${N}}" - config_foreach olsrd_write_loadplugin LoadPlugin - INTERFACES_COUNT=0 - config_foreach olsrd_write_interface Interface - echo - - return 0 -} - -start() { - ### check for running instance - if [ -s $PID ]; then - if kill -0 $(cat $PID) 2>&-; then - echo "there is already a running instance ($(cat $PID))" - return 1 - fi - fi - - ### disable icmp redirects - echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects - - SYSTEM_HOSTNAME= - SYSTEM_LAT= - SYSTEM_LON= - config_load system - config_foreach system_config system - - option_cb() { - olsrd_update_schema "option" "$@" - } - - list_cb() { - olsrd_update_schema "list" "$@" - } - - include /lib/network - scan_interfaces - config_load olsrd - reset_cb - - OLSRD_CONFIG_FILE= - config_foreach olsrd_find_config_file olsrd - - if [ -z "$OLSRD_CONFIG_FILE" ]; then - ### generate config - mkdir -p ${CONF%/*} - olsrd_write_config > $CONF - if [ "$INTERFACES_COUNT" -gt 0 -a "$OLSRD_COUNT" -gt 0 ]; then - OLSRD_CONFIG_FILE=$CONF - fi - fi - - [ -z "$OLSRD_CONFIG_FILE" ] && return 1 - - ### start olsrd - start-stop-daemon -q -b -m -p $PID -x $BIN -S -- -f $CONF -nofork -} - -stop() { - ### stop olsrd - start-stop-daemon -q -p $PID -x $BIN -K - - ### re-enable icmp redirects - echo 1 > /proc/sys/net/ipv4/conf/all/send_redirects -} - -restart() { - ### override generic restart because we need some time between stop and start - stop; sleep 3; start -} diff --git a/contrib/package/olsrd-luci/ipkg/postinst b/contrib/package/olsrd-luci/ipkg/postinst deleted file mode 100755 index 26156a693..000000000 --- a/contrib/package/olsrd-luci/ipkg/postinst +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -[ -n "${IPKG_INSTROOT}" ] || { - /etc/init.d/olsrd enabled || /etc/init.d/olsrd enable - exit 0 -} diff --git a/contrib/package/olsrd-luci/patches/131-olsrd-tweak-ffetx.patch b/contrib/package/olsrd-luci/patches/131-olsrd-tweak-ffetx.patch deleted file mode 100644 index 853a14fe7..000000000 --- a/contrib/package/olsrd-luci/patches/131-olsrd-tweak-ffetx.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -Nur olsrd-0.5.6-r2.orig/src/lq_plugin_default_ff.h olsrd-0.5.6-r2/src/lq_plugin_default_ff.h ---- olsrd-0.5.6-r2.orig/src/lq_plugin_default_ff.h 2008-11-26 10:53:16.000000000 +0100 -+++ olsrd-0.5.6-r2/src/lq_plugin_default_ff.h 2008-11-26 10:53:16.000000000 +0100 -@@ -50,7 +50,8 @@ - - #define LQ_ALGORITHM_ETX_FF_NAME "etx_ff" - --#define LQ_FF_WINDOW 32 -+/* 16,32,64 and max. 128 */ -+#define LQ_FF_WINDOW 64 - #define LQ_FF_QUICKSTART_INIT 4 - - struct default_lq_ff { diff --git a/contrib/package/olsrd-luci/patches/137-olsrd-192.168.1.1.patch b/contrib/package/olsrd-luci/patches/137-olsrd-192.168.1.1.patch deleted file mode 100644 index 33a916b2f..000000000 --- a/contrib/package/olsrd-luci/patches/137-olsrd-192.168.1.1.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Nur olsrd-0.5.6-r2.orig/src/net_olsr.c olsrd-0.5.6-r2/src/net_olsr.c ---- olsrd-0.5.6-r2.orig/src/net_olsr.c 2008-11-26 10:53:53.000000000 +0100 -+++ olsrd-0.5.6-r2/src/net_olsr.c 2008-11-26 10:53:53.000000000 +0100 -@@ -78,6 +78,7 @@ - static const char *const deny_ipv4_defaults[] = { - "0.0.0.0", - "127.0.0.1", -+ "192.168.1.1", - NULL - }; - diff --git a/contrib/package/olsrd-luci/patches/139-olsrd-magicarprefresh.patch b/contrib/package/olsrd-luci/patches/139-olsrd-magicarprefresh.patch deleted file mode 100644 index 8d231dfec..000000000 --- a/contrib/package/olsrd-luci/patches/139-olsrd-magicarprefresh.patch +++ /dev/null @@ -1,44 +0,0 @@ ---- a/lib/arprefresh/src/olsrd_arprefresh.c -+++ b/lib/arprefresh/src/olsrd_arprefresh.c -@@ -34,6 +34,8 @@ - * Plugin to refresh the local ARP cache from received OLSR broadcasts - */ - -+#undef ARPREFRESH_DEBUG -+ - #include - #include - #include -@@ -46,6 +48,9 @@ - #include - #include - #include -+#ifdef ARPREFRESH_DEBUG -+#include -+#endif - #include - #include - #include -@@ -54,7 +59,6 @@ - #include "kernel_routes.h" - #include "scheduler.h" - --#undef ARPREFRESH_DEBUG - #define PLUGIN_INTERFACE_VERSION 5 - - /**************************************************************************** -@@ -129,7 +133,13 @@ - memcpy(&req.in_pa.sin_addr, &buf.ip.saddr, sizeof(buf.ip.saddr)); - req.arp.arp_ha.sa_family = AF_LOCAL; - memcpy(&req.arp.arp_ha.sa_data, &buf.eth.h_source, sizeof(buf.eth.h_source)); -- req.arp.arp_flags = ATF_COM; -+ /* -+ * Currently, temp arp entries work partially under linux-2.6 (the entries -+ * are timed out after a short period, not after the default 5 minutes. Under -+ * linux 2.4 this does not work. The ATF_MAGIC triggers a hack in the Freifunk -+ * firmware's kernel. ATF_MACIG seem not to be used anywhere... -+ */ -+ req.arp.arp_flags = ATF_COM | ATF_MAGIC; - if_indextoname(from.sll_ifindex, req.arp.arp_dev); - #ifdef ARPREFRESH_DEBUG - { diff --git a/contrib/package/olsrd-luci/patches/140-olsrd-optimize-size.patch b/contrib/package/olsrd-luci/patches/140-olsrd-optimize-size.patch deleted file mode 100644 index 3c3dabd9b..000000000 --- a/contrib/package/olsrd-luci/patches/140-olsrd-optimize-size.patch +++ /dev/null @@ -1,1909 +0,0 @@ ---- a/Makefile.inc -+++ b/Makefile.inc -@@ -207,6 +207,10 @@ - $(warning Use CPPFLAGS instead of DEFINES for -D) - endif - -+ifeq ($(SVEN_OLA_UNBLOAT),1) -+CPPFLAGS += -DSVEN_OLA_UNBLOAT -DNODEBUG -+endif -+ - TAGFILE ?= src/TAGS - - help: ---- a/lib/bmf/src/NetworkInterfaces.c -+++ b/lib/bmf/src/NetworkInterfaces.c -@@ -541,7 +541,9 @@ - OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: no link found\n", PLUGIN_NAME_SHORT, - olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); - } else { -+#ifndef DEBUG - struct interface *bestIntf = if_ifwithaddr(&bestLinkToNeighbor->local_iface_addr); -+#endif - - OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: \"%s\" gives a better link to this neighbor, costing %5.2f\n", - PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr), bestIntf->int_name, ---- a/lib/httpinfo/Makefile -+++ b/lib/httpinfo/Makefile -@@ -47,7 +47,11 @@ - CPPFLAGS += -DADMIN_INTERFACE - endif - -+ifdef SVEN_OLA_UNBLOAT -+ CFLAGS += -DSVEN_OLA -+else - OBJS += $(TOPDIR)/src/cfgparser/cfgfile_gen.o -+endif - - default_target: $(PLUGIN_FULLNAME) - ifdef ADMIN_INTERFACE ---- a/lib/httpinfo/src/olsrd_httpinfo.c -+++ b/lib/httpinfo/src/olsrd_httpinfo.c -@@ -67,7 +67,9 @@ - - #include "olsrd_httpinfo.h" - #include "admin_interface.h" -+#ifndef SVEN_OLA_UNBLOAT - #include "gfx.h" -+#endif /* SVEN_OLA_UNBLOAT */ - - #ifdef OS - #undef OS -@@ -222,10 +224,13 @@ - {"Admin", "admin", build_admin_body, true}, - #endif - {"About", "about", build_about_body, true}, -+#ifndef SVEN_OLA_UNBLOAT - {"FOO", "cfgfile", build_cfgfile_body, false}, -+#endif /* SVEN_OLA_UNBLOAT */ - {NULL, NULL, NULL, false} - }; - -+#ifndef SVEN_OLA_UNBLOAT - static const struct static_bin_file_entry static_bin_files[] = { - {"favicon.ico", favicon_ico, sizeof(favicon_ico)} - , -@@ -235,6 +240,7 @@ - , - {NULL, NULL, 0} - }; -+#endif /* SVEN_OLA_UNBLOAT */ - - static const struct static_txt_file_entry static_txt_files[] = { - {"httpinfo.css", httpinfo_css}, -@@ -428,6 +434,7 @@ - } else if (!strcmp(req_type, "GET")) { - int i = 0; - -+#ifndef SVEN_OLA_UNBLOAT - for (i = 0; static_bin_files[i].filename; i++) { - if (FILENREQ_MATCH(filename, static_bin_files[i].filename)) { - break; -@@ -442,6 +449,7 @@ - } - - i = 0; -+#endif /* SVEN_OLA_UNBLOAT */ - while (static_txt_files[i].filename) { - if (FILENREQ_MATCH(filename, static_txt_files[i].filename)) { - break; -@@ -480,16 +488,22 @@ - abuf_appendf(&body_abuf, - "\n" "\n" - "\n" -- "olsr.org httpinfo plugin\n" "\n" -+ "olsr.org httpinfo plugin\n" -+#ifndef SVEN_OLA_UNBLOAT -+ "\n" - "\n" -+#endif /* SVEN_OLA_UNBLOAT */ - "\n" "\n" - "\n" -+#ifndef SVEN_OLA_UNBLOAT - "\n" - "\n" "\n" - "\n" "\n" -- "\n" "
\n" - "   olsr.org OLSR daemon\n" - "\"olsrd
\n", FRAMEWIDTH); -+ "\n" "\n", FRAMEWIDTH -+#endif /* SVEN_OLA_UNBLOAT */ -+ ); - - build_tabs(&body_abuf, i); - build_frame(&body_abuf, "Current Routes", "routes", FRAMEWIDTH, tab_entries[i].build_body_cb); -@@ -894,7 +908,7 @@ - abuf_puts(abuf, "Status: DOWN\n"); - continue; - } -- -+#ifndef SVEN_OLA_UNBLOAT - if (olsr_cnf->ip_version == AF_INET) { - struct ipaddr_str addrbuf, maskbuf, bcastbuf; - abuf_appendf(abuf, "\n" "IP: %s\n" "MASK: %s\n" "BCAST: %s\n" "\n", -@@ -905,6 +919,7 @@ - abuf_appendf(abuf, "\n" "IP: %s\n" "MCAST: %s\n" "\n" "\n", - ip6_to_string(&addrbuf, &rifs->int6_addr.sin6_addr), ip6_to_string(&maskbuf, &rifs->int6_multaddr.sin6_addr)); - } -+#endif /* SVEN_OLA_UNBLOAT */ - abuf_appendf(abuf, "\n" "MTU: %d\n" "WLAN: %s\n" "STATUS: UP\n" "\n", - rifs->int_mtu, rifs->is_wireless ? "Yes" : "No"); - } -@@ -1155,6 +1170,7 @@ - #endif - } - -+#ifndef SVEN_OLA_UNBLOAT - static int - check_allowed_ip(const struct allowed_net *const my_allowed_nets, const union olsr_ip_addr *const addr) - { -@@ -1166,6 +1182,7 @@ - } - return 0; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - #if 0 - ---- a/lib/nameservice/src/nameservice.c -+++ b/lib/nameservice/src/nameservice.c -@@ -67,6 +67,11 @@ - #include "mapwrite.h" - #include "compat.h" - -+#ifdef SVEN_OLA_UNBLOAT -+#undef OLSR_PRINTF -+#define OLSR_PRINTF(...) -+#endif /* SVEN_OLA_UNBLOAT */ -+ - /* config parameters */ - static char my_hosts_file[MAX_FILE + 1]; - static char my_sighup_pid_file[MAX_FILE + 1]; -@@ -383,6 +388,7 @@ - name->ip = olsr_cnf->main_addr; - } - } -+ - for (name = my_forwarders; name != NULL; name = name->next) { - if (name->ip.v4.s_addr == 0) { - OLSR_PRINTF(2, "NAME PLUGIN: insert main addr for name %s \n", name->name); -@@ -903,9 +909,11 @@ - pos += sizeof(struct name); - pos += 1 + ((ntohs(from_packet->len) - 1) | 3); - } -+#ifdef DEBUG - if (i != 0) - OLSR_PRINTF(4, "NAME PLUGIN: Lost %d entries in received packet due to length inconsistency (%s)\n", i, - olsr_ip_to_string(&strbuf, originator)); -+#endif - } - - /** ---- a/src/apm.h -+++ b/src/apm.h -@@ -41,6 +41,7 @@ - - #ifndef _OLSR_APM - #define _OLSR_APM -+#ifndef SVEN_OLA_UNBLOAT - - /* - * Interface to OS dependent power management information -@@ -69,6 +70,7 @@ - int apm_read(struct olsr_apm_info *); - - #endif -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/cfgparser/cfgfile_gen.c -+++ b/src/cfgparser/cfgfile_gen.c -@@ -57,7 +57,9 @@ - struct olsr_if *in = cnf->interfaces; - struct plugin_entry *pe = cnf->plugins; - struct plugin_param *pp; -+#ifndef SVEN_OLA_UNBLOAT - struct ip_prefix_list *ie = cnf->ipc_nets; -+#endif /* SVEN_OLA_UNBLOAT */ - struct olsr_lq_mult *mult; - - char ipv6_buf[100]; /* buffer for IPv6 inet_htop */ -@@ -133,6 +135,7 @@ - else - fprintf(fd, "Willingness\t%d\n\n", cnf->willingness); - -+#ifndef SVEN_OLA_UNBLOAT - /* IPC */ - fprintf(fd, "# Allow processes like the GUI front-end\n# to connect to the daemon.\n\n"); - fprintf(fd, "IpcConnect {\n"); -@@ -149,6 +152,7 @@ - } - - fprintf(fd, "}\n\n"); -+#endif /* SVEN_OLA_UNBLOAT */ - - /* Hysteresis */ - fprintf(fd, "# Hysteresis adds more robustness to the\n# link sensing.\n# Used by default. 'yes' or 'no'\n\n"); -@@ -367,7 +371,9 @@ - struct olsr_if *in = cnf->interfaces; - struct plugin_entry *pe = cnf->plugins; - struct plugin_param *pp; -+#ifndef SVEN_OLA_UNBLOAT - struct ip_prefix_list *ie = cnf->ipc_nets; -+#endif /* SVEN_OLA_UNBLOAT */ - struct olsr_lq_mult *mult; - - int size = 0; -@@ -434,6 +440,7 @@ - else - WRITE_TO_BUF("Willingness\t%d\n\n", cnf->willingness); - -+#ifndef SVEN_OLA_UNBLOAT - /* IPC */ - WRITE_TO_BUF("# Allow processes like the GUI front-end\n# to connect to the daemon.\n\n"); - WRITE_TO_BUF("IpcConnect {\n"); -@@ -449,6 +456,7 @@ - } - - WRITE_TO_BUF("}\n\n"); -+#endif /* SVEN_OLA_UNBLOAT */ - - /* Hysteresis */ - WRITE_TO_BUF("# Hysteresis adds more robustness to the\n# link sensing.\n# Used by default. 'yes' or 'no'\n\n"); ---- a/src/cfgparser/local.mk -+++ b/src/cfgparser/local.mk -@@ -41,8 +41,13 @@ - C=$(if $(CFGDIR),$(CFGDIR)/) - - # add the variables as we may have others already there -+ifeq ($(SVEN_OLA_UNBLOAT),1) -+SRCS += $(foreach file,olsrd_conf oparse oscan,$(C)$(file).c) -+OBJS += $(foreach file,olsrd_conf oparse oscan,$(C)$(file).o) -+else - SRCS += $(foreach file,olsrd_conf oparse oscan cfgfile_gen,$(C)$(file).c) - OBJS += $(foreach file,olsrd_conf oparse oscan cfgfile_gen,$(C)$(file).o) -+endif - HDRS += $(foreach file,olsrd_conf oparse,$(C)$(file).h) - - $(C)oscan.c: $(C)oscan.lex $(C)Makefile ---- a/src/cfgparser/olsrd_conf.c -+++ b/src/cfgparser/olsrd_conf.c -@@ -81,11 +81,13 @@ - } - - if ((cnf = olsrd_parse_cnf(argv[1])) != NULL) { -+#ifndef SVEN_OLA_UNBLOAT - if ((argc > 2) && (!strcmp(argv[2], "-print"))) { - olsrd_print_cnf(cnf); - olsrd_write_cnf(cnf, "./out.conf"); - } else - printf("Use -print to view parsed values\n"); -+#endif /* SVEN_OLA_UNBLOAT */ - printf("Configfile parsed OK\n"); - } else { - printf("Failed parsing \"%s\"\n", argv[1]); -@@ -152,7 +154,9 @@ - /* set various stuff */ - in->configured = false; - in->interf = NULL; -+#ifndef SVEN_OLA_UNBLOAT - in->host_emul = false; -+#endif /* SVEN_OLA_UNBLOAT */ - } - return olsr_cnf; - } -@@ -416,7 +420,9 @@ - - cnf->debug_level = DEF_DEBUGLVL; - cnf->no_fork = false; -+#ifndef SVEN_OLA_UNBLOAT - cnf->host_emul = false; -+#endif /* SVEN_OLA_UNBLOAT */ - cnf->ip_version = AF_INET; - cnf->ipsize = sizeof(struct in_addr); - cnf->maxplen = 32; -@@ -427,7 +433,9 @@ - cnf->rtproto = DEF_RTPROTO; - cnf->rttable_default = 0; - cnf->willingness_auto = DEF_WILL_AUTO; -+#ifndef SVEN_OLA_UNBLOAT - cnf->ipc_connections = DEF_IPC_CONNECTIONS; -+#endif /* SVEN_OLA_UNBLOAT */ - cnf->fib_metric = DEF_FIB_METRIC; - - cnf->use_hysteresis = DEF_USE_HYST; -@@ -506,6 +514,7 @@ - - } - -+#ifndef SVEN_OLA_UNBLOAT - void - olsrd_print_cnf(struct olsrd_config *cnf) - { -@@ -649,6 +658,7 @@ - } - } - } -+#endif /* SVEN_OLA_UNBLOAT */ - - #if defined WIN32 - struct ioinfo { ---- a/src/cfgparser/oparse.y -+++ b/src/cfgparser/oparse.y -@@ -178,7 +178,6 @@ - %token TOK_RTPROTO - %token TOK_RTTABLE_DEFAULT - %token TOK_WILLINGNESS --%token TOK_IPCCON - %token TOK_FIBMETRIC - %token TOK_USEHYST - %token TOK_HYSTSCALE -@@ -203,7 +202,6 @@ - - %token TOK_HOSTLABEL - %token TOK_NETLABEL --%token TOK_MAXIPC - - %token TOK_IP4BROADCAST - %token TOK_IFMODE -@@ -267,7 +265,6 @@ - - block: TOK_HNA4 hna4body - | TOK_HNA6 hna6body -- | TOK_IPCCON ipcbody - | ifblock ifbody - | plblock plbody - ; -@@ -292,18 +289,6 @@ - | ihna6entry - ; - --ipcbody: TOK_OPEN ipcstmts TOK_CLOSE --; -- --ipcstmts: | ipcstmts ipcstmt --; -- --ipcstmt: vcomment -- | imaxipc -- | ipchost -- | ipcnet --; -- - ifblock: ifstart ifnicks - ; - -@@ -345,77 +330,6 @@ - | vcomment - ; - --imaxipc: TOK_MAXIPC TOK_INTEGER --{ -- olsr_cnf->ipc_connections = $2->integer; -- free($2); --} --; -- --ipchost: TOK_HOSTLABEL TOK_IP4_ADDR --{ -- union olsr_ip_addr ipaddr; -- PARSER_DEBUG_PRINTF("\tIPC host: %s\n", $2->string); -- -- if (inet_aton($2->string, &ipaddr.v4) == 0) { -- fprintf(stderr, "Failed converting IP address IPC %s\n", $2->string); -- YYABORT; -- } -- -- ip_prefix_list_add(&olsr_cnf->ipc_nets, &ipaddr, olsr_cnf->maxplen); -- -- free($2->string); -- free($2); --} --; -- --ipcnet: TOK_NETLABEL TOK_IP4_ADDR TOK_IP4_ADDR --{ -- union olsr_ip_addr ipaddr, netmask; -- -- PARSER_DEBUG_PRINTF("\tIPC net: %s/%s\n", $2->string, $3->string); -- -- if (inet_pton(AF_INET, $2->string, &ipaddr.v4) == 0) { -- fprintf(stderr, "Failed converting IP net IPC %s\n", $2->string); -- YYABORT; -- } -- -- if (inet_pton(AF_INET, $3->string, &netmask.v4) == 0) { -- fprintf(stderr, "Failed converting IP mask IPC %s\n", $3->string); -- YYABORT; -- } -- -- ip_prefix_list_add(&olsr_cnf->ipc_nets, &ipaddr, olsr_netmask_to_prefix(&netmask)); -- -- free($2->string); -- free($2); -- free($3->string); -- free($3); --} -- | TOK_NETLABEL TOK_IP4_ADDR TOK_SLASH TOK_INTEGER --{ -- union olsr_ip_addr ipaddr; -- -- PARSER_DEBUG_PRINTF("\tIPC net: %s/%s\n", $2->string, $3->string); -- -- if (inet_pton(AF_INET, $2->string, &ipaddr.v4) == 0) { -- fprintf(stderr, "Failed converting IP net IPC %s\n", $2->string); -- YYABORT; -- } -- -- if ($4->integer > olsr_cnf->maxplen) { -- fprintf(stderr, "ipcnet: Prefix len %u > %d is not allowed!\n", $4->integer, olsr_cnf->maxplen); -- YYABORT; -- } -- -- ip_prefix_list_add(&olsr_cnf->ipc_nets, &ipaddr, $4->integer); -- -- free($2->string); -- free($2); -- free($4); --} --; -- - iifweight: TOK_IFWEIGHT TOK_INTEGER - { - int ifcnt = ifs_in_curr_cfg; ---- a/src/cfgparser/oscan.lex -+++ b/src/cfgparser/oscan.lex -@@ -252,11 +252,6 @@ - return TOK_NETLABEL; - } - --"MaxConnections" { -- yylval = NULL; -- return TOK_MAXIPC; --} -- - "DebugLevel" { - yylval = NULL; - return TOK_DEBUGLEVEL; -@@ -333,11 +328,6 @@ - return TOK_WILLINGNESS; - } - --"IpcConnect" { -- yylval = NULL; -- return TOK_IPCCON; --} -- - "FIBMetric" { - yylval = NULL; - return TOK_FIBMETRIC; ---- a/src/defs.h -+++ b/src/defs.h -@@ -189,6 +189,8 @@ - - uint32_t olsr_times(void); - -+#ifndef SVEN_OLA_UNBLOAT -+ - /* - *IPC functions - *These are moved to a plugin soon -@@ -206,6 +208,7 @@ - int ipc_output(struct olsr *); - - #endif -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/duplicate_set.c -+++ b/src/duplicate_set.c -@@ -177,6 +177,7 @@ - return false; /* no duplicate */ - } - -+#ifndef SVEN_OLA_UNBLOAT - void - olsr_print_duplicate_table(void) - { -@@ -195,6 +196,7 @@ - } OLSR_FOR_ALL_DUP_ENTRIES_END(entry); - #endif - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/hna_set.c -+++ b/src/hna_set.c -@@ -280,6 +280,7 @@ - * - *@return nada - */ -+#ifndef SVEN_OLA_UNBLOAT - void - olsr_print_hna_set(void) - { -@@ -321,6 +322,7 @@ - } - #endif - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /** - *Process incoming HNA message. ---- a/src/interfaces.c -+++ b/src/interfaces.c -@@ -93,12 +93,16 @@ - OLSR_PRINTF(1, "\n ---- Interface configuration ---- \n\n"); - /* Run trough all interfaces immedeatly */ - for (tmp_if = olsr_cnf->interfaces; tmp_if != NULL; tmp_if = tmp_if->next) { -+#ifndef SVEN_OLA_UNBLOAT - if (!tmp_if->host_emul) { - if (!olsr_cnf->host_emul) /* XXX: TEMPORARY! */ -+#endif /* SVEN_OLA_UNBLOAT */ - chk_if_up(tmp_if, 1); -+#ifndef SVEN_OLA_UNBLOAT - } else { - add_hemu_if(tmp_if); - } -+#endif /* SVEN_OLA_UNBLOAT */ - } - - /* Kick a periodic timer for the network interface update function */ -@@ -244,7 +248,11 @@ - *@return nada - */ - struct olsr_if * -+#ifdef SVEN_OLA_UNBLOAT -+queue_if(const char *name) -+#else /* SVEN_OLA_UNBLOAT */ - queue_if(const char *name, int hemu) -+#endif /* SVEN_OLA_UNBLOAT */ - { - struct olsr_if *interf_n = olsr_cnf->interfaces; - size_t name_size; -@@ -268,7 +276,9 @@ - interf_n->interf = NULL; - interf_n->configured = 0; - -+#ifndef SVEN_OLA_UNBLOAT - interf_n->host_emul = hemu ? true : false; -+#endif /* SVEN_OLA_UNBLOAT */ - - strscpy(interf_n->name, name, name_size); - interf_n->next = olsr_cnf->interfaces; ---- a/src/interfaces.h -+++ b/src/interfaces.h -@@ -200,7 +200,12 @@ - - struct interface *if_ifwithindex(const int if_index); - --struct olsr_if *queue_if(const char *, int); -+struct olsr_if * -+#ifdef SVEN_OLA_UNBLOAT -+ queue_if(const char *); -+#else /* SVEN_OLA_UNBLOAT */ -+ queue_if(const char *, int); -+#endif /* SVEN_OLA_UNBLOAT */ - - int add_ifchgf(int (*f) (struct interface *, int)); - ---- a/src/ipc_frontend.c -+++ b/src/ipc_frontend.c -@@ -46,6 +46,7 @@ - * - */ - -+#ifndef SVEN_OLA_UNBLOAT - #include "ipc_frontend.h" - #include "link_set.h" - #include "olsr.h" -@@ -423,6 +424,7 @@ - - return 1; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/ipc_frontend.h -+++ b/src/ipc_frontend.h -@@ -48,6 +48,7 @@ - - #ifndef _OLSR_IPC - #define _OLSR_IPC -+#ifndef SVEN_OLA_UNBLOAT - - #include - #include -@@ -103,6 +104,7 @@ - int ipc_route_send_rtentry(const union olsr_ip_addr *, const union olsr_ip_addr *, int, int, const char *); - - #endif -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/ipcalc.c -+++ b/src/ipcalc.c -@@ -121,6 +121,7 @@ - return prefix; - } - -+#ifndef SVEN_OLA_UNBLOAT - const char * - olsr_ip_prefix_to_string(const struct olsr_ip_prefix *prefix) - { -@@ -147,6 +148,7 @@ - } - return rv; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* see if the ipaddr is in the net. That is equivalent to the fact that the net part - * of both are equal. So we must compare the first bits. ---- a/src/ipcalc.h -+++ b/src/ipcalc.h -@@ -146,7 +146,9 @@ - return inet_ntop(olsr_cnf->ip_version, addr, buf->buf, sizeof(buf->buf)); - } - -+#ifndef SVEN_OLA_UNBLOAT - const char *olsr_ip_prefix_to_string(const struct olsr_ip_prefix *prefix); -+#endif /* SVEN_OLA_UNBLOAT */ - - static INLINE const char * - sockaddr4_to_string(struct ipaddr_str *const buf, const struct sockaddr *const addr) ---- a/src/link_set.c -+++ b/src/link_set.c -@@ -770,6 +770,7 @@ - return ret; - } - -+#ifndef SVEN_OLA_UNBLOAT - void - olsr_print_link_set(void) - { -@@ -791,6 +792,7 @@ - } OLSR_FOR_ALL_LINK_ENTRIES_END(walker); - #endif - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * called for every LQ HELLO message. ---- a/src/linux/apm.c -+++ b/src/linux/apm.c -@@ -44,6 +44,7 @@ - * Acpi-Power Enlightenment epplet - */ - -+#ifndef SVEN_OLA_UNBLOAT - #include "apm.h" - #include "defs.h" - #include -@@ -348,6 +349,7 @@ - /* No battery found */ - return -1; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/linux/kernel_routes.c -+++ b/src/linux/kernel_routes.c -@@ -486,7 +486,11 @@ - } - /* send ipc update on success */ - if ( ( cmd != RTM_NEWRULE ) && ( cmd != RTM_DELRULE ) -- && (flag = RT_ORIG_REQUEST) && (0 <= rt_ret && olsr_cnf->ipc_connections > 0) ) { -+ && (flag = RT_ORIG_REQUEST) && (0 <= rt_ret -+#ifndef SVEN_OLA_UNBLOAT -+ && olsr_cnf->ipc_connections > 0 -+#endif /* SVEN_OLA_UNBLOAT */ -+ ) ) { - ipc_route_send_rtentry(&rt->rt_dst.prefix, &nexthop->gateway, metric, - RTM_NEWROUTE == cmd, if_ifwithindex_name(nexthop->iif_index)); - } -@@ -528,7 +532,9 @@ - int rslt; - #endif /* LINUX_POLICY_ROUTING */ - -+#ifndef SVEN_OLA_UNBLOAT - OLSR_PRINTF(2, "KERN: Adding %s\n", olsr_rtp_to_string(rt->rt_best)); -+#endif /* SVEN_OLA_UNBLOAT */ - - #if !LINUX_POLICY_ROUTING - memset(&kernel_route, 0, sizeof(struct rtentry)); -@@ -604,7 +610,9 @@ - struct in6_rtmsg kernel_route; - int rslt; - -+#ifndef SVEN_OLA_UNBLOAT - OLSR_PRINTF(2, "KERN: Adding %s\n", olsr_rtp_to_string(rt->rt_best)); -+#endif /* SVEN_OLA_UNBLOAT */ - - memset(&kernel_route, 0, sizeof(struct in6_rtmsg)); - -@@ -658,7 +666,9 @@ - int rslt; - #endif /* LINUX_POLICY_ROUTING */ - -+#ifndef SVEN_OLA_UNBLOAT - OLSR_PRINTF(2, "KERN: Deleting %s\n", olsr_rt_to_string(rt)); -+#endif /* SVEN_OLA_UNBLOAT */ - - #if !LINUX_POLICY_ROUTING - memset(&kernel_route, 0, sizeof(struct rtentry)); -@@ -727,7 +737,9 @@ - int rslt; - #endif /* LINUX_POLICY_ROUTING */ - -+#ifndef SVEN_OLA_UNBLOAT - OLSR_PRINTF(2, "KERN: Deleting %s\n", olsr_rt_to_string(rt)); -+#endif /* SVEN_OLA_UNBLOAT */ - - #if !LINUX_POLICY_ROUTING - memset(&kernel_route, 0, sizeof(struct in6_rtmsg)); ---- a/src/linux/net.c -+++ b/src/linux/net.c -@@ -70,8 +70,10 @@ - #define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */ - - /* The original state of the IP forwarding proc entry */ -+#ifndef SVEN_OLA_UNBLOAT - static char orig_fwd_state; - static char orig_global_redirect_state; -+#endif /* SVEN_OLA_UNBLOAT */ - - /** - *Bind a socket to a device -@@ -92,6 +94,8 @@ - return setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, dev_name, strlen(dev_name) + 1); - } - -+#ifndef SVEN_OLA_UNBLOAT -+ - /** - *Enable IP forwarding. - *Just writing "1" to the /proc/sys/net/ipv4/ip_forward -@@ -111,6 +115,9 @@ - const char *const procfile = version == AF_INET ? "/proc/sys/net/ipv4/ip_forward" : "/proc/sys/net/ipv6/conf/all/forwarding"; - - if ((proc_fwd = fopen(procfile, "r")) == NULL) { -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - /* IPv4 */ - if (version == AF_INET) - fprintf(stderr, -@@ -123,6 +130,7 @@ - procfile); - - sleep(3); -+#endif - return 0; - } - -@@ -132,9 +140,13 @@ - OLSR_PRINTF(3, "\nIP forwarding is enabled on this system\n"); - } else { - if ((proc_fwd = fopen(procfile, "w")) == NULL) { -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - fprintf(stderr, "Could not open %s for writing!\n", procfile); - fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that IP forwarding is enabeled!\n\n"); - sleep(3); -+#endif - return 0; - } else { - syslog(LOG_INFO, "Writing \"1\" to %s\n", procfile); -@@ -155,11 +167,15 @@ - return -1; - - if ((proc_redirect = fopen(procfile, "r")) == NULL) { -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - fprintf(stderr, - "WARNING! Could not open the %s file to check/disable ICMP redirects!\nAre you using the procfile filesystem?\nDoes your system support IPv4?\nI will continue(in 3 sec) - but you should mannually ensure that ICMP redirects are disabled!\n\n", - procfile); - - sleep(3); -+#endif - return -1; - } - orig_global_redirect_state = fgetc(proc_redirect); -@@ -169,9 +185,13 @@ - return 0; - - if ((proc_redirect = fopen(procfile, "w")) == NULL) { -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - fprintf(stderr, "Could not open %s for writing!\n", procfile); - fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that ICMP redirect is disabeled!\n\n"); - sleep(3); -+#endif - return 0; - } - syslog(LOG_INFO, "Writing \"0\" to %s", procfile); -@@ -197,19 +217,27 @@ - snprintf(procfile, sizeof(procfile), REDIRECT_PROC, if_name); - - if ((proc_redirect = fopen(procfile, "r")) == NULL) { -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - fprintf(stderr, - "WARNING! Could not open the %s file to check/disable ICMP redirects!\nAre you using the procfile filesystem?\nDoes your system support IPv4?\nI will continue(in 3 sec) - but you should mannually ensure that ICMP redirects are disabled!\n\n", - procfile); - sleep(3); -+#endif - return 0; - } - iface->nic_state.redirect = fgetc(proc_redirect); - fclose(proc_redirect); - - if ((proc_redirect = fopen(procfile, "w")) == NULL) { -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - fprintf(stderr, "Could not open %s for writing!\n", procfile); - fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that ICMP redirect is disabeled!\n\n"); - sleep(3); -+#endif - return 0; - } - syslog(LOG_INFO, "Writing \"0\" to %s", procfile); -@@ -235,20 +263,28 @@ - sprintf(procfile, SPOOF_PROC, if_name); - - if ((proc_spoof = fopen(procfile, "r")) == NULL) { -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - fprintf(stderr, - "WARNING! Could not open the %s file to check/disable the IP spoof filter!\nAre you using the procfile filesystem?\nDoes your system support IPv4?\nI will continue(in 3 sec) - but you should mannually ensure that IP spoof filtering is disabled!\n\n", - procfile); - - sleep(3); -+#endif - return 0; - } - iface->nic_state.spoof = fgetc(proc_spoof); - fclose(proc_spoof); - - if ((proc_spoof = fopen(procfile, "w")) == NULL) { -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - fprintf(stderr, "Could not open %s for writing!\n", procfile); - fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that IP spoof filtering is disabeled!\n\n"); - sleep(3); -+#endif - return 0; - } - syslog(LOG_INFO, "Writing \"0\" to %s", procfile); -@@ -273,7 +309,11 @@ - FILE *proc_fd; - - if ((proc_fd = fopen(procfile, "w")) == NULL) { -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile); -+#endif - } else { - syslog(LOG_INFO, "Resetting %s to %c\n", procfile, orig_fwd_state); - fputc(orig_fwd_state, proc_fd); -@@ -288,7 +328,11 @@ - FILE *proc_fd; - - if ((proc_fd = fopen(procfile, "w")) == NULL) { -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile); -+#endif - } else { - syslog(LOG_INFO, "Resetting %s to %c\n", procfile, orig_global_redirect_state); - fputc(orig_global_redirect_state, proc_fd); -@@ -312,7 +356,11 @@ - snprintf(procfile, sizeof(procfile), REDIRECT_PROC, ifs->int_name); - - if ((proc_fd = fopen(procfile, "w")) == NULL) -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile); -+#endif - else { - syslog(LOG_INFO, "Resetting %s to %c\n", procfile, ifs->nic_state.redirect); - -@@ -325,7 +373,11 @@ - /* Generate the procfile name */ - sprintf(procfile, SPOOF_PROC, ifs->int_name); - if ((proc_fd = fopen(procfile, "w")) == NULL) -+#ifdef SVEN_OLA_UNBLOAT_OLD -+ perror(procfile); -+#else - fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile); -+#endif - else { - syslog(LOG_INFO, "Resetting %s to %c\n", procfile, ifs->nic_state.spoof); - -@@ -373,6 +425,8 @@ - return sock; - } - -+#endif /* SVEN_OLA_UNBLOAT */ -+ - /** - *Creates a nonblocking broadcast socket. - *@param sa sockaddr struct. Used for bind(2). ---- a/src/lq_plugin.c -+++ b/src/lq_plugin.c -@@ -67,12 +67,18 @@ - init_lq_handler_tree(void) - { - avl_init(&lq_handler_tree, &avl_strcasecmp); -+#ifndef SVEN_OLA_UNBLOAT - register_lq_handler(&lq_etx_float_handler, LQ_ALGORITHM_ETX_FLOAT_NAME); - register_lq_handler(&lq_etx_fpm_handler, LQ_ALGORITHM_ETX_FPM_NAME); -+#endif /* SVEN_OLA_UNBLOAT */ - register_lq_handler(&lq_etx_ff_handler, LQ_ALGORITHM_ETX_FF_NAME); -+#ifndef SVEN_OLA_UNBLOAT - if (activate_lq_handler(olsr_cnf->lq_algorithm)) { - activate_lq_handler(LQ_ALGORITHM_ETX_FPM_NAME); - } -+#else /* SVEN_OLA_UNBLOAT */ -+ activate_lq_handler(LQ_ALGORITHM_ETX_FF_NAME); -+#endif /* SVEN_OLA_UNBLOAT */ - } - - /* -@@ -385,7 +391,11 @@ - * @return pointer to hello_neighbor - */ - struct hello_neighbor * -+#ifndef SVEN_OLA_UNBLOAT - olsr_malloc_hello_neighbor(const char *id) -+#else /* SVEN_OLA_UNBLOAT */ -+olsr_malloc_hello_neighbor(const char *id __attribute__ ((unused))) -+#endif /* SVEN_OLA_UNBLOAT */ - { - struct hello_neighbor *h; - -@@ -407,7 +417,11 @@ - * @return pointer to tc_mpr_addr - */ - struct tc_mpr_addr * -+#ifndef SVEN_OLA_UNBLOAT - olsr_malloc_tc_mpr_addr(const char *id) -+#else /* SVEN_OLA_UNBLOAT */ -+olsr_malloc_tc_mpr_addr(const char *id __attribute__ ((unused))) -+#endif /* SVEN_OLA_UNBLOAT */ - { - struct tc_mpr_addr *t; - -@@ -429,7 +443,11 @@ - * @return pointer to lq_hello_neighbor - */ - struct lq_hello_neighbor * -+#ifndef SVEN_OLA_UNBLOAT - olsr_malloc_lq_hello_neighbor(const char *id) -+#else /* SVEN_OLA_UNBLOAT */ -+olsr_malloc_lq_hello_neighbor(const char *id __attribute__ ((unused))) -+#endif /* SVEN_OLA_UNBLOAT */ - { - struct lq_hello_neighbor *h; - -@@ -451,7 +469,11 @@ - * @return pointer to link_entry - */ - struct link_entry * -+#ifndef SVEN_OLA_UNBLOAT - olsr_malloc_link_entry(const char *id) -+#else /* SVEN_OLA_UNBLOAT */ -+olsr_malloc_link_entry(const char *id __attribute__ ((unused))) -+#endif /* SVEN_OLA_UNBLOAT */ - { - struct link_entry *h; - ---- a/src/lq_plugin_default_float.c -+++ b/src/lq_plugin_default_float.c -@@ -39,6 +39,7 @@ - * - */ - -+#ifndef SVEN_OLA_UNBLOAT - #include "tc_set.h" - #include "link_set.h" - #include "olsr_spf.h" -@@ -228,6 +229,7 @@ - - return buffer->buf; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/lq_plugin_default_float.h -+++ b/src/lq_plugin_default_float.h -@@ -39,6 +39,7 @@ - * - */ - -+#ifndef SVEN_OLA_UNBLOAT - #ifndef LQ_PLUGIN_DEFAULT_H_ - #define LQ_PLUGIN_DEFAULT_H_ - -@@ -57,6 +58,7 @@ - extern struct lq_handler lq_etx_float_handler; - - #endif /*LQ_PLUGIN_DEFAULT_H_ */ -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/lq_plugin_default_fpm.c -+++ b/src/lq_plugin_default_fpm.c -@@ -39,6 +39,7 @@ - * - */ - -+#ifndef SVEN_OLA_UNBLOAT - #include "tc_set.h" - #include "link_set.h" - #include "lq_plugin.h" -@@ -239,6 +240,7 @@ - snprintf(buffer->buf, sizeof(buffer->buf), "%.3f", (float)(cost) / LQ_FPM_LINKCOST_MULTIPLIER); - return buffer->buf; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/lq_plugin_default_fpm.h -+++ b/src/lq_plugin_default_fpm.h -@@ -39,6 +39,7 @@ - * - */ - -+#ifndef SVEN_OLA_UNBLOAT - #ifndef LQ_ETX_FPM_ - #define LQ_ETX_FPM_ - -@@ -61,6 +62,7 @@ - extern struct lq_handler lq_etx_fpm_handler; - - #endif /*LQ_ETX_FPM_ */ -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/main.c -+++ b/src/main.c -@@ -289,13 +289,17 @@ - /* - * Print configuration - */ -+#ifndef SVEN_OLA_UNBLOAT - if (olsr_cnf->debug_level > 1) { - olsrd_print_cnf(olsr_cnf); - } -+#endif /* SVEN_OLA_UNBLOAT */ - #ifndef WIN32 -+#ifndef SVEN_OLA_UNBLOAT - /* Disable redirects globally */ - disable_redirects_global(olsr_cnf->ip_version); - #endif -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * socket for ioctl calls -@@ -331,7 +335,9 @@ - /* - *enable ip forwarding on host - */ -+#ifndef SVEN_OLA_UNBLOAT - enable_ip_forwarding(olsr_cnf->ip_version); -+#endif /* SVEN_OLA_UNBLOAT */ - - /* Initialize parser */ - olsr_init_parser(); -@@ -349,6 +355,7 @@ - *Set up willingness/APM - */ - if (olsr_cnf->willingness_auto) { -+#ifndef SVEN_OLA_UNBLOAT - if (apm_init() < 0) { - OLSR_PRINTF(1, "Could not read APM info - setting default willingness(%d)\n", WILL_DEFAULT); - -@@ -359,10 +366,13 @@ - olsr_cnf->willingness_auto = 0; - olsr_cnf->willingness = WILL_DEFAULT; - } else { -+#endif /* SVEN_OLA_UNBLOAT */ - olsr_cnf->willingness = olsr_calculate_willingness(); - - OLSR_PRINTF(1, "Willingness set to %d - next update in %.1f secs\n", olsr_cnf->willingness, olsr_cnf->will_int); -+#ifndef SVEN_OLA_UNBLOAT - } -+#endif /* SVEN_OLA_UNBLOAT */ - } - - /* Initialize net */ -@@ -392,9 +402,11 @@ - - /* Initialize the IPC socket */ - -+#ifndef SVEN_OLA_UNBLOAT - if (olsr_cnf->ipc_connections > 0) { - ipc_init(); - } -+#endif /* SVEN_OLA_UNBLOAT */ - /* Initialisation of different tables to be used. */ - olsr_init_tables(); - -@@ -533,9 +545,11 @@ - OLSR_PRINTF(1, "Closing sockets...\n"); - - /* front-end IPC socket */ -+#ifndef SVEN_OLA_UNBLOAT - if (olsr_cnf->ipc_connections > 0) { - shutdown_ipc(); - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* OLSR sockets */ - for (ifn = ifnet; ifn; ifn = ifn->int_next) -@@ -545,7 +559,9 @@ - olsr_close_plugins(); - - /* Reset network settings */ -+#ifndef SVEN_OLA_UNBLOAT - restore_settings(olsr_cnf->ip_version); -+#endif /* SVEN_OLA_UNBLOAT */ - - /* ioctl socket */ - close(olsr_cnf->ioctl_s); -@@ -585,7 +601,11 @@ - "usage: olsrd [-f ] [ -i interface1 interface2 ... ]\n" - " [-d ] [-ipv6] [-multi ]\n" - " [-lql ] [-lqw ] [-lqnt ]\n" -+#ifdef SVEN_OLA_UNBLOAT -+ " [-bcast ] [-delgw] (Note: no -ipc,-dispin,-dispout)\n" -+#else - " [-bcast ] [-ipc] [-dispin] [-dispout] [-delgw]\n" -+#endif /* SVEN_OLA_UNBLOAT */ - " [-hint ] [-tcint ]\n" - " [-midint ] [-hnaint ]\n" - " [-T ] [-nofork] [-hemu ]\n" " [-lql ] [-lqa ]\n"); -@@ -749,12 +769,20 @@ - olsr_exit(__func__, EXIT_FAILURE); - } - printf("Queuing if %s\n", *argv); -+#ifdef SVEN_OLA_UNBLOAT -+ queue_if(*argv); -+#else /* SVEN_OLA_UNBLOAT */ - queue_if(*argv, false); -+#endif /* SVEN_OLA_UNBLOAT */ - - while ((argc - 1) && (argv[1][0] != '-')) { - NEXT_ARG; - printf("Queuing if %s\n", *argv); -+#ifdef SVEN_OLA_UNBLOAT -+ queue_if(*argv); -+#else /* SVEN_OLA_UNBLOAT */ - queue_if(*argv, false); -+#endif /* SVEN_OLA_UNBLOAT */ - } - - continue; -@@ -817,7 +845,7 @@ - sscanf(*argv, "%f", &cnf->pollrate); - continue; - } -- -+#ifndef SVEN_OLA_UNBLOAT - /* - * Should we display the contents of packages beeing sent? - */ -@@ -841,6 +869,7 @@ - cnf->ipc_connections = 1; - continue; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * IPv6 multicast addr -@@ -858,7 +887,7 @@ - - continue; - } -- -+#ifndef SVEN_OLA_UNBLOAT - /* - * Host emulation - */ -@@ -886,6 +915,7 @@ - - continue; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Delete possible default GWs ---- a/src/neighbor_table.c -+++ b/src/neighbor_table.c -@@ -362,6 +362,7 @@ - * - *@return nada - */ -+#ifndef SVEN_OLA_UNBLOAT - void - olsr_print_neighbor_table(void) - { -@@ -391,6 +392,7 @@ - } - #endif - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/net_olsr.c -+++ b/src/net_olsr.c -@@ -44,7 +44,9 @@ - #include "log.h" - #include "olsr.h" - #include "net_os.h" -+#ifndef SVEN_OLA_UNBLOAT - #include "print_packet.h" -+#endif /* SVEN_OLA_UNBLOAT */ - #include "link_set.h" - #include "lq_packet.h" - -@@ -385,8 +387,10 @@ - *if the -dispout option was given - *we print the content of the packets - */ -+#ifndef SVEN_OLA_UNBLOAT - if (disp_pack_out) - print_olsr_serialized_packet(stdout, (union olsr_packet *)ifp->netbuf.buff, ifp->netbuf.pending, &ifp->ip_addr); -+#endif /* SVEN_OLA_UNBLOAT */ - - if (olsr_cnf->ip_version == AF_INET) { - /* IP version 4 */ -@@ -400,12 +404,16 @@ - /* IP version 6 */ - if (olsr_sendto(ifp->olsr_socket, ifp->netbuf.buff, ifp->netbuf.pending, MSG_DONTROUTE, (struct sockaddr *)sin6, sizeof(*sin6)) - < 0) { -+#ifndef SVEN_OLA_UNBLOAT - struct ipaddr_str buf; -+#endif /* SVEN_OLA_UNBLOAT */ - perror("sendto(v6)"); - olsr_syslog(OLSR_LOG_ERR, "OLSR: sendto IPv6 %m"); -+#ifndef SVEN_OLA_UNBLOAT - fprintf(stderr, "Socket: %d interface: %d\n", ifp->olsr_socket, ifp->if_index); - fprintf(stderr, "To: %s (size: %u)\n", ip6_to_string(&buf, &sin6->sin6_addr), (unsigned int)sizeof(*sin6)); - fprintf(stderr, "Outputsize: %d\n", ifp->netbuf.pending); -+#endif /* SVEN_OLA_UNBLOAT */ - retval = -1; - } - } ---- a/src/olsr.c -+++ b/src/olsr.c -@@ -150,7 +150,9 @@ - return; - - if (olsr_cnf->debug_level > 0 && olsr_cnf->clear_screen && isatty(1)) { -+#ifndef SVEN_OLA_UNBLOAT - clear_console(); -+#endif /* SVEN_OLA_UNBLOAT */ - printf(" *** %s (%s on %s) ***\n", olsrd_version, build_date, build_host); - } - -@@ -166,7 +168,7 @@ - if (changes_neighborhood || changes_topology || changes_hna) { - olsr_calculate_routing_table(); - } -- -+#ifndef SVEN_OLA_UNBLOAT - if (olsr_cnf->debug_level > 0) { - if (olsr_cnf->debug_level > 2) { - olsr_print_mid_set(); -@@ -185,6 +187,7 @@ - olsr_print_tc_table(); - #endif - } -+#endif /* SVEN_OLA_UNBLOAT */ - - for (tmp_pc_list = pcf_list; tmp_pc_list != NULL; tmp_pc_list = tmp_pc_list->next) { - tmp_pc_list->function(changes_neighborhood, changes_topology, changes_hna); -@@ -421,12 +424,15 @@ - uint8_t - olsr_calculate_willingness(void) - { -+#ifndef SVEN_OLA_UNBLOAT - struct olsr_apm_info ainfo; -+#endif /* SVEN_OLA_UNBLOAT */ - - /* If fixed willingness */ - if (!olsr_cnf->willingness_auto) - return olsr_cnf->willingness; - -+#ifndef SVEN_OLA_UNBLOAT - if (apm_read(&ainfo) < 1) - return WILL_DEFAULT; - -@@ -443,8 +449,12 @@ - * 26% > juice will: 1 - */ - return (ainfo.battery_percentage / 26); -+#else /* SVEN_OLA_UNBLOAT */ -+ return WILL_DEFAULT; -+#endif /* SVEN_OLA_UNBLOAT */ - } - -+#ifndef SVEN_OLA_UNBLOAT - const char * - olsr_msgtype_to_string(uint8_t msgtype) - { -@@ -514,6 +524,7 @@ - snprintf(type, sizeof(type), "UNKNOWN(%d)", status); - return type; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /** - *Termination function to be called whenever a error occures -@@ -542,6 +553,7 @@ - * - * @return a void pointer to the memory allocated - */ -+#ifndef SVEN_OLA_UNBLOAT - void * - olsr_malloc(size_t size, const char *id) - { -@@ -566,6 +578,7 @@ - - return ptr; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /** - *Wrapper for printf that prints to a specific ---- a/src/olsr.h -+++ b/src/olsr.h -@@ -72,15 +72,21 @@ - - uint8_t olsr_calculate_willingness(void); - -+#ifndef SVEN_OLA_UNBLOAT - const char *olsr_msgtype_to_string(uint8_t); - - const char *olsr_link_to_string(uint8_t); - - const char *olsr_status_to_string(uint8_t); -+#endif /* SVEN_OLA_UNBLOAT */ - - void olsr_exit(const char *, int); - -+#ifdef SVEN_OLA_UNBLOAT -+#define olsr_malloc(size, msg) calloc(1, size) -+#else /* SVEN_OLA_UNBLOAT */ - void *olsr_malloc(size_t, const char *); -+#endif /* SVEN_OLA_UNBLOAT */ - - int olsr_printf(int, const char *, ...) __attribute__ ((format(printf, 2, 3))); - ---- a/src/olsr_cfg.h -+++ b/src/olsr_cfg.h -@@ -154,8 +154,10 @@ - char *name; - char *config; - bool configured; -+#ifndef SVEN_OLA_UNBLOAT - bool host_emul; - union olsr_ip_addr hemu_ip; -+#endif /* SVEN_OLA_UNBLOAT */ - struct interface *interf; - struct if_config_options *cnf; - struct olsr_if *next; -@@ -198,7 +200,9 @@ - uint16_t olsrport; - int debug_level; - bool no_fork; -+#ifndef SVEN_OLA_UNBLOAT - bool host_emul; -+#endif /* SVEN_OLA_UNBLOAT */ - int ip_version; - bool allow_no_interfaces; - uint16_t tos; -@@ -207,13 +211,17 @@ - uint8_t rttable_default; - uint8_t willingness; - bool willingness_auto; -+#ifndef SVEN_OLA_UNBLOAT - int ipc_connections; -+#endif /* SVEN_OLA_UNBLOAT */ - bool use_hysteresis; - olsr_fib_metric_options fib_metric; - struct hyst_param hysteresis_param; - struct plugin_entry *plugins; - struct ip_prefix_list *hna_entries; -+#ifndef SVEN_OLA_UNBLOAT - struct ip_prefix_list *ipc_nets; -+#endif /* SVEN_OLA_UNBLOAT */ - struct olsr_if *interfaces; - float pollrate; - float nic_chgs_pollrate; -@@ -275,7 +283,9 @@ - - void olsrd_free_cnf(struct olsrd_config *); - -+#ifndef SVEN_OLA_UNBLOAT - void olsrd_print_cnf(struct olsrd_config *); -+#endif /* SVEN_OLA_UNBLOAT */ - - int olsrd_write_cnf(struct olsrd_config *, const char *); - ---- a/src/parser.c -+++ b/src/parser.c -@@ -51,7 +51,9 @@ - #include "rebuild_packet.h" - #include "net_os.h" - #include "log.h" -+#ifndef SVEN_OLA_UNBLOAT - #include "print_packet.h" -+#endif /* SVEN_OLA_UNBLOAT */ - #include "net_olsr.h" - - #ifdef WIN32 -@@ -281,8 +283,10 @@ - //printf("Message from %s\n\n", olsr_ip_to_string(&buf, from_addr)); - - /* Display packet */ -+#ifndef SVEN_OLA_UNBLOAT - if (disp_pack_in) - print_olsr_serialized_packet(stdout, (union olsr_packet *)olsr, size, from_addr); -+#endif /* SVEN_OLA_UNBLOAT */ - - if (olsr_cnf->ip_version == AF_INET) - msgsize = ntohs(m->v4.olsr_msgsize); ---- a/src/print_packet.c -+++ b/src/print_packet.c -@@ -39,6 +39,7 @@ - * - */ - -+#ifndef SVEN_OLA_UNBLOAT - #include "print_packet.h" - #include "ipcalc.h" - #include "mantissa.h" -@@ -339,6 +340,7 @@ - remsize -= olsr_cnf->ipsize; - } - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/process_routes.c -+++ b/src/process_routes.c -@@ -158,6 +158,7 @@ - static void - olsr_delete_kernel_route(struct rt_entry *rt) - { -+#ifndef SVEN_OLA_UNBLOAT - if (!olsr_cnf->host_emul) { - int16_t error = olsr_cnf->ip_version == AF_INET ? olsr_delroute_function(rt) : olsr_delroute6_function(rt); - -@@ -169,6 +170,12 @@ - olsr_syslog(OLSR_LOG_ERR, "Delete route %s: %s", routestr, err_msg); - } - } -+#else /* SVEN_OLA_UNBLOAT */ -+ int16_t error = olsr_cnf->ip_version == AF_INET ? olsr_delroute_function(rt) : olsr_delroute6_function(rt); -+ if (0 > error) { -+ olsr_syslog(OLSR_LOG_ERR, "Delete route: %s", strerror(errno)); -+ } -+#endif /* SVEN_OLA_UNBLOAT */ - } - - /** -@@ -180,6 +187,7 @@ - olsr_add_kernel_route(struct rt_entry *rt) - { - -+#ifndef SVEN_OLA_UNBLOAT - if (!olsr_cnf->host_emul) { - int16_t error = (olsr_cnf->ip_version == AF_INET) ? olsr_addroute_function(rt) : olsr_addroute6_function(rt); - -@@ -198,6 +206,14 @@ - rt->rt_metric = rt->rt_best->rtp_metric; - } - } -+#else /* SVEN_OLA_UNBLOAT */ -+ int16_t error = olsr_cnf->ip_version == AF_INET ? olsr_addroute_function(rt) : olsr_addroute6_function(rt); -+ if (0 > error) { -+ olsr_syslog(OLSR_LOG_ERR, "Add route: %s", strerror(errno)); -+ } else { -+ rt->rt_nexthop = rt->rt_best->rtp_nexthop; -+ } -+#endif /* SVEN_OLA_UNBLOAT */ - } - - /** -@@ -348,9 +364,11 @@ - /* route changes */ - olsr_chg_kernel_routes(&chg_kernel_list); - --#if DEBUG -+#ifndef SVEN_OLA_UNBLOAT -+#ifdef DEBUG - olsr_print_routing_table(&routingtree); - #endif -+#endif /* SVEN_OLA_UNBLOAT */ - } - - /* ---- a/src/rebuild_packet.c -+++ b/src/rebuild_packet.c -@@ -60,7 +60,11 @@ - mid_chgestruct(struct mid_message *mmsg, const union olsr_message *m) - { - int i; -+#ifndef SVEN_OLA_UNBLOAT - struct mid_alias *alias, *alias_tmp; -+#else /* SVEN_OLA_UNBLOAT */ -+ struct mid_alias *alias; -+#endif /* SVEN_OLA_UNBLOAT */ - int no_aliases; - - /* Checking if everything is ok */ -@@ -100,6 +104,7 @@ - maddr++; - } - -+#ifndef SVEN_OLA_UNBLOAT - if (olsr_cnf->debug_level > 1) { - struct ipaddr_str buf; - OLSR_PRINTF(3, "Alias list for %s: ", olsr_ip_to_string(&buf, &mmsg->mid_origaddr)); -@@ -111,6 +116,7 @@ - } - OLSR_PRINTF(3, "\n"); - } -+#endif /* SVEN_OLA_UNBLOAT */ - } else { - /* IPv6 */ - const struct midaddr6 *maddr6 = m->v6.message.mid.mid_addr; -@@ -144,6 +150,7 @@ - maddr6++; - } - -+#ifndef SVEN_OLA_UNBLOAT - if (olsr_cnf->debug_level > 1) { - struct ipaddr_str buf; - OLSR_PRINTF(3, "Alias list for %s", ip6_to_string(&buf, &mmsg->mid_origaddr.v6)); -@@ -156,6 +163,7 @@ - } - OLSR_PRINTF(3, "\n"); - } -+#endif /* SVEN_OLA_UNBLOAT */ - } - - } ---- a/src/routing_table.c -+++ b/src/routing_table.c -@@ -628,6 +628,7 @@ - /** - * format a route entry into a buffer - */ -+#ifndef SVEN_OLA_UNBLOAT - char * - olsr_rt_to_string(const struct rt_entry *rt) - { -@@ -659,11 +660,13 @@ - - return buff; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /** - * Print the routingtree to STDOUT - * - */ -+#ifndef SVEN_OLA_UNBLOAT - void - olsr_print_routing_table(struct avl_tree *tree) - { -@@ -697,6 +700,7 @@ - #endif - tree = NULL; /* squelch compiler warnings */ - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/routing_table.h -+++ b/src/routing_table.h -@@ -210,9 +210,11 @@ - bool olsr_cmp_rt(const struct rt_entry *, const struct rt_entry *); - uint8_t olsr_fib_metric(const struct rt_metric *); - -+#ifndef SVEN_OLA_UNBLOAT - char *olsr_rt_to_string(const struct rt_entry *); - char *olsr_rtp_to_string(const struct rt_path *); - void olsr_print_routing_table(struct avl_tree *); -+#endif /* SVEN_OLA_UNBLOAT */ - - const struct rt_nexthop *olsr_get_nh(const struct rt_entry *); - ---- a/src/tc_set.c -+++ b/src/tc_set.c -@@ -336,6 +336,7 @@ - /** - * Format tc_edge contents into a buffer. - */ -+#ifndef SVEN_OLA_UNBLOAT - char * - olsr_tc_edge_to_string(struct tc_edge_entry *tc_edge) - { -@@ -350,6 +351,7 @@ - - return buf; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /** - * Wrapper for the timer callback. -@@ -693,6 +695,7 @@ - /** - * Print the topology table to stdout - */ -+#ifndef SVEN_OLA_UNBLOAT - void - olsr_print_tc_table(void) - { -@@ -718,6 +721,7 @@ - } OLSR_FOR_ALL_TC_ENTRIES_END(tc); - #endif - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * calculate the border IPs of a tc edge set according to the border flags ---- a/src/tc_set.h -+++ b/src/tc_set.h -@@ -157,7 +157,9 @@ - - /* tc_edge_entry manipulation */ - bool olsr_delete_outdated_tc_edges(struct tc_entry *); -+#ifndef SVEN_OLA_UNBLOAT - char *olsr_tc_edge_to_string(struct tc_edge_entry *); -+#endif /* SVEN_OLA_UNBLOAT */ - struct tc_edge_entry *olsr_lookup_tc_edge(struct tc_entry *, union olsr_ip_addr *); - struct tc_edge_entry *olsr_add_tc_edge_entry(struct tc_entry *, union olsr_ip_addr *, uint16_t); - void olsr_delete_tc_entry(struct tc_entry *); ---- a/src/two_hop_neighbor_table.c -+++ b/src/two_hop_neighbor_table.c -@@ -203,6 +203,8 @@ - return NULL; - } - -+#ifndef SVEN_OLA_UNBLOAT -+ - /** - *Print the two hop neighbor table to STDOUT. - * -@@ -240,6 +242,7 @@ - } - #endif - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: ---- a/src/unix/ifnet.c -+++ b/src/unix/ifnet.c -@@ -70,6 +70,8 @@ - - #define BUFSPACE (127*1024) /* max. input buffer size to request */ - -+#ifndef SVEN_OLA_UNBLOAT -+ - int - set_flag(char *ifname, short flag __attribute__ ((unused))) - { -@@ -100,6 +102,8 @@ - - } - -+#endif /* SVEN_OLA_UNBLOAT */ -+ - void - check_interface_updates(void *foo __attribute__ ((unused))) - { -@@ -110,11 +114,13 @@ - #endif - - for (tmp_if = olsr_cnf->interfaces; tmp_if != NULL; tmp_if = tmp_if->next) { -+#ifndef SVEN_OLA_UNBLOAT - if (tmp_if->host_emul) - continue; - - if (olsr_cnf->host_emul) /* XXX: TEMPORARY! */ - continue; -+#endif /* SVEN_OLA_UNBLOAT */ - - if (!tmp_if->cnf->autodetect_chg) { - #ifdef DEBUG -@@ -154,8 +160,10 @@ - OLSR_PRINTF(3, "Checking if %s is set down or changed\n", iface->name); - #endif - -+#ifndef SVEN_OLA_UNBLOAT - if (iface->host_emul) - return -1; -+#endif /* SVEN_OLA_UNBLOAT */ - - ifp = iface->interf; - -@@ -278,7 +286,9 @@ - } else - /* IP version 4 */ - { -+#ifndef SVEN_OLA_UNBLOAT - struct ipaddr_str buf; -+#endif /* SVEN_OLA_UNBLOAT */ - /* Check interface address (IPv4) */ - if (ioctl(olsr_cnf->ioctl_s, SIOCGIFADDR, &ifr) < 0) { - OLSR_PRINTF(1, "\tCould not get address of interface - removing it\n"); -@@ -291,17 +301,21 @@ - if (memcmp - (&((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&ifp->int_addr)->sin_addr.s_addr, &((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&ifr.ifr_addr)->sin_addr.s_addr, - olsr_cnf->ipsize) != 0) { -+#ifndef SVEN_OLA_UNBLOAT - /* New address */ - OLSR_PRINTF(1, "IPv4 address changed for %s\n", ifr.ifr_name); - OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_addr.sin_addr)); - OLSR_PRINTF(1, "\tNew:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_addr)); -+#endif /* SVEN_OLA_UNBLOAT */ - - ifp->int_addr = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN)&ifr.ifr_addr; - /* deactivated to prevent change of originator IP */ - #if 0 - if (memcmp(&olsr_cnf->main_addr, &ifp->ip_addr, olsr_cnf->ipsize) == 0) { - OLSR_PRINTF(1, "New main address: %s\n", sockaddr4_to_string(&buf, &ifr.ifr_addr)); -+#ifndef SVEN_OLA_UNBLOAT - olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", sockaddr4_to_string(&buf, &ifr.ifr_addr)); -+#endif /* SVEN_OLA_UNBLOAT */ - memcpy(&olsr_cnf->main_addr, &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr, olsr_cnf->ipsize); - } - #endif -@@ -375,7 +389,9 @@ - ifp = iface->interf; - - OLSR_PRINTF(1, "Removing interface %s\n", iface->name); -+#ifndef SVEN_OLA_UNBLOAT - olsr_syslog(OLSR_LOG_INFO, "Removing interface %s\n", iface->name); -+#endif /* SVEN_OLA_UNBLOAT */ - - olsr_delete_link_entry_by_ip(&ifp->ip_addr); - -@@ -417,10 +433,14 @@ - memset(&olsr_cnf->main_addr, 0, olsr_cnf->ipsize); - OLSR_PRINTF(1, "No more interfaces...\n"); - } else { -+#if !defined(SVEN_OLA_UNBLOAT) - struct ipaddr_str buf; -+#endif /* SVEN_OLA_UNBLOAT */ - olsr_cnf->main_addr = ifnet->ip_addr; - OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); -+#ifndef SVEN_OLA_UNBLOAT - olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); -+#endif /* SVEN_OLA_UNBLOAT */ - } - } - #endif -@@ -444,13 +464,17 @@ - - if ((ifnet == NULL) && (!olsr_cnf->allow_no_interfaces)) { - OLSR_PRINTF(1, "No more active interfaces - exiting.\n"); -+#ifndef SVEN_OLA_UNBLOAT - olsr_syslog(OLSR_LOG_INFO, "No more active interfaces - exiting.\n"); -+#endif /* SVEN_OLA_UNBLOAT */ - olsr_cnf->exit_value = EXIT_FAILURE; - kill(getpid(), SIGINT); - } - - } - -+#ifndef SVEN_OLA_UNBLOAT -+ - /** - * Initializes the special interface used in - * host-client emulation -@@ -602,6 +626,7 @@ - - return 1; - } -+#endif /* SVEN_OLA_UNBLOAT */ - - static char basenamestr[32]; - static const char *if_basename(const char *name); -@@ -637,8 +662,10 @@ - int tos_bits = IPTOS_TOS(olsr_cnf->tos); - #endif - -+#ifndef SVEN_OLA_UNBLOAT - if (iface->host_emul) - return -1; -+#endif /* SVEN_OLA_UNBLOAT */ - - memset(&ifr, 0, sizeof(struct ifreq)); - memset(&ifs, 0, sizeof(struct interface)); -@@ -745,11 +772,13 @@ - ifs.int_broadaddr = *(struct sockaddr_in *)(ARM_NOWARN_ALIGN)&ifr.ifr_broadaddr; - } - -+#ifndef SVEN_OLA_UNBLOAT - /* Deactivate IP spoof filter */ - deactivate_spoof(if_basename(ifr.ifr_name), &ifs, olsr_cnf->ip_version); - - /* Disable ICMP redirects */ - disable_redirects(if_basename(ifr.ifr_name), &ifs, olsr_cnf->ip_version); -+#endif /* SVEN_OLA_UNBLOAT */ - - } - -@@ -779,7 +808,9 @@ - - OLSR_PRINTF(1, "\tMTU - IPhdr: %d\n", ifs.int_mtu); - -+#ifndef SVEN_OLA_UNBLOAT - olsr_syslog(OLSR_LOG_INFO, "Adding interface %s\n", iface->name); -+#endif /* SVEN_OLA_UNBLOAT */ - OLSR_PRINTF(1, "\tIndex %d\n", ifs.if_index); - - if (olsr_cnf->ip_version == AF_INET) { -@@ -884,10 +915,14 @@ - */ - memset(&null_addr, 0, olsr_cnf->ipsize); - if (ipequal(&null_addr, &olsr_cnf->main_addr)) { -+#ifndef SVEN_OLA_UNBLOAT - struct ipaddr_str buf; -+#endif - olsr_cnf->main_addr = ifp->ip_addr; -+#ifndef SVEN_OLA_UNBLOAT - OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); - olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr)); -+#endif /* SVEN_OLA_UNBLOAT */ - } - - /* ---- a/src/unix/misc.c -+++ b/src/unix/misc.c -@@ -44,6 +44,7 @@ - #include "misc.h" - #include "olsr_types.h" - -+#ifndef SVEN_OLA_UNBLOAT - void - clear_console(void) - { -@@ -69,6 +70,7 @@ - - fflush(stdout); - } -+#endif /* SVEN_OLA_UNBLOAT */ - - /* - * Local Variables: diff --git a/contrib/package/olsrd-luci/patches/160-add-mdns.patch b/contrib/package/olsrd-luci/patches/160-add-mdns.patch deleted file mode 100644 index 003061119..000000000 --- a/contrib/package/olsrd-luci/patches/160-add-mdns.patch +++ /dev/null @@ -1,4408 +0,0 @@ ---- a/Makefile -+++ b/Makefile -@@ -154,7 +154,7 @@ - # nameservice: no regex - SUBDIRS := bmf dot_draw dyn_gw_plain httpinfo mini quagga secure tas txtinfo watchdog - else --SUBDIRS := bmf dot_draw dyn_gw dyn_gw_plain httpinfo mini nameservice pgraph secure txtinfo watchdog -+SUBDIRS := bmf dot_draw dyn_gw dyn_gw_plain httpinfo mini nameservice pgraph secure txtinfo watchdog mdns - endif - endif - endif -@@ -241,6 +241,11 @@ - $(MAKECMD) -C lib/watchdog - $(MAKECMD) -C lib/watchdog DESTDIR=$(DESTDIR) install - -+mdns: -+ $(MAKECMD) -C lib/mdns clean -+ $(MAKECMD) -C lib/mdns -+ $(MAKECMD) -C lib/mdns DESTDIR=$(DESTDIR) install -+ - build_all: all switch libs - install_all: install install_libs - clean_all: uberclean clean_libs ---- /dev/null -+++ b/lib/mdns/Makefile -@@ -0,0 +1,66 @@ -+# -+# OLSR Basic Multicast Forwarding (BMF) plugin. -+# Copyright (c) 2005, 2006, Thales Communications, Huizen, The Netherlands. -+# Written by Erik Tromp. -+# 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 Thales, BMF 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. -+# -+ -+OLSRD_PLUGIN = true -+PLUGIN_NAME = olsrd_mdns -+PLUGIN_VER = 1.0.0 -+ -+TOPDIR = ../.. -+include $(TOPDIR)/Makefile.inc -+ -+LIBS += $(OS_LIB_PTHREAD) -+ -+# Must be specified along with -lpthread on linux -+CPPFLAGS += $(OS_CFLAG_PTHREAD) -+ -+ifneq ($(OS),linux) -+ -+default_target install clean: -+ @echo "*** BMF Plugin only supported on Linux, sorry!" -+ -+else -+ -+default_target: $(PLUGIN_FULLNAME) -+ -+$(PLUGIN_FULLNAME): $(OBJS) version-script.txt -+ $(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS) -+ -+install: $(PLUGIN_FULLNAME) -+ $(STRIP) $(PLUGIN_FULLNAME) -+ $(INSTALL_LIB) -+ -+clean: -+ rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME) -+ -+endif ---- /dev/null -+++ b/lib/mdns/src/Address.c -@@ -0,0 +1,164 @@ -+/* -+ * OLSR Basic Multicast Forwarding (BMF) plugin. -+ * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. -+ * Written by Erik Tromp. -+ * 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 Thales, BMF 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. -+ */ -+ -+/* ------------------------------------------------------------------------- -+ * File : Address.c -+ * Description: IP packet characterization functions -+ * Created : 29 Jun 2006 -+ * -+ * ------------------------------------------------------------------------- */ -+ -+#include "Address.h" -+ -+/* System includes */ -+#include /* NULL */ -+#include /* strcmp */ -+#include /* assert() */ -+#include /* struct ip */ -+#include /* struct udphdr */ -+ -+/* OLSRD includes */ -+#include "defs.h" /* ipequal */ -+#include "olsr_protocol.h" /* OLSRPORT */ -+ -+/* Plugin includes */ -+#include "mdns.h" /* BMF_ENCAP_PORT */ -+#include "NetworkInterfaces.h" /* TBmfInterface */ -+ -+/* Whether or not to flood local broadcast packets (e.g. packets with IP -+ * destination 192.168.1.255). May be overruled by setting the plugin -+ * parameter "DoLocalBroadcast" to "no" */ -+int EnableLocalBroadcast = 1; -+ -+/* ------------------------------------------------------------------------- -+ * Function : DoLocalBroadcast -+ * Description: Overrule the default setting, enabling or disabling the -+ * flooding of local broadcast packets -+ * Input : enable - either "yes" or "no" -+ * data - not used -+ * addon - not used -+ * Output : none -+ * Return : success (0) or fail (1) -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+int DoLocalBroadcast( -+ const char* enable, -+ void* data __attribute__((unused)), -+ set_plugin_parameter_addon addon __attribute__((unused))) -+{ -+ if (strcmp(enable, "yes") == 0) -+ { -+ EnableLocalBroadcast = 1; -+ return 0; -+ } -+ else if (strcmp(enable, "no") == 0) -+ { -+ EnableLocalBroadcast = 0; -+ return 0; -+ } -+ -+ /* Value not recognized */ -+ return 1; -+} -+ -+/* ------------------------------------------------------------------------- -+ * Function : IsMulticast -+ * Description: Check if an IP address is a multicast address -+ * Input : ipAddress -+ * Output : none -+ * Return : true (1) or false (0) -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+int IsMulticast(union olsr_ip_addr* ipAddress) -+{ -+ assert(ipAddress != NULL); -+ -+ return (ntohl(ipAddress->v4.s_addr) & 0xF0000000) == 0xE0000000; -+} -+ -+/* ------------------------------------------------------------------------- -+ * Function : IsOlsrOrBmfPacket -+ * Description: Check if an IP packet is either an OLSR packet or a BMF packet -+ * Input : ipPacket -+ * Output : none -+ * Return : true (1) or false (0) -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+//int IsOlsrOrBmfPacket(unsigned char* ipPacket) -+//{//MODIFICATA -+// struct ip* ipHeader; -+// unsigned int ipHeaderLen; -+// struct udphdr* udpHeader; -+// u_int16_t destPort; -+// -+// assert(ipPacket != NULL); -+// -+// /* OLSR packets are UDP - port 698 -+// * OLSR-BMF packets are UDP - port 50698 -+// * OLSR-Autodetect probe packets are UDP - port 51698 */ -+// -+// /* Check if UDP */ -+// ipHeader = (struct ip*) ipPacket; -+// if (ipHeader->ip_p != SOL_UDP) -+// { -+// /* Not UDP */ -+// return 0; -+// } -+// -+// /* The total length must be at least large enough to store the UDP header */ -+// ipHeaderLen = GetIpHeaderLength(ipPacket); -+// if (GetIpTotalLength(ipPacket) < ipHeaderLen + sizeof(struct udphdr)) -+// { -+// /* Not long enough */ -+// return 0; -+// } -+// -+// /* Go into the UDP header and check port number */ -+// udpHeader = (struct udphdr*) (ipPacket + ipHeaderLen); -+// destPort = ntohs(udpHeader->dest); -+// -+// //if (destPort == OLSRPORT || destPort == BMF_ENCAP_PORT || destPort == 51698) -+// if (destPort == 5353) -+// /* TODO: #define for 51698 */ -+// { -+// return 1; -+// } -+// -+// return 0; -+//} -+// -+/* -+ * Local Variables: -+ * c-basic-offset: 2 -+ * indent-tabs-mode: nil -+ * End: -+ */ ---- /dev/null -+++ b/lib/mdns/src/Address.h -@@ -0,0 +1,62 @@ -+#ifndef _BMF_ADDRESS_H -+#define _BMF_ADDRESS_H -+ -+/* -+ * OLSR Basic Multicast Forwarding (BMF) plugin. -+ * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. -+ * Written by Erik Tromp. -+ * 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 Thales, BMF 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. -+ */ -+ -+/* ------------------------------------------------------------------------- -+ * File : Address.h -+ * Description: IP packet characterization functions -+ * Created : 29 Jun 2006 -+ * -+ * ------------------------------------------------------------------------- */ -+ -+#include "olsr_types.h" /* olsr_ip_addr */ -+#include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ -+#include "interfaces.h" /* struct interface */ -+ -+struct TBmfInterface; -+ -+extern int EnableLocalBroadcast; -+ -+int DoLocalBroadcast(const char* enable, void* data, set_plugin_parameter_addon addon); -+int IsMulticast(union olsr_ip_addr* ipAddress); -+int IsOlsrOrBmfPacket(unsigned char* ipPacket); -+ -+#endif /* _BMF_ADDRESS_H */ -+ -+/* -+ * Local Variables: -+ * c-basic-offset: 2 -+ * indent-tabs-mode: nil -+ * End: -+ */ ---- /dev/null -+++ b/lib/mdns/src/NetworkInterfaces.c -@@ -0,0 +1,1703 @@ -+/* -+ * OLSR Basic Multicast Forwarding (BMF) plugin. -+ * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. -+ * Written by Erik Tromp. -+ * 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 Thales, BMF 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. -+ */ -+ -+/* ------------------------------------------------------------------------- -+ * File : NetworkInterfaces.c -+ * Description: Functions to open and close sockets -+ * Created : 29 Jun 2006 -+ * -+ * ------------------------------------------------------------------------- */ -+ -+#include "NetworkInterfaces.h" -+ -+/* System includes */ -+#include /* NULL */ -+#include /* syslog() */ -+#include /* strerror(), strchr(), strcmp() */ -+#include /* errno */ -+#include /* close() */ -+#include /* ioctl() */ -+#include /* fcntl() */ -+#include /* assert() */ -+#include /* socket(), ifreq, if_indextoname(), if_nametoindex() */ -+#include /* htons() */ -+#include /* ETH_P_IP */ -+#include /* packet_mreq, PACKET_MR_PROMISC, PACKET_ADD_MEMBERSHIP */ -+#include /* IFF_TAP */ -+#include /* struct ip */ -+#include /* SOL_UDP */ -+#include /* atoi, malloc */ -+ -+/* OLSRD includes */ -+#include "olsr.h" /* OLSR_PRINTF() */ -+#include "ipcalc.h" -+#include "defs.h" /* olsr_cnf */ -+#include "link_set.h" /* get_link_set() */ -+#include "tc_set.h" /* olsr_lookup_tc_entry(), olsr_lookup_tc_edge() */ -+#include "net_olsr.h" /* ipequal */ -+#include "lq_plugin.h" -+ -+ -+/* Plugin includes */ -+#include "Packet.h" /* IFHWADDRLEN */ -+#include "mdns.h" /* PLUGIN_NAME, MainAddressOf() */ -+#include "Address.h" /* IsMulticast() */ -+ -+/* List of network interface objects used by BMF plugin */ -+struct TBmfInterface* BmfInterfaces = NULL; -+struct TBmfInterface* LastBmfInterface = NULL; -+ -+/* Highest-numbered open socket file descriptor. To be used as first -+ * parameter in calls to select(...). */ -+int HighestSkfd = -1; -+ -+/* Set of socket file descriptors */ -+fd_set InputSet; -+ -+/* File descriptor of EtherTunTap interface */ -+int EtherTunTapFd = -1; -+ -+/* Network interface name of EtherTunTap interface. May be overruled by -+ * setting the plugin parameter "BmfInterface". */ -+char EtherTunTapIfName[IFNAMSIZ] = "bmf0"; -+ -+/* The underlying mechanism to forward multicast packets. Either: -+ * - BM_BROADCAST: BMF uses the IP local broadcast as destination address -+ * - BM_UNICAST_PROMISCUOUS: BMF uses the IP address of the best neighbor as -+ * destination address. The other neighbors listen promiscuously. */ -+enum TBmfMechanism BmfMechanism = BM_BROADCAST; -+ -+#define ETHERTUNTAPIPNOTSET 0 -+ -+/* The IP address of the BMF network interface in host byte order. -+ * May be overruled by setting the plugin parameter "BmfInterfaceIp". */ -+u_int32_t EtherTunTapIp = ETHERTUNTAPIPNOTSET; -+ -+/* 255.255.255.255 in host byte order. May be overruled by -+ * setting the plugin parameter "BmfInterfaceIp". */ -+u_int32_t EtherTunTapIpMask = 0xFFFFFFFF; -+ -+/* The IP broadcast address of the BMF network interface in host byte order. -+ * May be overruled by setting the plugin parameter "BmfinterfaceIp". */ -+u_int32_t EtherTunTapIpBroadcast = ETHERTUNTAPIPNOTSET; -+ -+/* Whether or not the configuration has overruled the default IP -+ * configuration of the EtherTunTap interface */ -+int TunTapIpOverruled = 0; -+ -+/* Whether or not to capture packets on the OLSR-enabled -+ * interfaces (in promiscuous mode). May be overruled by setting the plugin -+ * parameter "CapturePacketsOnOlsrInterfaces" to "yes". */ -+int CapturePacketsOnOlsrInterfaces = 0; -+ -+/* ------------------------------------------------------------------------- -+ * Function : SetBmfInterfaceName -+ * Description: Overrule the default network interface name ("bmf0") of the -+ * EtherTunTap interface -+ * Input : ifname - network interface name (e.g. "mybmf0") -+ * data - not used -+ * addon - not used -+ * Output : none -+ * Return : success (0) or fail (1) -+ * Data Used : EtherTunTapIfName -+ * ------------------------------------------------------------------------- */ -+int SetBmfInterfaceName( -+ const char* ifname, -+ void* data __attribute__((unused)), -+ set_plugin_parameter_addon addon __attribute__((unused))) -+{ -+ strncpy(EtherTunTapIfName, ifname, IFNAMSIZ - 1); -+ EtherTunTapIfName[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ -+ return 0; -+} /* SetBmfInterfaceName */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : SetBmfInterfaceIp -+ * Description: Overrule the default IP address and prefix length -+ * ("10.255.255.253/30") of the EtherTunTap interface -+ * Input : ip - IP address string, followed by '/' and prefix length -+ * data - not used -+ * addon - not used -+ * Output : none -+ * Return : success (0) or fail (1) -+ * Data Used : EtherTunTapIp, EtherTunTapIpMask, EtherTunTapIpBroadcast, -+ * TunTapIpOverruled -+ * ------------------------------------------------------------------------- */ -+int SetBmfInterfaceIp( -+ const char* ip, -+ void* data __attribute__((unused)), -+ set_plugin_parameter_addon addon __attribute__((unused))) -+{ -+#define IPV4_MAX_ADDRLEN 16 -+#define IPV4_MAX_PREFIXLEN 32 -+ char* slashAt; -+ char ipAddr[IPV4_MAX_ADDRLEN]; -+ struct in_addr sinaddr; -+ int prefixLen; -+ int i; -+ -+ /* Inspired by function str2prefix_ipv4 as found in Quagga source -+ * file lib/prefix.c */ -+ -+ /* Find slash inside string. */ -+ slashAt = strchr(ip, '/'); -+ -+ /* String doesn't contain slash. */ -+ if (slashAt == NULL || slashAt - ip >= IPV4_MAX_ADDRLEN) -+ { -+ /* No prefix length specified, or IP address too long */ -+ return 1; -+ } -+ -+ strncpy(ipAddr, ip, slashAt - ip); -+ *(ipAddr + (slashAt - ip)) = '\0'; -+ if (inet_aton(ipAddr, &sinaddr) == 0) -+ { -+ /* Invalid address passed */ -+ return 1; -+ } -+ -+ EtherTunTapIp = ntohl(sinaddr.s_addr); -+ -+ /* Get prefix length. */ -+ prefixLen = atoi(++slashAt); -+ if (prefixLen <= 0 || prefixLen > IPV4_MAX_PREFIXLEN) -+ { -+ return 1; -+ } -+ -+ /* Compose IP subnet mask in host byte order */ -+ EtherTunTapIpMask = 0; -+ for (i = 0; i < prefixLen; i++) -+ { -+ EtherTunTapIpMask |= (1 << (IPV4_MAX_PREFIXLEN - 1 - i)); -+ } -+ -+ /* Compose IP broadcast address in host byte order */ -+ EtherTunTapIpBroadcast = EtherTunTapIp; -+ for (i = prefixLen; i < IPV4_MAX_PREFIXLEN; i++) -+ { -+ EtherTunTapIpBroadcast |= (1 << (IPV4_MAX_PREFIXLEN - 1 - i)); -+ } -+ -+ TunTapIpOverruled = 1; -+ -+ return 0; -+} /* SetBmfInterfaceIp */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : SetCapturePacketsOnOlsrInterfaces -+ * Description: Overrule the default setting, enabling or disabling the -+ * capturing of packets on OLSR-enabled interfaces. -+ * Input : enable - either "yes" or "no" -+ * data - not used -+ * addon - not used -+ * Output : none -+ * Return : success (0) or fail (1) -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+int SetCapturePacketsOnOlsrInterfaces( -+ const char* enable, -+ void* data __attribute__((unused)), -+ set_plugin_parameter_addon addon __attribute__((unused))) -+{ -+ if (strcmp(enable, "yes") == 0) -+ { -+ CapturePacketsOnOlsrInterfaces = 1; -+ return 0; -+ } -+ else if (strcmp(enable, "no") == 0) -+ { -+ CapturePacketsOnOlsrInterfaces = 0; -+ return 0; -+ } -+ -+ /* Value not recognized */ -+ return 1; -+} /* SetCapturePacketsOnOlsrInterfaces */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : SetBmfMechanism -+ * Description: Overrule the default BMF mechanism to either BM_BROADCAST or -+ * BM_UNICAST_PROMISCUOUS. -+ * Input : mechanism - either "Broadcast" or "UnicastPromiscuous" -+ * data - not used -+ * addon - not used -+ * Output : none -+ * Return : success (0) or fail (1) -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+int SetBmfMechanism( -+ const char* mechanism, -+ void* data __attribute__((unused)), -+ set_plugin_parameter_addon addon __attribute__((unused))) -+{ -+ if (strcmp(mechanism, "Broadcast") == 0) -+ { -+ BmfMechanism = BM_BROADCAST; -+ return 0; -+ } -+ else if (strcmp(mechanism, "UnicastPromiscuous") == 0) -+ { -+ BmfMechanism = BM_UNICAST_PROMISCUOUS; -+ return 0; -+ } -+ -+ /* Value not recognized */ -+ return 1; -+} /* SetBmfMechanism */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : AddDescriptorToInputSet -+ * Description: Add a socket descriptor to the global set of socket file descriptors -+ * Input : skfd - socket file descriptor -+ * Output : none -+ * Return : none -+ * Data Used : HighestSkfd, InputSet -+ * Notes : Keeps track of the highest-numbered descriptor -+ * ------------------------------------------------------------------------- */ -+static void AddDescriptorToInputSet(int skfd) -+{ -+ /* Keep the highest-numbered descriptor */ -+ if (skfd > HighestSkfd) -+ { -+ HighestSkfd = skfd; -+ } -+ -+ /* Add descriptor to input set */ -+ FD_SET(skfd, &InputSet); -+} /* AddDescriptorToInputSet */ -+ -+/* To save the state of the IP spoof filter for the EtherTunTap interface */ -+static char EthTapSpoofState = '1'; -+ -+/* ------------------------------------------------------------------------- -+ * Function : DeactivateSpoofFilter -+ * Description: Deactivates the Linux anti-spoofing filter for the tuntap -+ * interface -+ * Input : none -+ * Output : none -+ * Return : fail (0) or success (1) -+ * Data Used : EtherTunTapIfName, EthTapSpoofState -+ * Notes : Saves the current filter state for later restoring -+ * ------------------------------------------------------------------------- */ -+int DeactivateSpoofFilter(void) -+{ -+ FILE* procSpoof; -+ char procFile[FILENAME_MAX]; -+ -+ /* Generate the procfile name */ -+ sprintf(procFile, "/proc/sys/net/ipv4/conf/%s/rp_filter", EtherTunTapIfName); -+ -+ /* Open procfile for reading */ -+ procSpoof = fopen(procFile, "r"); -+ if (procSpoof == NULL) -+ { -+ fprintf( -+ stderr, -+ "WARNING! Could not open the %s file to check/disable the IP spoof filter!\n" -+ "Are you using the procfile filesystem?\n" -+ "Does your system support IPv4?\n" -+ "I will continue (in 3 sec) - but you should manually ensure that IP spoof\n" -+ "filtering is disabled!\n\n", -+ procFile); -+ -+ sleep(3); -+ return 0; -+ } -+ -+ EthTapSpoofState = fgetc(procSpoof); -+ fclose(procSpoof); -+ -+ /* Open procfile for writing */ -+ procSpoof = fopen(procFile, "w"); -+ if (procSpoof == NULL) -+ { -+ fprintf(stderr, "Could not open %s for writing!\n", procFile); -+ fprintf( -+ stderr, -+ "I will continue (in 3 sec) - but you should manually ensure that IP" -+ " spoof filtering is disabled!\n\n"); -+ sleep(3); -+ return 0; -+ } -+ -+ syslog(LOG_INFO, "Writing \"0\" to %s", procFile); -+ fputs("0", procSpoof); -+ -+ fclose(procSpoof); -+ -+ return 1; -+} /* DeactivateSpoofFilter */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : RestoreSpoofFilter -+ * Description: Restores the Linux anti-spoofing filter setting for the tuntap -+ * interface -+ * Input : none -+ * Output : none -+ * Return : none -+ * Data Used : EtherTunTapIfName, EthTapSpoofState -+ * ------------------------------------------------------------------------- */ -+void RestoreSpoofFilter(void) -+{ -+ FILE* procSpoof; -+ char procFile[FILENAME_MAX]; -+ -+ /* Generate the procfile name */ -+ sprintf(procFile, "/proc/sys/net/ipv4/conf/%s/rp_filter", EtherTunTapIfName); -+ -+ /* Open procfile for writing */ -+ procSpoof = fopen(procFile, "w"); -+ if (procSpoof == NULL) -+ { -+ fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procFile); -+ } -+ else -+ { -+ syslog(LOG_INFO, "Resetting %s to %c\n", procFile, EthTapSpoofState); -+ -+ fputc(EthTapSpoofState, procSpoof); -+ fclose(procSpoof); -+ } -+} /* RestoreSpoofFilter */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : FindNeighbors -+ * Description: Find the neighbors on a network interface to forward a BMF -+ * packet to -+ * Input : intf - the network interface -+ * source - the source IP address of the BMF packet -+ * forwardedBy - the IP address of the node that forwarded the BMF -+ * packet -+ * forwardedTo - the IP address of the node to which the BMF packet -+ * was directed -+ * Output : neighbors - list of (up to a number of 'FanOutLimit') neighbors. -+ * bestNeighbor - the best neighbor (in terms of lowest cost or ETX -+ * value) -+ * nPossibleNeighbors - number of found possible neighbors -+ * Data Used : FanOutLimit -+ * ------------------------------------------------------------------------- */ -+//void FindNeighbors( -+// struct TBestNeighbors* neighbors, -+// struct link_entry** bestNeighbor, -+// struct TBmfInterface* intf, -+// union olsr_ip_addr* source, -+// union olsr_ip_addr* forwardedBy, -+// union olsr_ip_addr* forwardedTo, -+// int* nPossibleNeighbors) -+//{ -+// struct link_entry* walker; -+// olsr_linkcost previousLinkEtx = LINK_COST_BROKEN; -+// olsr_linkcost bestEtx = LINK_COST_BROKEN; -+// -+// int i; -+// -+// /* Initialize */ -+// *bestNeighbor = NULL; -+// for (i = 0; i < MAX_UNICAST_NEIGHBORS; i++) -+// { -+// neighbors->links[i] = NULL; -+// } -+// *nPossibleNeighbors = 0; -+// -+// if (forwardedBy != NULL) -+// { -+// /* Retrieve the cost of the link from 'forwardedBy' to myself */ -+// struct link_entry* bestLinkFromForwarder = get_best_link_to_neighbor(forwardedBy); -+// if (bestLinkFromForwarder != NULL) -+// { -+// previousLinkEtx = bestLinkFromForwarder->linkcost; -+// } -+// } -+// -+// OLSR_FOR_ALL_LINK_ENTRIES(walker) { -+// struct ipaddr_str buf; -+// union olsr_ip_addr* neighborMainIp; -+// struct link_entry* bestLinkToNeighbor; -+// struct tc_entry* tcLastHop; -+// float currEtx; -+// -+// /* Consider only links from the specified interface */ -+// if (! olsr_ipequal(&intf->intAddr, &walker->local_iface_addr)) -+// { -+// continue; /* for */ -+// } -+// -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> Considering forwarding pkt on \"%s\" to %s\n", -+// PLUGIN_NAME_SHORT, -+// intf->ifName, -+// olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); -+// -+// neighborMainIp = MainAddressOf(&walker->neighbor_iface_addr); -+// -+// /* Consider only neighbors with an IP address that differs from the -+// * passed IP addresses (if passed). Rely on short-circuit boolean evaluation. */ -+// if (source != NULL && olsr_ipequal(neighborMainIp, MainAddressOf(source))) -+// { -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> Not forwarding to %s: is source of pkt\n", -+// PLUGIN_NAME_SHORT, -+// olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); -+// -+// continue; /* for */ -+// } -+// -+// /* Rely on short-circuit boolean evaluation */ -+// if (forwardedBy != NULL && olsr_ipequal(neighborMainIp, MainAddressOf(forwardedBy))) -+// { -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> Not forwarding to %s: is the node that forwarded the pkt\n", -+// PLUGIN_NAME_SHORT, -+// olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); -+// -+// continue; /* for */ -+// } -+// -+// /* Rely on short-circuit boolean evaluation */ -+// if (forwardedTo != NULL && olsr_ipequal(neighborMainIp, MainAddressOf(forwardedTo))) -+// { -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> Not forwarding to %s: is the node to which the pkt was forwarded\n", -+// PLUGIN_NAME_SHORT, -+// olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); -+// -+// continue; /* for */ -+// } -+// -+// /* Found a candidate neighbor to direct our packet to */ -+// -+// /* Calculate the link quality (ETX) of the link to the found neighbor */ -+// currEtx = walker->linkcost; -+// -+// if (currEtx >= LINK_COST_BROKEN) -+// { -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> Not forwarding to %s: link is timing out\n", -+// PLUGIN_NAME_SHORT, -+// olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); -+// -+// continue; /* for */ -+// } -+// -+// /* Compare costs to check if the candidate neighbor is best reached via 'intf' */ -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> Forwarding pkt to %s will cost ETX %5.2f\n", -+// PLUGIN_NAME_SHORT, -+// olsr_ip_to_string(&buf, &walker->neighbor_iface_addr), -+// currEtx); -+// -+// /* -+// * If the candidate neighbor is best reached via another interface, then skip -+// * the candidate neighbor; the candidate neighbor has been / will be selected via that -+// * other interface. -+// */ -+// bestLinkToNeighbor = get_best_link_to_neighbor(&walker->neighbor_iface_addr); -+// -+// if (walker != bestLinkToNeighbor) -+// { -+// if (bestLinkToNeighbor == NULL) -+// { -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> Not forwarding to %s: no link found\n", -+// PLUGIN_NAME_SHORT, -+// olsr_ip_to_string(&buf, &walker->neighbor_iface_addr)); -+// } -+// else -+// { -+//#ifndef NODEBUG -+// struct interface* bestIntf = if_ifwithaddr(&bestLinkToNeighbor->local_iface_addr); -+// struct lqtextbuffer lqbuffer; -+//#endif -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> Not forwarding to %s: \"%s\" gives a better link to this neighbor, costing %s\n", -+// PLUGIN_NAME_SHORT, -+// olsr_ip_to_string(&buf, &walker->neighbor_iface_addr), -+// bestIntf->int_name, -+// get_linkcost_text(bestLinkToNeighbor->linkcost, 0, &lqbuffer)); -+// } -+// -+// continue; /* for */ -+// } -+// -+// if (forwardedBy != NULL) -+// { -+//#ifndef NODEBUG -+// struct ipaddr_str forwardedByBuf, niaBuf; -+// struct lqtextbuffer lqbuffer; -+//#endif -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> 2-hop path from %s via me to %s will cost ETX %s\n", -+// PLUGIN_NAME_SHORT, -+// olsr_ip_to_string(&forwardedByBuf, forwardedBy), -+// olsr_ip_to_string(&niaBuf, &walker->neighbor_iface_addr), -+// get_linkcost_text(previousLinkEtx + currEtx, 1, &lqbuffer)); -+// } -+// -+// /* Check the topology table whether the 'forwardedBy' node is itself a direct -+// * neighbor of the candidate neighbor, at a lower cost than the 2-hop route -+// * via myself. If so, we do not need to forward the BMF packet to the candidate -+// * neighbor, because the 'forwardedBy' node will forward the packet. */ -+// if (forwardedBy != NULL) -+// { -+// tcLastHop = olsr_lookup_tc_entry(MainAddressOf(forwardedBy)); -+// if (tcLastHop != NULL) -+// { -+// struct tc_edge_entry* tc_edge; -+// -+// tc_edge = olsr_lookup_tc_edge(tcLastHop, MainAddressOf(&walker->neighbor_iface_addr)); -+// -+// /* We are not interested in dead-end edges. */ -+// if (tc_edge) { -+// olsr_linkcost tcEtx = tc_edge->cost; -+// -+// if (previousLinkEtx + currEtx > tcEtx) -+// { -+//#ifndef NODEBUG -+// struct ipaddr_str neighbor_iface_buf, forw_buf; -+// struct lqtextbuffer lqbuffer; -+// olsr_ip_to_string(&neighbor_iface_buf, &walker->neighbor_iface_addr); -+//#endif -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> Not forwarding to %s: I am not an MPR between %s and %s, direct link costs %s\n", -+// PLUGIN_NAME_SHORT, -+// neighbor_iface_buf.buf, -+// olsr_ip_to_string(&forw_buf, forwardedBy), -+// neighbor_iface_buf.buf, -+// get_linkcost_text(tcEtx, 0, &lqbuffer)); -+// -+// continue; /* for */ -+// } /* if */ -+// } /* if */ -+// } /* if */ -+// } /* if */ -+// -+// /* Remember the best neighbor. If all are very bad, remember none. */ -+// if (currEtx < bestEtx) -+// { -+// *bestNeighbor = walker; -+// bestEtx = currEtx; -+// } -+// -+// /* Fill the list with up to 'FanOutLimit' neighbors. If there -+// * are more neighbors, broadcast is used instead of unicast. In that -+// * case we do not need the list of neighbors. */ -+// if (*nPossibleNeighbors < FanOutLimit) -+// { -+// neighbors->links[*nPossibleNeighbors] = walker; -+// } -+// -+// *nPossibleNeighbors += 1; -+// } OLSR_FOR_ALL_LINK_ENTRIES_END(walker); -+// -+// /* Display the result of the neighbor search */ -+// if (*nPossibleNeighbors == 0) -+// { -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> No suitable neighbor found to forward to on \"%s\"\n", -+// PLUGIN_NAME_SHORT, -+// intf->ifName); -+// } -+// else -+// { -+// struct ipaddr_str buf; -+// OLSR_PRINTF( -+// 9, -+// "%s: ----> %d neighbors found on \"%s\"; best neighbor to forward to: %s\n", -+// PLUGIN_NAME_SHORT, -+// *nPossibleNeighbors, -+// intf->ifName, -+// olsr_ip_to_string(&buf, &(*bestNeighbor)->neighbor_iface_addr)); -+// } /* if */ -+// -+//} /* FindNeighbors */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : CreateCaptureSocket -+ * Description: Create socket for promiscuously capturing multicast IP traffic -+ * Input : ifname - network interface (e.g. "eth0") -+ * Output : none -+ * Return : the socket descriptor ( >= 0), or -1 if an error occurred -+ * Data Used : none -+ * Notes : The socket is a cooked IP packet socket, bound to the specified -+ * network interface -+ * ------------------------------------------------------------------------- */ -+static int CreateCaptureSocket(const char* ifName) -+{ -+ int ifIndex = if_nametoindex(ifName); -+ struct packet_mreq mreq; -+ struct ifreq req; -+ struct sockaddr_ll bindTo; -+ int skfd = 0; -+ /* Open cooked IP packet socket */ -+ if (olsr_cnf->ip_version == AF_INET){ -+ skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); -+ } -+ else { -+ skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IPV6)); -+ } -+ if (skfd < 0) -+ { -+ BmfPError("socket(PF_PACKET) error"); -+ return -1; -+ } -+ -+ /* Set interface to promiscuous mode */ -+ memset(&mreq, 0, sizeof(struct packet_mreq)); -+ mreq.mr_ifindex = ifIndex; -+ mreq.mr_type = PACKET_MR_PROMISC; -+ if (setsockopt(skfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) -+ { -+ BmfPError("setsockopt(PACKET_MR_PROMISC) error"); -+ close(skfd); -+ return -1; -+ } -+ -+ /* Get hardware (MAC) address */ -+ memset(&req, 0, sizeof(struct ifreq)); -+ strncpy(req.ifr_name, ifName, IFNAMSIZ - 1); -+ req.ifr_name[IFNAMSIZ-1] = '\0'; /* Ensures null termination */ -+ if (ioctl(skfd, SIOCGIFHWADDR, &req) < 0) -+ { -+ BmfPError("error retrieving MAC address"); -+ close(skfd); -+ return -1; -+ } -+ -+ /* Bind the socket to the specified interface */ -+ memset(&bindTo, 0, sizeof(bindTo)); -+ bindTo.sll_family = AF_PACKET; -+ if (olsr_cnf->ip_version == AF_INET){ -+ bindTo.sll_protocol = htons(ETH_P_IP); -+ } -+ else{ -+ bindTo.sll_protocol = htons(ETH_P_IPV6); -+ } -+ bindTo.sll_ifindex = ifIndex; -+ memcpy(bindTo.sll_addr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); -+ bindTo.sll_halen = IFHWADDRLEN; -+ -+ if (bind(skfd, (struct sockaddr*)&bindTo, sizeof(bindTo)) < 0) -+ { -+ BmfPError("bind() error"); -+ close(skfd); -+ return -1; -+ } -+ -+ /* Set socket to blocking operation */ -+ if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0) -+ { -+ BmfPError("fcntl() error"); -+ close(skfd); -+ return -1; -+ } -+ -+ AddDescriptorToInputSet(skfd); -+ add_olsr_socket(skfd,&DoMDNS); -+ -+ return skfd; -+} /* CreateCaptureSocket */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : CreateListeningSocket -+ * Description: Create socket for promiscuously listening to BMF packets. -+ * Used only when 'BmfMechanism' is BM_UNICAST_PROMISCUOUS -+ * Input : ifname - network interface (e.g. "eth0") -+ * Output : none -+ * Return : the socket descriptor ( >= 0), or -1 if an error occurred -+ * Data Used : none -+ * Notes : The socket is a cooked IP packet socket, bound to the specified -+ * network interface -+ * ------------------------------------------------------------------------- */ -+//static int CreateListeningSocket(const char* ifName) -+//{ -+// int ifIndex = if_nametoindex(ifName); -+// struct packet_mreq mreq; -+// struct ifreq req; -+// struct sockaddr_ll bindTo; -+// -+// /* Open cooked IP packet socket */ -+// int skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); -+// if (skfd < 0) -+// { -+// BmfPError("socket(PF_PACKET) error"); -+// return -1; -+// } -+// -+// /* Set interface to promiscuous mode */ -+// memset(&mreq, 0, sizeof(struct packet_mreq)); -+// mreq.mr_ifindex = ifIndex; -+// mreq.mr_type = PACKET_MR_PROMISC; -+// if (setsockopt(skfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) -+// { -+// BmfPError("setsockopt(PACKET_MR_PROMISC) error"); -+// close(skfd); -+// return -1; -+// } -+// -+// /* Get hardware (MAC) address */ -+// memset(&req, 0, sizeof(struct ifreq)); -+// strncpy(req.ifr_name, ifName, IFNAMSIZ - 1); -+// req.ifr_name[IFNAMSIZ-1] = '\0'; /* Ensures null termination */ -+// if (ioctl(skfd, SIOCGIFHWADDR, &req) < 0) -+// { -+// BmfPError("error retrieving MAC address"); -+// close(skfd); -+// return -1; -+// } -+// -+// /* Bind the socket to the specified interface */ -+// memset(&bindTo, 0, sizeof(bindTo)); -+// bindTo.sll_family = AF_PACKET; -+// bindTo.sll_protocol = htons(ETH_P_IP); -+// bindTo.sll_ifindex = ifIndex; -+// memcpy(bindTo.sll_addr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); -+// bindTo.sll_halen = IFHWADDRLEN; -+// -+// if (bind(skfd, (struct sockaddr*)&bindTo, sizeof(bindTo)) < 0) -+// { -+// BmfPError("bind() error"); -+// close(skfd); -+// return -1; -+// } -+// -+// /* Set socket to blocking operation */ -+// if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0) -+// { -+// BmfPError("fcntl() error"); -+// close(skfd); -+// return -1; -+// } -+// -+// AddDescriptorToInputSet(skfd); -+// -+// return skfd; -+//} /* CreateListeningSocket */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : CreateEncapsulateSocket -+ * Description: Create a socket for sending and receiving encapsulated -+ * multicast packets -+ * Input : ifname - network interface (e.g. "eth0") -+ * Output : none -+ * Return : the socket descriptor ( >= 0), or -1 if an error occurred -+ * Data Used : none -+ * Notes : The socket is an UDP (datagram) over IP socket, bound to the -+ * specified network interface -+ * ------------------------------------------------------------------------- */ -+//static int CreateEncapsulateSocket(const char* ifName) -+//{ -+// int on = 1; -+// struct sockaddr_in bindTo; -+// -+// /* Open UDP-IP socket */ -+// int skfd = socket(PF_INET, SOCK_DGRAM, 0); -+// if (skfd < 0) -+// { -+// BmfPError("socket(PF_INET) error"); -+// return -1; -+// } -+// -+// /* Enable sending to broadcast addresses */ -+// if (setsockopt(skfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) -+// { -+// BmfPError("setsockopt(SO_BROADCAST) error"); -+// close(skfd); -+// return -1; -+// } -+// -+// /* Bind to the specific network interfaces indicated by ifName. */ -+// /* When using Kernel 2.6 this must happer prior to the port binding! */ -+// if (setsockopt(skfd, SOL_SOCKET, SO_BINDTODEVICE, ifName, strlen(ifName) + 1) < 0) -+// { -+// BmfPError("setsockopt(SO_BINDTODEVICE) error"); -+// close(skfd); -+// return -1; -+// } -+// -+// /* Bind to BMF port */ -+// memset(&bindTo, 0, sizeof(bindTo)); -+// bindTo.sin_family = AF_INET; -+// bindTo.sin_port = htons(BMF_ENCAP_PORT); -+// bindTo.sin_addr.s_addr = htonl(INADDR_ANY); -+// -+// if (bind(skfd, (struct sockaddr*)&bindTo, sizeof(bindTo)) < 0) -+// { -+// BmfPError("bind() error"); -+// close(skfd); -+// return -1; -+// } -+// -+// /* Set socket to blocking operation */ -+// if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0) -+// { -+// BmfPError("fcntl() error"); -+// close(skfd); -+// return -1; -+// } -+// -+// AddDescriptorToInputSet(skfd); -+// -+// return skfd; -+//} /* CreateEncapsulateSocket */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : CreateLocalEtherTunTap -+ * Description: Creates and brings up an EtherTunTap interface -+ * Input : none -+ * Output : none -+ * Return : the socket file descriptor (>= 0), or -1 in case of failure -+ * Data Used : EtherTunTapIfName - name used for the tuntap interface (e.g. -+ * "bmf0") -+ * EtherTunTapIp -+ * EtherTunTapIpMask -+ * EtherTunTapIpBroadcast -+ * BmfInterfaces -+ * Note : Order dependency: call this function only if BmfInterfaces -+ * is filled with a list of network interfaces. -+ * ------------------------------------------------------------------------- */ -+//static int CreateLocalEtherTunTap(void) -+//{ -+// static const char deviceName[] = "/dev/net/tun"; -+// struct ifreq ifreq; -+// int etfd; -+// int ioctlSkfd; -+// int ioctlres; -+// -+// etfd = open(deviceName, O_RDWR | O_NONBLOCK); -+// if (etfd < 0) -+// { -+// BmfPError("error opening %s", deviceName); -+// return -1; -+// } -+// -+// memset(&ifreq, 0, sizeof(ifreq)); -+// strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1); -+// ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ -+// -+// /* Specify the IFF_TUN flag for IP packets. -+// * Specify IFF_NO_PI for not receiving extra meta packet information. */ -+// ifreq.ifr_flags = IFF_TUN; -+// ifreq.ifr_flags |= IFF_NO_PI; -+// -+// if (ioctl(etfd, TUNSETIFF, (void *)&ifreq) < 0) -+// { -+// BmfPError("ioctl(TUNSETIFF) error on %s", deviceName); -+// close(etfd); -+// return -1; -+// } -+// -+// memset(&ifreq, 0, sizeof(ifreq)); -+// strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1); -+// ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ -+// ifreq.ifr_addr.sa_family = AF_INET; -+// -+// ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0); -+// if (ioctlSkfd < 0) -+// { -+// BmfPError("socket(PF_INET) error on %s", deviceName); -+// close(etfd); -+// return -1; -+// } -+// -+// /* Give the EtherTunTap interface an IP address. -+// * The default IP address is the address of the first OLSR interface; -+// * the default netmask is 255.255.255.255 . Having an all-ones netmask prevents -+// * automatic entry of the BMF network interface in the routing table. */ -+// if (EtherTunTapIp == ETHERTUNTAPIPNOTSET) -+// { -+// struct TBmfInterface* nextBmfIf = BmfInterfaces; -+// while (nextBmfIf != NULL) -+// { -+// struct TBmfInterface* bmfIf = nextBmfIf; -+// nextBmfIf = bmfIf->next; -+// -+// if (bmfIf->olsrIntf != NULL) -+// { -+// EtherTunTapIp = ntohl(bmfIf->intAddr.v4.s_addr); -+// EtherTunTapIpBroadcast = EtherTunTapIp; -+// } -+// } -+// } -+// -+// if (EtherTunTapIp == ETHERTUNTAPIPNOTSET) -+// { -+// /* No IP address configured for BMF network interface, and no OLSR interface found to -+// * copy IP address from. Fall back to default: 10.255.255.253 . */ -+// EtherTunTapIp = ETHERTUNTAPDEFAULTIP; -+// } -+// -+// ((struct sockaddr_in*)&ifreq.ifr_addr)->sin_addr.s_addr = htonl(EtherTunTapIp); -+// ioctlres = ioctl(ioctlSkfd, SIOCSIFADDR, &ifreq); -+// if (ioctlres >= 0) -+// { -+// /* Set net mask */ -+// ((struct sockaddr_in*)&ifreq.ifr_netmask)->sin_addr.s_addr = htonl(EtherTunTapIpMask); -+// ioctlres = ioctl(ioctlSkfd, SIOCSIFNETMASK, &ifreq); -+// if (ioctlres >= 0) -+// { -+// /* Set broadcast IP */ -+// ((struct sockaddr_in*)&ifreq.ifr_broadaddr)->sin_addr.s_addr = htonl(EtherTunTapIpBroadcast); -+// ioctlres = ioctl(ioctlSkfd, SIOCSIFBRDADDR, &ifreq); -+// if (ioctlres >= 0) -+// { -+// /* Bring EtherTunTap interface up (if not already) */ -+// ioctlres = ioctl(ioctlSkfd, SIOCGIFFLAGS, &ifreq); -+// if (ioctlres >= 0) -+// { -+// ifreq.ifr_flags |= (IFF_UP | IFF_RUNNING | IFF_BROADCAST); -+// ioctlres = ioctl(ioctlSkfd, SIOCSIFFLAGS, &ifreq); -+// } -+// } -+// } -+// } -+// -+// if (ioctlres < 0) -+// { -+// /* Any of the above ioctl() calls failed */ -+// BmfPError("error bringing up EtherTunTap interface \"%s\"", EtherTunTapIfName); -+// -+// close(etfd); -+// close(ioctlSkfd); -+// return -1; -+// } /* if (ioctlres < 0) */ -+// -+// /* Set the multicast flag on the interface */ -+// memset(&ifreq, 0, sizeof(ifreq)); -+// strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1); -+// ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ -+// -+// ioctlres = ioctl(ioctlSkfd, SIOCGIFFLAGS, &ifreq); -+// if (ioctlres >= 0) -+// { -+// ifreq.ifr_flags |= IFF_MULTICAST; -+// ioctlres = ioctl(ioctlSkfd, SIOCSIFFLAGS, &ifreq); -+// } -+// if (ioctlres < 0) -+// { -+// /* Any of the two above ioctl() calls failed */ -+// BmfPError("error setting multicast flag on EtherTunTap interface \"%s\"", EtherTunTapIfName); -+// -+// /* Continue anyway */ -+// } -+// -+// /* Use ioctl to make the tuntap persistent. Otherwise it will disappear -+// * when this program exits. That is not desirable, since a multicast -+// * daemon (e.g. mrouted) may be using the tuntap interface. */ -+// if (ioctl(etfd, TUNSETPERSIST, (void *)&ifreq) < 0) -+// { -+// BmfPError("error making EtherTunTap interface \"%s\" persistent", EtherTunTapIfName); -+// -+// /* Continue anyway */ -+// } -+// -+// OLSR_PRINTF(8, "%s: opened 1 socket on \"%s\"\n", PLUGIN_NAME_SHORT, EtherTunTapIfName); -+// -+// AddDescriptorToInputSet(etfd); -+// -+// /* If the user configured a specific IP address for the BMF network interface, -+// * help the user and advertise the IP address of the BMF network interface -+// * on the OLSR network via HNA */ -+// if (TunTapIpOverruled != 0) -+// { -+// union olsr_ip_addr temp_net; -+// -+// temp_net.v4.s_addr = htonl(EtherTunTapIp); -+// ip_prefix_list_add(&olsr_cnf->hna_entries, &temp_net, 32); -+// } -+// -+// close(ioctlSkfd); -+// -+// return etfd; -+//} /* CreateLocalEtherTunTap */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : CreateInterface -+ * Description: Create a new TBmfInterface object and adds it to the global -+ * BmfInterfaces list -+ * Input : ifName - name of the network interface (e.g. "eth0") -+ * : olsrIntf - OLSR interface object of the network interface, or -+ * NULL if the network interface is not OLSR-enabled -+ * Output : none -+ * Return : the number of opened sockets -+ * Data Used : BmfInterfaces, LastBmfInterface -+ * ------------------------------------------------------------------------- */ -+ -+//FOR MDNS IS ALWAYS CALLED WITH NULL AS SECOND ARG -+ -+static int CreateInterface( -+ const char* ifName, -+ struct interface* olsrIntf) -+{ -+ int capturingSkfd = -1; -+ int encapsulatingSkfd = -1; -+ int listeningSkfd = -1; -+ int ioctlSkfd; -+ struct ifreq ifr; -+ int nOpened = 0; -+ struct TBmfInterface* newIf = malloc(sizeof(struct TBmfInterface)); -+ -+ assert(ifName != NULL); -+ -+ if (newIf == NULL) -+ { -+ return 0; -+ } -+ -+//TODO: assert interface is not talking OLSR -+ -+// if (olsrIntf != NULL) -+// { -+// /* On OLSR-enabled interfaces, create socket for encapsulating and forwarding -+// * multicast packets */ -+// encapsulatingSkfd = CreateEncapsulateSocket(ifName); -+// if (encapsulatingSkfd < 0) -+// { -+// free(newIf); -+// return 0; -+// } -+// nOpened++; -+// } -+ -+ /* Create socket for capturing and sending of multicast packets on -+ * non-OLSR interfaces, and on OLSR-interfaces if configured. */ -+ if ((olsrIntf == NULL) || (CapturePacketsOnOlsrInterfaces != 0)) -+ { -+ capturingSkfd = CreateCaptureSocket(ifName); -+ if (capturingSkfd < 0) -+ { -+ close(encapsulatingSkfd); -+ free(newIf); -+ return 0; -+ } -+ -+ nOpened++; -+ } -+ -+// /* Create promiscuous mode listening interface if BMF uses IP unicast -+// * as underlying forwarding mechanism */ -+// if (BmfMechanism == BM_UNICAST_PROMISCUOUS) -+// { -+// listeningSkfd = CreateListeningSocket(ifName); -+// if (listeningSkfd < 0) -+// { -+// close(listeningSkfd); -+// close(encapsulatingSkfd); /* no problem if 'encapsulatingSkfd' is -1 */ -+// free(newIf); -+// return 0; -+// } -+// -+// nOpened++; -+// } -+ -+ /* For ioctl operations on the network interface, use either capturingSkfd -+ * or encapsulatingSkfd, whichever is available */ -+ ioctlSkfd = (capturingSkfd >= 0) ? capturingSkfd : encapsulatingSkfd; -+ -+ /* Retrieve the MAC address of the interface. */ -+ memset(&ifr, 0, sizeof(struct ifreq)); -+ strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); -+ ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ -+ if (ioctl(ioctlSkfd, SIOCGIFHWADDR, &ifr) < 0) -+ { -+ BmfPError("ioctl(SIOCGIFHWADDR) error for interface \"%s\"", ifName); -+ close(capturingSkfd); -+ close(encapsulatingSkfd); -+ free(newIf); -+ return 0; -+ } -+ -+ /* Copy data into TBmfInterface object */ -+ newIf->capturingSkfd = capturingSkfd; -+ newIf->encapsulatingSkfd = encapsulatingSkfd; -+ newIf->listeningSkfd = listeningSkfd; -+ memcpy(newIf->macAddr, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN); -+ memcpy(newIf->ifName, ifName, IFNAMSIZ); -+ newIf->olsrIntf = olsrIntf; -+ if (olsrIntf != NULL) -+ { -+ /* For an OLSR-interface, copy the interface address and broadcast -+ * address from the OLSR interface object. Downcast to correct sockaddr -+ * subtype. */ -+ newIf->intAddr.v4 = olsrIntf->int_addr.sin_addr; -+ newIf->broadAddr.v4 = olsrIntf->int_broadaddr.sin_addr; -+ } -+ else -+ { -+ /* For a non-OLSR interface, retrieve the IP address ourselves */ -+ memset(&ifr, 0, sizeof(struct ifreq)); -+ strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); -+ ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ -+ if (ioctl(ioctlSkfd, SIOCGIFADDR, &ifr) < 0) -+ { -+ BmfPError("ioctl(SIOCGIFADDR) error for interface \"%s\"", ifName); -+ -+ newIf->intAddr.v4.s_addr = inet_addr("0.0.0.0"); -+ } -+ else -+ { -+ /* Downcast to correct sockaddr subtype */ -+ newIf->intAddr.v4 = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr; -+ } -+ -+ /* For a non-OLSR interface, retrieve the IP broadcast address ourselves */ -+ memset(&ifr, 0, sizeof(struct ifreq)); -+ strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1); -+ ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ -+ if (ioctl(ioctlSkfd, SIOCGIFBRDADDR, &ifr) < 0) -+ { -+ BmfPError("ioctl(SIOCGIFBRDADDR) error for interface \"%s\"", ifName); -+ -+ newIf->broadAddr.v4.s_addr = inet_addr("0.0.0.0"); -+ } -+ else -+ { -+ /* Downcast to correct sockaddr subtype */ -+ newIf->broadAddr.v4 = ((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr; -+ } -+ } -+ -+ /* Initialize fragment history table */ -+ //memset(&newIf->fragmentHistory, 0, sizeof(newIf->fragmentHistory)); -+ //newIf->nextFragmentHistoryEntry = 0; -+ -+ /* Reset counters */ -+ //newIf->nBmfPacketsRx = 0; -+ //newIf->nBmfPacketsRxDup = 0; -+ //newIf->nBmfPacketsTx = 0; -+ -+ /* Add new TBmfInterface object to global list. OLSR interfaces are -+ * added at the front of the list, non-OLSR interfaces at the back. */ -+ if (BmfInterfaces == NULL) -+ { -+ /* First TBmfInterface object in list */ -+ BmfInterfaces = newIf; -+ LastBmfInterface = newIf; -+ } -+ else if (olsrIntf != NULL) -+ { -+ /* Add new TBmfInterface object at front of list */ -+ newIf->next = BmfInterfaces; -+ BmfInterfaces = newIf; -+ } -+ else -+ { -+ /* Add new TBmfInterface object at back of list */ -+ newIf->next = NULL; -+ LastBmfInterface->next= newIf; -+ LastBmfInterface = newIf; -+ } -+ -+ OLSR_PRINTF( -+ 8, -+ "%s: opened %d socket%s on %s interface \"%s\"\n", -+ PLUGIN_NAME_SHORT, -+ nOpened, -+ nOpened == 1 ? "" : "s", -+ olsrIntf != NULL ? "OLSR" : "non-OLSR", -+ ifName); -+ -+ return nOpened; -+} /* CreateInterface */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : CreateBmfNetworkInterfaces -+ * Description: Create a list of TBmfInterface objects, one for each network -+ * interface on which BMF runs -+ * Input : skipThisIntf - network interface to skip, if seen -+ * Output : none -+ * Return : fail (-1) or success (0) -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+int CreateBmfNetworkInterfaces(struct interface* skipThisIntf) -+{ -+ int skfd; -+ struct ifconf ifc; -+ int numreqs = 30; -+ struct ifreq* ifr; -+ int n; -+ int nOpenedSockets = 0; -+ -+ /* Clear input descriptor set */ -+ FD_ZERO(&InputSet); -+ -+ skfd = socket(PF_INET, SOCK_DGRAM, 0); -+ if (skfd < 0) -+ { -+ BmfPError("no inet socket available to retrieve interface list"); -+ return -1; -+ } -+ -+ /* Retrieve the network interface configuration list */ -+ ifc.ifc_buf = NULL; -+ for (;;) -+ { -+ ifc.ifc_len = sizeof(struct ifreq) * numreqs; -+ ifc.ifc_buf = realloc(ifc.ifc_buf, ifc.ifc_len); -+ -+ if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) -+ { -+ BmfPError("ioctl(SIOCGIFCONF) error"); -+ -+ close(skfd); -+ free(ifc.ifc_buf); -+ return -1; -+ } -+ if ((unsigned)ifc.ifc_len == sizeof(struct ifreq) * numreqs) -+ { -+ /* Assume it overflowed; double the space and try again */ -+ numreqs *= 2; -+ assert(numreqs < 1024); -+ continue; /* for (;;) */ -+ } -+ break; /* for (;;) */ -+ } /* for (;;) */ -+ -+ close(skfd); -+ -+ /* For each item in the interface configuration list... */ -+ ifr = ifc.ifc_req; -+ for (n = ifc.ifc_len / sizeof(struct ifreq); --n >= 0; ifr++) -+ { -+ struct interface* olsrIntf; -+ union olsr_ip_addr ipAddr; -+ -+ /* Skip the BMF network interface itself */ -+ //if (strncmp(ifr->ifr_name, EtherTunTapIfName, IFNAMSIZ) == 0) -+ //{ -+ // continue; /* for (n = ...) */ -+ //} -+ -+ /* ...find the OLSR interface structure, if any */ -+ ipAddr.v4 = ((struct sockaddr_in*)&ifr->ifr_addr)->sin_addr; -+ olsrIntf = if_ifwithaddr(&ipAddr); -+ -+ if (skipThisIntf != NULL && olsrIntf == skipThisIntf) -+ { -+ continue; /* for (n = ...) */ -+ } -+ -+ if (olsrIntf == NULL && ! IsNonOlsrBmfIf(ifr->ifr_name)) -+ { -+ /* Interface is neither OLSR interface, nor specified as non-OLSR BMF -+ * interface in the BMF plugin parameter list */ -+ continue; /* for (n = ...) */ -+ } -+ -+ if (! IsNonOlsrBmfIf(ifr->ifr_name)) -+ { -+ //If the interface is not specified in the configuration file then go ahead -+ continue; /* for (n = ...) */ -+ } -+ //TODO: asser if->ifr_name is not talking OLSR -+ //nOpenedSockets += CreateInterface(ifr->ifr_name, olsrIntf); -+ nOpenedSockets += CreateInterface(ifr->ifr_name, NULL); -+ -+ } /* for (n = ...) */ -+ -+ free(ifc.ifc_buf); -+ -+ /* Create the BMF network interface */ -+ //EtherTunTapFd = CreateLocalEtherTunTap(); -+ //if (EtherTunTapFd >= 0) -+ //{ -+ // nOpenedSockets++; -+ //} -+ -+ if (BmfInterfaces == NULL) -+ { -+ OLSR_PRINTF(1, "%s: could not initialize any network interface\n", PLUGIN_NAME); -+ } -+ else -+ { -+ OLSR_PRINTF(1, "%s: opened %d sockets\n", PLUGIN_NAME, nOpenedSockets); -+ } -+ return 0; -+} /* CreateBmfNetworkInterfaces */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : AddInterface -+ * Description: Add an OLSR-enabled network interface to the list of BMF-enabled -+ * network interfaces -+ * Input : newIntf - network interface to add -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+void AddInterface(struct interface* newIntf) -+{ -+ int nOpened; -+ -+ assert(newIntf != NULL); -+ -+ nOpened = CreateInterface(newIntf->int_name, newIntf); -+ -+ OLSR_PRINTF(1, "%s: opened %d sockets\n", PLUGIN_NAME, nOpened); -+} /* AddInterface */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : CloseBmfNetworkInterfaces -+ * Description: Closes every socket on each network interface used by BMF -+ * Input : none -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * Notes : Closes -+ * - the local EtherTunTap interface (e.g. "tun0" or "tap0") -+ * - for each BMF-enabled interface, the socket used for -+ * capturing multicast packets -+ * - for each OLSR-enabled interface, the socket used for -+ * encapsulating packets -+ * Also restores the network state to the situation before BMF -+ * was started. -+ * ------------------------------------------------------------------------- */ -+void CloseBmfNetworkInterfaces(void) -+{ -+ int nClosed = 0; -+ u_int32_t totalOlsrBmfPacketsRx = 0; -+ u_int32_t totalOlsrBmfPacketsRxDup = 0; -+ u_int32_t totalOlsrBmfPacketsTx = 0; -+ u_int32_t totalNonOlsrBmfPacketsRx = 0; -+ u_int32_t totalNonOlsrBmfPacketsRxDup = 0; -+ u_int32_t totalNonOlsrBmfPacketsTx = 0; -+ -+ /* Close all opened sockets */ -+ struct TBmfInterface* nextBmfIf = BmfInterfaces; -+ while (nextBmfIf != NULL) -+ { -+ struct TBmfInterface* bmfIf = nextBmfIf; -+ nextBmfIf = bmfIf->next; -+ -+ if (bmfIf->capturingSkfd >= 0) -+ { -+ close(bmfIf->capturingSkfd); -+ nClosed++; -+ } -+ if (bmfIf->encapsulatingSkfd >= 0) -+ { -+ close(bmfIf->encapsulatingSkfd); -+ nClosed++; -+ } -+ -+ OLSR_PRINTF( -+ 7, -+ "%s: %s interface \"%s\": RX pkts %u (%u dups); TX pkts %u\n", -+ PLUGIN_NAME_SHORT, -+ bmfIf->olsrIntf != NULL ? "OLSR" : "non-OLSR", -+ bmfIf->ifName, -+ bmfIf->nBmfPacketsRx, -+ bmfIf->nBmfPacketsRxDup, -+ bmfIf->nBmfPacketsTx); -+ -+ OLSR_PRINTF( -+ 1, -+ "%s: closed %s interface \"%s\"\n", -+ PLUGIN_NAME_SHORT, -+ bmfIf->olsrIntf != NULL ? "OLSR" : "non-OLSR", -+ bmfIf->ifName); -+ -+ /* Add totals */ -+ if (bmfIf->olsrIntf != NULL) -+ { -+ totalOlsrBmfPacketsRx += bmfIf->nBmfPacketsRx; -+ totalOlsrBmfPacketsRxDup += bmfIf->nBmfPacketsRxDup; -+ totalOlsrBmfPacketsTx += bmfIf->nBmfPacketsTx; -+ } -+ else -+ { -+ totalNonOlsrBmfPacketsRx += bmfIf->nBmfPacketsRx; -+ totalNonOlsrBmfPacketsRxDup += bmfIf->nBmfPacketsRxDup; -+ totalNonOlsrBmfPacketsTx += bmfIf->nBmfPacketsTx; -+ } -+ -+ free(bmfIf); -+ } /* while */ -+ -+ if (EtherTunTapFd >= 0) -+ { -+ close(EtherTunTapFd); -+ nClosed++; -+ -+ OLSR_PRINTF(7, "%s: closed \"%s\"\n", PLUGIN_NAME_SHORT, EtherTunTapIfName); -+ } -+ -+ BmfInterfaces = NULL; -+ -+ OLSR_PRINTF(1, "%s: closed %d sockets\n", PLUGIN_NAME_SHORT, nClosed); -+ -+ OLSR_PRINTF( -+ 7, -+ "%s: Total all OLSR interfaces : RX pkts %u (%u dups); TX pkts %u\n", -+ PLUGIN_NAME_SHORT, -+ totalOlsrBmfPacketsRx, -+ totalOlsrBmfPacketsRxDup, -+ totalOlsrBmfPacketsTx); -+ OLSR_PRINTF( -+ 7, -+ "%s: Total all non-OLSR interfaces: RX pkts %u (%u dups); TX pkts %u\n", -+ PLUGIN_NAME_SHORT, -+ totalNonOlsrBmfPacketsRx, -+ totalNonOlsrBmfPacketsRxDup, -+ totalNonOlsrBmfPacketsTx); -+} /* CloseBmfNetworkInterfaces */ -+ -+#define MAX_NON_OLSR_IFS 32 -+static char NonOlsrIfNames[MAX_NON_OLSR_IFS][IFNAMSIZ]; -+static int nNonOlsrIfs = 0; -+ -+/* ------------------------------------------------------------------------- -+ * Function : AddNonOlsrBmfIf -+ * Description: Add an non-OLSR enabled network interface to the list of BMF-enabled -+ * network interfaces -+ * Input : ifName - network interface (e.g. "eth0") -+ * data - not used -+ * addon - not used -+ * Output : none -+ * Return : success (0) or fail (1) -+ * Data Used : NonOlsrIfNames -+ * ------------------------------------------------------------------------- */ -+int AddNonOlsrBmfIf( -+ const char* ifName, -+ void* data __attribute__((unused)), -+ set_plugin_parameter_addon addon __attribute__((unused))) -+{ -+ assert(ifName != NULL); -+ -+ if (nNonOlsrIfs >= MAX_NON_OLSR_IFS) -+ { -+ OLSR_PRINTF( -+ 1, -+ "%s: too many non-OLSR interfaces specified, maximum is %d\n", -+ PLUGIN_NAME, -+ MAX_NON_OLSR_IFS); -+ return 1; -+ } -+ -+ strncpy(NonOlsrIfNames[nNonOlsrIfs], ifName, IFNAMSIZ - 1); -+ NonOlsrIfNames[nNonOlsrIfs][IFNAMSIZ - 1] = '\0'; /* Ensures null termination */ -+ nNonOlsrIfs++; -+ return 0; -+} /* AddNonOlsrBmfIf */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : IsNonOlsrBmfIf -+ * Description: Checks if a network interface is OLSR-enabled -+ * Input : ifName - network interface (e.g. "eth0") -+ * Output : none -+ * Return : true (1) or false (0) -+ * Data Used : NonOlsrIfNames -+ * ------------------------------------------------------------------------- */ -+int IsNonOlsrBmfIf(const char* ifName) -+{ -+ int i; -+ -+ assert(ifName != NULL); -+ -+ for (i = 0; i < nNonOlsrIfs; i++) -+ { -+ if (strncmp(NonOlsrIfNames[i], ifName, IFNAMSIZ) == 0) return 1; -+ } -+ return 0; -+} /* IsNonOlsrBmfIf */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : CheckAndUpdateLocalBroadcast -+ * Description: For an IP packet, check if the destination address is not a -+ * multicast address. If it is not, the packet is assumed to be -+ * a local broadcast packet. In that case, set the destination -+ * address of the IP packet to the passed broadcast address. -+ * Input : ipPacket - the IP packet -+ * broadAddr - the broadcast address to fill in -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * Notes : See also RFC1141 -+ * ------------------------------------------------------------------------- */ -+void CheckAndUpdateLocalBroadcast(unsigned char* ipPacket, union olsr_ip_addr* broadAddr) -+{ -+ struct iphdr* iph; -+ union olsr_ip_addr destIp; -+ -+ assert(ipPacket != NULL && broadAddr != NULL); -+ -+ iph = (struct iphdr*) ipPacket; -+ destIp.v4.s_addr = iph->daddr; -+ if (! IsMulticast(&destIp)) -+ { -+ u_int32_t origDaddr, newDaddr; -+ u_int32_t check; -+ -+ origDaddr = ntohl(iph->daddr); -+ -+ iph->daddr = broadAddr->v4.s_addr; -+ newDaddr = ntohl(iph->daddr); -+ -+ /* Re-calculate IP header checksum for new destination */ -+ check = ntohs(iph->check); -+ -+ check = ~ (~ check - ((origDaddr >> 16) & 0xFFFF) + ((newDaddr >> 16) & 0xFFFF)); -+ check = ~ (~ check - (origDaddr & 0xFFFF) + (newDaddr & 0xFFFF)); -+ -+ /* Add carry */ -+ check = check + (check >> 16); -+ -+ iph->check = htons(check); -+ -+ if (iph->protocol == SOL_UDP) -+ { -+ /* Re-calculate UDP/IP checksum for new destination */ -+ -+ int ipHeaderLen = GetIpHeaderLength(ipPacket); -+ struct udphdr* udph = (struct udphdr*) (ipPacket + ipHeaderLen); -+ -+ /* RFC 1624, Eq. 3: HC' = ~(~HC - m + m') */ -+ -+ check = ntohs(udph->check); -+ -+ check = ~ (~ check - ((origDaddr >> 16) & 0xFFFF) + ((newDaddr >> 16) & 0xFFFF)); -+ check = ~ (~ check - (origDaddr & 0xFFFF) + (newDaddr & 0xFFFF)); -+ -+ /* Add carry */ -+ check = check + (check >> 16); -+ -+ udph->check = htons(check); -+ } /* if */ -+ } /* if */ -+} /* CheckAndUpdateLocalBroadcast */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : AddMulticastRoute -+ * Description: Insert a route to all multicast addresses in the kernel -+ * routing table. The route will be via the BMF network interface. -+ * Input : none -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+void AddMulticastRoute(void) -+{ -+ struct rtentry kernel_route; -+ int ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0); -+ if (ioctlSkfd < 0) -+ { -+ BmfPError("socket(PF_INET) error"); -+ return; -+ } -+ -+ memset(&kernel_route, 0, sizeof(struct rtentry)); -+ -+ ((struct sockaddr_in*)&kernel_route.rt_dst)->sin_family = AF_INET; -+ ((struct sockaddr_in*)&kernel_route.rt_gateway)->sin_family = AF_INET; -+ ((struct sockaddr_in*)&kernel_route.rt_genmask)->sin_family = AF_INET; -+ -+ /* 224.0.0.0/4 */ -+ ((struct sockaddr_in *)&kernel_route.rt_dst)->sin_addr.s_addr = htonl(0xE0000000); -+ ((struct sockaddr_in *)&kernel_route.rt_genmask)->sin_addr.s_addr = htonl(0xF0000000); -+ -+ kernel_route.rt_metric = 0; -+ kernel_route.rt_flags = RTF_UP; -+ -+ kernel_route.rt_dev = EtherTunTapIfName; -+ -+ if (ioctl(ioctlSkfd, SIOCADDRT, &kernel_route) < 0) -+ { -+ BmfPError("error setting multicast route via EtherTunTap interface \"%s\"", EtherTunTapIfName); -+ -+ /* Continue anyway */ -+ } -+ close(ioctlSkfd); -+} /* AddMulticastRoute */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : DeleteMulticastRoute -+ * Description: Delete the route to all multicast addresses from the kernel -+ * routing table -+ * Input : none -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+void DeleteMulticastRoute(void) -+{ -+ if (EtherTunTapIp != ETHERTUNTAPDEFAULTIP) -+ { -+ struct rtentry kernel_route; -+ int ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0); -+ if (ioctlSkfd < 0) -+ { -+ BmfPError("socket(PF_INET) error"); -+ return; -+ } -+ -+ memset(&kernel_route, 0, sizeof(struct rtentry)); -+ -+ ((struct sockaddr_in*)&kernel_route.rt_dst)->sin_family = AF_INET; -+ ((struct sockaddr_in*)&kernel_route.rt_gateway)->sin_family = AF_INET; -+ ((struct sockaddr_in*)&kernel_route.rt_genmask)->sin_family = AF_INET; -+ -+ /* 224.0.0.0/4 */ -+ ((struct sockaddr_in *)&kernel_route.rt_dst)->sin_addr.s_addr = htonl(0xE0000000); -+ ((struct sockaddr_in *)&kernel_route.rt_genmask)->sin_addr.s_addr = htonl(0xF0000000); -+ -+ kernel_route.rt_metric = 0; -+ kernel_route.rt_flags = RTF_UP; -+ -+ kernel_route.rt_dev = EtherTunTapIfName; -+ -+ if (ioctl(ioctlSkfd, SIOCDELRT, &kernel_route) < 0) -+ { -+ BmfPError("error deleting multicast route via EtherTunTap interface \"%s\"", EtherTunTapIfName); -+ -+ /* Continue anyway */ -+ } -+ close(ioctlSkfd); -+ } /* if */ -+} /* DeleteMulticastRoute */ -+ -+/* -+ * Local Variables: -+ * c-basic-offset: 2 -+ * indent-tabs-mode: nil -+ * End: -+ */ ---- /dev/null -+++ b/lib/mdns/src/NetworkInterfaces.h -@@ -0,0 +1,162 @@ -+#ifndef _BMF_NETWORKINTERFACES_H -+#define _BMF_NETWORKINTERFACES_H -+ -+/* -+ * OLSR Basic Multicast Forwarding (BMF) plugin. -+ * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. -+ * Written by Erik Tromp. -+ * 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 Thales, BMF 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. -+ */ -+ -+/* ------------------------------------------------------------------------- -+ * File : NetworkInterfaces.h -+ * Description: Functions to open and close sockets -+ * Created : 29 Jun 2006 -+ * -+ * ------------------------------------------------------------------------- */ -+ -+/* System includes */ -+#include /* struct in_addr */ -+ -+/* OLSR includes */ -+#include "olsr_types.h" /* olsr_ip_addr */ -+#include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ -+#include "socket_parser.h" -+/* Plugin includes */ -+#include "Packet.h" /* IFHWADDRLEN */ -+#include "mdns.h" -+/* Size of buffer in which packets are received */ -+#define BMF_BUFFER_SIZE 2048 -+ -+struct TBmfInterface -+{ -+ /* File descriptor of raw packet socket, used for capturing multicast packets */ -+ int capturingSkfd; -+ -+ /* File descriptor of UDP (datagram) socket for encapsulated multicast packets. -+ * Only used for OLSR-enabled interfaces; set to -1 if interface is not OLSR-enabled. */ -+ int encapsulatingSkfd; -+ -+ /* File descriptor of UDP packet socket, used for listening to encapsulation packets. -+ * Used only when PlParam "BmfMechanism" is set to "UnicastPromiscuous". */ -+ int listeningSkfd; -+ -+ unsigned char macAddr[IFHWADDRLEN]; -+ -+ char ifName[IFNAMSIZ]; -+ -+ /* OLSRs idea of this network interface. NULL if this interface is not -+ * OLSR-enabled. */ -+ struct interface* olsrIntf; -+ -+ /* IP address of this network interface */ -+ union olsr_ip_addr intAddr; -+ -+ /* Broadcast address of this network interface */ -+ union olsr_ip_addr broadAddr; -+ -+ #define FRAGMENT_HISTORY_SIZE 10 -+ struct TFragmentHistory -+ { -+ u_int16_t ipId; -+ u_int8_t ipProto; -+ struct in_addr ipSrc; -+ struct in_addr ipDst; -+ } fragmentHistory [FRAGMENT_HISTORY_SIZE]; -+ -+ int nextFragmentHistoryEntry; -+ -+ /* Number of received and transmitted BMF packets on this interface */ -+ u_int32_t nBmfPacketsRx; -+ u_int32_t nBmfPacketsRxDup; -+ u_int32_t nBmfPacketsTx; -+ -+ /* Next element in list */ -+ struct TBmfInterface* next; -+}; -+ -+extern struct TBmfInterface* BmfInterfaces; -+ -+extern int HighestSkfd; -+extern fd_set InputSet; -+ -+extern int EtherTunTapFd; -+ -+extern char EtherTunTapIfName[]; -+ -+/* 10.255.255.253 in host byte order */ -+#define ETHERTUNTAPDEFAULTIP 0x0AFFFFFD -+ -+extern u_int32_t EtherTunTapIp; -+extern u_int32_t EtherTunTapIpMask; -+extern u_int32_t EtherTunTapIpBroadcast; -+ -+extern int CapturePacketsOnOlsrInterfaces; -+ -+enum TBmfMechanism { BM_BROADCAST = 0, BM_UNICAST_PROMISCUOUS }; -+extern enum TBmfMechanism BmfMechanism; -+ -+int SetBmfInterfaceName(const char* ifname, void* data, set_plugin_parameter_addon addon); -+int SetBmfInterfaceIp(const char* ip, void* data, set_plugin_parameter_addon addon); -+int SetCapturePacketsOnOlsrInterfaces(const char* enable, void* data, set_plugin_parameter_addon addon); -+int SetBmfMechanism(const char* mechanism, void* data, set_plugin_parameter_addon addon); -+int DeactivateSpoofFilter(void); -+void RestoreSpoofFilter(void); -+ -+#define MAX_UNICAST_NEIGHBORS 10 -+struct TBestNeighbors -+{ -+ struct link_entry* links[MAX_UNICAST_NEIGHBORS]; -+}; -+ -+void FindNeighbors( -+ struct TBestNeighbors* neighbors, -+ struct link_entry** bestNeighbor, -+ struct TBmfInterface* intf, -+ union olsr_ip_addr* source, -+ union olsr_ip_addr* forwardedBy, -+ union olsr_ip_addr* forwardedTo, -+ int* nPossibleNeighbors); -+ -+int CreateBmfNetworkInterfaces(struct interface* skipThisIntf); -+void AddInterface(struct interface* newIntf); -+void CloseBmfNetworkInterfaces(void); -+int AddNonOlsrBmfIf(const char* ifName, void* data, set_plugin_parameter_addon addon); -+int IsNonOlsrBmfIf(const char* ifName); -+void CheckAndUpdateLocalBroadcast(unsigned char* ipPacket, union olsr_ip_addr* broadAddr); -+void AddMulticastRoute(void); -+void DeleteMulticastRoute(void); -+ -+#endif /* _BMF_NETWORKINTERFACES_H */ -+ -+/* -+ * Local Variables: -+ * c-basic-offset: 2 -+ * indent-tabs-mode: nil -+ * End: -+ */ ---- /dev/null -+++ b/lib/mdns/src/Packet.c -@@ -0,0 +1,238 @@ -+/* -+ * OLSR Basic Multicast Forwarding (BMF) plugin. -+ * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. -+ * Written by Erik Tromp. -+ * 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 Thales, BMF 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. -+ */ -+ -+/* ------------------------------------------------------------------------- -+ * File : Packet.c -+ * Description: IP packet and Ethernet frame processing functions -+ * Created : 29 Jun 2006 -+ * -+ * ------------------------------------------------------------------------- */ -+ -+#include "Packet.h" -+ -+/* System includes */ -+#include /* NULL */ -+#include /* assert() */ -+#include /* memcpy() */ -+#include /* u_int8_t, u_int16_t, u_int32_t */ -+#include /* ntohs(), htons() */ -+#include /* struct iphdr */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : IsIpFragment -+ * Description: Check if an IP packet is an IP fragment -+ * Input : ipPacket - the IP packet -+ * Output : none -+ * Return : true (1) or false (0) -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+int IsIpFragment(unsigned char* ipPacket) -+{ -+ struct ip* iph; -+ -+ assert(ipPacket != NULL); -+ -+ iph = (struct ip*) ipPacket; -+ if ((ntohs(iph->ip_off) & IP_OFFMASK) != 0) -+ { -+ return 1; -+ } -+ return 0; -+} /* IsIpFragment */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : GetIpTotalLength -+ * Description: Retrieve the total length of the IP packet (in bytes) of -+ * an IP packet -+ * Input : ipPacket - the IP packet -+ * Output : none -+ * Return : IP packet length -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+u_int16_t GetIpTotalLength(unsigned char* ipPacket) -+{ -+ struct iphdr* iph; -+ -+ assert(ipPacket != NULL); -+ -+ iph = (struct iphdr*) ipPacket; -+ return ntohs(iph->tot_len); -+} /* GetIpTotalLength */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : GetIpHeaderLength -+ * Description: Retrieve the IP header length (in bytes) of an IP packet -+ * Input : ipPacket - the IP packet -+ * Output : none -+ * Return : IP header length -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+unsigned int GetIpHeaderLength(unsigned char* ipPacket) -+{ -+ struct iphdr* iph; -+ -+ assert(ipPacket != NULL); -+ -+ iph = (struct iphdr*) ipPacket; -+ return iph->ihl << 2; -+} /* GetIpHeaderLength */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : GetTtl -+ * Description: Retrieve the TTL (Time To Live) value from the IP header of -+ * an IP packet -+ * Input : ipPacket - the IP packet -+ * Output : none -+ * Return : TTL value -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+u_int8_t GetTtl(unsigned char* ipPacket) -+{ -+ struct iphdr* iph; -+ -+ assert(ipPacket != NULL); -+ -+ iph = (struct iphdr*) ipPacket; -+ return iph->ttl; -+} /* GetTtl */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : SaveTtlAndChecksum -+ * Description: Save the TTL (Time To Live) value and IP checksum as found in -+ * the IP header of an IP packet -+ * Input : ipPacket - the IP packet -+ * Output : sttl - the TTL and checksum values -+ * Return : none -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+void SaveTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl) -+{ -+ struct iphdr* iph; -+ -+ assert(ipPacket != NULL && sttl != NULL); -+ -+ iph = (struct iphdr*) ipPacket; -+ sttl->ttl = iph->ttl; -+ sttl->check = ntohs(iph->check); -+} /* SaveTtlAndChecksum */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : RestoreTtlAndChecksum -+ * Description: Restore the TTL (Time To Live) value and IP checksum in -+ * the IP header of an IP packet -+ * Input : ipPacket - the IP packet -+ * sttl - the TTL and checksum values -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+void RestoreTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl) -+{ -+ struct iphdr* iph; -+ -+ assert(ipPacket != NULL && sttl != NULL); -+ -+ iph = (struct iphdr*) ipPacket; -+ iph->ttl = sttl->ttl; -+ iph->check = htons(sttl->check); -+} /* RestoreTtlAndChecksum */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : DecreaseTtlAndUpdateHeaderChecksum -+ * Description: For an IP packet, decrement the TTL value and update the IP header -+ * checksum accordingly. -+ * Input : ipPacket - the IP packet -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * Notes : See also RFC1141 -+ * ------------------------------------------------------------------------- */ -+void DecreaseTtlAndUpdateHeaderChecksum(unsigned char* ipPacket) -+{ -+ struct iphdr* iph; -+ u_int32_t sum; -+ -+ assert(ipPacket != NULL); -+ -+ iph = (struct iphdr*) ipPacket; -+ -+ iph->ttl--; /* decrement ttl */ -+ sum = ntohs(iph->check) + 0x100; /* increment checksum high byte */ -+ iph->check = htons(sum + (sum>>16)); /* add carry */ -+} /* DecreaseTtlAndUpdateHeaderChecksum */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : GetIpHeader -+ * Description: Retrieve the IP header from BMF encapsulation UDP data -+ * Input : encapsulationUdpData - the encapsulation UDP data -+ * Output : none -+ * Return : IP header -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+struct ip* GetIpHeader(unsigned char* encapsulationUdpData) -+{ -+ return (struct ip*)(encapsulationUdpData + ENCAP_HDR_LEN); -+} /* GetIpHeader */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : GetIpPacket -+ * Description: Retrieve the IP packet from BMF encapsulation UDP data -+ * Input : encapsulationUdpData - the encapsulation UDP data -+ * Output : none -+ * Return : The IP packet -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+unsigned char* GetIpPacket(unsigned char* encapsulationUdpData) -+{ -+ return encapsulationUdpData + ENCAP_HDR_LEN; -+} /* GetIpPacket */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : GetEncapsulationUdpDataLength -+ * Description: Return the length of BMF encapsulation UDP data -+ * Input : encapsulationUdpData - the encapsulation UDP data -+ * Output : none -+ * Return : The encapsulation data length -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+u_int16_t GetEncapsulationUdpDataLength(unsigned char* encapsulationUdpData) -+{ -+ return GetIpTotalLength(GetIpPacket(encapsulationUdpData)) + ENCAP_HDR_LEN; -+} /* GetEncapsulationUdpDataLength */ -+ -+ -+/* -+ * Local Variables: -+ * c-basic-offset: 2 -+ * indent-tabs-mode: nil -+ * End: -+ */ ---- /dev/null -+++ b/lib/mdns/src/Packet.h -@@ -0,0 +1,88 @@ -+#ifndef _BMF_PACKET_H -+#define _BMF_PACKET_H -+ -+/* -+ * OLSR Basic Multicast Forwarding (BMF) plugin. -+ * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. -+ * Written by Erik Tromp. -+ * 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 Thales, BMF 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. -+ */ -+ -+/* ------------------------------------------------------------------------- -+ * File : Packet.h -+ * Description: BMF and IP packet processing functions -+ * Created : 29 Jun 2006 -+ * -+ * ------------------------------------------------------------------------- */ -+ -+/* System includes */ -+#include /* IFNAMSIZ, IFHWADDRLEN */ -+#include /* u_int8_t, u_int16_t */ -+ -+/* BMF-encapsulated packets are Ethernet-IP-UDP packets, which start -+ * with a 8-bytes BMF header (struct TEncapHeader), followed by the -+ * encapsulated Ethernet-IP packet itself */ -+ -+struct TEncapHeader -+{ -+ /* Use a standard Type-Length-Value (TLV) element */ -+ u_int8_t type; -+ u_int8_t len; -+ u_int16_t reserved; /* Always 0 */ -+ u_int32_t crc32; -+} __attribute__((__packed__)); -+ -+#define ENCAP_HDR_LEN ((int)sizeof(struct TEncapHeader)) -+#define BMF_ENCAP_TYPE 1 -+#define BMF_ENCAP_LEN 6 -+ -+struct TSaveTtl -+{ -+ u_int8_t ttl; -+ u_int16_t check; -+} __attribute__((__packed__)); -+ -+int IsIpFragment(unsigned char* ipPacket); -+u_int16_t GetIpTotalLength(unsigned char* ipPacket); -+unsigned int GetIpHeaderLength(unsigned char* ipPacket); -+u_int8_t GetTtl(unsigned char* ipPacket); -+void SaveTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl); -+void RestoreTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl); -+void DecreaseTtlAndUpdateHeaderChecksum(unsigned char* ipPacket); -+struct ip* GetIpHeader(unsigned char* encapsulationUdpData); -+unsigned char* GetIpPacket(unsigned char* encapsulationUdpData); -+u_int16_t GetEncapsulationUdpDataLength(unsigned char* encapsulationUdpData); -+ -+#endif /* _BMF_PACKET_H */ -+ -+/* -+ * Local Variables: -+ * c-basic-offset: 2 -+ * indent-tabs-mode: nil -+ * End: -+ */ ---- /dev/null -+++ b/lib/mdns/src/PacketHistory.c -@@ -0,0 +1,324 @@ -+/* -+ * OLSR Basic Multicast Forwarding (BMF) plugin. -+ * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. -+ * Written by Erik Tromp. -+ * 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 Thales, BMF 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. -+ */ -+ -+/* ------------------------------------------------------------------------- -+ * File : PacketHistory.c -+ * Description: Functions for keeping and accessing the history of processed -+ * multicast IP packets. -+ * Created : 29 Jun 2006 -+ * -+ * ------------------------------------------------------------------------- */ -+ -+#include "PacketHistory.h" -+ -+/* System includes */ -+#include /* NULL */ -+#include /* assert() */ -+#include /* memset */ -+#include /* u_int16_t, u_int32_t */ -+#include /* struct iphdr */ -+#include /* atoi, malloc */ -+ -+/* OLSRD includes */ -+#include "defs.h" /* GET_TIMESTAMP, TIMED_OUT */ -+#include "olsr.h" /* OLSR_PRINTF */ -+#include "scheduler.h" /* now_times */ -+ -+/* Plugin includes */ -+#include "Packet.h" -+ -+static struct TDupEntry* PacketHistory[HISTORY_HASH_SIZE]; -+ -+#define CRC_UPTO_NBYTES 256 -+ -+#if 0 -+/* ------------------------------------------------------------------------- -+ * Function : CalcCrcCcitt -+ * Description: Calculate 16-bits CRC according to CRC-CCITT specification -+ * Input : buffer - the bytes to calculate the CRC value over -+ * len - the number of bytes to calculate the CRC value over -+ * Output : none -+ * Return : CRC-16 value -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+static u_int16_t CalcCrcCcitt(unsigned char* buffer, ssize_t len) -+{ -+ /* Initial value of 0xFFFF should be 0x1D0F according to -+ * www.joegeluso.com/software/articles/ccitt.htm */ -+ u_int16_t crc = 0xFFFF; -+ int i; -+ -+ assert(buffer != NULL); -+ -+ for (i = 0; i < len; i++) -+ { -+ crc = (unsigned char)(crc >> 8) | (crc << 8); -+ crc ^= buffer[i]; -+ crc ^= (unsigned char)(crc & 0xff) >> 4; -+ crc ^= (crc << 8) << 4; -+ crc ^= ((crc & 0xff) << 4) << 1; -+ } -+ return crc; -+} /* CalcCrcCcitt */ -+#endif -+ -+/* ------------------------------------------------------------------------- -+ * Function : GenerateCrc32Table -+ * Description: Generate the table of CRC remainders for all possible bytes, -+ * according to CRC-32-IEEE 802.3 -+ * Input : none -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+#define CRC32_POLYNOMIAL 0xedb88320UL /* bit-inverse of 0x04c11db7UL */ -+ -+static unsigned long CrcTable[256]; -+ -+static void GenerateCrc32Table(void) -+{ -+ int i, j; -+ u_int32_t crc; -+ for (i = 0; i < 256; i++) -+ { -+ crc = (u_int32_t) i; -+ for (j = 0; j < 8; j++) -+ { -+ if (crc & 1) -+ { -+ crc = (crc >> 1) ^ CRC32_POLYNOMIAL; -+ } -+ else -+ { -+ crc = (crc >> 1); -+ } -+ } -+ CrcTable[i] = crc; -+ } /* for */ -+} /* GenerateCrc32Table */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : CalcCrc32 -+ * Description: Calculate CRC-32 according to CRC-32-IEEE 802.3 -+ * Input : buffer - the bytes to calculate the CRC value over -+ * len - the number of bytes to calculate the CRC value over -+ * Output : none -+ * Return : CRC-32 value -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+static u_int32_t CalcCrc32(unsigned char* buffer, ssize_t len) -+{ -+ int i, j; -+ u_int32_t crc = 0xffffffffUL; -+ for (i = 0; i < len; i++) -+ { -+ j = ((int) (crc & 0xFF) ^ *buffer++); -+ crc = (crc >> 8) ^ CrcTable[j]; -+ } -+ return crc ^ 0xffffffffUL; -+} /* CalcCrc32 */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : PacketCrc32 -+ * Description: Calculates the CRC-32 value for an IP packet -+ * Input : ipPacket - the IP packet -+ * len - the number of octets in the IP packet -+ * Output : none -+ * Return : 32-bits CRC value -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+u_int32_t PacketCrc32(unsigned char* ipPacket, ssize_t len) -+{ -+ struct TSaveTtl sttl; -+ struct ip* ipHeader; -+ u_int32_t result; -+ -+ assert(ipPacket != NULL); -+ -+ /* Skip TTL: in a multi-homed OLSR-network, the same multicast packet -+ * may enter the network multiple times, each copy differing only in its -+ * TTL value. BMF must not calculate a different CRC for packets that -+ * differ only in TTL. Skip also the IP-header checksum, because it changes -+ * along with TTL. Besides, it is not a good idea to calculate a CRC over -+ * data that already contains a checksum. -+ * -+ * Clip number of bytes over which CRC is calculated to prevent -+ * long packets from possibly claiming too much CPU resources. */ -+ assert(len > 0); -+ if (len > CRC_UPTO_NBYTES) -+ { -+ len = CRC_UPTO_NBYTES; -+ } -+ -+ SaveTtlAndChecksum(ipPacket, &sttl); -+ -+ ipHeader = (struct ip*)ipPacket; -+ ipHeader->ip_ttl = 0xFF; /* fixed value of TTL for CRC-32 calculation */ -+ ipHeader->ip_sum = 0x5A5A; /* fixed value of IP header checksum for CRC-32 calculation */ -+ -+ result = CalcCrc32(ipPacket, len); -+ -+ RestoreTtlAndChecksum(ipPacket, &sttl); -+ return result; -+} /* PacketCrc32 */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : Hash -+ * Description: Calculates a hash value from a 32-bit value -+ * Input : from32 - 32-bit value -+ * Output : none -+ * Return : hash value -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+u_int32_t Hash(u_int32_t from32) -+{ -+ return ((from32 >> N_HASH_BITS) + from32) & ((1 << N_HASH_BITS) - 1); -+} /* Hash */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : InitPacketHistory -+ * Description: Initialize the packet history table and CRC-32 table -+ * Input : none -+ * Output : none -+ * Return : none -+ * Data Used : PacketHistory -+ * ------------------------------------------------------------------------- */ -+void InitPacketHistory(void) -+{ -+ int i; -+ -+ GenerateCrc32Table(); -+ -+ for(i = 0; i < HISTORY_HASH_SIZE; i++) -+ { -+ PacketHistory[i] = NULL; -+ } -+} /* InitPacketHistory */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : CheckAndMarkRecentPacket -+ * Description: Check if this packet was seen recently, then record the fact -+ * that this packet was seen recently. -+ * Input : crc32 - 32-bits crc value of the packet -+ * Output : none -+ * Return : not recently seen (0), recently seen (1) -+ * Data Used : PacketHistory -+ * ------------------------------------------------------------------------- */ -+int CheckAndMarkRecentPacket(u_int32_t crc32) -+{ -+ u_int32_t idx; -+ struct TDupEntry* walker; -+ struct TDupEntry* newEntry; -+ -+ idx = Hash(crc32); -+ assert(idx < HISTORY_HASH_SIZE); -+ -+ for (walker = PacketHistory[idx]; walker != NULL; walker = walker->next) -+ { -+ if (walker->crc32 == crc32) -+ { -+ /* Found duplicate entry */ -+ -+ /* Always mark as "seen recently": refresh time-out */ -+ walker->timeOut = GET_TIMESTAMP(HISTORY_HOLD_TIME); -+ -+ return 1; -+ } /* if */ -+ } /* for */ -+ -+ /* No duplicate entry found: create one */ -+ newEntry = malloc(sizeof(struct TDupEntry)); -+ if (newEntry != NULL) -+ { -+ newEntry->crc32 = crc32; -+ newEntry->timeOut = GET_TIMESTAMP(HISTORY_HOLD_TIME); -+ -+ /* Add new entry at the front of the list */ -+ newEntry->next = PacketHistory[idx]; -+ PacketHistory[idx] = newEntry; -+ } -+ -+ return 0; -+} /* CheckAndMarkRecentPacket */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : PrunePacketHistory -+ * Description: Prune the packet history table. -+ * Input : useless - not used -+ * Output : none -+ * Return : none -+ * Data Used : PacketHistory -+ * ------------------------------------------------------------------------- */ -+void PrunePacketHistory(void* useless __attribute__((unused))) -+{ -+ uint i; -+ for (i = 0; i < HISTORY_HASH_SIZE; i++) -+ { -+ if (PacketHistory[i] != NULL) -+ { -+ struct TDupEntry* nextEntry = PacketHistory[i]; -+ struct TDupEntry* prevEntry = NULL; -+ while (nextEntry != NULL) -+ { -+ struct TDupEntry* entry = nextEntry; -+ nextEntry = entry->next; -+ -+ if (TIMED_OUT(entry->timeOut)) -+ { -+ /* De-queue */ -+ if (prevEntry != NULL) -+ { -+ prevEntry->next = entry->next; -+ } -+ else -+ { -+ PacketHistory[i] = entry->next; -+ } /* if */ -+ -+ /* De-allocate memory */ -+ free(entry); -+ } -+ else -+ { -+ prevEntry = entry; -+ } /* if */ -+ } /* while */ -+ } /* if (PacketHistory[i] != NULL) */ -+ } /* for (i = ...) */ -+} /* PrunePacketHistory */ -+ -+/* -+ * Local Variables: -+ * c-basic-offset: 2 -+ * indent-tabs-mode: nil -+ * End: -+ */ ---- /dev/null -+++ b/lib/mdns/src/PacketHistory.h -@@ -0,0 +1,75 @@ -+#ifndef _BMF_PACKETHISTORY_H -+#define _BMF_PACKETHISTORY_H -+ -+/* -+ * OLSR Basic Multicast Forwarding (BMF) plugin. -+ * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. -+ * Written by Erik Tromp. -+ * 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 Thales, BMF 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. -+ */ -+ -+/* ------------------------------------------------------------------------- -+ * File : PacketHistory.h -+ * Description: Functions for keeping and accessing the history of processed -+ * multicast IP packets. -+ * Created : 29 Jun 2006 -+ * -+ * ------------------------------------------------------------------------- */ -+ -+/* System includes */ -+#include /* ssize_t */ -+#include /* clock_t */ -+ -+#define N_HASH_BITS 12 -+#define HISTORY_HASH_SIZE (1 << N_HASH_BITS) -+ -+/* Time-out of duplicate entries, in milliseconds */ -+#define HISTORY_HOLD_TIME 3000 -+ -+struct TDupEntry -+{ -+ u_int32_t crc32; -+ clock_t timeOut; -+ struct TDupEntry* next; -+}; -+ -+void InitPacketHistory(void); -+u_int32_t PacketCrc32(unsigned char* ipPkt, ssize_t len); -+u_int32_t Hash(u_int32_t from32); -+void MarkRecentPacket(u_int32_t crc32); -+int CheckAndMarkRecentPacket(u_int32_t crc32); -+void PrunePacketHistory(void*); -+ -+#endif /* _BMF_PACKETHISTORY_H */ -+ -+/* -+ * Local Variables: -+ * c-basic-offset: 2 -+ * indent-tabs-mode: nil -+ * End: -+ */ ---- /dev/null -+++ b/lib/mdns/src/mdns.c -@@ -0,0 +1,1174 @@ -+/* -+ * OLSR MDNS plugin. -+ * Written by Saverio Proto. -+ * -+ * 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 Thales, BMF 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. -+ */ -+ -+ -+//#define _MULTI_THREADED -+ -+#include "mdns.h" -+ -+/* System includes */ -+#include /* NULL */ -+#include /* ssize_t */ -+#include /* strerror() */ -+#include /* va_list, va_start, va_end */ -+#include /* errno */ -+#include /* assert() */ -+#include /* ETH_P_IP */ -+#include /* struct sockaddr_ll, PACKET_MULTICAST */ -+//#include /* pthread_t, pthread_create() */ -+#include /* sigset_t, sigfillset(), sigdelset(), SIGINT */ -+#include /* struct ip */ -+#include /* struct udphdr */ -+#include /* close() */ -+ -+#include -+#include -+ -+/* OLSRD includes */ -+#include "plugin_util.h" /* set_plugin_int */ -+#include "defs.h" /* olsr_cnf, OLSR_PRINTF */ -+#include "ipcalc.h" -+#include "olsr.h" /* OLSR_PRINTF */ -+#include "mid_set.h" /* mid_lookup_main_addr() */ -+#include "mpr_selector_set.h" /* olsr_lookup_mprs_set() */ -+#include "link_set.h" /* get_best_link_to_neighbor() */ -+#include "net_olsr.h" /* ipequal */ -+ -+/* plugin includes */ -+#include "NetworkInterfaces.h" /* TBmfInterface, CreateBmfNetworkInterfaces(), CloseBmfNetworkInterfaces() */ -+#include "Address.h" /* IsMulticast() */ -+#include "Packet.h" /* ENCAP_HDR_LEN, BMF_ENCAP_TYPE, BMF_ENCAP_LEN etc. */ -+#include "PacketHistory.h" /* InitPacketHistory() */ -+ -+//static pthread_t mdnsThread; -+//static int mdnsThreadRunning = 0; -+ -+/* ------------------------------------------------------------------------- -+ * Function : PacketReceivedFromOLSR -+ * Description: Handle a received packet from a OLSR message -+ * Input : ipPacket into an unsigned char and the lenght of the packet -+ * Output : none -+ * Return : none -+ * Data Used : BmfInterfaces -+ * ------------------------------------------------------------------------- */ -+static void PacketReceivedFromOLSR( -+ unsigned char* encapsulationUdpData, int len) -+{ -+ struct ip* ipHeader; /* IP header inside the encapsulated IP packet */ -+ union olsr_ip_addr mcSrc; /* Original source of the encapsulated multicast packet */ -+ union olsr_ip_addr mcDst; /* Multicast destination of the encapsulated packet */ -+ struct TBmfInterface* walker; -+ ipHeader = (struct ip*) encapsulationUdpData; -+ mcSrc.v4 = ipHeader->ip_src; -+ mcDst.v4 = ipHeader->ip_dst; -+ -+ OLSR_PRINTF(3, "MDNS PLUGIN got packet from OLSR message\n"); -+ -+ -+ /* Check with each network interface what needs to be done on it */ -+ for (walker = BmfInterfaces; walker != NULL; walker = walker->next) -+ { -+ /* To a non-OLSR interface: unpack the encapsulated IP packet and forward it */ -+ if (walker->olsrIntf == NULL) -+ { -+ int nBytesWritten; -+ struct sockaddr_ll dest; -+ -+ memset(&dest, 0, sizeof(dest)); -+ dest.sll_family = AF_PACKET; -+ if ((encapsulationUdpData[0] & 0xf0) == 0x40) dest.sll_protocol = htons(ETH_P_IP); -+ if ((encapsulationUdpData[0] & 0xf0) == 0x60) dest.sll_protocol = htons(ETH_P_IPV6); -+ //TODO: if packet is not IP die here -+ dest.sll_ifindex = if_nametoindex(walker->ifName); -+ dest.sll_halen = IFHWADDRLEN; -+ -+ /* Use all-ones as destination MAC address. When the IP destination is -+ * a multicast address, the destination MAC address should normally also -+ * be a multicast address. E.g., when the destination IP is 224.0.0.1, -+ * the destination MAC should be 01:00:5e:00:00:01. However, it does not -+ * seem to matter when the destination MAC address is set to all-ones -+ * in that case. */ -+ memset(dest.sll_addr, 0xFF, IFHWADDRLEN); -+ -+ nBytesWritten = sendto( -+ walker->capturingSkfd, -+ encapsulationUdpData, -+ len, -+ 0, -+ (struct sockaddr*) &dest, -+ sizeof(dest)); -+ if (nBytesWritten != len) -+ { -+ BmfPError("sendto() error forwarding unpacked encapsulated pkt on \"%s\"", walker->ifName); -+ } -+ else -+ { -+ -+ OLSR_PRINTF( -+ 2, -+ "%s: --> unpacked and forwarded on \"%s\"\n", -+ PLUGIN_NAME_SHORT, -+ walker->ifName); -+ } -+ } /* if (walker->olsrIntf == NULL) */ -+} -+} /* PacketReceivedFromOLSR */ -+ -+ -+ -+bool -+olsr_parser(union olsr_message *m, -+ struct interface *in_if __attribute__((unused)), -+ union olsr_ip_addr *ipaddr) -+{ -+ union olsr_ip_addr originator; -+ int size; -+ olsr_reltime vtime; -+ OLSR_PRINTF(2, "MDNS PLUGIN: Received msg in parser\n"); -+ /* Fetch the originator of the messsage */ -+ if(olsr_cnf->ip_version == AF_INET) { -+ memcpy(&originator, &m->v4.originator, olsr_cnf->ipsize); -+ vtime = me_to_reltime(m->v4.olsr_vtime); -+ size = ntohs(m->v4.olsr_msgsize); -+ } else { -+ memcpy(&originator, &m->v6.originator, olsr_cnf->ipsize); -+ vtime = me_to_reltime(m->v6.olsr_vtime); -+ size = ntohs(m->v6.olsr_msgsize); -+ } -+ -+ /* Check if message originated from this node. -+ * If so - back off */ -+ if(ipequal(&originator, &olsr_cnf->main_addr)) -+ return false; -+ -+ /* Check that the neighbor this message was received from is symmetric. -+ * If not - back off*/ -+ if(check_neighbor_link(ipaddr) != SYM_LINK) { -+ struct ipaddr_str strbuf; -+ OLSR_PRINTF(3, "NAME PLUGIN: Received msg from NON SYM neighbor %s\n", olsr_ip_to_string(&strbuf, ipaddr)); -+ return false; -+ } -+ -+ if(olsr_cnf->ip_version == AF_INET){ -+ PacketReceivedFromOLSR((unsigned char*) &m->v4.message,size-12); -+ } -+ else { -+ PacketReceivedFromOLSR((unsigned char*) &m->v6.message,size-12-96); -+ } -+ /* Forward the message */ -+ return 1; -+} -+ -+//Sends a packet in the OLSR network -+void -+olsr_mdns_gen(unsigned char* packet, int len) -+{ -+ /* send buffer: huge */ -+ char buffer[10240]; -+ union olsr_message *message = (union olsr_message *)buffer; -+ struct interface *ifn; -+ //int namesize; -+ -+ /* fill message */ -+ if(olsr_cnf->ip_version == AF_INET) -+ { -+ /* IPv4 */ -+ message->v4.olsr_msgtype = MESSAGE_TYPE; -+ message->v4.olsr_vtime = reltime_to_me(MDNS_VALID_TIME * MSEC_PER_SEC); -+ memcpy(&message->v4.originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); -+ message->v4.ttl = MAX_TTL; -+ message->v4.hopcnt = 0; -+ message->v4.seqno = htons(get_msg_seqno()); -+ -+ message->v4.olsr_msgsize = htons(len+12); -+ -+ memcpy(&message->v4.message,packet,len); -+ len=len+12; -+ } -+ else -+ { -+ /* IPv6 */ -+ message->v6.olsr_msgtype = MESSAGE_TYPE; -+ message->v6.olsr_vtime = reltime_to_me(MDNS_VALID_TIME * MSEC_PER_SEC); -+ memcpy(&message->v6.originator, &olsr_cnf->main_addr, olsr_cnf->ipsize); -+ message->v6.ttl = MAX_TTL; -+ message->v6.hopcnt = 0; -+ message->v6.seqno = htons(get_msg_seqno()); -+ -+ message->v6.olsr_msgsize = htons(len+12+96); -+ memcpy(&message->v6.message,packet,len); -+ len=len+12+96; -+ } -+ -+ /* looping trough interfaces */ -+ for (ifn = ifnet; ifn; ifn = ifn->int_next) { -+ OLSR_PRINTF(1, "MDNS PLUGIN: Generating packet - [%s]\n", ifn->int_name); -+ -+ if(net_outbuffer_push(ifn, message, len) != len) { -+ /* send data and try again */ -+ net_output(ifn); -+ if(net_outbuffer_push(ifn, message, len) != len) { -+ OLSR_PRINTF(1, "MDNS PLUGIN: could not send on interface: %s\n", ifn->int_name); -+ } -+ } -+ } -+} -+ -+/* ------------------------------------------------------------------------- -+ * Function : BmfPError -+ * Description: Prints an error message at OLSR debug level 1. -+ * First the plug-in name is printed. Then (if format is not NULL -+ * and *format is not empty) the arguments are printed, followed -+ * by a colon and a blank. Then the message and a new-line. -+ * Input : format, arguments -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+ -+void BmfPError(const char* format, ...) -+{ -+#define MAX_STR_DESC 255 -+#ifndef NODEBUG -+ char* strErr = strerror(errno); -+#endif -+ char strDesc[MAX_STR_DESC]; -+ -+ /* Rely on short-circuit boolean evaluation */ -+ if (format == NULL || *format == '\0') -+ { -+ OLSR_PRINTF(1, "%s: %s\n", PLUGIN_NAME, strErr); -+ } -+ else -+ { -+ va_list arglist; -+ -+ OLSR_PRINTF(1, "%s: ", PLUGIN_NAME); -+ -+ va_start(arglist, format); -+ vsnprintf(strDesc, MAX_STR_DESC, format, arglist); -+ va_end(arglist); -+ -+ strDesc[MAX_STR_DESC - 1] = '\0'; /* Ensures null termination */ -+ -+ OLSR_PRINTF(1, "%s: %s\n", strDesc, strErr); -+ } -+} /* BmfPError */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : MainAddressOf -+ * Description: Lookup the main address of a node -+ * Input : ip - IP address of the node -+ * Output : none -+ * Return : The main IP address of the node -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+union olsr_ip_addr* MainAddressOf(union olsr_ip_addr* ip) -+{ -+ union olsr_ip_addr* result; -+ -+ /* TODO: mid_lookup_main_addr() is not thread-safe! */ -+ result = mid_lookup_main_addr(ip); -+ if (result == NULL) -+ { -+ result = ip; -+ } -+ return result; -+} /* MainAddressOf */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : EncapsulateAndForwardPacket -+ * Description: Encapsulate a captured raw IP packet and forward it -+ * Input : intf - the network interface on which to forward the packet -+ * encapsulationUdpData - The encapsulation header, followed by -+ * the encapsulated IP packet -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * ------------------------------------------------------------------------- */ -+//static void EncapsulateAndForwardPacket( -+// struct TBmfInterface* intf, -+// unsigned char* encapsulationUdpData) -+//{ -+//// /* The packet */ -+// u_int16_t udpDataLen = GetEncapsulationUdpDataLength(encapsulationUdpData); -+// -+// /* The next destination(s) */ -+// struct TBestNeighbors bestNeighborLinks; -+// struct link_entry* bestNeighbor; -+// -+// int nPossibleNeighbors = 0; -+// struct sockaddr_in forwardTo; /* Next destination of encapsulation packet */ -+// int nPacketsToSend; -+// int sendUnicast; /* 0 = send broadcast; 1 = send unicast */ -+// -+// int i; -+// -+// /* Find at most 'FanOutLimit' best neigbors to forward the packet to */ -+// FindNeighbors(&bestNeighborLinks, &bestNeighbor, intf, NULL, NULL, NULL, &nPossibleNeighbors); -+// -+// if (nPossibleNeighbors <= 0) -+// { -+// OLSR_PRINTF( -+// 8, -+// "%s: --> not encap-forwarding on \"%s\": there is no neighbor that needs my retransmission\n", -+// PLUGIN_NAME_SHORT, -+// intf->ifName); -+// return; -+// } -+// -+// /* Compose destination of encapsulation packet */ -+// -+// memset(&forwardTo, 0, sizeof(forwardTo)); -+// forwardTo.sin_family = AF_INET; -+// forwardTo.sin_port = htons(BMF_ENCAP_PORT); -+// -+// /* Start by filling in the local broadcast address. This may be overwritten later. */ -+// forwardTo.sin_addr = intf->broadAddr.v4; -+// -+// /* - If the BMF mechanism is BM_UNICAST_PROMISCUOUS, always send just one -+// * unicast packet (to the best neighbor). -+// * - But if the BMF mechanism is BM_BROADCAST, -+// * - send 'nPossibleNeighbors' unicast packets if there are up to -+// * 'FanOutLimit' possible neighbors, -+// * - if there are more than 'FanOutLimit' possible neighbors, then -+// * send a (WLAN-air-expensive, less reliable) broadcast packet. */ -+// if (BmfMechanism == BM_UNICAST_PROMISCUOUS) -+// { -+// /* One unicast packet to the best neighbor */ -+// nPacketsToSend = 1; -+// sendUnicast = 1; -+// bestNeighborLinks.links[0] = bestNeighbor; -+// } -+// else /* BmfMechanism == BM_BROADCAST */ -+// { -+// if (nPossibleNeighbors <= FanOutLimit) -+// { -+// /* 'nPossibleNeighbors' unicast packets */ -+// nPacketsToSend = nPossibleNeighbors; -+// sendUnicast = 1; -+// } -+// else /* nPossibleNeighbors > FanOutLimit */ -+// { -+// /* One broadcast packet, possibly retransmitted as specified in the -+// * 'BroadcastRetransmitCount' plugin parameter */ -+// nPacketsToSend = BroadcastRetransmitCount; -+// sendUnicast = 0; -+// } /* if */ -+// } /* if */ -+// -+// for (i = 0; i < nPacketsToSend; i++) -+// { -+// int nBytesWritten; -+// -+// if (sendUnicast == 1) -+// { -+// /* For unicast, overwrite the local broadcast address which was filled in above */ -+// forwardTo.sin_addr = bestNeighborLinks.links[i]->neighbor_iface_addr.v4; -+// } -+// -+// /* Forward the BMF packet via the encapsulation socket */ -+// nBytesWritten = sendto( -+// intf->encapsulatingSkfd, -+// encapsulationUdpData, -+// udpDataLen, -+// MSG_DONTROUTE, -+// (struct sockaddr*) &forwardTo, -+// sizeof(forwardTo)); -+// -+// /* Evaluate and display result */ -+// if (nBytesWritten != udpDataLen) -+// { -+// BmfPError("sendto() error forwarding pkt on \"%s\"", intf->ifName); -+// } -+// else -+// { -+// /* Increase counter */ -+// intf->nBmfPacketsTx++; -+// -+// OLSR_PRINTF( -+// 8, -+// "%s: --> encapsulated and forwarded on \"%s\" to %s\n", -+// PLUGIN_NAME_SHORT, -+// intf->ifName, -+// inet_ntoa(forwardTo.sin_addr)); -+// } /* if (nBytesWritten != udpDataLen) */ -+// } /* for */ -+//} /* EncapsulateAndForwardPacket */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : BmfPacketCaptured -+ * Description: Handle a captured IP packet -+ * Input : intf - the network interface on which the packet was captured -+ * sllPkttype - the type of packet. Either PACKET_OUTGOING, -+ * PACKET_BROADCAST or PACKET_MULTICAST. -+ * encapsulationUdpData - space for the encapsulation header, followed by -+ * the captured IP packet -+ * Output : none -+ * Return : none -+ * Data Used : BmfInterfaces -+ * Notes : The IP packet is assumed to be captured on a socket of family -+ * PF_PACKET and type SOCK_DGRAM (cooked). -+ * ------------------------------------------------------------------------- */ -+static void BmfPacketCaptured( -+ //struct TBmfInterface* intf, -+ //unsigned char sllPkttype, -+ unsigned char* encapsulationUdpData, -+ int nBytes) -+{ -+ union olsr_ip_addr src; /* Source IP address in captured packet */ -+ union olsr_ip_addr dst; /* Destination IP address in captured packet */ -+ union olsr_ip_addr* origIp; /* Main OLSR address of source of captured packet */ -+ //struct TBmfInterface* walker; -+ //int isFromOlsrIntf; -+ //int isFromOlsrNeighbor; -+ //int iAmMpr; -+ //unsigned char* ipPacket; /* The captured IP packet... */ -+ //u_int16_t ipPacketLen; /* ...and its length */ -+ struct ip* ipHeader; /* The IP header inside the captured IP packet */ -+ struct ip6_hdr* ipHeader6; /* The IP header inside the captured IP packet */ -+ //u_int32_t crc32; -+ //struct TEncapHeader* encapHdr; -+ //struct ipaddr_str srcBuf, dstBuf; -+ struct udphdr* udpHeader; -+ u_int16_t destPort; -+ -+ if ((encapsulationUdpData[0] & 0xf0) == 0x40) { //IPV4 -+ -+ ipHeader = (struct ip*) encapsulationUdpData; -+ -+ dst.v4 = ipHeader->ip_dst; -+ -+ /* Only forward multicast packets. If configured, also forward local broadcast packets */ -+ if (IsMulticast(&dst)) -+ { -+ /* continue */ -+ } -+ else -+ { -+ return; -+ } -+ if (ipHeader->ip_p != SOL_UDP) -+ { -+ /* Not UDP */ -+ OLSR_PRINTF(1,"NON UDP PACKET\n"); -+ return; /* for */ -+ } -+ udpHeader = (struct udphdr*)(encapsulationUdpData + GetIpHeaderLength(encapsulationUdpData)); -+ destPort = ntohs(udpHeader->dest); -+ if (destPort != 5353) -+ { -+ return; -+ } -+ }//END IPV4 -+ -+ else if ((encapsulationUdpData[0] & 0xf0) == 0x60) { //IPv6 -+ -+ ipHeader6 = (struct ip6_hdr*) encapsulationUdpData; -+ if (ipHeader6->ip6_dst.s6_addr[0] == 0xff) //Multicast -+ { -+ //Continua -+ } -+ else -+ { -+ return; //not multicast -+ } -+ if (ipHeader6->ip6_nxt != SOL_UDP) -+ { -+ /* Not UDP */ -+ OLSR_PRINTF(1,"NON UDP PACKET\n"); -+ return; /* for */ -+ } -+ udpHeader = (struct udphdr*)(encapsulationUdpData + 40); -+ destPort = ntohs(udpHeader->dest); -+ if (destPort != 5353) -+ { -+ return; -+ } -+ } //END IPV6 -+ else return; //Is not IP packet -+ -+ /* Check if the frame is captured on an OLSR-enabled interface */ -+ //isFromOlsrIntf = (intf->olsrIntf != NULL); TODO: put again this check -+ -+ /* Retrieve the length of the captured packet */ -+ //ipPacketLen = GetIpTotalLength(ipPacket); -+ -+ //src.v4 = ipHeader->ip_src; -+ -+ //OLSR_PRINTF( -+ // 1, -+ // "%s: %s pkt of %ld bytes captured on %s interface \"%s\": %s->%s\n", -+ // PLUGIN_NAME_SHORT, -+ // sllPkttype == PACKET_OUTGOING ? "outgoing" : "incoming", -+ // (long)ipPacketLen, -+ // isFromOlsrIntf ? "OLSR" : "non-OLSR", -+ // intf->ifName, -+ // olsr_ip_to_string(&srcBuf, &src), -+ // olsr_ip_to_string(&dstBuf, &dst)); -+ -+ /* Lookup main address of source in the MID table of OLSR */ -+ origIp = MainAddressOf(&src); -+ -+ // send the packet to OLSR forward mechanism -+ olsr_mdns_gen(encapsulationUdpData,nBytes); -+} /* BmfPacketCaptured */ -+ -+ -+/* ------------------------------------------------------------------------- -+ * Function : BmfEncapsulationPacketReceived -+ * Description: Handle a received BMF-encapsulation packet -+ * Input : intf - the network interface on which the packet was received -+ * forwardedBy - the IP node that forwarded the packet to me -+ * forwardedTo - the destination IP address of the encapsulation -+ * packet, in case the packet was received promiscuously. -+ * Pass NULL if the packet is received normally (unicast or -+ * broadcast). -+ * encapsulationUdpData - the encapsulating IP UDP data, containting -+ * the BMF encapsulation header, followed by the encapsulated -+ * IP packet -+ * Output : none -+ * Return : none -+ * Data Used : BmfInterfaces -+ * ------------------------------------------------------------------------- */ -+//static void BmfEncapsulationPacketReceived( -+// struct TBmfInterface* intf, -+// union olsr_ip_addr* forwardedBy, -+// union olsr_ip_addr* forwardedTo, -+// unsigned char* encapsulationUdpData) -+//{ -+// int iAmMpr; /* True (1) if I am selected as MPR by 'forwardedBy' */ -+// struct sockaddr_in forwardTo; /* Next destination of encapsulation packet */ -+// unsigned char* ipPacket; /* The encapsulated IP packet */ -+// u_int16_t ipPacketLen; /* Length of the encapsulated IP packet */ -+// struct ip* ipHeader; /* IP header inside the encapsulated IP packet */ -+// union olsr_ip_addr mcSrc; /* Original source of the encapsulated multicast packet */ -+// union olsr_ip_addr mcDst; /* Multicast destination of the encapsulated packet */ -+// struct TEncapHeader* encapsulationHdr; -+// u_int16_t encapsulationUdpDataLen; -+// struct TBmfInterface* walker; -+// struct ipaddr_str mcSrcBuf, mcDstBuf, forwardedByBuf, forwardedToBuf; -+// /* Are we talking to ourselves? */ -+// if (if_ifwithaddr(forwardedBy) != NULL) -+// { -+// return; -+// } -+// -+// /* Discard encapsulated packets received on a non-OLSR interface */ -+// if (intf->olsrIntf == NULL) -+// { -+// return; -+// } -+// -+// /* Retrieve details about the encapsulated IP packet */ -+// ipPacket = GetIpPacket(encapsulationUdpData); -+// ipPacketLen = GetIpTotalLength(ipPacket); -+// ipHeader = GetIpHeader(encapsulationUdpData); -+// -+// mcSrc.v4 = ipHeader->ip_src; -+// mcDst.v4 = ipHeader->ip_dst; -+// -+// /* Increase counter */ -+// intf->nBmfPacketsRx++; -+// -+// /* Beware: not possible to call olsr_ip_to_string more than 4 times in same printf */ -+// OLSR_PRINTF( -+// 8, -+// "%s: encapsulated pkt of %ld bytes incoming on \"%s\": %s->%s, forwarded by %s to %s\n", -+// PLUGIN_NAME_SHORT, -+// (long)ipPacketLen, -+// intf->ifName, -+// olsr_ip_to_string(&mcSrcBuf, &mcSrc), -+// olsr_ip_to_string(&mcDstBuf, &mcDst), -+// olsr_ip_to_string(&forwardedByBuf, forwardedBy), -+// forwardedTo != NULL ? olsr_ip_to_string(&forwardedToBuf, forwardedTo) : "me"); -+// -+// /* Get encapsulation header */ -+// encapsulationHdr = (struct TEncapHeader*) encapsulationUdpData; -+// -+// /* Verify correct format of BMF encapsulation header */ -+// if (encapsulationHdr->type != BMF_ENCAP_TYPE || -+// encapsulationHdr->len != BMF_ENCAP_LEN || -+// ntohs(encapsulationHdr->reserved != 0)) -+// { -+// OLSR_PRINTF( -+// 8, -+// "%s: --> discarding: format of BMF encapsulation header not recognized\n", -+// PLUGIN_NAME_SHORT); -+// return; -+// } -+// -+// /* Check if this packet was seen recently */ -+// if (CheckAndMarkRecentPacket(ntohl(encapsulationHdr->crc32))) -+// { -+// /* Increase counter */ -+// intf->nBmfPacketsRxDup++; -+// -+// OLSR_PRINTF( -+// 8, -+// "%s: --> discarding: packet is duplicate\n", -+// PLUGIN_NAME_SHORT); -+// return; -+// } -+// -+// if (EtherTunTapFd >= 0) -+// { -+// /* Unpack the encapsulated IP packet and deliver it locally, by sending -+// * a copy into the local IP stack via the EtherTunTap interface */ -+// -+// union olsr_ip_addr broadAddr; -+// int nBytesToWrite, nBytesWritten; -+// unsigned char* bufferToWrite; -+// -+// /* If the encapsulated IP packet is a local broadcast packet, -+// * update its destination address to match the subnet of the EtherTunTap -+// * interface */ -+// broadAddr.v4.s_addr = htonl(EtherTunTapIpBroadcast); -+// CheckAndUpdateLocalBroadcast(ipPacket, &broadAddr); -+// -+// bufferToWrite = ipPacket; -+// nBytesToWrite = ipPacketLen; -+// -+// /* Write the packet into the EtherTunTap interface for local delivery */ -+// nBytesWritten = write(EtherTunTapFd, bufferToWrite, nBytesToWrite); -+// if (nBytesWritten != nBytesToWrite) -+// { -+// BmfPError("write() error forwarding encapsulated pkt on \"%s\"", EtherTunTapIfName); -+// } -+// else -+// { -+// OLSR_PRINTF( -+// 8, -+// "%s: --> unpacked and delivered locally on \"%s\"\n", -+// PLUGIN_NAME_SHORT, -+// EtherTunTapIfName); -+// } -+// } /* if (EtherTunTapFd >= 0) */ -+// -+// /* Check if I am MPR for the forwarder */ -+// /* TODO: olsr_lookup_mprs_set() is not thread-safe! */ -+// iAmMpr = (olsr_lookup_mprs_set(MainAddressOf(forwardedBy)) != NULL); -+// -+// /* Compose destination address for next hop */ -+// memset(&forwardTo, 0, sizeof(forwardTo)); -+// forwardTo.sin_family = AF_INET; -+// forwardTo.sin_port = htons(BMF_ENCAP_PORT); -+// -+// /* Retrieve the number of bytes to be forwarded via the encapsulation socket */ -+// encapsulationUdpDataLen = GetEncapsulationUdpDataLength(encapsulationUdpData); -+// -+// /* Check with each network interface what needs to be done on it */ -+// for (walker = BmfInterfaces; walker != NULL; walker = walker->next) -+// { -+// /* What to do with the packet on a non-OLSR interface? Unpack -+// * encapsulated packet, and forward it. -+// * -+// * What to do with the packet on an OLSR interface? Forward it only -+// * if the forwarding node has selected us as MPR (iAmMpr). -+// * -+// * Note that the packet is always coming in on an OLSR interface, because -+// * it is an encapsulated BMF packet. */ -+// -+// /* To a non-OLSR interface: unpack the encapsulated IP packet and forward it */ -+// if (walker->olsrIntf == NULL) -+// { -+// int nBytesWritten; -+// struct sockaddr_ll dest; -+// -+// /* If the encapsulated IP packet is a local broadcast packet, -+// * update its destination address to match the subnet of the network -+// * interface on which the packet is being sent. */ -+// CheckAndUpdateLocalBroadcast(ipPacket, &walker->broadAddr); -+// -+// memset(&dest, 0, sizeof(dest)); -+// dest.sll_family = AF_PACKET; -+// dest.sll_protocol = htons(ETH_P_IP); -+// dest.sll_ifindex = if_nametoindex(walker->ifName); -+// dest.sll_halen = IFHWADDRLEN; -+// -+// /* Use all-ones as destination MAC address. When the IP destination is -+// * a multicast address, the destination MAC address should normally also -+// * be a multicast address. E.g., when the destination IP is 224.0.0.1, -+// * the destination MAC should be 01:00:5e:00:00:01. However, it does not -+// * seem to matter when the destination MAC address is set to all-ones -+// * in that case. */ -+// memset(dest.sll_addr, 0xFF, IFHWADDRLEN); -+// -+// nBytesWritten = sendto( -+// walker->capturingSkfd, -+// ipPacket, -+// ipPacketLen, -+// 0, -+// (struct sockaddr*) &dest, -+// sizeof(dest)); -+// if (nBytesWritten != ipPacketLen) -+// { -+// BmfPError("sendto() error forwarding unpacked encapsulated pkt on \"%s\"", walker->ifName); -+// } -+// else -+// { -+// /* Increase counter */ -+// walker->nBmfPacketsTx++; -+// -+// OLSR_PRINTF( -+// 8, -+// "%s: --> unpacked and forwarded on \"%s\"\n", -+// PLUGIN_NAME_SHORT, -+// walker->ifName); -+// } -+// } /* if (walker->olsrIntf == NULL) */ -+// -+// /* To an OLSR interface: forward the packet, but only if this node is -+// * selected as MPR by the forwarding node */ -+// else if (iAmMpr) -+// { -+// struct TBestNeighbors bestNeighborLinks; -+// struct link_entry* bestNeighbor; -+// int nPossibleNeighbors; -+// int nPacketsToSend; -+// int sendUnicast; /* 0 = send broadcast; 1 = send unicast */ -+// int i; -+// -+// /* Retrieve at most two best neigbors to forward the packet to */ -+// FindNeighbors( -+// &bestNeighborLinks, -+// &bestNeighbor, -+// walker, -+// &mcSrc, -+// forwardedBy, -+// forwardedTo, -+// &nPossibleNeighbors); -+// -+// if (nPossibleNeighbors <= 0) -+// { -+// OLSR_PRINTF( -+// 8, -+// "%s: --> not forwarding on \"%s\": there is no neighbor that needs my retransmission\n", -+// PLUGIN_NAME_SHORT, -+// walker->ifName); -+// -+// continue; /* for */ -+// } -+// -+// /* Compose destination of encapsulation packet. -+// * Start by filling in the local broadcast address. This may be overwritten later. */ -+// forwardTo.sin_addr = walker->broadAddr.v4; -+// -+// /* - If the BMF mechanism is BM_UNICAST_PROMISCUOUS, always send just one -+// * unicast packet (to the best neighbor). -+// * - But if the BMF mechanism is BM_BROADCAST, -+// * - send 'nPossibleNeighbors' unicast packets if there are up to -+// * 'FanOutLimit' possible neighbors, -+// * - if there are more than 'FanOutLimit' possible neighbors, then -+// * send a (WLAN-air-expensive, less reliable) broadcast packet. */ -+// if (BmfMechanism == BM_UNICAST_PROMISCUOUS) -+// { -+// /* One unicast packet to the best neighbor */ -+// nPacketsToSend = 1; -+// sendUnicast = 1; -+// bestNeighborLinks.links[0] = bestNeighbor; -+// } -+// else /* BmfMechanism == BM_BROADCAST */ -+// { -+// if (nPossibleNeighbors <= FanOutLimit) -+// { -+// /* 'nPossibleNeighbors' unicast packets */ -+// nPacketsToSend = nPossibleNeighbors; -+// sendUnicast = 1; -+// } -+// else /* nPossibleNeighbors > FanOutLimit */ -+// { -+// /* One broadcast packet, possibly retransmitted as specified in the -+// * 'BroadcastRetransmitCount' plugin parameter */ -+// nPacketsToSend = BroadcastRetransmitCount; -+// sendUnicast = 0; -+// } /* if */ -+// } /* if */ -+// -+// for (i = 0; i < nPacketsToSend; i++) -+// { -+// int nBytesWritten; -+// -+// if (sendUnicast) -+// { -+// /* For unicast, overwrite the local broadcast address which was filled in above */ -+// forwardTo.sin_addr = bestNeighborLinks.links[i]->neighbor_iface_addr.v4; -+// } -+// -+// /* Forward the BMF packet via the encapsulation socket */ -+// nBytesWritten = sendto( -+// walker->encapsulatingSkfd, -+// encapsulationUdpData, -+// encapsulationUdpDataLen, -+// MSG_DONTROUTE, -+// (struct sockaddr*) &forwardTo, -+// sizeof(forwardTo)); -+// -+// /* Evaluate and display result */ -+// if (nBytesWritten != encapsulationUdpDataLen) -+// { -+// BmfPError("sendto() error forwarding encapsulated pkt on \"%s\"", walker->ifName); -+// } -+// else -+// { -+// /* Increase counter */ -+// walker->nBmfPacketsTx++; -+// -+// OLSR_PRINTF( -+// 8, -+// "%s: --> forwarded on \"%s\" to %s\n", -+// PLUGIN_NAME_SHORT, -+// walker->ifName, -+// inet_ntoa(forwardTo.sin_addr)); -+// } /* if */ -+// } /* for */ -+// } /* else if (iAmMpr) */ -+// -+// else /* walker->olsrIntf != NULL && !iAmMpr */ -+// { -+// struct ipaddr_str buf; -+// /* 'walker' is an OLSR interface, but I am not selected as MPR. In that -+// * case, don't forward. */ -+// OLSR_PRINTF( -+// 8, -+// "%s: --> not forwarding on \"%s\": I am not selected as MPR by %s\n", -+// PLUGIN_NAME_SHORT, -+// walker->ifName, -+// olsr_ip_to_string(&buf, forwardedBy)); -+// } /* else */ -+// } /* for */ -+//} /* BmfEncapsulationPacketReceived */ -+// -+/* ------------------------------------------------------------------------- -+ * Function : BmfTunPacketCaptured -+ * Description: Handle an IP packet, captured outgoing on the tuntap interface -+ * Input : encapsulationUdpData - space for the encapsulation header, followed by -+ * the captured outgoing IP packet -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * Notes : The packet is assumed to be captured on a socket of family -+ * PF_PACKET and type SOCK_DGRAM (cooked). -+ * ------------------------------------------------------------------------- */ -+//static void BmfTunPacketCaptured(unsigned char* encapsulationUdpData) -+//{ -+// union olsr_ip_addr srcIp; -+// union olsr_ip_addr dstIp; -+// union olsr_ip_addr broadAddr; -+// struct TBmfInterface* walker; -+// unsigned char* ipPacket; -+// u_int16_t ipPacketLen; -+// struct ip* ipHeader; -+// u_int32_t crc32; -+// struct TEncapHeader* encapHdr; -+// struct ipaddr_str srcIpBuf, dstIpBuf; -+// ipPacket = GetIpPacket(encapsulationUdpData); -+// ipPacketLen = GetIpTotalLength(ipPacket); -+// ipHeader = GetIpHeader(encapsulationUdpData); -+// -+// dstIp.v4 = ipHeader->ip_dst; -+// broadAddr.v4.s_addr = htonl(EtherTunTapIpBroadcast); -+// -+// /* Only forward multicast packets. If configured, also forward local broadcast packets */ -+// if (IsMulticast(&dstIp) || -+// (EnableLocalBroadcast != 0 && olsr_ipequal(&dstIp, &broadAddr))) -+// { -+// /* continue */ -+// } -+// else -+// { -+// return; -+// } -+// -+// srcIp.v4 = ipHeader->ip_src; -+// -+// OLSR_PRINTF( -+// 8, -+// "%s: outgoing pkt of %ld bytes captured on tuntap interface \"%s\": %s->%s\n", -+// PLUGIN_NAME_SHORT, -+// (long)ipPacketLen, -+// EtherTunTapIfName, -+// olsr_ip_to_string(&srcIpBuf, &srcIp), -+// olsr_ip_to_string(&dstIpBuf, &dstIp)); -+// -+// /* Calculate packet fingerprint */ -+// crc32 = PacketCrc32(ipPacket, ipPacketLen); -+// -+// /* Check if this packet was seen recently */ -+// if (CheckAndMarkRecentPacket(crc32)) -+// { -+// OLSR_PRINTF( -+// 8, -+// "%s: --> discarding: packet is duplicate\n", -+// PLUGIN_NAME_SHORT); -+// return; -+// } -+// -+// /* Compose encapsulation header */ -+// encapHdr = (struct TEncapHeader*) encapsulationUdpData; -+// memset (encapHdr, 0, ENCAP_HDR_LEN); -+// encapHdr->type = BMF_ENCAP_TYPE; -+// encapHdr->len = BMF_ENCAP_LEN; -+// encapHdr->reserved = 0; -+// encapHdr->crc32 = htonl(crc32); -+// -+// /* Check with each network interface what needs to be done on it */ -+// for (walker = BmfInterfaces; walker != NULL; walker = walker->next) -+// { -+// /* Is the forwarding interface OLSR-enabled? */ -+// if (walker->olsrIntf != NULL) -+// { -+// /* On an OLSR interface: encapsulate and forward packet. */ -+// -+// EncapsulateAndForwardPacket(walker, encapsulationUdpData); -+// } -+// else -+// { -+// /* On a non-OLSR interface: what to do? -+// * Answer 1: nothing. Multicast routing between non-OLSR interfaces -+// * is to be done by other protocols (e.g. PIM, DVMRP). -+// * Answer 2 (better): Forward it. */ -+// -+// int nBytesWritten; -+// struct sockaddr_ll dest; -+// -+// /* If the encapsulated IP packet is a local broadcast packet, -+// * update its destination address to match the subnet of the network -+// * interface on which the packet is being sent. */ -+// CheckAndUpdateLocalBroadcast(ipPacket, &walker->broadAddr); -+// -+// memset(&dest, 0, sizeof(dest)); -+// dest.sll_family = AF_PACKET; -+// dest.sll_protocol = htons(ETH_P_IP); -+// dest.sll_ifindex = if_nametoindex(walker->ifName); -+// dest.sll_halen = IFHWADDRLEN; -+// -+// /* Use all-ones as destination MAC address. When the IP destination is -+// * a multicast address, the destination MAC address should normally also -+// * be a multicast address. E.g., when the destination IP is 224.0.0.1, -+// * the destination MAC should be 01:00:5e:00:00:01. However, it does not -+// * seem to matter when the destination MAC address is set to all-ones -+// * in that case. */ -+// memset(dest.sll_addr, 0xFF, IFHWADDRLEN); -+// -+// nBytesWritten = sendto( -+// walker->capturingSkfd, -+// ipPacket, -+// ipPacketLen, -+// 0, -+// (struct sockaddr*) &dest, -+// sizeof(dest)); -+// if (nBytesWritten != ipPacketLen) -+// { -+// BmfPError("sendto() error forwarding pkt on \"%s\"", walker->ifName); -+// } -+// else -+// { -+// /* Increase counter */ -+// walker->nBmfPacketsTx++; -+// -+// OLSR_PRINTF( -+// 8, -+// "%s: --> forwarded from non-OLSR to non-OLSR \"%s\"\n", -+// PLUGIN_NAME_SHORT, -+// walker->ifName); -+// } /* if */ -+// } /* if */ -+// } /* for */ -+//} /* BmfTunPacketCaptured */ -+// -+/* ------------------------------------------------------------------------- -+ * Function : DoBmf -+ * Description: Wait (blocking) for IP packets, then call the handler for each -+ * received packet -+ * Input : none -+ * Output : none -+ * Return : none -+ * Data Used : BmfInterfaces -+ * ------------------------------------------------------------------------- */ -+void DoMDNS(int skfd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) -+ -+{ -+// int nFdBitsSet; -+ unsigned char rxBuffer[BMF_BUFFER_SIZE]; -+// fd_set rxFdSet; -+// OLSR_PRINTF(1,"ENTERING DoMDNS\n"); -+// assert(HighestSkfd >= 0); -+// -+// /* Make a local copy of the set of file descriptors that select() can -+// * modify to indicate which descriptors actually changed status */ -+// rxFdSet = InputSet; -+// -+// /* Wait (blocking) for packets received on any of the sockets. -+// * NOTE: don't use a timeout (last parameter). It causes a high system CPU load! */ -+// nFdBitsSet = select(HighestSkfd + 1, &rxFdSet, NULL, NULL, NULL); -+// if (nFdBitsSet < 0) -+// { -+// if (errno != EINTR) -+// { -+// BmfPError("select() error"); -+// } -+// return; -+// } -+// -+ //while (nFdBitsSet > 0) -+ //{ -+ //struct TBmfInterface* walker; -+ -+ /* Check if a packet was received on the capturing socket (if any) -+ * of each network interface */ -+ //for (walker = BmfInterfaces; walker != NULL; walker = walker->next) -+ //{ -+ //int skfd = walker->capturingSkfd; -+ //if (skfd >= 0 && (FD_ISSET(skfd, &rxFdSet))) -+ if (skfd >= 0) -+ { -+ struct sockaddr_ll pktAddr; -+ socklen_t addrLen = sizeof(pktAddr); -+ int nBytes; -+ unsigned char* ipPacket; -+ -+ /* Receive the captured Ethernet frame, leaving space for the BMF -+ * encapsulation header */ -+ ipPacket = GetIpPacket(rxBuffer); -+ nBytes = recvfrom( -+ skfd, -+ ipPacket, -+ //BMF_BUFFER_SIZE - ENCAP_HDR_LEN, //TODO: understand how to change this -+ BMF_BUFFER_SIZE, //TODO: understand how to change this -+ 0, -+ (struct sockaddr*)&pktAddr, -+ &addrLen); -+ if (nBytes < 0) -+ { -+ //BmfPError("recvfrom() error on \"%s\"", walker->ifName); -+ -+ return; /* for */ -+ } /* if (nBytes < 0) */ -+ -+ /* Check if the number of received bytes is large enough for an IP -+ * packet which contains at least a minimum-size IP header. -+ * Note: There is an apparent bug in the packet socket implementation in -+ * combination with VLAN interfaces. On a VLAN interface, the value returned -+ * by 'recvfrom' may (but need not) be 4 (bytes) larger than the value -+ * returned on a non-VLAN interface, for the same ethernet frame. */ -+ if (nBytes < (int)sizeof(struct ip)) -+ { -+ //OLSR_PRINTF( -+ // 1, -+ // "%s: captured frame too short (%d bytes) on \"%s\"\n", -+ // PLUGIN_NAME, -+ // nBytes, -+ // walker->ifName); -+ -+ return; /* for */ -+ } -+ -+ if (pktAddr.sll_pkttype == PACKET_OUTGOING || -+ pktAddr.sll_pkttype == PACKET_MULTICAST || -+ pktAddr.sll_pkttype == PACKET_BROADCAST) -+ { -+ /* A multicast or broadcast packet was captured */ -+ -+ //OLSR_PRINTF( -+ // 1, -+ // "%s: captured frame (%d bytes) on \"%s\"\n", -+ // PLUGIN_NAME, -+ // nBytes, -+ // walker->ifName); -+ //BmfPacketCaptured(walker, pktAddr.sll_pkttype, rxBuffer); -+ BmfPacketCaptured(ipPacket,nBytes); -+ -+ } /* if (pktAddr.sll_pkttype == ...) */ -+ } /* if (skfd >= 0 && (FD_ISSET...)) */ -+// } /* for */ -+ -+// } /* while (nFdBitsSet > 0) */ -+} /* DoMDNS */ -+ -+int InitMDNS(struct interface* skipThisIntf) -+{ -+ -+ -+ //Tells OLSR to launch olsr_parser when the packets for this plugin arrive -+ olsr_parser_add_function(&olsr_parser, PARSER_TYPE); -+ CreateBmfNetworkInterfaces(skipThisIntf); -+ -+ return 0; -+} /* InitBmf */ -+ -+/* ------------------------------------------------------------------------- -+ * Function : CloseBmf -+ * Description: Close the BMF plugin and clean up -+ * Input : none -+ * Output : none -+ * Return : none -+ * Data Used : BmfThread -+ * ------------------------------------------------------------------------- */ -+void CloseMDNS(void) -+{ -+// if (EtherTunTapFd >= 0) -+// { -+// /* If there is a multicast route, try to delete it first */ -+// DeleteMulticastRoute(); -+// -+// /* Restore IP spoof filter for EtherTunTap interface */ -+// RestoreSpoofFilter(); -+// } -+// -+// if (mdnsThreadRunning) -+// { -+// /* Signal BmfThread to exit */ -+// /* Strangely enough, all running threads receive the SIGALRM signal. But only the -+// * BMF thread is affected by this signal, having specified a handler for this -+// * signal in its thread entry function BmfRun(...). */ -+// if (pthread_kill(mdnsThread, SIGALRM) != 0) -+// { -+// BmfPError("pthread_kill() error"); -+// } -+// -+// /* Wait for BmfThread to acknowledge */ -+// if (pthread_join(mdnsThread, NULL) != 0) -+// { -+// BmfPError("pthread_join() error"); -+// } -+// } -+// -+// /* Clean up after the BmfThread has been killed */ -+ CloseBmfNetworkInterfaces(); -+} /* CloseBmf */ -+ -+ -+/* -+ * Local Variables: -+ * c-basic-offset: 2 -+ * indent-tabs-mode: nil -+ * End: -+ */ ---- /dev/null -+++ b/lib/mdns/src/mdns.h -@@ -0,0 +1,95 @@ -+#ifndef _BMF_BMF_H -+#define _BMF_BMF_H -+ -+/* -+ * OLSR Basic Multicast Forwarding (BMF) plugin. -+ * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. -+ * Written by Erik Tromp. -+ * 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 Thales, BMF 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. -+ */ -+ -+/* ------------------------------------------------------------------------- -+ * File : Bmf.h -+ * Description: Multicast forwarding functions -+ * Created : 29 Jun 2006 -+ * -+ * ------------------------------------------------------------------------- */ -+ -+#include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ -+ -+#include "parser.h" -+#include -+ -+#define MESSAGE_TYPE 132 -+#define PARSER_TYPE MESSAGE_TYPE -+#define EMISSION_INTERVAL 10 /* seconds */ -+#define EMISSION_JITTER 25 /* percent */ -+#define MDNS_VALID_TIME 1800 /* seconds */ -+ -+/* BMF plugin data */ -+#define PLUGIN_NAME "OLSRD MDNS plugin" -+#define PLUGIN_NAME_SHORT "OLSRD MDNS" -+#define PLUGIN_VERSION "1.0.0 (" __DATE__ " " __TIME__ ")" -+#define PLUGIN_COPYRIGHT " (C) Ninux.org" -+#define PLUGIN_AUTHOR " Saverio Proto (zioproto@gmail.com)" -+#define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION "\n" PLUGIN_COPYRIGHT "\n" PLUGIN_AUTHOR -+#define PLUGIN_INTERFACE_VERSION 5 -+ -+/* UDP-Port on which multicast packets are encapsulated */ -+//#define BMF_ENCAP_PORT 50698 -+ -+/* Forward declaration of OLSR interface type */ -+struct interface; -+ -+//extern int FanOutLimit; -+//extern int BroadcastRetransmitCount; -+ -+void DoMDNS(int sd, void * x, unsigned int y); -+void BmfPError(const char* format, ...) __attribute__((format(printf, 1, 2))); -+union olsr_ip_addr* MainAddressOf(union olsr_ip_addr* ip); -+//int InterfaceChange(struct interface* interf, int action); -+//int SetFanOutLimit(const char* value, void* data, set_plugin_parameter_addon addon); -+//int InitBmf(struct interface* skipThisIntf); -+//void CloseBmf(void); -+int InitMDNS(struct interface* skipThisIntf); -+void CloseMDNS(void); -+ -+void olsr_mdns_gen(unsigned char* packet, int len); -+ -+/* Parser function to register with the scheduler */ -+bool -+olsr_parser(union olsr_message *, struct interface *, union olsr_ip_addr *); -+ -+#endif /* _BMF_BMF_H */ -+ -+/* -+ * Local Variables: -+ * c-basic-offset: 2 -+ * indent-tabs-mode: nil -+ * End: -+ */ ---- /dev/null -+++ b/lib/mdns/src/olsrd_plugin.c -@@ -0,0 +1,185 @@ -+/* -+ * OLSR Basic Multicast Forwarding (BMF) plugin. -+ * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. -+ * Written by Erik Tromp. -+ * 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 Thales, BMF 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. -+ */ -+ -+/* ------------------------------------------------------------------------- -+ * File : olsrd_plugin.c -+ * Description: Interface to the OLSRD plugin system -+ * Created : 29 Jun 2006 -+ * -+ * ------------------------------------------------------------------------- */ -+ -+/* System includes */ -+#include /* assert() */ -+#include /* NULL */ -+ -+/* OLSRD includes */ -+#include "olsrd_plugin.h" -+#include "plugin_util.h" -+#include "defs.h" /* uint8_t, olsr_cnf */ -+#include "scheduler.h" /* olsr_start_timer() */ -+#include "olsr_cfg.h" /* olsr_cnf() */ -+#include "olsr_cookie.h" /* olsr_alloc_cookie() */ -+ -+/* BMF includes */ -+#include "mdns.h" /* InitBmf(), CloseBmf() */ -+#include "PacketHistory.h" /* InitPacketHistory() */ -+#include "NetworkInterfaces.h" /* AddNonOlsrBmfIf(), SetBmfInterfaceIp(), ... */ -+#include "Address.h" /* DoLocalBroadcast() */ -+ -+static void __attribute__ ((constructor)) my_init(void); -+static void __attribute__ ((destructor)) my_fini(void); -+ -+//static struct olsr_cookie_info *prune_packet_history_timer_cookie; -+ -+void olsr_plugin_exit(void); -+ -+/* ------------------------------------------------------------------------- -+ * Function : olsrd_plugin_interface_version -+ * Description: Plugin interface version -+ * Input : none -+ * Output : none -+ * Return : BMF plugin interface version number -+ * Data Used : none -+ * Notes : Called by main OLSRD (olsr_load_dl) to check plugin interface -+ * version -+ * ------------------------------------------------------------------------- */ -+int olsrd_plugin_interface_version(void) -+{ -+ return PLUGIN_INTERFACE_VERSION; -+} -+ -+/* ------------------------------------------------------------------------- -+ * Function : olsrd_plugin_init -+ * Description: Plugin initialisation -+ * Input : none -+ * Output : none -+ * Return : fail (0) or success (1) -+ * Data Used : olsr_cnf -+ * Notes : Called by main OLSRD (init_olsr_plugin) to initialize plugin -+ * ------------------------------------------------------------------------- */ -+int olsrd_plugin_init(void) -+{ -+ /* Clear the packet history */ -+ //InitPacketHistory(); -+ -+ /* Register ifchange function */ -+ //add_ifchgf(&InterfaceChange); -+ -+ /* create the cookie */ -+ //prune_packet_history_timer_cookie = olsr_alloc_cookie("BMF: Prune Packet History", OLSR_COOKIE_TYPE_TIMER); -+ -+ /* Register the duplicate registration pruning process */ -+ //olsr_start_timer(3 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, -+ // &PrunePacketHistory, NULL, prune_packet_history_timer_cookie->ci_id); -+ -+ -+ return InitMDNS(NULL); -+} -+ -+/* ------------------------------------------------------------------------- -+ * Function : olsr_plugin_exit -+ * Description: Plugin cleanup -+ * Input : none -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * Notes : Called by my_fini() at unload of shared object -+ * ------------------------------------------------------------------------- */ -+void olsr_plugin_exit(void) -+{ -+ CloseMDNS(); -+} -+ -+static const struct olsrd_plugin_parameters plugin_parameters[] = { -+ { .name = "NonOlsrIf", .set_plugin_parameter = &AddNonOlsrBmfIf, .data = NULL }, -+ //{ .name = "DoLocalBroadcast", .set_plugin_parameter = &DoLocalBroadcast, .data = NULL }, -+ //{ .name = "BmfInterface", .set_plugin_parameter = &SetBmfInterfaceName, .data = NULL }, -+ //{ .name = "BmfInterfaceIp", .set_plugin_parameter = &SetBmfInterfaceIp, .data = NULL }, -+ //{ .name = "CapturePacketsOnOlsrInterfaces", .set_plugin_parameter = &SetCapturePacketsOnOlsrInterfaces, .data = NULL }, -+ //{ .name = "BmfMechanism", .set_plugin_parameter = &SetBmfMechanism, .data = NULL }, -+ //{ .name = "FanOutLimit", .set_plugin_parameter = &SetFanOutLimit, .data = NULL }, -+ //{ .name = "BroadcastRetransmitCount", .set_plugin_parameter = &set_plugin_int, .data = &BroadcastRetransmitCount}, -+}; -+ -+/* ------------------------------------------------------------------------- -+ * Function : olsrd_get_plugin_parameters -+ * Description: Return the parameter table and its size -+ * Input : none -+ * Output : params - the parameter table -+ * size - its size in no. of entries -+ * Return : none -+ * Data Used : plugin_parameters -+ * Notes : Called by main OLSR (init_olsr_plugin) for all plugins -+ * ------------------------------------------------------------------------- */ -+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) -+{ -+ *params = plugin_parameters; -+ *size = ARRAYSIZE(plugin_parameters); -+} -+ -+/* ------------------------------------------------------------------------- -+ * Function : my_init -+ * Description: Plugin constructor -+ * Input : none -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * Notes : Called at load of shared object -+ * ------------------------------------------------------------------------- */ -+static void my_init(void) -+{ -+ /* Print plugin info to stdout */ -+ printf("%s\n", MOD_DESC); -+ -+ return; -+} -+ -+/* ------------------------------------------------------------------------- -+ * Function : my_fini -+ * Description: Plugin destructor -+ * Input : none -+ * Output : none -+ * Return : none -+ * Data Used : none -+ * Notes : Called at unload of shared object -+ * ------------------------------------------------------------------------- */ -+static void my_fini(void) -+{ -+ olsr_plugin_exit(); -+} -+ -+/* -+ * Local Variables: -+ * c-basic-offset: 2 -+ * indent-tabs-mode: nil -+ * End: -+ */ ---- /dev/null -+++ b/lib/mdns/version-script.txt -@@ -0,0 +1,10 @@ -+VERS_1.0 -+{ -+ global: -+ olsrd_plugin_interface_version; -+ olsrd_plugin_init; -+ olsrd_get_plugin_parameters; -+ -+ local: -+ *; -+}; diff --git a/contrib/package/olsrd-luci/patches/170-fcntl-fix.patch b/contrib/package/olsrd-luci/patches/170-fcntl-fix.patch deleted file mode 100644 index ca5676727..000000000 --- a/contrib/package/olsrd-luci/patches/170-fcntl-fix.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/src/linux/kernel_routes.c -+++ b/src/linux/kernel_routes.c -@@ -42,6 +42,7 @@ - #include "kernel_routes.h" - #include "ipc_frontend.h" - #include "log.h" -+#include - - /* values for control flag to handle recursive route corrections - * currently only requires in linux specific kernel_routes.c */ diff --git a/contrib/package/olsrd-luci/patches/200-mid_memory_cleanup.patch b/contrib/package/olsrd-luci/patches/200-mid_memory_cleanup.patch deleted file mode 100644 index 00b2f4c2c..000000000 --- a/contrib/package/olsrd-luci/patches/200-mid_memory_cleanup.patch +++ /dev/null @@ -1,256 +0,0 @@ ---- a/lib/httpinfo/src/olsrd_httpinfo.c -+++ b/lib/httpinfo/src/olsrd_httpinfo.c -@@ -687,9 +687,16 @@ - void - olsr_plugin_exit(void) - { -+ struct allowed_net *a, *next; - if (http_socket >= 0) { - CLOSE(http_socket); - } -+ -+ for (a = allowed_nets; a != NULL; a = next) { -+ next = a->next; -+ -+ free(a); -+ } - } - - static void ---- a/src/interfaces.h -+++ b/src/interfaces.h -@@ -187,6 +187,7 @@ - extern struct interface *ifnet; - - int ifinit(void); -+void olsr_delete_interfaces(void); - - void run_ifchg_cbs(struct interface *, int); - ---- a/src/linux/kernel_routes.c -+++ b/src/linux/kernel_routes.c -@@ -85,6 +85,8 @@ - OLSR_PRINTF(1,"could not create rtnetlink socket! %d",sock); - } - else { -+ memset(&addr, 0, sizeof(addr)); -+ - addr.nl_family = AF_NETLINK; - addr.nl_pid = 0; //kernel will assign appropiate number instead of pid (which is already used by primaray rtnetlink socket to add/delete routes) - addr.nl_groups = rtnl_mgrp; ---- a/src/main.c -+++ b/src/main.c -@@ -57,6 +57,7 @@ - #include "net_os.h" - #include "build_msg.h" - #include "net_olsr.h" -+#include "mid_set.h" - - #if LINUX_POLICY_ROUTING - #include -@@ -526,6 +527,7 @@ - #endif - { - struct interface *ifn; -+ int exit_value; - - OLSR_PRINTF(1, "Received signal %d - shutting down\n", (int)signo); - -@@ -542,6 +544,12 @@ - - olsr_delete_all_kernel_routes(); - -+ olsr_delete_all_tc_entries(); -+ -+ olsr_delete_all_mid_entries(); -+ -+ olsr_destroy_parser(); -+ - OLSR_PRINTF(1, "Closing sockets...\n"); - - /* front-end IPC socket */ -@@ -551,7 +559,6 @@ - } - #endif /* SVEN_OLA_UNBLOAT */ - -- /* OLSR sockets */ - for (ifn = ifnet; ifn; ifn = ifn->int_next) - close(ifn->olsr_socket); - -@@ -581,13 +588,17 @@ - #endif - - /* Free cookies and memory pools attached. */ -+ OLSR_PRINTF(0, "Free all memory...\n"); - olsr_delete_all_cookies(); - - olsr_syslog(OLSR_LOG_INFO, "%s stopped", olsrd_version); - - OLSR_PRINTF(1, "\n <<<< %s - terminating >>>>\n http://www.olsr.org\n", olsrd_version); - -- exit(olsr_cnf->exit_value); -+ exit_value = olsr_cnf->exit_value; -+ free (olsr_cnf); -+ -+ exit(exit_value); - } - - /** ---- a/src/mid_set.c -+++ b/src/mid_set.c -@@ -38,6 +38,7 @@ - * the copyright holders. - * - */ -+#include - - #include "ipcalc.h" - #include "defs.h" -@@ -79,6 +80,15 @@ - return 1; - } - -+void olsr_delete_all_mid_entries(void) { -+ int hash; -+ -+ for (hash = 0; hash < HASHSIZE; hash++) { -+ while (mid_set[hash].next != &mid_set[hash]) { -+ olsr_delete_mid_entry(mid_set[hash].next); -+ } -+ } -+} - /** - * Wrapper for the timer callback. - */ -@@ -124,10 +134,10 @@ - * - * @param m_addr the main address of the node - * @param alias the alias address to insert -- * @return nada -+ * @return false if mid_address is unnecessary, true otherwise - */ - --void -+static bool - insert_mid_tuple(union olsr_ip_addr *m_addr, struct mid_address *alias, olsr_reltime vtime) - { - struct mid_entry *tmp; -@@ -147,9 +157,8 @@ - /* Check if alias is already registered with m_addr */ - registered_m_addr = mid_lookup_main_addr(&alias->alias); - if (registered_m_addr != NULL && ipequal(registered_m_addr, m_addr)) { -- - /* Alias is already registered with main address. Nothing to do here. */ -- return; -+ return false; - } - - /* -@@ -223,6 +232,7 @@ - } - tmp_adr = tmp_adr->next_alias; - } -+ return true; - } - - /** -@@ -284,7 +294,9 @@ - } - } - -- insert_mid_tuple(main_add, adr, vtime); -+ if (!insert_mid_tuple(main_add, adr, vtime)) { -+ free(adr); -+ } - - /* - *Recalculate topology ---- a/src/mid_set.h -+++ b/src/mid_set.h -@@ -75,7 +75,7 @@ - struct mid_alias; - - int olsr_init_mid_set(void); --void insert_mid_tuple(union olsr_ip_addr *, struct mid_address *, olsr_reltime); -+void olsr_delete_all_mid_entries(void); - void insert_mid_alias(union olsr_ip_addr *, const union olsr_ip_addr *, olsr_reltime); - union olsr_ip_addr *mid_lookup_main_addr(const union olsr_ip_addr *); - struct mid_address *mid_lookup_aliases(const union olsr_ip_addr *); ---- a/src/parser.c -+++ b/src/parser.c -@@ -104,6 +104,26 @@ - } - - void -+olsr_destroy_parser(void) { -+ struct parse_function_entry *pe, *pe_next; -+ struct preprocessor_function_entry *ppe, *ppe_next; -+ struct packetparser_function_entry *pae, *pae_next; -+ -+ for (pe = parse_functions; pe; pe = pe_next) { -+ pe_next = pe->next; -+ free (pe); -+ } -+ for (ppe = preprocessor_functions; ppe; ppe = ppe_next) { -+ ppe_next = ppe->next; -+ free (ppe); -+ } -+ for (pae = packetparser_functions; pae; pae = pae_next) { -+ pae_next = pae->next; -+ free(pae); -+ } -+} -+ -+void - olsr_parser_add_function(parse_function * function, uint32_t type) - { - struct parse_function_entry *new_entry; ---- a/src/parser.h -+++ b/src/parser.h -@@ -74,6 +74,8 @@ - - void olsr_init_parser(void); - -+void olsr_destroy_parser(void); -+ - void olsr_input(int); - - void olsr_input_hostemu(int); ---- a/src/scheduler.c -+++ b/src/scheduler.c -@@ -40,6 +40,8 @@ - * - */ - -+#include -+ - #include "defs.h" - #include "scheduler.h" - #include "log.h" ---- a/src/tc_set.c -+++ b/src/tc_set.c -@@ -205,6 +205,14 @@ - tc_myself = olsr_add_tc_entry(&olsr_cnf->main_addr); - } - -+void olsr_delete_all_tc_entries(void) { -+ struct tc_entry *tc; -+ -+ OLSR_FOR_ALL_TC_ENTRIES(tc) { -+ olsr_delete_tc_entry(tc); -+ } OLSR_FOR_ALL_TC_ENTRIES_END(tc) -+} -+ - /** - * The main ip address has changed. - * Do the needful. ---- a/src/tc_set.h -+++ b/src/tc_set.h -@@ -142,6 +142,7 @@ - extern struct tc_entry *tc_myself; - - void olsr_init_tc(void); -+void olsr_delete_all_tc_entries(void); - void olsr_change_myself_tc(void); - void olsr_print_tc_table(void); - void olsr_time_out_tc_set(void); -- 2.11.0