[OpenWrt-Devel] [PATCH] NEW FEATURE IP Virtual Server Load Balancer

John Crispin blogic at openwrt.org
Tue Feb 23 02:38:16 EST 2016


Hi,

On 22/02/2016 20:52, Mauro Mozzarelli wrote:
> I am not having success with git, so I will submit this new feature as patch. I hope this is acceptable to all.
> 
> commit c7d7abd075117739e6a784df5477a3e66a0533bd
> Author: Mauro Mozzarelli <mauro at ezplanet.net>
> Date:   Mon Feb 22 18:49:28 2016 +0000
> 
>     This ipvs package adds Linux IP Virtual Server capability to OpenWRT
>     IPVS (IP Virtual Server) implements transport-layer load balancing inside the Linux kernel, so called Layer-4 switching.
> IPVS running on a host acts as a load balancer at the front of a cluster of real servers, it can direct requests for
> TCP/UDP based services to the real servers, and makes services of the real servers to appear as a virtual service on a
> single IP address.
>     This ipvs package contains:
>     - configuration to add Linux IP Virtual Server kernel modules
>     - ipvsadm utility to configure IP VS tables, virtual and real servers
>     - uci ipvs sample configuration file
>     - ipvsadm service startup/shutdown script
>     - scheduler checking real servers' availability and re-configuring ipvs tables accordingly
> 
>     Signed-off-by: Mauro Mozzarelli <mauro at ezplanet.net>
> 



before we do any further review could you split the patch up into more
than 1. each patch should contain 1 change. in this case i would suggest
you do the following

1) the netfilter.mk changes
2) the patch that adds the new package

also quickly looking at the shell script i fear that they will need a
some work. however i will wait for you to split this into 2 patches
first as it will take a bit of time to review the scripts.

	John



> diff --git a/package/kernel/linux/modules/netfilter.mk b/package/kernel/linux/modules/netfilter.mk
> index a0a19b2..71bed3d 100644
> --- a/package/kernel/linux/modules/netfilter.mk
> +++ b/package/kernel/linux/modules/netfilter.mk
> @@ -270,6 +270,56 @@ define KernelPackage/ipt-ipset
>  endef
>  $(eval $(call KernelPackage,ipt-ipset))
> 
> +IPVS_MODULES:= \
> +	ipvs/ip_vs \
> +	ipvs/ip_vs_lc \
> +	ipvs/ip_vs_wlc \
> +	ipvs/ip_vs_rr \
> +	ipvs/ip_vs_wrr \
> +	ipvs/ip_vs_lblc \
> +	ipvs/ip_vs_lblcr \
> +	ipvs/ip_vs_dh \
> +	ipvs/ip_vs_sh \
> +	ipvs/ip_vs_fo \
> +	ipvs/ip_vs_nq \
> +	ipvs/ip_vs_sed
> +
> +define KernelPackage/ipvs
> +  SUBMENU:=Netfilter Extensions
> +  TITLE:=IP Virtual Server modules
> +  DEPENDS:=+kmod-lib-crc32c
> +  KCONFIG:= \
> +	CONFIG_IP_VS \
> +	CONFIG_IP_VS_IPV6=y \
> +	CONFIG_IP_VS_DEBUG=n \
> +	CONFIG_IP_VS_PROTO_TCP=y \
> +	CONFIG_IP_VS_PROTO_UDP=y \
> +	CONFIG_IP_VS_PROTO_AH_ESP=y \
> +	CONFIG_IP_VS_PROTO_ESP=y \
> +	CONFIG_IP_VS_PROTO_AH=y \
> +	CONFIG_IP_VS_PROTO_SCTP=y \
> +	CONFIG_IP_VS_TAB_BITS=12 \
> +	CONFIG_IP_VS_RR \
> +	CONFIG_IP_VS_WRR \
> +	CONFIG_IP_VS_LC \
> +	CONFIG_IP_VS_WLC \
> +	CONFIG_IP_VS_FO \
> +	CONFIG_IP_VS_OVF \
> +	CONFIG_IP_VS_LBLC \
> +	CONFIG_IP_VS_LBLCR \
> +	CONFIG_IP_VS_DH \
> +	CONFIG_IP_VS_SH \
> +	CONFIG_IP_VS_SED \
> +	CONFIG_IP_VS_NQ \
> +	CONFIG_IP_VS_SH_TAB_BITS=8 \
> +	CONFIG_IP_VS_NFCT=n \
> +	CONFIG_NETFILTER_XT_MATCH_IPVS=n
> +
> +  FILES:=$(foreach mod,$(IPVS_MODULES),$(LINUX_DIR)/net/netfilter/$(mod).ko)
> +  #AUTOLOAD:=$(call AutoLoad,70,$(notdir $(IPVS_MODULES_LOAD)))
> +  $(call AddDepends/ipt,+kmod-ipt-conntrack)
> +endef
> +$(eval $(call KernelPackage,ipvs))
> 
>  define KernelPackage/ipt-nat
>    TITLE:=Basic NAT targets
> diff --git a/package/network/utils/ipvsadm/Makefile b/package/network/utils/ipvsadm/Makefile
> new file mode 100644
> index 0000000..6ce06a1
> --- /dev/null
> +++ b/package/network/utils/ipvsadm/Makefile
> @@ -0,0 +1,60 @@
> +#
> +# Copyright (C) 2016 OpenWRT, Mauro Mozzarelli
> +#
> +# This is free software, licensed under the GNU General Public License v2.
> +# See /LICENSE for more information.
> +#
> +# AUTHOR: Mauro Mozzarelli
> +#
> +include $(TOPDIR)/rules.mk
> +
> +PKG_NAME:=ipvsadm
> +PKG_VERSION:=1.26
> +PKG_MAINTAINER:=Mauro Mozzarelli <mauro at ezplanet.net>
> +PKG_LICENSE:=GPL-1.0
> +PKG_RELEASE:=1
> +
> +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
> +PKG_SOURCE_URL:=http://www.linuxvirtualserver.org/software/kernel-2.6/
> +PKG_MD5SUM:=eac3ba3f62cd4dea2da353aeddd353a8
> +
> +PKG_BUILD_PARALLEL:=1
> +PKG_INSTALL:=1
> +
> +ifeq ($(CONFIG_DEVEL),y)
> +	export QUILT=1
> +endif
> +
> +include $(INCLUDE_DIR)/package.mk
> +
> +define Package/$(PKG_NAME)
> +  SECTION:=net
> +  CATEGORY:=Network
> +  TITLE:=IP Virtual Server Configuration Manager
> +  URL:=http://www.linuxvirtualserver.org
> +  DEPENDS:= +kmod-ipvs +libnl-tiny +libpopt
> +endef
> +
> +#	-I$(STAGING_DIR)/usr/include/libnl/linux -fPIC -DLIBIPVS_USE_NL
> +TARGET_CFLAGS += \
> +	-I$(STAGING_DIR)/usr/include/libnl-tiny -fPIC -DLIBIPVS_USE_NL -D_GNU_SOURCE
> +
> +MAKE_FLAGS += \
> +	CC="$(TOOLCHAIN_DIR)/bin/$(TARGET_CC)" \
> +	CXX="$(TOOLCHAIN_DIR)/bin/$(TARGET_CXX)" \
> +	CFLAGS="$(TARGET_CFLAGS)" \
> +	LIBS="-lnl-tiny -lpopt"
> +
> +define Build/Compile
> +	$(call Build/Compile/Default)
> +endef
> +
> +define Package/ipvsadm/install
> +	$(INSTALL_DIR) $(1)/usr/sbin
> +	$(INSTALL_BIN) $(PKG_BUILD_DIR)/ipvsadm $(1)/usr/sbin/
> +	$(INSTALL_BIN) $(PKG_BUILD_DIR)/ipvsadm-save $(1)/usr/sbin/
> +	$(INSTALL_BIN) $(PKG_BUILD_DIR)/ipvsadm-restore $(1)/usr/sbin/
> +	$(CP) ./files/* $(1)/
> +endef
> +
> +$(eval $(call BuildPackage,$(PKG_NAME)))
> diff --git a/package/network/utils/ipvsadm/files/etc/config/ipvs b/package/network/utils/ipvsadm/files/etc/config/ipvs
> new file mode 100644
> index 0000000..9d6be66
> --- /dev/null
> +++ b/package/network/utils/ipvsadm/files/etc/config/ipvs
> @@ -0,0 +1,44 @@
> +# Sample Configuration
> +# please see the documentation at www.linuxvirtualserver.org to learn how to
> +# configure real servers.
> +# This configuration is used by /etc/init.d/ipvsadm to setup and load balance
> +# virtual servers to available real servers.
> +# A cron job is used to activate/deactivate real servers based on their availability (ping)
> +#
> +# Currently this configuration defaults to persistent gateway mode
> +# Currently NAT masquerading and other options provided by ipvsadm are not implemented by this configuration
> +# If virtual and real servers have internet static IPs, the wan interface must be part of a static IP Subnet
> +# ipvsadm is fully functional for manual configuration
> +
> +config vipvs globals
> +	option enabled 0
> +# role master|slave
> +	option role 'master'
> +	option interface 'lan'
> +# valid schedulers are included in the kernel schedulers list
> +	list scheduler wlc
> +
> +# for each vip an alias ip is initialized on the wan/lan router interface
> +# the vip must not be the same as the router's ip
> +config virtual
> +	option enabled 0
> +	option name admin
> +	option vip '192.168.10.10'
> +	option interface lan
> +	option alias 10
> +	option scheduler 'wlc'
> +	list real '192.168.10.100'
> +	list real '192.168.10.101'
> +
> +# lists protocols/ports
> +config admin
> +	option protocol tcp
> +	option src_port 80
> +	option dest_port 80
> +
> +config admin
> +	option protocol udp
> +# if only 'port' is specified then source and destination ports are the same
> +# port 0 means all ports are forwarded to the real servers
> +	option port 0
> +
> diff --git a/package/network/utils/ipvsadm/files/etc/init.d/ipvsadm b/package/network/utils/ipvsadm/files/etc/init.d/ipvsadm
> new file mode 100755
> index 0000000..7c8c378
> --- /dev/null
> +++ b/package/network/utils/ipvsadm/files/etc/init.d/ipvsadm
> @@ -0,0 +1,187 @@
> +#!/bin/sh /etc/rc.common
> +
> +################################################################################
> +# Author: Mauro Mozzarelli
> +# Description: builds ipvs configuration from uci openwrt parameters
> +#              load/unload ip_vs kernel modules
> +#              start/stop ipvs scheduler
> +#              start/stop cron job scheduler
> +# Dependencies: /etc/config/ipvs; ipvsadm; ip_vs Kernel modules; cron
> +# Notes: Firewall must be configured separately
> +#	Configuration files in /tmp/ipvsadm.d:
> +#	virt.*  = virtual servers
> +#   *.stop  = real server in down state ipvs table
> +#   *.start = real server in up state ipvs table
> +#   vserv.* = virtual servers ipvs table
> +################################################################################
> +
> +START=70
> +STOP=10
> +
> +USE_PROCD=1
> +
> +BASE_DIR=/tmp/ipvsadm.d
> +TMP_DIR=$BASE_DIR
> +REAL_SERVERS=realServers
> +KERNEL_RELEASE=`uname -r`
> +MODULES=/lib/modules/$KERNEL_RELEASE
> +IPVSMOD=ip_vs
> +# Cron job used to check if real servers are available and update ipvs
> +# scheduler accordingly
> +CRON_SCHEDULER='*		*	*	*	*	/usr/sbin/checkRealServers		# IPVS_SCHEDULER'
> +
> +# Check if real server is in the list and add if not present
> +update_real_server () {
> +	realServer=$1
> +	gotit=0
> +	for s in `cat $BASE_DIR/$REAL_SERVERS`; do
> +		if [ $r == $s ]; then
> +			gotit=1
> +			break
> +		fi
> +	done
> +	if [ $gotit -eq 0 ]; then
> +		echo $r >> $BASE_DIR/$REAL_SERVERS
> +	fi
> +}
> +
> +start_service () {
> +	enabled=`uci -q get ipvs.globals.enabled`
> +	case $enabled in
> +		0)
> +			exit
> +			;;
> +		1)
> +			;;
> +		*)
> +			echo Invalid initialization parameter: enabled=$enabled
> +			exit
> +			;;
> +	esac
> +	if [ -d $BASE_DIR ]; then
> +		cd $BASE_DIR
> +	else
> +		mkdir -p $BASE_DIR
> +		cd $BASE_DIR
> +	fi
> +	rm -f $BASE_DIR/*
> +	rm -f $TMP_DIR/*.down
> +	touch $BASE_DIR/$REAL_SERVERS
> +	modprobe $IPVSMOD
> +	cm=0
> +	for m in `uci -q get ipvs.globals.scheduler`; do
> +			cm=$((cm+1))
> +			modprobe ${IPVSMOD}_$m
> +	done
> +	# Default to wlc if no schedulers
> +	if [ $cm -eq 0 ]; then
> +		modprobe ${IPVSMOD}_wlc
> +	fi
> +	cv=0
> +	while [ x`uci -q get ipvs. at virtual[$cv]` == x'virtual' ]; do
> +		enabled=`uci get ipvs. at virtual[$cv].enabled`
> +		if [ $enabled -eq 0 ]; then
> +			cv=$((cv+1))
> +			continue
> +		fi
> +		name=`uci get ipvs. at virtual[$cv].name`
> +		vip=`uci get ipvs. at virtual[$cv].vip`
> +		interface=`uci get ipvs. at virtual[$cv].interface`
> +		device=`uci -P /var/state get network.${interface}.ifname`
> +		alias=`uci get ipvs. at virtual[$cv].alias`
> +		scheduler=`uci get ipvs. at virtual[$cv].scheduler`
> +		# ifconfig
> +		ifconfig $device:$alias $vip netmask 255.255.255.255 up
> +		#
> +		real=`uci get ipvs. at virtual[$cv].real`
> +		if [ ! -z "$real" -a "$real" != " " ]; then
> +			vip_done=no
> +			for r in $real; do
> +				update_real_server $r
> +				cd=0
> +				while [ x`uci -q get ipvs.@$name[$cd]` == x$name ]; do
> +					protocol=`uci -q get ipvs.@$name[$cd].protocol`
> +					src_port=`uci -q get ipvs.@$name[$cd].src_port`
> +					dest_port=`uci -q get ipvs.@$name[$cd].dest_port`
> +					case $protocol in
> +						tcp)
> +							protocol="-t"
> +							;;
> +						udp)
> +							protocol="-u"
> +							;;
> +						*)
> +							# Default to tcp protocol
> +							protocol="-t"
> +							;;
> +					esac
> +					if [ -z $src_port ]; then
> +						port=`uci -q get ipvs.@$name[$cd].port`
> +						if [ -z $port ]; then
> +							port=0
> +						fi
> +						src_port=$port
> +					fi
> +					if [ -z $dest_port ]; then
> +						dest_port=$src_port
> +					fi
> +					if [ x$vip_done == x'no' ];then
> +						echo "-A $protocol $vip:$src_port -s $scheduler -p" >> $BASE_DIR/vserv.start.$interface
> +						echo "-D $protocol $vip:$src_port" >> $BASE_DIR/vserv.stop.$interface
> +					fi
> +					echo "-a $protocol $vip:$src_port -r $r:$dest_port -g -w 1" >> $BASE_DIR/$r.start
> +					echo "-d $protocol $vip:$src_port -r $r" >> $BASE_DIR/$r.stop
> +					cd=$((cd+1))
> +				done
> +				vip_done=yes
> +			done
> +		fi
> +		cv=$((cv+1))
> +	done
> +	for i in `cat $BASE_DIR/$REAL_SERVERS`; do
> +		date > $TMP_DIR/$i.down
> +	done
> +	for i in ${BASE_DIR}/vserv.start.* ; do
> +		ipvsadm -R < $i
> +	done
> +
> +	grole=`uci get ipvs.globals.role`
> +	gintf=`uci get ipvs.globals.interface`
> +	ipvsadm --start-daemon $grole --mcast-interface `uci -P /var/state get network.$gintf.ifname`
> +	if [ $? -gt 0 ]; then
> +		logger -p info "ERROR: IPVSADM daemon failed to start"
> +		exit
> +	fi
> +	(crontab -l ; echo "$CRON_SCHEDULER")|crontab -
> +	logger -p info "IPVSADM daemon started"
> +}
> +
> +stop_service () {
> +	for i in ${BASE_DIR}/*.stop ; do
> +		ipvsadm -R < $i
> +	done
> +	for i in ${BASE_DIR}/vserv.stop.* ; do
> +		ipvsadm -R < $i
> +	done
> +	n=0
> +	while [ x`uci -q get ipvs. at virtual[$n]` == x'virtual' ]; do
> +		interface=`uci get ipvs. at virtual[$n].interface`
> +		device=`uci -P /var/state get network.${interface}.ifname`
> +		alias=`uci get ipvs. at virtual[$n].alias`
> +		ifconfig $device:$alias down
> +		n=$((n+1))
> +	done
> +	ipvsadm --stop-daemon `uci get ipvs.globals.role`
> +	rm -f $TMP_DIR/*.down
> +	rm -rf $BASE_DIR
> +	for m in `uci -q get ipvs.globals.scheduler`; do
> +			cm=$((cm+1))
> +			rmmod ${IPVSMOD}_$m
> +	done
> +	# Default to wlc if no schedulers
> +	if [ $m -eq 0 ]; then
> +		rmmod ${IPVSMOD}_wlc
> +	fi
> +	rmmod $IPVSMOD
> +	crontab -l |grep -v IPVS_SCHEDULER|crontab -
> +}
> diff --git a/package/network/utils/ipvsadm/files/usr/sbin/checkRealServers
> b/package/network/utils/ipvsadm/files/usr/sbin/checkRealServers
> new file mode 100755
> index 0000000..f801c4b
> --- /dev/null
> +++ b/package/network/utils/ipvsadm/files/usr/sbin/checkRealServers
> @@ -0,0 +1,36 @@
> +#!/bin/sh
> +################################################################################
> +# Author: Mauro Mozzarelli
> +# Description: checks whether a real server is up and running and if it is
> +#              then it starts the services
> +# Dependencies: /tmp/ipvsadm.d
> +#				configuration files created by /etc/init.d/ipvsadm
> +#	virt.*  = virtual servers
> +#   *.stop  = real server in down state ipvs table
> +#   *.start = real server in up state ipvs table
> +#   *.down  = real server down status
> +################################################################################
> +
> +BASE_DIR=/tmp/ipvsadm.d
> +TMP_DIR=$BASE_DIR
> +REAL_SERVERS=realServers
> +
> +if [ -f $BASE_DIR/$REAL_SERVERS ]; then
> +	for i in `cat $BASE_DIR/$REAL_SERVERS`; do
> +		ping -qc 3 $i > /dev/null
> +		RESULT=$?
> +		if [ $RESULT -gt 0 ]; then
> +			if [ ! -f $TMP_DIR/$i.down ]; then
> +				ipvsadm -R < $BASE_DIR/$i.stop
> +				date > $TMP_DIR/$i.down
> +				logger -p info "IPVS Server $i is down"
> +			fi
> +		else
> +			if [ -f $TMP_DIR/$i.down ]; then
> +				ipvsadm -R < $BASE_DIR/$i.start
> +				rm $TMP_DIR/$i.down
> +				logger -p info "IPVS Server $i is on-line"
> +			fi
> +		fi
> +	done
> +fi
> diff --git a/package/network/utils/ipvsadm/patches/001-ipvsadm.patch b/package/network/utils/ipvsadm/patches/001-ipvsadm.patch
> new file mode 100644
> index 0000000..643d5ae
> --- /dev/null
> +++ b/package/network/utils/ipvsadm/patches/001-ipvsadm.patch
> @@ -0,0 +1,199 @@
> +diff -Naur ipvsadm-1.26/ipvsadm.spec ipvsadm-1.26.owrt/ipvsadm.spec
> +--- ipvsadm-1.26/ipvsadm.spec	2011-02-08 00:25:36.000000000 +0000
> ++++ ipvsadm-1.26.owrt/ipvsadm.spec	1970-01-01 01:00:00.000000000 +0100
> +@@ -1,100 +0,0 @@
> +-%define prefix   /usr
> +-
> +-Summary: Utility to administer the Linux Virtual Server
> +-Name: ipvsadm
> +-Version: 1.26
> +-Release: 1
> +-License: GPL
> +-URL: http://www.LinuxVirtualServer.org/
> +-Group: Applications/System
> +-Source0: http://www.LinuxVirtualServer.org/software/ipvsadm-%{version}.tar.gz
> +-BuildRoot: /var/tmp/%name-%{PACKAGE_VERSION}-root
> +-Provides: %{name}-%{version}
> +-Conflicts: piranha <= 0.4.14
> +-
> +-%description
> +-ipvsadm is a utility to administer the IP Virtual Server services
> +-offered by the latest Linux kernel 2.6.x.
> +-
> +-
> +-%prep
> +-%setup -n %{name}-%{version}
> +-
> +-
> +-%build
> +-CFLAGS="${RPM_OPT_FLAGS}" make
> +-
> +-
> +-%install
> +-rm -rf $RPM_BUILD_ROOT
> +-mkdir -p ${RPM_BUILD_ROOT}/{sbin,%{_mandir}/man8,etc/rc.d/init.d}
> +-make install BUILD_ROOT=${RPM_BUILD_ROOT} MANDIR=%{_mandir}
> +-
> +-
> +-%files
> +-%defattr(-,root,root)
> +-%doc README
> +-%config /etc/rc.d/init.d/ipvsadm
> +-/sbin/ipvsadm*
> +-%{_mandir}/man8/ipvsadm*
> +-
> +-%post
> +-/sbin/chkconfig --add ipvsadm
> +-
> +-%preun
> +-/sbin/chkconfig --del ipvsadm
> +-
> +-
> +-%clean
> +-rm -rf $RPM_BUILD_DIR/%{name}
> +-rm -rf $RPM_BUILD_ROOT
> +-
> +-
> +-%changelog
> +-* Thu Jun 23 2005 Steve Nielsen <snielsen at comscore.com>
> +-- Respect rpmmacros that might be set (by using rpm --eval)
> +-
> +-* Sat Dec 20 2003 Wensong Zhang <wensong at linux-vs.org>
> +-- tidy up the description
> +-
> +-* Sat Apr  5 2003 Wensong Zhang <wensong at linux-vs.org>
> +-- Removed the unnecessary Docdir setting.
> +-
> +-* Thu Dec 16 2001 Wensong Zhang <wensong at linuxvirtualserver.org>
> +-- Changed to install ipvsadm man pages according to the %{_mandir}
> +-
> +-* Thu Dec 30 2000 Wensong Zhang <wensong at linuxvirtualserver.org>
> +-- update the %file section
> +-
> +-* Thu Dec 17 2000 Wensong Zhang <wensong at linuxvirtualserver.org>
> +-- Added a if-condition to keep both new or old rpm utility building
> +-  the package happily.
> +-
> +-* Tue Dec 12 2000 P.Copeland <bryce at redhat.com>
> +-- Small modifications to make the compiler happy in RH7 and the Alpha
> +-- Fixed the documentation file that got missed off in building
> +-  the rpm
> +-- Made a number of -pedantic mods though popt will not compile with
> +-  -pedantic
> +-
> +-* Wed Aug 9 2000 Horms <horms at vergenet.net>
> +-- Removed Obseletes tag as ipvsadm is back in /sbin where it belongs
> +-  as it is more or less analogous to both route and ipchains both of
> +-  which reside in /sbin.
> +-- Create directory to install init script into. Init scripts won't install
> +-  into build directory unless this is done
> +-
> +-* Thu Jul  6 2000 Wensong Zhang <wensong at linuxvirtualserver.org>
> +-- Changed to build rpms on the ipvsadm tar ball directly
> +-
> +-* Wed Jun 21 2000 P.Copeland <copeland at redhat.com>
> +-- fixed silly install permission settings
> +-
> +-* Mon Jun 19 2000 P.Copeland <copeland at redhat.com>
> +-- Added 'dist' and 'rpms' to the Makefile
> +-- Added Obsoletes tag since there were early versions
> +-  of ipvsadm-*.rpm that installed in /sbin
> +-- Obsolete tag was a bit vicious re: piranha
> +-
> +-* Mon Apr 10 2000 Horms <horms at vergenet.net>
> +-- created for version 1.9
> +diff -Naur ipvsadm-1.26/libipvs/ip_vs.h ipvsadm-1.26.owrt/libipvs/ip_vs.h
> +--- ipvsadm-1.26/libipvs/ip_vs.h	2011-02-07 02:38:57.000000000 +0000
> ++++ ipvsadm-1.26.owrt/libipvs/ip_vs.h	2016-01-24 19:59:27.304631247 +0000
> +@@ -10,6 +10,7 @@
> + #include <sys/socket.h>
> + #include <arpa/inet.h>
> + #include <linux/types.h>	/* For __beXX types in userland */
> ++#include <sys/types.h>
> +
> + #ifdef LIBIPVS_USE_NL
> + #include <netlink/netlink.h>
> +diff -Naur ipvsadm-1.26/libipvs/libipvs.c ipvsadm-1.26.owrt/libipvs/libipvs.c
> +--- ipvsadm-1.26/libipvs/libipvs.c	2011-02-07 02:38:57.000000000 +0000
> ++++ ipvsadm-1.26.owrt/libipvs/libipvs.c	2016-01-24 20:02:49.840430677 +0000
> +@@ -32,7 +32,7 @@
> + struct ip_vs_getinfo ipvs_info;
> +
> + #ifdef LIBIPVS_USE_NL
> +-static struct nl_handle *sock = NULL;
> ++static struct nl_sock *sock = NULL;
> + static int family, try_nl = 1;
> + #endif
> +
> +@@ -73,7 +73,7 @@
> + {
> + 	int err = EINVAL;
> +
> +-	sock = nl_handle_alloc();
> ++	sock = nl_socket_alloc();
> + 	if (!sock) {
> + 		nlmsg_free(msg);
> + 		return -1;
> +@@ -88,7 +88,7 @@
> +
> + 	/* To test connections and set the family */
> + 	if (msg == NULL) {
> +-		nl_handle_destroy(sock);
> ++		nl_socket_free(sock);
> + 		sock = NULL;
> + 		return 0;
> + 	}
> +@@ -104,12 +104,12 @@
> +
> + 	nlmsg_free(msg);
> +
> +-	nl_handle_destroy(sock);
> ++	nl_socket_free(sock);
> +
> + 	return 0;
> +
> + fail_genl:
> +-	nl_handle_destroy(sock);
> ++	nl_socket_free(sock);
> + 	sock = NULL;
> + 	nlmsg_free(msg);
> + 	errno = err;
> +diff -Naur ipvsadm-1.26/Makefile ipvsadm-1.26.owrt/Makefile
> +--- ipvsadm-1.26/Makefile	2011-02-08 00:24:23.000000000 +0000
> ++++ ipvsadm-1.26.owrt/Makefile	2016-01-24 12:40:39.427307725 +0000
> +@@ -37,18 +37,17 @@
> +
> + CC		= gcc
> + INCLUDE		=
> +-SBIN		= $(BUILD_ROOT)/sbin
> ++SBIN		= $(DESTDIR)/usr/sbin
> + MANDIR		= usr/man
> +-MAN		= $(BUILD_ROOT)/$(MANDIR)/man8
> +-INIT		= $(BUILD_ROOT)/etc/rc.d/init.d
> ++INIT		= $(DESTDIR)/etc/rc.d/init.d
> + MKDIR		= mkdir
> + INSTALL		= install
> + STATIC_LIBS	= libipvs/libipvs.a
> +
> + ifeq "${ARCH}" "sparc64"
> +-    CFLAGS = -Wall -Wunused -Wstrict-prototypes -g -m64 -pipe -mcpu=ultrasparc -mcmodel=medlow
> ++    CFLAGS += -Wall -Wunused -Wstrict-prototypes -g -m64 -pipe -mcpu=ultrasparc -mcmodel=medlow
> + else
> +-    CFLAGS = -Wall -Wunused -Wstrict-prototypes -g
> ++    CFLAGS += -Wall -Wunused -Wstrict-prototypes -g
> + endif
> +
> +
> +@@ -104,12 +103,6 @@
> + 		$(INSTALL) -m 0755 ipvsadm $(SBIN)
> + 		$(INSTALL) -m 0755 ipvsadm-save $(SBIN)
> + 		$(INSTALL) -m 0755 ipvsadm-restore $(SBIN)
> +-		[ -d $(MAN) ] || $(MKDIR) -p $(MAN)
> +-		$(INSTALL) -m 0644 ipvsadm.8 $(MAN)
> +-		$(INSTALL) -m 0644 ipvsadm-save.8 $(MAN)
> +-		$(INSTALL) -m 0644 ipvsadm-restore.8 $(MAN)
> +-		[ -d $(INIT) ] || $(MKDIR) -p $(INIT)
> +-		$(INSTALL) -m 0755 ipvsadm.sh $(INIT)/ipvsadm
> +
> + clean:
> + 		rm -f ipvsadm $(NAME).spec $(NAME)-$(VERSION).tar.gz
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel at lists.openwrt.org
> https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
> 
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list